f_sys_scidentity.srf 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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. IF sys_option_if_sql2008 = 0 THEN
  66. //-------------------------------------------------------4.建立查找最大ID_dw
  67. ds_maxid = Create datastore
  68. str_dwSQl = 'select max('+arg_columnname+') as maxid from '+arg_tablename
  69. str_SyntaxFromSQL = sqlca.SyntaxFromSQL(str_dwSQl,"style(type=grid)",ls_msg) //本地检查
  70. IF ls_msg > '' THEN
  71. arg_msg = "dw语法生成失败"
  72. rslt_id = 0
  73. GOTO ext
  74. END IF
  75. ds_maxid.Create(str_SyntaxFromSQL,ls_msg)
  76. IF ls_msg > '' THEN
  77. arg_msg = "建立相关DW失败"
  78. rslt_id = 0
  79. GOTO ext
  80. END IF
  81. ds_maxid.SetTransObject(arg_transaction)
  82. ds_maxid.Retrieve()
  83. ins_maxid = ds_maxid.GetItemNumber(1,1)
  84. IF IsNull(ins_maxid) THEN
  85. ins_maxid = 10
  86. END IF
  87. Destroy ds_maxid
  88. //--------------------------------------------------------5.比较ID
  89. IF ins_maxid < rslt_id THEN
  90. GOTO ext
  91. ELSE
  92. add_n = ins_maxid - rslt_id + 1
  93. UPDATE Sys_scIdentity
  94. SET ScIdentityno = ScIdentityno + :add_n
  95. WHERE Sys_scIdentity.Scid = :arg_sc_id AND
  96. lower(Sys_scIdentity.tablename) = :arg_tablename AND
  97. lower(Sys_scIdentity.columnname) = :arg_columnname
  98. Using arg_transaction;
  99. IF arg_transaction.SQLCode <> 0 THEN
  100. arg_msg = '更新相关唯一码记录操作失败'+arg_transaction.SQLErrText
  101. rslt_id = 0
  102. GOTO ext
  103. END IF
  104. rslt_id = rslt_id + add_n
  105. GOTO ext
  106. END IF
  107. END IF
  108. //-----------------------------------------------------------
  109. ext:
  110. IF IsNull(rslt_id) THEN rslt_id = 0
  111. IF arg_ifcommit And rslt_id > 0 THEN
  112. COMMIT Using arg_transaction;
  113. END IF
  114. IF rslt_id = 0 THEN
  115. ROLLBACK Using arg_transaction;
  116. END IF
  117. RETURN rslt_id
  118. end function