f_sys_scidentity.srf 3.8 KB

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