123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- $PBExportHeader$f_sys_scidentity_n.srf
- global type f_sys_scidentity_n from function_object
- end type
- forward prototypes
- global function long f_sys_scidentity_n (long arg_sc_id, string arg_tablename, string arg_columnname, ref string arg_msg, boolean arg_ifcommit, ref s_sys_scidentity_n sys_scidentity_n, long arg_it_mxbt)
- end prototypes
- global function long f_sys_scidentity_n (long arg_sc_id, string arg_tablename, string arg_columnname, ref string arg_msg, boolean arg_ifcommit, ref s_sys_scidentity_n sys_scidentity_n, long arg_it_mxbt);//f_sys_scidentity
- //long arg_sc_id :目标学校id,>=0;(如果是为取得学校id本身,可以赋0)
- //string arg_tablename :目标表名称
- //string arg_columnname:目标表字段名称
- //s_sys_scidentity_n sys_scidentity_n
- //long arg_it_mxbt
- //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
- if arg_it_mxbt=0 then
- arg_msg='错误明细数目 0 '
- 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 + :arg_it_mxbt
- WHERE Sys_scIdentity.Scid = :arg_sc_id and
- lower(Sys_scIdentity.tablename)=:arg_tablename and
- lower(Sys_scIdentity.columnname)=:arg_columnname ;
- if sqlca.sqlcode <>0 then
- arg_msg='更新相关唯一码记录操作失败'+sqlca.sqlerrtext
- rslt_id=0
- goto ext
- end if
- //-------------------------------------------------------2.如果无则加入新ID
- if sqlca.sqlnrows=0 then
- new_selfid=0
- insert into Sys_scIdentity (id,Scid,ScIdentityno,tablename,columnname)
- values (:new_selfid,:arg_sc_id,10 + :arg_it_mxbt,:arg_tablename,:arg_columnname);
- //预留1~10的id作系统约定的预设数据id
- if sqlca.sqlcode<>0 then
- arg_msg='新建相关唯一码记录操作失败'+sqlca.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;
- if sqlca.sqlcode<>0 then //---------查询ID失败
- arg_msg='查询相关唯一码记录操作失败'+sqlca.sqlerrtext
- rslt_id=0
- goto ext
- end if
- //-------------------------------------------------------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(sqlca)
- 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 - arg_it_mxbt + 1 then
- sys_scidentity_n.firstid=rslt_id - arg_it_mxbt + 1 //首ID
- sys_scidentity_n.lastid=rslt_id //尾ID
-
- goto ext
- else
- add_n=ins_maxid - rslt_id - arg_it_mxbt + 1 + 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 ;
- if sqlca.sqlcode <>0 then
- arg_msg='更新相关唯一码记录操作失败'+sqlca.sqlerrtext
- rslt_id=0
- goto ext
- end if
-
- rslt_id=rslt_id + add_n
- sys_scidentity_n.firstid=rslt_id - arg_it_mxbt + 1 //首ID
- sys_scidentity_n.lastid=rslt_id //尾ID
-
- goto ext
- end if
- //-----------------------------------------------------------
- ext:
- if arg_ifcommit and rslt_id>0 then
- commit;
- end if
- if rslt_id=0 then
- rollback;
- end if
- //messagebox("",rslt_id)
- return rslt_id
- end function
|