$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