123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- $PBExportHeader$f_sys_scidentity.srf
- global type f_sys_scidentity from function_object
- end type
- forward prototypes
- global function long f_sys_scidentity (long arg_sc_id, string arg_tablename, string arg_columnname, ref string arg_msg, boolean arg_ifcommit, transaction arg_transaction)
- end prototypes
- global function long f_sys_scidentity (long arg_sc_id, string arg_tablename, string arg_columnname, ref string arg_msg, boolean arg_ifcommit, transaction arg_transaction);//f_sys_scidentity
- //long arg_sc_id :目标学校id,>=0;(如果是为取得学校id本身,可以赋0)
- //string arg_tablename :目标表名称
- //string arg_columnname:目标表字段名称
- //return 0 //操作失败
- //return >0 //操作成功返回新ID
- Long new_selfid = 0,ls_idtop
- Long rslt_id = 1
- String str_dwSQl,str_SyntaxFromSQL
- datastore ds_maxid
- Long ins_maxid
- Long add_n = 1
- String ls_msg = ""
- IF arg_sc_id < 0 THEN
- arg_msg = '错误唯一编码'
- rslt_id = 0
- GOTO ext
- END IF
- arg_tablename = Lower(arg_tablename)
- arg_columnname = Lower(arg_columnname)
- //-------------------------------------------------------1.ID加1
- UPDATE Sys_scIdentity
- SET ScIdentityno = ScIdentityno + 1
- WHERE Sys_scIdentity.Scid = :arg_sc_id AND
- lower(Sys_scIdentity.tablename) = :arg_tablename AND
- lower(Sys_scIdentity.columnname) = :arg_columnname
- Using arg_transaction;
- IF arg_transaction.SQLCode <> 0 THEN
- arg_msg = '更新相关唯一码记录操作失败'+arg_transaction.SQLErrText
- rslt_id = 0
- GOTO ext
- END IF
- //-------------------------------------------------------2.如果无则加入新ID
- IF arg_transaction.SQLNRows = 0 THEN
- new_selfid = 0
- INSERT INTO Sys_scIdentity (id,Scid,ScIdentityno,tablename,columnname)
- VALUES (:new_selfid,:arg_sc_id,11,:arg_tablename,:arg_columnname)
- Using arg_transaction;
- //预留1~10的id作系统约定的预设数据id
- IF arg_transaction.SQLCode <> 0 THEN
- arg_msg = '新建相关唯一码记录操作失败'+arg_transaction.SQLErrText
- rslt_id = 0
- GOTO ext
- END IF
- END IF
- //-------------------------------------------------------3.查询最新ID
- SELECT top 1 Sys_scIdentity.ScIdentityno
- INTO :rslt_id
- FROM Sys_scIdentity
- WHERE Sys_scIdentity.Scid = :arg_sc_id AND
- lower(Sys_scIdentity.tablename) = :arg_tablename AND
- lower(Sys_scIdentity.columnname) = :arg_columnname
- Using arg_transaction;
-
- IF arg_transaction.SQLCode <> 0 THEN //---------查询ID失败
- arg_msg = '查询相关唯一码记录操作失败'+arg_transaction.SQLErrText
- rslt_id = 0
- GOTO ext
- END IF
- IF sys_option_if_sql2008 = 0 THEN
- //-------------------------------------------------------4.建立查找最大ID_dw
- ds_maxid = Create datastore
- str_dwSQl = 'select max('+arg_columnname+') as maxid from '+arg_tablename
- str_SyntaxFromSQL = sqlca.SyntaxFromSQL(str_dwSQl,"style(type=grid)",ls_msg) //本地检查
- IF ls_msg > '' THEN
- arg_msg = "dw语法生成失败"
- rslt_id = 0
- GOTO ext
- END IF
-
- ds_maxid.Create(str_SyntaxFromSQL,ls_msg)
- IF ls_msg > '' THEN
- arg_msg = "建立相关DW失败"
- rslt_id = 0
- GOTO ext
- END IF
- ds_maxid.SetTransObject(arg_transaction)
- ds_maxid.Retrieve()
- ins_maxid = ds_maxid.GetItemNumber(1,1)
- IF IsNull(ins_maxid) THEN
- ins_maxid = 10
- END IF
- Destroy ds_maxid
-
- //--------------------------------------------------------5.比较ID
- IF ins_maxid < rslt_id THEN
- GOTO ext
- ELSE
- add_n = ins_maxid - rslt_id + 1
-
- UPDATE Sys_scIdentity
- SET ScIdentityno = ScIdentityno + :add_n
- WHERE Sys_scIdentity.Scid = :arg_sc_id AND
- lower(Sys_scIdentity.tablename) = :arg_tablename AND
- lower(Sys_scIdentity.columnname) = :arg_columnname
- Using arg_transaction;
- IF arg_transaction.SQLCode <> 0 THEN
- arg_msg = '更新相关唯一码记录操作失败'+arg_transaction.SQLErrText
- rslt_id = 0
- GOTO ext
- END IF
-
- rslt_id = rslt_id + add_n
- GOTO ext
- END IF
- END IF
- //-----------------------------------------------------------
- ext:
- IF IsNull(rslt_id) THEN rslt_id = 0
- IF arg_ifcommit And rslt_id > 0 THEN
- COMMIT Using arg_transaction;
- END IF
- IF rslt_id = 0 THEN
- ROLLBACK Using arg_transaction;
- END IF
- RETURN rslt_id
- end function
|