f_sys_scidentity_n.srf 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. $PBExportHeader$f_sys_scidentity_n.srf
  2. global type f_sys_scidentity_n from function_object
  3. end type
  4. forward prototypes
  5. 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)
  6. end prototypes
  7. 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
  8. //long arg_sc_id :目标学校id,>=0;(如果是为取得学校id本身,可以赋0)
  9. //string arg_tablename :目标表名称
  10. //string arg_columnname:目标表字段名称
  11. //s_sys_scidentity_n sys_scidentity_n
  12. //long arg_it_mxbt
  13. //return 0 //操作失败
  14. //return >0 //操作成功返回新ID
  15. long new_selfid=0,ls_idtop
  16. long rslt_id=1
  17. string str_dwSQl,str_SyntaxFromSQL
  18. datastore ds_maxid
  19. long ins_maxid
  20. long add_n=1
  21. string ls_msg=""
  22. if arg_sc_id<0 then
  23. arg_msg='错误学校唯一编码'
  24. rslt_id=0
  25. goto ext
  26. end if
  27. if arg_it_mxbt=0 then
  28. arg_msg='错误明细数目 0 '
  29. rslt_id=0
  30. goto ext
  31. end if
  32. arg_tablename=lower(arg_tablename)
  33. arg_columnname=lower(arg_columnname)
  34. //-------------------------------------------------------1.ID加1
  35. update Sys_scIdentity
  36. set ScIdentityno =ScIdentityno + :arg_it_mxbt
  37. WHERE Sys_scIdentity.Scid = :arg_sc_id and
  38. lower(Sys_scIdentity.tablename)=:arg_tablename and
  39. lower(Sys_scIdentity.columnname)=:arg_columnname ;
  40. if sqlca.sqlcode <>0 then
  41. arg_msg='更新相关唯一码记录操作失败'+sqlca.sqlerrtext
  42. rslt_id=0
  43. goto ext
  44. end if
  45. //-------------------------------------------------------2.如果无则加入新ID
  46. if sqlca.sqlnrows=0 then
  47. new_selfid=0
  48. insert into Sys_scIdentity (id,Scid,ScIdentityno,tablename,columnname)
  49. values (:new_selfid,:arg_sc_id,10 + :arg_it_mxbt,:arg_tablename,:arg_columnname);
  50. //预留1~10的id作系统约定的预设数据id
  51. if sqlca.sqlcode<>0 then
  52. arg_msg='新建相关唯一码记录操作失败'+sqlca.sqlerrtext
  53. rslt_id=0
  54. goto ext
  55. end if
  56. end if
  57. //-------------------------------------------------------3.查询最新ID
  58. SELECT top 1 Sys_scIdentity.ScIdentityno
  59. INTO :rslt_id
  60. FROM Sys_scIdentity
  61. WHERE Sys_scIdentity.Scid = :arg_sc_id and
  62. lower(Sys_scIdentity.tablename)=:arg_tablename and
  63. lower(Sys_scIdentity.columnname)=:arg_columnname;
  64. if sqlca.sqlcode<>0 then //---------查询ID失败
  65. arg_msg='查询相关唯一码记录操作失败'+sqlca.sqlerrtext
  66. rslt_id=0
  67. goto ext
  68. end if
  69. //-------------------------------------------------------4.建立查找最大ID_dw
  70. ds_maxid= create datastore
  71. str_dwSQl='select max('+arg_columnname+') as maxid from '+arg_tablename
  72. str_SyntaxFromSQL =sqlca.SyntaxFromSQL(str_dwSQl,"style(type=grid)",ls_msg)
  73. if ls_msg>'' then
  74. arg_msg="dw语法生成失败"
  75. rslt_id=0
  76. goto ext
  77. end if
  78. ds_maxid.Create(str_SyntaxFromSQL,ls_msg)
  79. if ls_msg>'' then
  80. arg_msg="建立相关DW失败"
  81. rslt_id=0
  82. goto ext
  83. end if
  84. ds_maxid.settransobject(sqlca)
  85. ds_maxid.retrieve()
  86. ins_maxid=ds_maxid.GetItemNumber(1,1)
  87. if isnull(ins_maxid) then
  88. ins_maxid=10
  89. end if
  90. destroy ds_maxid
  91. //--------------------------------------------------------5.比较ID
  92. if ins_maxid < rslt_id - arg_it_mxbt + 1 then
  93. sys_scidentity_n.firstid=rslt_id - arg_it_mxbt + 1 //首ID
  94. sys_scidentity_n.lastid=rslt_id //尾ID
  95. goto ext
  96. else
  97. add_n=ins_maxid - rslt_id - arg_it_mxbt + 1 + 1
  98. update Sys_scIdentity
  99. set ScIdentityno =ScIdentityno + :add_n
  100. WHERE Sys_scIdentity.Scid = :arg_sc_id and
  101. lower(Sys_scIdentity.tablename)=:arg_tablename and
  102. lower(Sys_scIdentity.columnname)=:arg_columnname ;
  103. if sqlca.sqlcode <>0 then
  104. arg_msg='更新相关唯一码记录操作失败'+sqlca.sqlerrtext
  105. rslt_id=0
  106. goto ext
  107. end if
  108. rslt_id=rslt_id + add_n
  109. sys_scidentity_n.firstid=rslt_id - arg_it_mxbt + 1 //首ID
  110. sys_scidentity_n.lastid=rslt_id //尾ID
  111. goto ext
  112. end if
  113. //-----------------------------------------------------------
  114. ext:
  115. if arg_ifcommit and rslt_id>0 then
  116. commit;
  117. end if
  118. if rslt_id=0 then
  119. rollback;
  120. end if
  121. //messagebox("",rslt_id)
  122. return rslt_id
  123. end function