uo_yfct.sru 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. $PBExportHeader$uo_yfct.sru
  2. forward
  3. global type uo_yfct from nonvisualobject
  4. end type
  5. end forward
  6. global type uo_yfct from nonvisualobject
  7. end type
  8. global uo_yfct uo_yfct
  9. type prototypes
  10. Function long GetFullPathName (String lpFileName ,Long nBufferLength,ref string lpBuffer,ref long lpFilePart) library "kernel32" ALIAS FOR "GetFullPathNameA;Ansi"
  11. Function long CreateDirectory (string lpNewDirectory ,ref SECURITY_ATTRIBUTES lpSecurityAttributes ) library "kernel32" Alias for "CreateDirectoryA;Ansi"
  12. end prototypes
  13. type variables
  14. end variables
  15. forward prototypes
  16. public function integer check_import_dt (integer arg_xporttype, datetime arg_bgdt, datetime arg_eddt, ref string arg_msg)
  17. public function integer check_no_finish (datetime arg_ctdt, ref string arg_log, ref string arg_msg)
  18. public function integer pf_writetifofile (string arg_tableinfo, string arg_objfilename, ref string arg_msg)
  19. public function integer add_ct_datamx (long arg_ct_id, datetime arg_bg_dt, datetime arg_ed_dt, long arg_err_num, long arg_ct_delerrnum, ref string arg_msg, integer arg_type, transaction arg_sqlca)
  20. public function integer init_ct (boolean arg_ifcheck_dt, datetime arg_ctdt, ref string arg_msg, ref string arg_log, boolean arg_ifcommit)
  21. public function integer del_ct_data (datetime arg_edctdt, long arg_ct_id, long arg_bg_int, long arg_ed_int, integer arg_commit_step, ref string arg_msg, ref string arg_log, boolean arg_if_buildlogfile)
  22. private function integer p_update_ctmint (string arg_etbname, string arg_ctbname, string arg_wherestr, string arg_fromstr, string arg_linkstr, long arg_value, ref string arg_msg, ref long arg_sucnum)
  23. end prototypes
  24. public function integer check_import_dt (integer arg_xporttype, datetime arg_bgdt, datetime arg_eddt, ref string arg_msg);//检查导入导出日期
  25. //check_import_dt(arg_xporttype,arg_bgdt,arg_eddt,arg_msg)
  26. //arg_xporttype 0:导出 1:导入
  27. int rslt=1
  28. long cnt
  29. datetime max_eddt
  30. select max(ct_eddt) into :max_eddt from sys_ct_datamx ;
  31. if sqlca.sqlcode = - 1 then
  32. if arg_xporttype=0 then
  33. arg_msg='查询最后导出日期失败'
  34. else
  35. arg_msg='查询最后导入日期失败'
  36. end if
  37. rslt=0
  38. goto ext
  39. elseif sqlca.sqlcode=100 then
  40. rslt=1
  41. goto ext
  42. end if
  43. if arg_xporttype=0 then
  44. if arg_bgdt > max_eddt then
  45. select count(*) into :cnt from sys_ct_data where ct_datetime > :max_eddt and ct_datetime < :arg_bgdt;
  46. if sqlca.sqlcode<>0 then
  47. arg_msg='查询日期失败'
  48. rslt=0
  49. goto ext
  50. end if
  51. if cnt > 0 then
  52. arg_msg='当前导出开始时间:'+string(arg_bgdt,'yyyy-mm-dd hh:mm:ss')+'与历史导出最大时间:'+string(max_eddt,'yyyy-mm-dd hh:mm:ss') + '之间还有数据未导出,不能导出数据'
  53. rslt=0
  54. goto ext
  55. end if
  56. end if
  57. end if
  58. ext:
  59. return rslt
  60. end function
  61. public function integer check_no_finish (datetime arg_ctdt, ref string arg_log, ref string arg_msg);//检查截数前未完成事项
  62. //check_no_finish(arg_ctdt,arg_log,arg_msg)
  63. Int rslt = 1
  64. Int arr_cnt
  65. Long exprot_suc = 0,export_fail = 0,lg_rowcount
  66. String str_dwSQl,str_SyntaxFromSQL
  67. String ls_msg
  68. String char_enter
  69. DataStore ds_data
  70. ds_data = CREATE DataStore
  71. Long arg_bgint,arg_edint
  72. char_enter = Char(13)+Char(10) //换行符
  73. s_yfct s_ctmx[]
  74. f_init_cttbinfo(arg_ctdt,arg_bgint,arg_edint,s_ctmx[])
  75. arr_cnt = UpperBound(s_ctmx)
  76. Open(w_sys_wait_jdt) //初始化进度条
  77. w_sys_wait_jdt.Show()
  78. w_sys_wait_jdt.wf_accepttol(arr_cnt)
  79. Int i
  80. FOR i = 1 TO arr_cnt
  81. ds_data.Reset()
  82. if s_ctmx[i].ctbname = '' then continue
  83. w_sys_wait_jdt.st_msg.Text = "正在检查 "+s_ctmx[i].ctbname+"..." //进度信息
  84. str_dwSQl = "select * "+s_ctmx[i].fromstr + s_ctmx[i].checkstr + s_ctmx[i].linkstr
  85. ls_msg = ""
  86. str_SyntaxFromSQL = sqlca.SyntaxFromSQL(str_dwSQl,"style(type=grid)",ls_msg)
  87. IF ls_msg > '' THEN
  88. arg_msg = "["+s_ctmx[i].etbname+"]"+"dw语法生成失败 ("+str_dwSQl+')'
  89. arg_log = arg_log+arg_msg+char_enter
  90. GOTO nexttable
  91. END IF
  92. ds_data.Create(str_SyntaxFromSQL,ls_msg)
  93. IF ls_msg > '' THEN
  94. arg_msg = "["+s_ctmx[i].etbname+"]"+"建立相关DW失败 ("+str_dwSQl+')'
  95. arg_log = arg_log+arg_msg+char_enter
  96. GOTO nexttable
  97. END IF
  98. ds_data.SetTransObject(sqlca)
  99. lg_rowcount = ds_data.Retrieve()
  100. arg_log = arg_log+">"+String(lg_rowcount)+" {"+s_ctmx[i].ctbname+"}"+" ["+str_dwSQl+"]"+char_enter
  101. nexttable:
  102. w_sys_wait_jdt.wf_inc(i) //进度
  103. NEXT
  104. Close(w_sys_wait_jdt)
  105. RETURN rslt
  106. end function
  107. public function integer pf_writetifofile (string arg_tableinfo, string arg_objfilename, ref string arg_msg);//pf_writetifofile(arg_tableinfo,arg_objfilename,arg_msg)
  108. integer li_FileNum,rslt=1,ls_jh
  109. li_FileNum = FileOpen( arg_objfilename,StreamMode!, Write!, LockWrite!, Replace!)
  110. if li_FileNum<=0 then
  111. arg_msg="打开文件"+arg_objfilename+"失败"
  112. rslt=0
  113. fileclose(li_FileNum)
  114. goto ext
  115. end if
  116. ls_jh=FileWrite(li_FileNum, arg_tableinfo)
  117. if ls_jh<=0 then
  118. arg_msg="写文件"+arg_objfilename+"失败"
  119. rslt=0
  120. fileclose(li_FileNum)
  121. goto ext
  122. end if
  123. fileclose(li_FileNum)
  124. ext:
  125. return rslt
  126. end function
  127. public function integer add_ct_datamx (long arg_ct_id, datetime arg_bg_dt, datetime arg_ed_dt, long arg_err_num, long arg_ct_delerrnum, ref string arg_msg, integer arg_type, transaction arg_sqlca);//新建/更新导出明细
  128. //add_ct_datamx(arg_ct_id,arg_bg_dt,arg_ed_dt,arg_err_num,arg_ct_delerrnum,arg_msg,arg_type,arg_sqlca)
  129. //arg_ct_id 0:新建,>0:更新
  130. //arg_type 0:文件导入导出,1:管道导入导入
  131. if arg_ct_id=0 then
  132. insert into sys_ct_datamx(ct_stdt,ct_eddt,ct_errnum,ct_delerrnum,ct_type)
  133. values(:arg_bg_dt,:arg_ed_dt,:arg_err_num,0,:arg_type) using arg_sqlca;
  134. else
  135. update sys_ct_datamx set ct_delerrnum=:arg_ct_delerrnum where ct_id=:arg_ct_id using arg_sqlca;
  136. end if
  137. if arg_sqlca.sqlcode <> 0 then
  138. rollback;
  139. arg_msg='更新截数提取日志失败'
  140. return 0
  141. else
  142. commit;
  143. return 1
  144. end if
  145. end function
  146. public function integer init_ct (boolean arg_ifcheck_dt, datetime arg_ctdt, ref string arg_msg, ref string arg_log, boolean arg_ifcommit);//设定截数时间
  147. //init_ct(arg_ctdt,arg_msg)
  148. Int rslt = 1,cnt
  149. Long ls_ct_dateint
  150. Long arg_sucnum
  151. String char_enter
  152. char_enter = Char(13)+Char(10) //换行符
  153. IF arg_ifcheck_dt THEN
  154. //检查当日是否已截数
  155. SELECT count(*) INTO :cnt FROM sys_ct_data
  156. WHERE year(ct_datetime) = year(:arg_ctdt)
  157. AND month(ct_datetime) = month(:arg_ctdt)
  158. AND Day(ct_datetime) = Day(:arg_ctdt);
  159. IF sqlca.SQLCode <> 0 THEN
  160. arg_msg = '查询日期 '+String(arg_ctdt,'yyyy-mm-dd') +'是否已设定为截数日期失败'
  161. rslt = 0
  162. GOTO ext
  163. END IF
  164. IF cnt > 0 THEN
  165. arg_msg = '日期 '+String(arg_ctdt,'yyyy-mm-dd') +'已设定为截数日期,不能重复设定'
  166. rslt = 0
  167. GOTO ext
  168. END IF
  169. //检查截数
  170. cnt = 0
  171. SELECT count(*) INTO :cnt FROM sys_ct_data
  172. Where ct_datetime > :arg_ctdt;
  173. IF sqlca.SQLCode <> 0 THEN
  174. arg_msg = '查询日期 '+String(arg_ctdt,'yyyy-mm-dd') +'是否已设定为截数日期失败'
  175. rslt = 0
  176. GOTO ext
  177. END IF
  178. IF cnt > 0 THEN
  179. arg_msg = '日期 '+String(arg_ctdt,'yyyy-mm-dd') +'之后已有截数日期,不能重复设定'
  180. rslt = 0
  181. GOTO ext
  182. END IF
  183. //
  184. ls_ct_dateint = Long(String(arg_ctdt,'yyyymmdd'))
  185. INSERT INTO sys_ct_data(ct_dateint,ct_datetime,ct_num)
  186. Values(:ls_ct_dateint,:arg_ctdt,0);
  187. IF sqlca.SQLCode <> 0 THEN
  188. arg_msg = '新建截数时间记录失败>>'+sqlca.SQLErrText
  189. rslt = 0
  190. GOTO ext
  191. END IF
  192. ELSE
  193. ls_ct_dateint = Long(String(arg_ctdt,'yyyymmdd'))
  194. END IF
  195. //更新表wagemth字段
  196. //1.财务表[已结清]
  197. //2.工资表[已审核]
  198. //3.进出仓表[已结存,财务已审]
  199. //4.不参与结存的in_out表
  200. Int arr_cnt
  201. Long arg_bgint,arg_edint
  202. s_yfct s_ctmx[]
  203. f_init_cttbinfo(arg_ctdt,arg_bgint,arg_edint,s_ctmx[])
  204. arr_cnt = UpperBound(s_ctmx)
  205. Open(w_sys_wait_jdt) //初始化进度条
  206. w_sys_wait_jdt.Show()
  207. w_sys_wait_jdt.wf_accepttol(arr_cnt)
  208. long i
  209. FOR i = 1 TO arr_cnt
  210. if s_ctmx[i].etbname = '' then continue
  211. w_sys_wait_jdt.st_msg.Text = s_ctmx[i].ctbname+" 正在更新标记..." //进度信息
  212. IF p_update_ctmint(s_ctmx[i].etbname,s_ctmx[i].ctbname,s_ctmx[i].wherestr,s_ctmx[i].fromstr,s_ctmx[i].linkstr,ls_ct_dateint,arg_msg,arg_sucnum) = 0 THEN
  213. rslt = 0
  214. GOTO ext
  215. END IF
  216. arg_log = arg_log + "> "+String(arg_sucnum)+ " ["+s_ctmx[i].ctbname+"] 截数成功"+char_enter
  217. w_sys_wait_jdt.wf_inc(i) //进度
  218. NEXT
  219. ext:
  220. IF rslt = 0 THEN
  221. ROLLBACK;
  222. ELSEIF rslt = 1 AND arg_ifcommit THEN
  223. COMMIT;
  224. END IF
  225. Close(w_sys_wait_jdt)
  226. RETURN rslt
  227. end function
  228. public function integer del_ct_data (datetime arg_edctdt, long arg_ct_id, long arg_bg_int, long arg_ed_int, integer arg_commit_step, ref string arg_msg, ref string arg_log, boolean arg_if_buildlogfile);//删除已成功截数且已成功导出的数据
  229. //del_ct_data(arg_bg_int,arg_ed_int,arg_commit_step,arg_msg,arg_log)
  230. Int rslt = 1
  231. Int arr_cnt
  232. Long suc = 0,fail = 0,lg_rowcount
  233. String str_dwSQl,str_SyntaxFromSQL
  234. String ls_msg
  235. String char_enter
  236. DataStore ds_data
  237. ds_data = CREATE DataStore
  238. Long max_delid,min_delid,tmp_maxid,tmp_minid
  239. String ls_ptbname //主表名
  240. String ls_delid //删除ID
  241. String err_tbname,etbname
  242. String del_comm,delstring,wherestring
  243. char_enter = Char(13)+Char(10) //换行符
  244. s_yfct s_ctmx[]
  245. f_init_cttbinfo(arg_edctdt,arg_bg_int,arg_ed_int,s_ctmx[])
  246. arr_cnt = UpperBound(s_ctmx)
  247. Open(w_sys_wait_2jdt)
  248. w_sys_wait_2jdt.Show()
  249. w_sys_wait_2jdt.wf_accepttol(arr_cnt) //初始化进度条1
  250. w_sys_wait_2jdt.wf_accepttol2(0) //初始化进度条2
  251. Int i
  252. FOR i = 1 TO arr_cnt
  253. IF s_ctmx[i].etbname <> '' THEN
  254. ds_data.Reset()
  255. ls_ptbname = ''
  256. w_sys_wait_2jdt.st_msg.Text = "正在删除 "+s_ctmx[i].ctbname+"..." //进度信息
  257. etbname = s_ctmx[i].etbname
  258. //1.取表名
  259. ls_ptbname = s_ctmx[i].etbname
  260. ls_delid = s_ctmx[i].delid
  261. //2.取最大、最小删除ID
  262. str_dwSQl = "select max("+ls_delid+") as maxid,min("+ls_delid+") as minid from "+ls_ptbname + s_ctmx[i].delstr
  263. ls_msg = ""
  264. str_SyntaxFromSQL = sqlca.SyntaxFromSQL(str_dwSQl,"style(type=grid)",ls_msg)
  265. IF ls_msg > '' THEN
  266. arg_msg = "> 0 ["+ls_ptbname+"]dw语法生成失败"
  267. err_tbname = ls_ptbname
  268. arg_log = arg_log+arg_msg+char_enter
  269. GOTO nexttable
  270. END IF
  271. ds_data.Create(str_SyntaxFromSQL,ls_msg)
  272. IF ls_msg > '' THEN
  273. arg_msg = "> 0 ["+ls_ptbname+"]建立相关DW失败"
  274. err_tbname = ls_ptbname
  275. arg_log = arg_log+arg_msg+char_enter
  276. GOTO nexttable
  277. END IF
  278. ds_data.SetTransObject(sqlca)
  279. lg_rowcount = ds_data.Retrieve()
  280. max_delid = ds_data.Object.maxid[1]
  281. min_delid = ds_data.Object.minid[1]
  282. IF IsNull(max_delid) THEN max_delid = 0
  283. IF IsNull(min_delid) THEN min_delid = 0
  284. IF max_delid = 0 AND min_delid = 0 THEN
  285. arg_msg = "> 0 ["+etbname+"]没有可删除的数据"
  286. arg_log = arg_log+arg_msg+char_enter
  287. GOTO nexttable
  288. END IF
  289. //3.根据删除步长删除
  290. IF max_delid - min_delid < arg_commit_step THEN
  291. delstring = "delete from " + etbname + s_ctmx[i].delstr
  292. wherestring = " and "+ls_delid+" >= "+String(min_delid)+" and "+ls_delid+" <= "+String(max_delid)
  293. del_comm = delstring + wherestring
  294. EXECUTE IMMEDIATE :del_comm ;
  295. IF sqlca.SQLCode <> 0 THEN
  296. arg_msg = "> 0 ["+etbname+"]删除数据失败 ["+del_comm+"]"
  297. err_tbname = ls_ptbname
  298. arg_log = arg_log+arg_msg+char_enter
  299. fail++
  300. GOTO nexttable
  301. ELSE
  302. suc = suc + sqlca.SQLNRows
  303. arg_msg = "> "+String(sqlca.SQLNRows)+" ["+etbname+"]"+"删除数据成功"+" ["+del_comm+"]"
  304. arg_log = arg_log+arg_msg+char_enter
  305. END IF
  306. ELSE
  307. tmp_maxid = min_delid + arg_commit_step
  308. tmp_minid = min_delid
  309. w_sys_wait_2jdt.wf_accepttol2(Ceiling((max_delid - min_delid)/arg_commit_step)) //初始化进度条2
  310. DO WHILE tmp_maxid <= max_delid
  311. delstring = "delete from " + etbname + s_ctmx[i].delstr
  312. wherestring = " and "+ls_delid+" >= "+String(tmp_minid)+" and "+ls_delid+" <= "+String(tmp_maxid)
  313. del_comm = delstring + wherestring
  314. EXECUTE IMMEDIATE :del_comm ;
  315. IF sqlca.SQLCode <> 0 THEN
  316. arg_msg = "> 0 ["+etbname+"]"+"删除数据失败"+" ["+del_comm+"]"
  317. err_tbname = ls_ptbname
  318. arg_log = arg_log+arg_msg+char_enter
  319. fail++
  320. GOTO nexttable
  321. ELSE
  322. suc = suc + sqlca.SQLNRows
  323. arg_msg = "> "+String(sqlca.SQLNRows)+" ["+etbname+"]删除数据成功 ["+del_comm+"]"
  324. arg_log = arg_log+arg_msg+char_enter
  325. END IF
  326. COMMIT;
  327. w_sys_wait_2jdt.wf_inc2(Ceiling((tmp_maxid - min_delid)/arg_commit_step)) //进度1
  328. IF tmp_maxid = max_delid THEN GOTO nexttable
  329. tmp_minid = tmp_maxid
  330. IF tmp_maxid + arg_commit_step >= max_delid THEN
  331. tmp_maxid = max_delid
  332. ELSE
  333. tmp_maxid = tmp_maxid + arg_commit_step
  334. END IF
  335. LOOP
  336. END IF
  337. nexttable:
  338. COMMIT;
  339. END IF
  340. w_sys_wait_2jdt.wf_inc(i) //进度1
  341. NEXT
  342. arg_log = arg_log+"数据删除:成功-"+String(suc)+",失败-"+String(fail)+char_enter
  343. //更新删除表
  344. IF fail > 0 AND arg_ct_id > 0 THEN
  345. DateTime arg_bg_changetime,arg_ed_changetime
  346. IF add_ct_datamx(arg_ct_id,arg_bg_changetime,arg_ed_changetime,0,fail,arg_msg,0,sqlca) = 0 THEN
  347. arg_log = arg_log+arg_msg+char_enter
  348. END IF
  349. END IF
  350. //建立日志
  351. String ct_path,ls_filepathname
  352. Long li_FileNum
  353. security_attributes ls_security_attributes
  354. String filelog
  355. ct_path = "ctdellog"
  356. filelog = '删除'+String(arg_bg_int)+' - '+String(arg_ed_int)+char_enter + arg_log
  357. li_FileNum = CreateDirectory(sys_cur_path+ct_path,ls_security_attributes)
  358. ls_filepathname = sys_cur_path+ct_path+'\'+"LongJoe_CTD"+String(Today(),'yyyymmdd')+String(Now(),'hhmmss')+".log"
  359. IF arg_if_buildlogfile THEN
  360. rslt = pf_writetifofile(filelog,ls_filepathname,arg_msg)
  361. IF rslt = 0 THEN
  362. arg_msg = "写日志文件失败>>"+arg_msg
  363. rslt = 1
  364. END IF
  365. END IF
  366. Close(w_sys_wait_2jdt)
  367. RETURN rslt
  368. end function
  369. private function integer p_update_ctmint (string arg_etbname, string arg_ctbname, string arg_wherestr, string arg_fromstr, string arg_linkstr, long arg_value, ref string arg_msg, ref long arg_sucnum);//更新截数标记
  370. //p_update_ctmint(arg_etbname,arg_ctbname,arg_wherestr,arg_value,arg_msg,arg_sucnum)
  371. int rslt=1
  372. string update_comm
  373. update_comm='update '+ arg_etbname + ' set ' + arg_etbname + '.ctmint = ' + string(arg_value)
  374. update_comm=update_comm + arg_fromstr + arg_wherestr + arg_linkstr
  375. //if arg_etbname = 'u_inware' then messagebox('',update_comm)
  376. Execute immediate :update_comm ;
  377. if sqlca.sqlcode <> 0 then
  378. arg_msg='更新表:' + arg_ctbname + ' 截数标记失败>>'+sqlca.sqlerrtext
  379. rslt=0
  380. goto ext
  381. end if
  382. arg_sucnum=sqlca.sqlnrows
  383. ext:
  384. return rslt
  385. end function
  386. on uo_yfct.create
  387. call super::create
  388. TriggerEvent( this, "constructor" )
  389. end on
  390. on uo_yfct.destroy
  391. TriggerEvent( this, "destructor" )
  392. call super::destroy
  393. end on