uo_yfimex.sru 84 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613
  1. $PBExportHeader$uo_yfimex.sru
  2. forward
  3. global type uo_yfimex from nonvisualobject
  4. end type
  5. end forward
  6. global type uo_yfimex from nonvisualobject
  7. end type
  8. global uo_yfimex uo_yfimex
  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. private:
  15. DataStore FilterData,ds_data
  16. int relt=0
  17. string msg=""
  18. int i=0,j=0
  19. string importtempfilepath='importtmp'
  20. string exporttempfilepath='exporttmp'
  21. string exportlogpath='exportlog'
  22. string importlogpath='importlog'
  23. string inceptpath='inceptdata'
  24. string incepttmpfile='_inceptdata.tmp'
  25. blob blbdw_data
  26. string sys_changetime="sys_changetime"
  27. string sys_changeflag="sys_changeflag"
  28. string infofilename="_table_info.ifo" //传递的信息文件
  29. string dts_deletelog="dts_deletelog" //删除日志表
  30. int len_headinfo=100 //头长度
  31. end variables
  32. forward prototypes
  33. public function string iuf_getdwvalue (datastore dw, integer urow, integer ucolumn)
  34. private function integer uf_zipfile (string fpath[], string arg_objfilename, ref string a_msg)
  35. private function integer pf_writetifofile (string arg_tableinfo, string arg_objfilename, ref string arg_msg)
  36. private function string pf_readtifofile (string arg_objfilename, ref string arg_msg)
  37. private function integer uf_unzipfile (string arg_zipfilename, string arg_objfilepath, ref string a_msg)
  38. public function integer si_newsendout (ref transaction arg_transaction, string arg_objfilename, string arg_dptmname, string arg_dscrp, string arg_emp, ref string arg_msg)
  39. public function integer si_autoincept_data (ref transaction arg_incept_transaction, ref transaction arg_import_transaction, ref string arg_msg, ref string arg_log)
  40. public function integer f_importdata (ref transaction arg_transaction, string arg_objzipfilename, integer arg_commitstep, boolean arg_if_buildlogfile, ref string arg_log, ref string arg_msg, ref integer arg_errflag)
  41. public function integer si_delete_dtrec (transaction arg_transaction, long arg_dt_id, ref string arg_msg)
  42. public function integer f_init_syscurpath (ref string arg_msg)
  43. public function integer si_incept_data (ref transaction arg_incept_transaction, ref transaction arg_import_transaction, long arg_dt_id, ref string arg_msg, ref string arg_log)
  44. public function integer si_reset_dtrec (transaction arg_transaction, long arg_dt_id, ref string arg_msg)
  45. public function integer uf_setrsl_trandt (transaction arg_transaction, long arg_scid, string arg_tablename, datetime arg_d_newlydt, datetime arg_dg_newlydt, ref string arg_msg)
  46. public function integer si_cnt_database_incept (ref transaction arg_dataincept_sqlca, ref string arg_msg)
  47. public function integer uf_getrsl_trandt (transaction arg_transaction, long arg_scid, string arg_tablename, ref datetime arg_d_newlydt, ref datetime arg_dg_newlydt, ref string arg_msg)
  48. public function integer f_trandata_online (long arg_scid, ref transaction arg_transaction, ref transaction arg_obj_transaction, s_exporttableinfo arg_zipfileinfo[300], integer arg_tableno, boolean arg_if_usedefaultdt, datetime arg_bg_changetime, datetime arg_ed_changetime, integer arg_commitstep, boolean arg_if_buildlogfile, ref string arg_msg, ref string arg_log)
  49. public function integer f_tranmstpdata_online (ref transaction arg_transaction, ref transaction arg_obj_transaction, s_exporttableinfo arg_zipfileinfo[300], integer arg_tableno, boolean arg_if_buildlogfile, ref string arg_msg, ref string arg_log)
  50. public function integer f_exportdata (transaction arg_transaction, s_exporttableinfo arg_zipfileinfo[300], integer arg_tableno, datetime arg_bg_changetime, datetime arg_ed_changetime, integer arg_usechangetime, integer arg_getflag, string arg_exportfilename, boolean arg_if_buildlogfile, ref string arg_msg, ref string arg_log)
  51. public function integer f_exportdata_blob (integer arg_usechangetime, datetime arg_bg_changtime, datetime arg_ed_changtime, string arg_exportfilename, string arg_exportbfilename, integer arg_info, ref string arg_msg)
  52. public function integer f_delzipfile (string arg_exportfilename, ref string arg_msg)
  53. public function integer f_importdata_blob (string arg_importfilename, string arg_zipfile, ref integer arg_info, ref integer arg_usechangetime, ref datetime arg_bg_changetime, ref datetime arg_ed_changtime, ref string arg_msg)
  54. end prototypes
  55. public function string iuf_getdwvalue (datastore dw, integer urow, integer ucolumn);//iuf_getdwvalue(datastore dw,integer uRow,int uColumn)
  56. string reStr
  57. choose case trim(left(lower(dw.describe("#"+string(uColumn)+".ColType")),5))
  58. case "char("
  59. //reStr="'"+string(dw.GetItemString(uRow,uColumn))+"'"
  60. reStr="'"+f_replacestr(string(dw.GetItemString(uRow,uColumn)),"'","'+char(39)+'")+"'"
  61. if isnull(reStr) then reStr="''"
  62. case "date"
  63. reStr="'"+string(dw.GetItemDate(uRow,uColumn))+"'"
  64. if isnull(reStr) then reStr=" NULL "
  65. case "datet"
  66. reStr="'"+string(dw.GetItemDatetime(uRow,uColumn))+"'"
  67. if isnull(reStr) then reStr=" NULL "
  68. case "decim"
  69. reStr=string(dw.GetItemDecimal(uRow,uColumn))
  70. if isnull(reStr) then reStr="0"
  71. case "int","long","numbe","real","ulong"
  72. reStr=string(dw.GetItemNumber(uRow,uColumn))
  73. if isnull(reStr) then reStr="0"
  74. case "time","times"
  75. reStr="'"+string(dw.GetItemTime(uRow,uColumn))+"'"
  76. if isnull(reStr) then reStr=" NULL "
  77. case else
  78. reStr="[err]"
  79. end choose
  80. return reStr
  81. end function
  82. private function integer uf_zipfile (string fpath[], string arg_objfilename, ref string a_msg);//uf_zipfile()
  83. long ll_status=0,ls_i=0
  84. OLEObject ZIPObject
  85. relt=1
  86. ZIPObject = CREATE OLEObject
  87. ll_status = ZIPObject.ConnectToNewObject("CGZiplibrary.CGZipfiles")
  88. if ll_status<0 then
  89. relt=0
  90. choose case ll_status
  91. case -1
  92. a_msg="Invalid Call: the argument is the Object property of a control"
  93. case -2
  94. a_msg="Class name not found"
  95. case -3
  96. a_msg="Object could not be created"
  97. case -4
  98. a_msg="Could not connect to object"
  99. case -9
  100. a_msg="Other error"
  101. end choose
  102. goto ext
  103. end if
  104. arg_objfilename = Trim(arg_objfilename)
  105. If Pos(arg_objfilename, ":\") <= 0 Then
  106. a_msg= "必须输入完整的目标文件文件路径."
  107. relt=0
  108. GoTo ext
  109. End If
  110. ZIPObject.ZipFileName = arg_objfilename
  111. ZIPObject.UpdatingZip = False // ensures a new zip is created
  112. if upperbound(fpath)=0 then
  113. a_msg= "无压缩文件列表."
  114. relt=0
  115. GoTo ext
  116. end if
  117. For ls_i = 1 To upperbound(fpath)
  118. ZIPObject.AddFile(fpath[ls_i])
  119. Next
  120. if ZIPObject.MakeZipFile()<>0 then
  121. relt=0
  122. a_msg="压缩文件失败!"+ZIPObject.GetLastMessage
  123. goto ext
  124. end if
  125. ext:
  126. destroy ZIPObject
  127. return relt
  128. end function
  129. private function integer pf_writetifofile (string arg_tableinfo, string arg_objfilename, ref string arg_msg);//pf_writetifofile(arg_tableinfo,arg_objfilename,arg_msg)
  130. integer li_FileNum,rslt=1,ls_jh
  131. li_FileNum = FileOpen( arg_objfilename,StreamMode!, Write!, LockWrite!, Replace!)
  132. if li_FileNum<=0 then
  133. arg_msg="打开文件"+infofilename+"失败"
  134. rslt=0
  135. fileclose(li_FileNum)
  136. goto ext
  137. end if
  138. ls_jh=FileWrite(li_FileNum, arg_tableinfo)
  139. if ls_jh<=0 then
  140. arg_msg="写文件"+infofilename+"失败"
  141. rslt=0
  142. fileclose(li_FileNum)
  143. goto ext
  144. end if
  145. fileclose(li_FileNum)
  146. ext:
  147. return rslt
  148. end function
  149. private function string pf_readtifofile (string arg_objfilename, ref string arg_msg);//pf_readtifofile(arg_objfilename,arg_msg)
  150. integer li_FileNum,rslt=1,ls_jh
  151. long ll_FLength
  152. string str_objstr=""
  153. ll_FLength = FileLength(arg_objfilename)
  154. li_FileNum = FileOpen( arg_objfilename,StreamMode!)
  155. if li_FileNum<=0 then
  156. arg_msg="打开文件"+infofilename+"失败"
  157. rslt=0
  158. fileclose(li_FileNum)
  159. goto ext
  160. end if
  161. if not ll_FLength<32767 then
  162. arg_msg="读文件"+infofilename+"失败,文件超长"
  163. rslt=0
  164. fileclose(li_FileNum)
  165. goto ext
  166. end if
  167. ls_jh=Fileread(li_FileNum, str_objstr)
  168. if ls_jh<=0 then
  169. arg_msg="读文件"+infofilename+"失败"
  170. rslt=0
  171. fileclose(li_FileNum)
  172. goto ext
  173. end if
  174. fileclose(li_FileNum)
  175. ext:
  176. if rslt=0 then
  177. str_objstr=""
  178. end if
  179. return str_objstr
  180. end function
  181. private function integer uf_unzipfile (string arg_zipfilename, string arg_objfilepath, ref string a_msg);//uf_unzipfile(arg_zipfilename,arg_objfilepath,a_msg)
  182. long ll_status=0,ls_i=0
  183. OLEObject ZIPObject
  184. relt=1
  185. ZIPObject = CREATE OLEObject
  186. ll_status = ZIPObject.ConnectToNewObject("CGZiplibrary.CGUnzipFiles")
  187. if ll_status<0 then
  188. relt=0
  189. choose case ll_status
  190. case -1
  191. a_msg="Invalid Call: the argument is the Object property of a control"
  192. case -2
  193. a_msg="Class name not found"
  194. case -3
  195. a_msg="Object could not be created"
  196. case -4
  197. a_msg="Could not connect to object"
  198. case -9
  199. a_msg="Other error"
  200. end choose
  201. goto ext
  202. end if
  203. if not FileExists (arg_zipfilename) then
  204. a_msg= "UnZipFiles>>无效的文件名"
  205. relt=0
  206. GoTo ext
  207. end if
  208. If Pos( arg_objfilepath, ".") > 0 Then
  209. a_msg= "UnZipFiles>> 无效的文件存放目录路径."
  210. relt=0
  211. GoTo ext
  212. ElseIf pos( arg_objfilepath, ":") <= 0 Then
  213. a_msg= "UnZipFiles>> 必须输入完整的目标文件存放目录路径."
  214. relt=0
  215. GoTo ext
  216. End If
  217. ZIPObject.ZipFileName = arg_zipfilename
  218. ZIPObject.ExtractDir = arg_objfilepath
  219. // Keep Directory Structure of Zip
  220. ZIPObject.HonorDirectories = False
  221. // Unzip and Display any errors as required
  222. If ZIPObject.Unzip() <> 0 Then
  223. relt=0
  224. a_msg="UnZip>> 无法解压文件 " + arg_zipfilename + " :" + ZIPObject.GetLastMessage
  225. goto ext
  226. End If
  227. ext:
  228. destroy ZIPObject
  229. return relt
  230. end function
  231. public function integer si_newsendout (ref transaction arg_transaction, string arg_objfilename, string arg_dptmname, string arg_dscrp, string arg_emp, ref string arg_msg);//si_newsendout(arg_transaction,arg_objfilename,arg_dptmname,arg_dscrp,arg_emp,arg_msg)
  232. //
  233. //读入目标文件
  234. //新建数据传递记录
  235. //取得新记录id
  236. //上传数据包
  237. //arg_transaction
  238. long rslt=1
  239. blob b_objfiledata,b_part
  240. integer li_FileNum,ls_i,bytes_read
  241. long flen,loops,new_dt_id,flen_k
  242. datetime new_dt
  243. long ll_status=0,ls_j,ls_k
  244. OLEObject blobcolumnupdateObject
  245. char BuffArr[]
  246. // blobcolumnupdate.blobupdate
  247. if isnull(arg_objfilename) or trim(arg_objfilename)='' then
  248. rslt=0
  249. arg_msg='非有效文件名'
  250. goto ext
  251. end if
  252. if isnull(arg_dscrp) then arg_dscrp=''
  253. if isnull(arg_dptmname) or trim(arg_dptmname)='' then
  254. rslt=0
  255. arg_msg='非有效上传部门名称'
  256. goto ext
  257. end if
  258. if isnull(arg_emp) or trim(arg_emp)='' then
  259. rslt=0
  260. arg_msg='非有效操作员名称'
  261. goto ext
  262. end if
  263. if not FileExists(arg_objfilename) then
  264. rslt=0
  265. arg_msg='目标文件不存在'
  266. goto ext
  267. end if
  268. SetPointer(HourGlass!)
  269. //// Get the file length, and open the file
  270. //flen = FileLength(arg_objfilename)
  271. //flen_k=flen/1024
  272. //li_FileNum = FileOpen(arg_objfilename,StreamMode!, Read!, LockRead!)
  273. //if li_FileNum = -1 then
  274. // rslt=0
  275. // arg_msg='目标文件打开失败'
  276. // goto ext
  277. //end if
  278. //
  279. //
  280. ////// Determine how many times to call FileRead
  281. //IF flen > 32765 THEN
  282. // IF Mod(flen, 32765) = 0 THEN
  283. // loops = flen/32765
  284. // ELSE
  285. // loops = (flen/32765) + 1
  286. // END IF
  287. //ELSE
  288. // loops = 1
  289. //END IF
  290. ////// Read the file
  291. //
  292. //FOR ls_i = 1 to loops
  293. // bytes_read = FileRead(li_FileNum, b_part)
  294. // b_objfiledata=b_objfiledata+b_part
  295. //NEXT
  296. //
  297. //FileClose(li_FileNum)
  298. //使用com: blobcolumnupdate.blobupdate
  299. blobcolumnupdateObject = CREATE OLEObject
  300. ll_status = blobcolumnupdateObject.ConnectToNewObject("blobcolumnupdate.blobupdate")
  301. if ll_status<0 then
  302. rslt=0
  303. choose case ll_status
  304. case -1
  305. arg_msg="Invalid Call: the argument is the Object property of a control"
  306. case -2
  307. arg_msg="Class name not found"
  308. case -3
  309. arg_msg="Object could not be created"
  310. case -4
  311. arg_msg="Could not connect to object"
  312. case -9
  313. arg_msg="Other error"
  314. end choose
  315. goto ext
  316. end if
  317. if not blobcolumnupdateObject.connectdb(arg_transaction.Database,arg_transaction.LogID,arg_transaction.LogPass,arg_transaction.ServerName ) then
  318. rslt=0
  319. arg_msg='数据库连接失败>blobcolumnupdate.blobupdate'
  320. goto ext
  321. end if
  322. ///
  323. SELECT top 1 getdate() as new_dt
  324. INTO :new_dt
  325. FROM sysobjects using arg_transaction ;
  326. if arg_transaction.sqlcode<>0 then
  327. rslt=0
  328. arg_msg='提取当前时间操作失败(借用sysobjects)'+arg_transaction.sqlerrtext
  329. goto ext
  330. end if
  331. INSERT INTO Dt_dataincept
  332. ( Incepttime,
  333. Sendout_emp,
  334. Sendout_dptm,
  335. Update_flag,
  336. Wrongdata_flag,
  337. Dscrp)
  338. VALUES ( :new_dt,
  339. :arg_emp,
  340. :arg_dptmname,
  341. 0,
  342. 0,
  343. :arg_dscrp )
  344. using arg_transaction ;
  345. if arg_transaction.sqlcode<>0 then
  346. rslt=0
  347. arg_msg='插入新数据传送记录失败>'+arg_transaction.sqlerrtext
  348. rollback using arg_transaction;
  349. goto ext
  350. end if
  351. select max(dt_id) as dt_id into :new_dt_id from Dt_dataincept
  352. where Incepttime=:new_dt
  353. using arg_transaction ;
  354. if arg_transaction.sqlcode<>0 then
  355. rslt=0
  356. arg_msg='查询新唯一码操作失败'+arg_transaction.sqlerrtext
  357. rollback using arg_transaction;
  358. goto ext
  359. end if
  360. commit using arg_transaction;
  361. if not blobcolumnupdateObject.WriteFileDataToBLOB(arg_msg,'Dt_dataincept', 'dt_data', arg_objfilename , '(dt_id = '+string(new_dt_id)+')') then
  362. rslt=0
  363. messagebox('系统提示','写入数据包操作失败>'+arg_msg)
  364. goto ext
  365. end if
  366. //flen_k
  367. //UPDATEBLOB Dt_dataincept SET dt_data=:b_objfiledata
  368. // WHERE dt_id = :new_dt_id
  369. // USING arg_transaction ;
  370. // if arg_transaction.sqlnrows=0 then
  371. // rslt=0
  372. // arg_msg='写入数据包操作失败>'+arg_transaction.sqlerrtext
  373. // rollback using arg_transaction;
  374. //
  375. // goto ext
  376. //end if
  377. //messagebox(string(new_dt_id)+' '+string(len(b_objfiledata))+' '+string(arg_transaction.sqlnrows),string(arg_transaction.SQLErrText))
  378. rslt=new_dt_id
  379. ext:
  380. DESTROY blobcolumnupdateObject
  381. return rslt
  382. end function
  383. public function integer si_autoincept_data (ref transaction arg_incept_transaction, ref transaction arg_import_transaction, ref string arg_msg, ref string arg_log);//si_autoincept_data
  384. //
  385. //取得临时文件全路径
  386. //提取最早上传的数据包记录ID
  387. //提取数据包
  388. //写临时文件
  389. //调用更新函数
  390. long rslt=1,ls_jh
  391. long obj_dt_id=0,li_FileNum,fend,fend_t,ls_i,do_arrow=0
  392. string cur_path,ls_str
  393. string obj_incept_tmp_file
  394. blob b_dtdata, b_dtdata_p
  395. int import_err_int=0
  396. datetime ls_dt
  397. arg_msg=''
  398. setnull(b_dtdata)
  399. arg_log=''
  400. //取得当前绝对路径
  401. cur_path=sys_cur_path
  402. do_arrow=long(ProfileString (sys_inifilename,'si_autoincept_data', "arrow",'0'))
  403. obj_incept_tmp_file=cur_path+inceptpath+'\'+incepttmpfile
  404. ///////////提取最早上传的数据包记录ID
  405. if do_arrow=0 then
  406. SELECT min(Dt_id) as dt_id
  407. INTO :obj_dt_id
  408. FROM Dt_dataincept
  409. WHERE ( Dt_dataincept.Update_flag = 0 ) AND
  410. ( Dt_dataincept.Wrongdata_flag = 0 )
  411. using arg_incept_transaction ;
  412. else
  413. SELECT max(Dt_id) as dt_id
  414. INTO :obj_dt_id
  415. FROM Dt_dataincept
  416. WHERE ( Dt_dataincept.Update_flag = 0 ) AND
  417. ( Dt_dataincept.Wrongdata_flag = 0 )
  418. using arg_incept_transaction ;
  419. end if
  420. if arg_incept_transaction.sqlcode<>0 and arg_incept_transaction.sqlcode<>100 then
  421. rslt=0
  422. arg_msg='查询未执行更新的数据传送记录操作失败>'+arg_incept_transaction.sqlerrtext
  423. goto ext
  424. elseif arg_incept_transaction.sqlcode=100 then
  425. rslt=0
  426. arg_msg=''
  427. goto ext
  428. end if
  429. if obj_dt_id>0 then
  430. SELECT Dt_dataincept.Incepttime ,
  431. '/'+ltrim(rtrim(Dt_dataincept.Sendout_emp))+'/'+ltrim(rtrim(Dt_dataincept.Sendout_dptm))+'/'+ltrim(rtrim(Dt_dataincept.Dscrp)) as sss
  432. INTO :ls_dt,:ls_str
  433. FROM Dt_dataincept
  434. WHERE ( Dt_dataincept.Dt_id = :obj_dt_id )
  435. using arg_incept_transaction ;
  436. if arg_incept_transaction.sqlcode<>0 then
  437. rslt=0
  438. arg_msg='查询要更新的数据传送记录操作失败>'+arg_incept_transaction.sqlerrtext
  439. goto ext
  440. end if
  441. arg_log=string(ls_dt,'yyyy-mm-dd h:mm')+ls_str+char(10)+char(13)
  442. end if
  443. rslt=si_incept_data(arg_incept_transaction,arg_import_transaction,obj_dt_id,arg_msg,arg_log)
  444. ext:
  445. return rslt
  446. end function
  447. public function integer f_importdata (ref transaction arg_transaction, string arg_objzipfilename, integer arg_commitstep, boolean arg_if_buildlogfile, ref string arg_log, ref string arg_msg, ref integer arg_errflag);//f_importdata(arg_transaction,arg_objzipfilename,arg_commitstep,arg_if_buildlogfile,arg_log,arg_msg,arg_errflag)
  448. //1.取得当前路径等
  449. //2.删除旧有文件
  450. //3.解压缩文件为目标文件
  451. //4.读取传递信息文件,取要更新的DBf列表
  452. //5.,导入删除日志表内容,先执行sql DELete
  453. ////6.删除校验DBF文件头临时文件*.if
  454. //7.循环:1.数据库读取要更新的DBF信息
  455. // 2.动态建立DW
  456. // //3.校验DBF文件头(生成校验文件*.IF(DBF格式,校验文件头))
  457. // 4.取数据
  458. // 5.生成UPdate语句
  459. // 6.更新,失败则生成Insert语句,再插入
  460. // 7.记录日志变量
  461. s_sys_tntblinfo ls_tntblinfo
  462. string str_export_table_info='',ls_temppathname,msg_err_sql
  463. string DBFfilename[300],str_tableinfo
  464. long ls_i,ls_j,ls_k,ls_l,ls_psc,Import_result
  465. long rslt=1,rslt_insert_rowcount,rslt_update_rowcount
  466. long rowcount_update_ok=0,rowcount_update_false=0,del_fail=0,del_suc=0,DBFfn_ub
  467. int li_FileNum,int_tabletype
  468. long ins_c,upt_c
  469. blob setblbdw_data
  470. string cur_path,ls_sc_id_name,ls_Indcolumn_name,ls_msg,ls_thr_Indcolumn_name
  471. string char_enter,pk1_type,pk2_type,ls_fou_Indcolumn_name
  472. string str_dwSQl,str_SyntaxFromSQL
  473. int exporttype,lg_rslt
  474. string field_str,value_str
  475. string obj_value
  476. string SelectPri1='',SelectPri3=""
  477. string SelectPri2="",SelectPri4=""
  478. string UpdateField
  479. string update_string,del_sqlstr
  480. int PK1_sit ,PK2_sit,PK3_sit,PK4_sit
  481. char_enter=char(13)+char(10) //换行符
  482. //if MessageBox("警告", '确定要开始导入数据吗? 原有的数据即将被覆盖且不可以恢复!', Exclamation!, OKCancel!, 2)=2 then
  483. // rslt=0
  484. // goto ext
  485. //end if
  486. arg_errflag=0
  487. arg_log=arg_log+arg_objzipfilename+char_enter
  488. open(w_sys_wait_jdt) //初始化进度条
  489. w_sys_wait_jdt.show()
  490. w_sys_wait_jdt.wf_accepttol(1)
  491. w_sys_wait_jdt.wf_inc(0)
  492. w_sys_wait_jdt.st_msg.text="正在解压缩目标文件..."
  493. if not FileExists(arg_objzipfilename) then
  494. rslt=0
  495. arg_msg="文件路径错误或目标文件不存在."
  496. arg_errflag=1
  497. goto ext
  498. end if
  499. //取得当前绝对路径
  500. cur_path=sys_cur_path
  501. //解压数据文件
  502. rslt=uf_unzipfile(arg_objzipfilename,cur_path+importtempfilepath,arg_msg)
  503. if rslt=0 then
  504. arg_msg="解压缩>>"+arg_msg
  505. arg_errflag=3
  506. goto ext
  507. end if
  508. w_sys_wait_jdt.st_msg.text="正在读取传递信息表..."
  509. //读取传递信息
  510. ls_temppathname=cur_path+importtempfilepath+'\'+infofilename
  511. str_tableinfo=pf_readtifofile(ls_temppathname,arg_msg)
  512. if str_tableinfo="" then
  513. rslt=0
  514. arg_msg="传递信息表>>"+arg_msg
  515. arg_errflag=4
  516. goto ext
  517. end if
  518. ls_k=0
  519. ls_psc=0
  520. ls_psc=pos(str_tableinfo,';')
  521. DO WHILE ls_psc>0
  522. if left(str_tableinfo,ls_psc - 1)<>'' then
  523. ls_k++
  524. DBFfilename[ls_k]=left(str_tableinfo,ls_psc - 1)
  525. end if
  526. str_tableinfo=right(str_tableinfo,len(str_tableinfo) - ls_psc)
  527. ls_psc=pos(str_tableinfo,';')
  528. LOOP
  529. DBFfn_ub=ls_k
  530. w_sys_wait_jdt.st_msg.text="正在执行删除..."
  531. w_sys_wait_jdt.wf_accepttol(DBFfn_ub+3)
  532. for ls_i=1 to DBFfn_ub //查找删除日志表
  533. DBFfilename[ls_i]=lower(DBFfilename[ls_i])
  534. if lower(DBFfilename[ls_i])=dts_deletelog then
  535. //生成select语句
  536. str_dwSQl="select * from "+DBFfilename[ls_i]
  537. //生成DW
  538. ls_msg=""
  539. //arg_transaction.AutoCommit=True
  540. str_SyntaxFromSQL =arg_transaction.SyntaxFromSQL(str_dwSQl,"style(type=grid)",ls_msg)
  541. //arg_transaction.AutoCommit=false
  542. if ls_msg>'' then
  543. arg_msg=DBFfilename[ls_i]+"dw语法生成失败"
  544. arg_errflag=5
  545. goto ext
  546. end if
  547. ds_data.Create(str_SyntaxFromSQL,ls_msg)
  548. ds_data.settransobject(arg_transaction)
  549. if ls_msg>'' then
  550. arg_msg=DBFfilename[ls_i]+"建立相关DW失败"
  551. arg_errflag=5
  552. goto ext
  553. end if
  554. //<4>从DBF导入数据到DW
  555. ls_temppathname=cur_path+importtempfilepath+'\'+DBFfilename[ls_i]+".DBF"
  556. if not FileExists(ls_temppathname) then
  557. arg_log=arg_log+"<删除日志表>["+">["+DBFfilename[ls_i]+"]无对应的DBF文件."+char_enter
  558. arg_errflag=7
  559. goto ext
  560. end if
  561. Import_result=ds_data.ImportFile(cur_path+importtempfilepath+'\'+DBFfilename[ls_i]+".DBF")
  562. if Import_result<-1 then
  563. arg_log=arg_log+"<删除日志表>["+DBFfilename[ls_i]+"]导入失败."+char_enter
  564. arg_errflag=8
  565. goto ext
  566. end if
  567. for ls_j=1 to ds_data.rowcount()
  568. w_sys_wait_jdt.wf_inc(3*(ls_j/ds_data.rowcount()))
  569. w_sys_wait_jdt.st_msg.text="正在执行删除..."+string(ls_j)+"/"+string(ds_data.rowcount())
  570. del_sqlstr=ds_data.object.sql_delete[ls_j]
  571. Execute immediate :del_sqlstr using arg_transaction; //先执行delete
  572. if arg_transaction.sqlcode<>0 then
  573. del_fail++
  574. if len(msg_err_sql)<5000 then
  575. msg_err_sql=msg_err_sql+' /'+string(ls_j)+' Error SQL{'+del_sqlstr+'}'+char_enter
  576. else
  577. if left(right(msg_err_sql,5),3)<>'...' then msg_err_sql=msg_err_sql+'...'+char_enter
  578. end if
  579. else
  580. del_suc++
  581. end if
  582. if Mod(ls_j , arg_commitstep)=0 then //够提交步长则提交
  583. commit using arg_transaction;
  584. end if
  585. next
  586. ds_data.reset()
  587. commit using arg_transaction;
  588. arg_log=arg_log+"<删除日志表更新>成功:"+string(del_suc)+"失败:"+string(del_fail)+char_enter+msg_err_sql
  589. end if
  590. next
  591. w_sys_wait_jdt.wf_inc(3.1)
  592. //循环处理读入数据,更新数据库,写日志
  593. for ls_i=1 to DBFfn_ub
  594. setnull(blbdw_data)
  595. w_sys_wait_jdt.st_msg.text="正在执行更新... >"+DBFfilename[ls_i]
  596. msg_err_sql=''
  597. rowcount_update_ok=0
  598. rowcount_update_false=0
  599. upt_c=0
  600. ins_c=0
  601. ds_data.reset()
  602. //<1>取出该文件信息
  603. if f_get_tntblinfo(DBFfilename[ls_i],ls_tntblinfo)=1 then
  604. ls_sc_id_name=trim(ls_tntblinfo.Sc_id_name)
  605. ls_Indcolumn_name=trim(ls_tntblinfo.Indcolumn_name)
  606. int_tabletype=ls_tntblinfo.tabletype
  607. ls_thr_Indcolumn_name=trim(ls_tntblinfo.thrIndcolumn_name)
  608. ls_fou_Indcolumn_name=trim(ls_tntblinfo.fouIndcolumn_name)
  609. exporttype=ls_tntblinfo.exporttype
  610. else
  611. ls_msg=DBFfilename[ls_i]+"不在系统记录中;"
  612. arg_log=arg_log+ls_msg+char_enter
  613. goto nexttable
  614. end if
  615. //<2>生成select语句
  616. str_dwSQl="select "+DBFfilename[ls_i]+".* from "+DBFfilename[ls_i]
  617. //<3>生成DW
  618. ls_msg=""
  619. //arg_transaction.AutoCommit=True
  620. str_SyntaxFromSQL =arg_transaction.SyntaxFromSQL(str_dwSQl,"style(type=grid)",ls_msg)
  621. //arg_transaction.AutoCommit=false
  622. if ls_msg>'' then
  623. arg_msg=DBFfilename[ls_i]+"dw语法生成失败"
  624. goto nexttable
  625. end if
  626. ds_data.Create(str_SyntaxFromSQL,ls_msg)
  627. ds_data.settransobject(arg_transaction)
  628. if ls_msg>'' then
  629. arg_msg=DBFfilename[ls_i]+"建立相关DW失败"
  630. goto nexttable
  631. end if
  632. //<4>从文件导入数据到DW
  633. if exporttype=1 then //blob导入
  634. ls_temppathname=cur_path+importtempfilepath+'\'+DBFfilename[ls_i]+".blb"
  635. if not FileExists(ls_temppathname) then
  636. arg_log=arg_log+'<'+string(ls_i)+">["+DBFfilename[ls_i]+"]无对应的blb文件."+char_enter
  637. goto nexttable
  638. end if
  639. lg_rslt=f_getblobfromfile(setblbdw_data,ls_temppathname,arg_msg)
  640. if lg_rslt=0 then
  641. arg_log=arg_log+'<'+string(ls_i)+">["+DBFfilename[ls_i]+"]对应的blb文件读取失败.>"+arg_msg+char_enter
  642. goto nexttable
  643. end if
  644. lg_rslt=ds_data.setFullState(setblbdw_data)
  645. if lg_rslt=-1 then
  646. Import_result=0
  647. else
  648. Import_result=ds_data.rowcount()
  649. end if
  650. setnull(blbdw_data)
  651. if Import_result<=0 then
  652. arg_log=arg_log+'<'+string(ls_i)+">["+DBFfilename[ls_i]+"]无数据或导入blob失败.>"+string(Import_result)+char_enter
  653. goto nexttable
  654. end if
  655. //blbdw_data
  656. elseif exporttype=2 then//txt导入
  657. ls_temppathname=cur_path+importtempfilepath+'\'+DBFfilename[ls_i]+".txt"
  658. if not FileExists(ls_temppathname) then
  659. arg_log=arg_log+'<'+string(ls_i)+">["+DBFfilename[ls_i]+"]无对应的txt文件."+char_enter
  660. goto nexttable
  661. end if
  662. Import_result=ds_data.ImportFile(cur_path+importtempfilepath+'\'+DBFfilename[ls_i]+".txt")
  663. if Import_result<=0 then
  664. arg_log=arg_log+'<'+string(ls_i)+">["+DBFfilename[ls_i]+"]无数据或导入txt失败.>"+string(Import_result)+char_enter
  665. goto nexttable
  666. end if
  667. else //DBF导入
  668. ls_temppathname=cur_path+importtempfilepath+'\'+DBFfilename[ls_i]+".DBF"
  669. if not FileExists(ls_temppathname) then
  670. arg_log=arg_log+'<'+string(ls_i)+">["+DBFfilename[ls_i]+"]无对应的DBF文件."+char_enter
  671. goto nexttable
  672. end if
  673. Import_result=ds_data.ImportFile(cur_path+importtempfilepath+'\'+DBFfilename[ls_i]+".DBF")
  674. //if lower(DBFfilename[ls_i])='pr_experimentrec_manager' then arg_log=arg_log+string(Import_result)
  675. if Import_result<=0 then
  676. arg_log=arg_log+'<'+string(ls_i)+">["+DBFfilename[ls_i]+"]无数据或导入DBF失败.>"+string(Import_result)+char_enter
  677. goto nexttable
  678. end if
  679. end if
  680. PK1_sit=0
  681. PK2_sit=0
  682. //定位主关键字段位置,ls_Indcolumn_name为空则为单关键字表
  683. for ls_k=1 to integer(ds_data.Object.DataWindow.Column.Count)
  684. if Lower(ds_data.Describe("#"+string(ls_k)+".Name"))=Lower(ls_sc_id_name) then
  685. PK1_sit=ls_k //有此字段
  686. //PK1_type=ds_data.Describe("#"+string(ls_k)+".type")
  687. end if
  688. if not ls_Indcolumn_name='' then
  689. if Lower(ds_data.Describe("#"+string(ls_k)+".Name"))=Lower(ls_Indcolumn_name) then
  690. PK2_sit=ls_k
  691. end if
  692. end if
  693. if not ls_thr_Indcolumn_name='' then
  694. if Lower(ds_data.Describe("#"+string(ls_k)+".Name"))=Lower(ls_thr_Indcolumn_name) then
  695. PK3_sit=ls_k
  696. end if
  697. end if
  698. if not ls_fou_Indcolumn_name='' then
  699. if Lower(ds_data.Describe("#"+string(ls_k)+".Name"))=Lower(ls_fou_Indcolumn_name) then
  700. PK4_sit=ls_k
  701. end if
  702. end if
  703. next //ls_k
  704. if PK1_sit+PK2_sit=0 then
  705. arg_log=arg_log+'<'+string(ls_i)+">["+DBFfilename[ls_i]+"]错误主键名称."+char_enter
  706. goto nexttable
  707. end if
  708. //<5>循环生成SQl语句,更新数据库
  709. Import_result=ds_data.rowcount()
  710. for ls_j=1 to Import_result
  711. // rslt_insert_rowcount=rslt_insert_rowcount+ins_c
  712. // rslt_update_rowcount=rslt_update_rowcount+upt_c
  713. // ins_c=0
  714. // upt_c=0
  715. field_str=""
  716. obj_value=""
  717. SelectPri1=""
  718. SelectPri2=""
  719. SelectPri3=""
  720. SelectPri4=""
  721. UpdateField=""
  722. update_string=""
  723. //取主关键字的内容
  724. SelectPri1=iuf_getdwvalue(ds_data,ls_j,PK1_sit)
  725. if SelectPri1="[err]" then
  726. rowcount_update_false++
  727. goto nextrow
  728. end if
  729. if not ls_Indcolumn_name='' then //双主键
  730. SelectPri2=iuf_getdwvalue(ds_data,ls_j,PK2_sit)
  731. if SelectPri2="[err]" then
  732. rowcount_update_false++
  733. goto nextrow
  734. end if
  735. end if
  736. if not ls_thr_Indcolumn_name='' then //三主键
  737. SelectPri3=iuf_getdwvalue(ds_data,ls_j,PK3_sit)
  738. if SelectPri3="[err]" then
  739. rowcount_update_false++
  740. goto nextrow
  741. end if
  742. end if
  743. if not ls_fou_Indcolumn_name='' then //四主键
  744. SelectPri4=iuf_getdwvalue(ds_data,ls_j,PK4_sit)
  745. if SelectPri4="[err]" then
  746. rowcount_update_false++
  747. goto nextrow
  748. end if
  749. end if
  750. //++++++++生成更新子段语句++++++
  751. //先更新记录---------------------------
  752. for ls_k=1 to integer(ds_data.Object.DataWindow.Column.Count)
  753. obj_value=iuf_getdwvalue(ds_data,ls_j,ls_k)
  754. if SelectPri1="[err]" then
  755. rowcount_update_false++
  756. goto nextrow
  757. end if
  758. UpdateField=UpdateField+ds_data.describe("#"+string(ls_k)+".Name")+"="+obj_value+","
  759. next //ls_k
  760. UpdateField=left(UpdateField,len(UpdateField) - 1)
  761. update_string="Update "+DBFfilename[ls_i]+" set " +UpdateField + " where "+&
  762. ls_sc_id_name+"="+SelectPri1
  763. if ls_Indcolumn_name<>'' then //双主键
  764. update_string=update_string+" and "+ls_Indcolumn_name+"="+SelectPri2
  765. end if
  766. if ls_thr_Indcolumn_name<>'' then //三主键
  767. update_string=update_string+" and "+ls_thr_Indcolumn_name+"="+SelectPri3
  768. end if
  769. if ls_fou_Indcolumn_name<>'' then //四主键
  770. update_string=update_string+" and "+ls_fou_Indcolumn_name+"="+SelectPri4
  771. end if
  772. Execute immediate :update_string using arg_transaction; //执行Update
  773. if arg_transaction.sqlcode<>0 then
  774. if len(msg_err_sql)<30000 then
  775. msg_err_sql=msg_err_sql+' /'+string(ls_j)+' Error SQL{'+update_string+'}'+char_enter
  776. else
  777. if left(right(msg_err_sql,5),3)<>'...' then msg_err_sql=msg_err_sql+'...'+char_enter
  778. end if
  779. rowcount_update_false++
  780. goto nextrow
  781. else
  782. if arg_transaction.sqlnrows=0 then
  783. //更新不成功就插入-----------
  784. field_str=""
  785. obj_value=""
  786. value_str=''
  787. update_string=""
  788. for ls_k=1 to integer(ds_data.Object.DataWindow.Column.Count)
  789. obj_value=iuf_getdwvalue(ds_data,ls_j,ls_k)
  790. if SelectPri1="[err]" then
  791. rowcount_update_false++
  792. goto nextrow
  793. end if
  794. field_str=field_str+ds_data.describe("#"+string(ls_k)+".Name")+","
  795. value_str=value_str+obj_value+","
  796. next //ls_k
  797. field_str=left(field_str,len(field_str)-1)
  798. value_str=left(value_str,len(value_str)-1)
  799. update_string="Insert into "+DBFfilename[ls_i]+" ("+field_str+&
  800. ") values ("+value_str+")"
  801. Execute immediate :update_string using arg_transaction; //执行Insert
  802. if arg_transaction.sqlcode<>0 then
  803. if len(msg_err_sql)<50000 then
  804. msg_err_sql=msg_err_sql+' /'+string(ls_j)+' Error SQL{'+update_string+'}'+char_enter
  805. else
  806. if left(right(msg_err_sql,5),3)<>'...' then msg_err_sql=msg_err_sql+'...'+char_enter
  807. end if
  808. rowcount_update_false++
  809. goto nextrow
  810. end if
  811. rslt_insert_rowcount++
  812. ins_c++
  813. else
  814. rslt_update_rowcount++
  815. upt_c++
  816. end if
  817. end if
  818. rowcount_update_ok++
  819. if Mod(ls_j , arg_commitstep)=0 then //够提交步长则提交
  820. commit using arg_transaction;
  821. end if
  822. nextrow:
  823. w_sys_wait_jdt.st_msg.text="正在执行更新... >"+DBFfilename[ls_i]+">"+string(rowcount_update_ok)
  824. next //ls_j
  825. arg_log=arg_log+'<'+string(ls_i)+">["+DBFfilename[ls_i]+"]成功:"+string(rowcount_update_ok)+"(更新-"+string(upt_c)+"/插入-"+string(ins_c)+")失败:"+string(rowcount_update_false)+"."+char_enter+msg_err_sql
  826. nexttable:
  827. commit using arg_transaction;
  828. w_sys_wait_jdt.wf_inc(3+ls_i)
  829. next //ls_i
  830. w_sys_wait_jdt.st_msg.text="删除文件..."
  831. //删除原有文件
  832. string ls_arg_msg
  833. for ls_i=1 to DBFfn_ub
  834. if trim(DBFfilename[ls_i])<>"" then
  835. ls_temppathname=cur_path+importtempfilepath+'\'+DBFfilename[ls_i]+".DBF"
  836. if FileExists(ls_temppathname) then
  837. if not FileDelete(ls_temppathname) then
  838. arg_msg="删除临时文件失败("+ls_temppathname+")! "
  839. ls_arg_msg=ls_arg_msg + arg_msg
  840. end if
  841. end if
  842. end if
  843. next
  844. ls_temppathname=cur_path+importtempfilepath+'\'+infofilename
  845. if FileExists(ls_temppathname) then
  846. if not FileDelete(ls_temppathname) then
  847. arg_msg="删除临时文件失败("+ls_temppathname+")!"
  848. ls_arg_msg=ls_arg_msg + arg_msg
  849. end if
  850. end if
  851. w_sys_wait_jdt.wf_inc(ls_i+4) //进度完成
  852. /////
  853. ls_temppathname=cur_path+importlogpath+'\'+"LongJoe_Import"+string(today(),'yyyymmdd')+string(now(),'hhmmss')+".log"
  854. arg_msg='总操作表-'+string(DBFfn_ub)+';总插入记录-'+string(rslt_insert_rowcount)+';总更新记录-'+string(rslt_update_rowcount)
  855. arg_log=arg_log+char_enter+arg_msg
  856. if arg_if_buildlogfile then
  857. rslt=pf_writetifofile(arg_log,ls_temppathname,arg_msg)
  858. if rslt=0 then
  859. arg_msg="写日志文件失败>>"+arg_msg
  860. arg_errflag=0
  861. rslt=1
  862. end if
  863. end if
  864. //
  865. ls_arg_msg=ls_arg_msg + arg_msg
  866. arg_msg=ls_arg_msg
  867. //
  868. ext:
  869. close(w_sys_wait_jdt)
  870. return rslt
  871. end function
  872. public function integer si_delete_dtrec (transaction arg_transaction, long arg_dt_id, ref string arg_msg);//si_delete_dtrec
  873. long rslt=1
  874. if isnull(arg_dt_id) or arg_dt_id<=0 then
  875. rslt=0
  876. arg_msg='无效数据传送记录唯一码!'
  877. goto ext
  878. end if
  879. DELETE FROM Dt_dataincept
  880. WHERE Dt_dataincept.Dt_id = :arg_dt_id
  881. using arg_transaction ;
  882. if arg_transaction.sqlcode<>0 then
  883. arg_msg='删除数据传送记录操作失败>'+arg_transaction.sqlerrtext
  884. rslt=0
  885. rollback using arg_transaction;
  886. goto ext
  887. end if
  888. commit using arg_transaction;
  889. ext:
  890. return rslt
  891. end function
  892. public function integer f_init_syscurpath (ref string arg_msg);//f_init_syscurpath
  893. long rslt =1
  894. string lpBuffer
  895. lpBuffer=Fill('',200)
  896. long lpfilepart,li_FileNum
  897. security_attributes ls_security_attributes
  898. rslt=GetFullPathName(sys_inifilename,196,lpBuffer,lpFilePart)
  899. if rslt=0 then
  900. arg_msg="提取当前路径失败,可能是因为系统INI文件丢失!"
  901. goto ext
  902. else
  903. sys_cur_path=left(lpBuffer,len(lpBuffer)-len(sys_inifilename))
  904. end if
  905. //尝试建立临时目录
  906. li_FileNum=CreateDirectory(sys_cur_path+exportlogpath,ls_security_attributes)
  907. li_FileNum=CreateDirectory(sys_cur_path+exporttempfilepath,ls_security_attributes)
  908. li_FileNum=CreateDirectory(sys_cur_path+importlogpath,ls_security_attributes)
  909. li_FileNum=CreateDirectory(sys_cur_path+importtempfilepath,ls_security_attributes)
  910. li_FileNum=CreateDirectory(sys_cur_path+inceptpath,ls_security_attributes)
  911. ext:
  912. return rslt
  913. end function
  914. public function integer si_incept_data (ref transaction arg_incept_transaction, ref transaction arg_import_transaction, long arg_dt_id, ref string arg_msg, ref string arg_log);//si_incept_data
  915. //
  916. //取得临时文件全路径
  917. //提取最早上传的数据包记录ID
  918. //提取数据包
  919. //写临时文件
  920. //调用更新函数
  921. long rslt=1,ls_jh
  922. long li_FileNum,fend,fend_t,ls_i
  923. string cur_path
  924. string obj_incept_tmp_file
  925. blob b_dtdata, b_dtdata_p
  926. int import_err_int=0
  927. arg_msg=''
  928. setnull(b_dtdata)
  929. if arg_dt_id<=0 then
  930. rslt=0
  931. arg_msg='无效传递记录唯一码!'
  932. goto ext
  933. end if
  934. //取得当前绝对路径
  935. cur_path=sys_cur_path
  936. obj_incept_tmp_file=cur_path+inceptpath+'\'+incepttmpfile
  937. /////////////////提取数据包
  938. SELECTBLOB dt_data
  939. INTO :b_dtdata
  940. FROM Dt_dataincept
  941. WHERE Dt_dataincept.dt_id = :arg_dt_id
  942. USING arg_incept_transaction ;
  943. if arg_incept_transaction.sqlcode<>0 or arg_incept_transaction.sqlnrows=0 then
  944. rslt=0
  945. arg_msg='提取数据包操作失败>'+arg_incept_transaction.sqlerrtext
  946. goto ext
  947. end if
  948. if len(b_dtdata)<10 or isnull(b_dtdata) then
  949. rslt=1
  950. arg_msg='空数据包!'
  951. update Dt_dataincept
  952. set Update_flag=1 ,Dt_update_dt=getdate(),
  953. Dt_update_fnsh_dt=getdate(),update_ctime=update_ctime+1,
  954. false_rslt=:arg_msg
  955. WHERE Dt_dataincept.dt_id = :arg_dt_id
  956. using arg_incept_transaction ;
  957. if arg_incept_transaction.sqlnrows=0 then
  958. rslt=0
  959. arg_msg='更新[数据更新完毕标记]操作失败>'+arg_incept_transaction.sqlerrtext
  960. rollback USING arg_incept_transaction ;
  961. goto ext
  962. end if
  963. goto ext
  964. end if
  965. update Dt_dataincept
  966. set Dt_update_dt=getdate()
  967. WHERE Dt_dataincept.dt_id = :arg_dt_id
  968. using arg_incept_transaction ; //写开始更新时间
  969. commit USING arg_incept_transaction ;
  970. //////////////////////////写临时文件
  971. if FileExists(obj_incept_tmp_file) then filedelete(obj_incept_tmp_file)
  972. //if len(b_dtdata)32765
  973. fend=len(b_dtdata)
  974. if fend<=32765 then
  975. fend_t=1
  976. else
  977. fend_t=fend/32765
  978. if mod(fend,32765)<>0 then
  979. fend_t=fend_t+1
  980. end if
  981. end if
  982. li_FileNum = FileOpen( obj_incept_tmp_file,StreamMode!, Write!, LockWrite!)
  983. if li_FileNum<=0 then
  984. arg_msg="打开文件"+obj_incept_tmp_file+"失败"
  985. rslt=0
  986. fileclose(li_FileNum)
  987. goto ext
  988. end if
  989. for ls_i = 1 to fend_t
  990. b_dtdata_p=blobmid(b_dtdata,1+(ls_i - 1 )*32765,32765)
  991. ls_jh=FileWrite(li_FileNum, b_dtdata_p)
  992. if ls_jh<=0 then
  993. arg_msg="写文件"+obj_incept_tmp_file+"失败"
  994. rslt=0
  995. fileclose(li_FileNum)
  996. goto ext
  997. end if
  998. next
  999. fileclose(li_FileNum)
  1000. //调用数据导入函数
  1001. rslt =f_importdata(arg_import_transaction,obj_incept_tmp_file,11,true,arg_log,arg_msg,import_err_int)
  1002. if rslt =0 then
  1003. if import_err_int=3 then//数据错误
  1004. update Dt_dataincept
  1005. set Dt_dataincept.Wrongdata_flag = 1,Dt_update_fnsh_dt=getdate()
  1006. ,Dt_dataincept.update_flag=2,Dt_dataincept.false_rslt=:arg_msg,update_ctime=update_ctime+1
  1007. WHERE Dt_dataincept.dt_id = :arg_dt_id
  1008. using arg_incept_transaction ;
  1009. if arg_incept_transaction.sqlnrows=0 then
  1010. rslt=0
  1011. arg_msg='更新[错误数据包标记]操作失败>'+arg_incept_transaction.sqlerrtext
  1012. rollback USING arg_incept_transaction ;
  1013. goto ext
  1014. end if
  1015. else
  1016. update Dt_dataincept
  1017. set Dt_update_fnsh_dt=getdate(),Dt_dataincept.Wrongdata_flag =9
  1018. ,Dt_dataincept.update_flag=2,Dt_dataincept.false_rslt=:arg_msg,update_ctime=update_ctime+1
  1019. WHERE Dt_dataincept.dt_id = :arg_dt_id
  1020. using arg_incept_transaction ;
  1021. if arg_incept_transaction.sqlnrows=0 then
  1022. rslt=0
  1023. arg_msg='更新[更新操作失败标记]操作失败>'+arg_incept_transaction.sqlerrtext
  1024. rollback USING arg_incept_transaction ;
  1025. goto ext
  1026. end if
  1027. end if
  1028. else
  1029. update Dt_dataincept
  1030. set Update_flag=1 ,Dt_update_fnsh_dt=getdate(),false_rslt=:arg_msg,update_ctime=update_ctime+1
  1031. WHERE Dt_dataincept.dt_id = :arg_dt_id
  1032. using arg_incept_transaction ;
  1033. if arg_incept_transaction.sqlnrows=0 then
  1034. rslt=0
  1035. arg_msg='更新[数据更新完毕标记]操作失败>'+arg_incept_transaction.sqlerrtext
  1036. rollback USING arg_incept_transaction ;
  1037. goto ext
  1038. end if
  1039. end if
  1040. commit USING arg_incept_transaction ;
  1041. ext:
  1042. return rslt
  1043. end function
  1044. public function integer si_reset_dtrec (transaction arg_transaction, long arg_dt_id, ref string arg_msg);//si_reset_dtrec
  1045. long rslt=1,no_day=0
  1046. if isnull(arg_dt_id) or arg_dt_id<=0 then
  1047. rslt=0
  1048. arg_msg='无效数据传送记录唯一码!'
  1049. goto ext
  1050. end if
  1051. SELECT DATEDIFF(day, Dt_dataincept.Dt_update_fnsh_dt, getdate()) as no_day
  1052. INTO :no_day
  1053. FROM Dt_dataincept
  1054. WHERE Dt_dataincept.Dt_id = :arg_dt_id
  1055. using arg_transaction ;
  1056. if arg_transaction.sqlcode<>0 then
  1057. arg_msg='查询数据传送记录操作失败>'+arg_transaction.sqlerrtext
  1058. rslt=0
  1059. goto ext
  1060. end if
  1061. if no_day>7 then
  1062. rslt=0
  1063. arg_msg='该更新在早于现在7天前['+string(no_day)+']执行成功,不允许重新执行!'
  1064. goto ext
  1065. end if
  1066. update Dt_dataincept
  1067. set Dt_dataincept.update_flag=0,
  1068. Dt_dataincept.wrongdata_flag=0
  1069. WHERE Dt_dataincept.Dt_id = :arg_dt_id
  1070. using arg_transaction ;
  1071. if arg_transaction.sqlcode<>0 then
  1072. arg_msg='删除数据传送记录操作失败>'+arg_transaction.sqlerrtext
  1073. rslt=0
  1074. rollback using arg_transaction;
  1075. goto ext
  1076. end if
  1077. commit using arg_transaction;
  1078. ext:
  1079. return rslt
  1080. end function
  1081. public function integer uf_setrsl_trandt (transaction arg_transaction, long arg_scid, string arg_tablename, datetime arg_d_newlydt, datetime arg_dg_newlydt, ref string arg_msg);//uf_setrsl_trandt(arg_transaction,arg_scid,arg_tablename,arg_d_newlydt,arg_dg_newlydt,arg_msg)
  1082. long rslt=1
  1083. if isnull(arg_d_newlydt) then arg_d_newlydt=datetime(1900-01-01)
  1084. if isnull(arg_dG_newlydt) then arg_dG_newlydt=datetime(1900-01-01)
  1085. if year(date(arg_d_newlydt))<=2000 and year(date(arg_dG_newlydt))<=2000 then
  1086. arg_msg='不合理时间!'
  1087. rslt=0
  1088. goto ext
  1089. elseif year(date(arg_d_newlydt))<=2000 then
  1090. UPDATE sys_tran_newlydt
  1091. SET DG_newlydt = :arg_dg_newlydt
  1092. where scid=:arg_scid and ltrim(rtrim(Tablename))=ltrim(rtrim(:arg_tablename))
  1093. using arg_transaction;
  1094. elseif year(date(arg_dG_newlydt))<=2000 then
  1095. UPDATE sys_tran_newlydt
  1096. SET D_newlydt = :arg_d_newlydt
  1097. where scid=:arg_scid and ltrim(rtrim(Tablename))=ltrim(rtrim(:arg_tablename))
  1098. using arg_transaction;
  1099. else
  1100. UPDATE sys_tran_newlydt
  1101. SET D_newlydt = :arg_d_newlydt,
  1102. DG_newlydt = :arg_dG_newlydt
  1103. where scid=:arg_scid and ltrim(rtrim(Tablename))=ltrim(rtrim(:arg_tablename))
  1104. using arg_transaction;
  1105. end if
  1106. if arg_transaction.sqlcode<>0 then
  1107. arg_msg='更新最近数据传递时间失败>'+arg_transaction.sqlerrtext
  1108. rollback using arg_transaction;
  1109. rslt=0
  1110. goto ext
  1111. elseif arg_transaction.sqlnrows=0 then
  1112. INSERT INTO sys_tran_newlydt
  1113. ( scid,
  1114. Tablename,
  1115. D_newlydt,
  1116. DG_newlydt )
  1117. VALUES ( :arg_scid,
  1118. :arg_tablename,
  1119. :arg_d_newlydt,
  1120. :arg_dg_newlydt ) using arg_transaction ;
  1121. if arg_transaction.sqlcode<>0 then
  1122. arg_msg='新建最近数据传递时间失败>'+arg_transaction.sqlerrtext
  1123. rollback using arg_transaction;
  1124. rslt=0
  1125. goto ext
  1126. end if
  1127. end if
  1128. commit using arg_transaction;
  1129. ext:
  1130. return rslt
  1131. end function
  1132. public function integer si_cnt_database_incept (ref transaction arg_dataincept_sqlca, ref string arg_msg);//
  1133. arg_dataincept_sqlca.DBMS = ProfileString (sys_inifilename, "database_incept", "dbms", "")
  1134. arg_dataincept_sqlca.database = ProfileString (sys_inifilename, "database_incept", "database", "")
  1135. arg_dataincept_sqlca.userid = ProfileString (sys_inifilename, "database_incept", "userid", "")
  1136. arg_dataincept_sqlca.dbpass = f_psw_bczh(ProfileString (sys_inifilename, "database_incept", "dbpass", ""),1,sys_power_key)
  1137. arg_dataincept_sqlca.logid = ProfileString (sys_inifilename, "database_incept", "logid", "")
  1138. arg_dataincept_sqlca.logpass = f_psw_bczh(ProfileString (sys_inifilename, "database_incept", "LogPassWord", ""),1,sys_power_key)
  1139. arg_dataincept_sqlca.servername = ProfileString (sys_inifilename, "database_incept", "servername", "")
  1140. arg_dataincept_sqlca.dbparm = f_psw_bczh(ProfileString (sys_inifilename, "database_incept", "dbparm", ""),1,sys_power_key)
  1141. if arg_dataincept_sqlca.database='' or arg_dataincept_sqlca.servername='' then
  1142. Messagebox("系统提示","连接数据传递数据库失败!")
  1143. // openWITHPARM(w_set_sqlca,1) //0 只设连接信息 1 并允许自动新建数据库(启动首次调用)
  1144. return 0
  1145. end if
  1146. connect using arg_dataincept_sqlca;
  1147. If SQLCA.SQLCode<0 Then
  1148. Messagebox("系统提示","连接数据传递数据库失败!")
  1149. // openWITHPARM(w_set_sqlca,1) //0 只设连接信息 1 并允许自动新建数据库(启动首次调用)
  1150. return 0
  1151. End if
  1152. return 1
  1153. end function
  1154. public function integer uf_getrsl_trandt (transaction arg_transaction, long arg_scid, string arg_tablename, ref datetime arg_d_newlydt, ref datetime arg_dg_newlydt, ref string arg_msg);//uf_Getrsl_trandt(arg_transaction,arg_scid,arg_tablename,arg_d_newlydt,arg_dg_newlydt,arg_msg)
  1155. long rslt=1
  1156. datetime d_newlydt,dG_newlydt
  1157. SELECT D_newlydt ,dG_newlydt
  1158. INTO :D_newlydt,:dG_newlydt
  1159. FROM sys_tran_newlydt
  1160. WHERE ( scid =:arg_scid ) AND
  1161. ( Tablename =:arg_tablename ) using arg_transaction ;
  1162. if arg_transaction.sqlcode=100 then
  1163. D_newlydt=datetime(1900-01-01,time(0))
  1164. dG_newlydt=datetime(1900-01-01,time(0))
  1165. elseif arg_transaction.sqlcode<>0 then
  1166. arg_msg='查询最近数据传递时间失败>'+arg_transaction.sqlerrtext
  1167. rslt=0
  1168. goto ext
  1169. end if
  1170. arg_d_newlydt=D_newlydt
  1171. arg_dg_newlydt=dG_newlydt
  1172. ext:
  1173. return rslt
  1174. end function
  1175. public function integer f_trandata_online (long arg_scid, ref transaction arg_transaction, ref transaction arg_obj_transaction, s_exporttableinfo arg_zipfileinfo[300], integer arg_tableno, boolean arg_if_usedefaultdt, datetime arg_bg_changetime, datetime arg_ed_changetime, integer arg_commitstep, boolean arg_if_buildlogfile, ref string arg_msg, ref string arg_log);//f_trandata_online(arg_transaction,arg_obj_transaction,arg_zipfileinfo[300],arg_tableno,arg_if_usedefaultdt,arg_bg_changetime,arg_ed_changetime,arg_usechangetime,arg_commitstep,arg_if_buildlogfilearg_msg,arg_log)
  1176. //arg_zipfileinfo[300] :要导出的表的名称列表
  1177. //arg_tableno
  1178. //arg_if_usedefaultdt:true -自动时间范围
  1179. //arg_bg_changetime :时间范围提取-开始时间
  1180. //arg_ed_changetime :时间范围提取-结束时间
  1181. //arg_commitstep
  1182. //arg_if_buildlogfile
  1183. //arg_msg
  1184. //arg_log :返回日志内容
  1185. //
  1186. //1.循环:(源事务)动态建立DW\retrieve
  1187. //2. (目标事务)循环生成更新语句
  1188. //3. 执行更新(注意不定时访问源事务,保证连接,如果连接失败,重试,如果也失败,就终止下一表数据提取)
  1189. string str_export_table_info=''
  1190. long exprot_suc=0,export_fail=0,rowc,del_fail,del_suc,rowcount_update_false,rowcount_update_ok
  1191. long rslt_insert_rowcount,rslt_update_rowcount,ins_c,upt_c
  1192. long rslt=1,l_rslt=1
  1193. int li_FileNum,int_tabletype
  1194. int exporttype=0
  1195. s_sys_tntblinfo ls_tntblinfo
  1196. string cur_path,ls_filepathname,ls_sc_id_name,ls_Indcolumn_name,ls_msg,msg_err_sql,ls_temppathname
  1197. long ls_i,ls_j,ls_k,lg_rowcount,lg_rslt
  1198. string char_enter
  1199. string str_dwSQl,str_SyntaxFromSQL,del_sqlstr
  1200. int i_cgt,i_udf
  1201. long PK1_sit,PK2_sit,PK3_sit,PK4_sit
  1202. string ls_thr_Indcolumn_name,ls_fou_Indcolumn_name
  1203. arg_log=""
  1204. datetime datatrans_timeline,D_newlydt,bg_changetime,ed_changetime,dg_newlydt
  1205. string field_str,obj_value,SelectPri1,SelectPri2,SelectPri3,SelectPri4,UpdateField,update_string,value_str
  1206. char_enter=char(13)+char(10) //换行符
  1207. open(w_sys_wait_jdt) //初始化进度条
  1208. w_sys_wait_jdt.show()
  1209. w_sys_wait_jdt.wf_accepttol(arg_tableno+2)
  1210. //取得当前绝对路径
  1211. cur_path=sys_cur_path
  1212. select top 1 getdate() into :datatrans_timeline from sysusers using arg_obj_transaction;
  1213. if arg_obj_transaction.sqlcode<>0 then
  1214. arg_msg='取得服务器时间操作失败!'
  1215. rslt=0
  1216. goto ext
  1217. end if
  1218. if not arg_if_usedefaultdt then
  1219. bg_changetime=arg_bg_changetime
  1220. ed_changetime=arg_ed_changetime
  1221. else
  1222. ed_changetime=datatrans_timeline
  1223. end if
  1224. arg_log='>>'+string(datatrans_timeline)+'<<'+char_enter
  1225. ls_k=0
  1226. rslt=1
  1227. //////////////////////优先处理删除日志表 dts_deletelog
  1228. for ls_i=1 to arg_tableno //查找删除日志表
  1229. rowcount_update_false=0
  1230. arg_zipfileinfo[ls_i].table_name=lower(arg_zipfileinfo[ls_i].table_name)
  1231. if arg_zipfileinfo[ls_i].table_name=dts_deletelog then
  1232. w_sys_wait_jdt.st_msg.text="预处理[删除日志表]:"+arg_zipfileinfo[ls_i].table_name //进度信息
  1233. if arg_if_usedefaultdt then//应用自动提取更新时间范围功能
  1234. rslt=uf_Getrsl_trandt(arg_transaction,arg_scid,arg_zipfileinfo[ls_i].table_name,d_newlydt,dg_newlydt,msg_err_sql)
  1235. if rslt=0 then
  1236. arg_log=arg_log+"[删除日志表]同步时间读取失败>>"+msg_err_sql+char_enter
  1237. export_fail++
  1238. exit
  1239. end if
  1240. bg_changetime=d_newlydt
  1241. end if
  1242. //生成select语句
  1243. str_dwSQl="select "+arg_zipfileinfo[ls_i].table_name+".* from "+arg_zipfileinfo[ls_i].table_name
  1244. //生成DW
  1245. ls_msg=""
  1246. //////////////////////////////////////////////////////////////////////////////////////
  1247. //str_SyntaxFromSQL =arg_obj_transaction.SyntaxFromSQL(str_dwSQl,"style(type=grid)",ls_msg)
  1248. str_SyntaxFromSQL =sqlca.SyntaxFromSQL(str_dwSQl,"style(type=grid)",ls_msg)
  1249. if ls_msg>'' then
  1250. arg_msg=arg_zipfileinfo[ls_i].table_name+"dw语法生成失败"
  1251. arg_log=arg_log+arg_msg+char_enter
  1252. export_fail++
  1253. exit
  1254. end if
  1255. ds_data.Create(str_SyntaxFromSQL,ls_msg)
  1256. if ls_msg>'' then
  1257. arg_msg=arg_zipfileinfo[ls_i].table_name+"建立相关DW失败"
  1258. arg_log=arg_log+arg_msg+char_enter
  1259. export_fail++
  1260. exit
  1261. end if
  1262. //检查字段,修正select语句的where子句
  1263. i_udf=0
  1264. i_cgt=0
  1265. for ls_j=1 to integer(ds_data.Object.DataWindow.Column.Count)
  1266. if Lower(ds_data.Describe("#"+string(ls_j)+".Name"))=Lower(sys_changetime) then
  1267. i_cgt=1 //有此字段
  1268. end if
  1269. next
  1270. if i_cgt=1 then //生成sys_changetime where 子句
  1271. str_dwSQl=str_dwSQl+" where "+&
  1272. sys_changetime+">='"+string(bg_changetime)+"' and "+&
  1273. sys_changetime+"<='"+string(ed_changetime)+"'"
  1274. end if
  1275. if trim(arg_zipfileinfo[ls_i].filter_string)<>'' then
  1276. if pos(lower(str_dwSQl)," where ")>0 then
  1277. str_dwSQl=str_dwSQl+" and "+arg_zipfileinfo[ls_i].filter_string
  1278. else
  1279. str_dwSQl=str_dwSQl+" where "+arg_zipfileinfo[ls_i].filter_string
  1280. end if
  1281. end if
  1282. ds_data.Modify("datawindow.table.select = ~"" + str_dwSQl+ "~"")
  1283. //DW取数
  1284. ds_data.settransobject(arg_transaction)
  1285. w_sys_wait_jdt.st_msg.text=arg_zipfileinfo[ls_i].table_name+" 正在取数据[删除日志表]..." //进度信息
  1286. lg_rowcount=ds_data.retrieve()
  1287. if lg_rowcount=0 then
  1288. arg_log=arg_log+">0 删除日志["+arg_zipfileinfo[ls_i].table_name+"]"+char_enter
  1289. exit
  1290. end if
  1291. //////////////
  1292. for ls_j=1 to ds_data.rowcount()
  1293. w_sys_wait_jdt.wf_inc(3*(ls_j/ds_data.rowcount()))
  1294. w_sys_wait_jdt.st_msg.text="正在执行删除..."+string(ls_j)+"/"+string(ds_data.rowcount())
  1295. del_sqlstr=ds_data.object.sql_delete[ls_j]
  1296. Execute immediate :del_sqlstr using arg_obj_transaction; //先执行delete
  1297. if arg_obj_transaction.sqlcode<>0 then
  1298. del_fail++
  1299. if len(msg_err_sql)<35000 then
  1300. msg_err_sql=msg_err_sql+' /'+string(ls_j)+' Error SQL{'+del_sqlstr+'}'+char_enter+'['+arg_transaction.sqlerrtext+']'+char_enter
  1301. else
  1302. if left(right(msg_err_sql,5),3)<>'...' then msg_err_sql=msg_err_sql+'...'+char_enter
  1303. end if
  1304. arg_log=arg_log+" \"+string(ls_j)+"失败{"+del_sqlstr+"}"+char_enter
  1305. else
  1306. del_suc++
  1307. // arg_log=arg_log+" \"+string(ls_j)+"成功{"+del_sqlstr+"}"+char_enter
  1308. end if
  1309. if Mod(ls_j , arg_commitstep)=0 then //够提交步长则提交
  1310. commit using arg_obj_transaction;
  1311. end if
  1312. next
  1313. ds_data.reset()
  1314. commit using arg_obj_transaction;
  1315. arg_log=arg_log+"<删除日志表更新>成功:"+string(del_suc)+"失败:"+string(del_fail)+char_enter+msg_err_sql
  1316. if del_fail=0 then
  1317. rslt=uf_setrsl_trandt(arg_transaction,arg_scid,arg_zipfileinfo[ls_i].table_name,ed_changetime,datetime(1900-01-01),arg_msg)
  1318. if rslt=0 then
  1319. end if
  1320. end if
  1321. exit
  1322. end if
  1323. next
  1324. w_sys_wait_jdt.wf_inc(1) //进度[完成删除日志处理]
  1325. ///////////////////////////
  1326. for ls_i=1 to arg_tableno
  1327. rowcount_update_ok=0
  1328. rowcount_update_false=0
  1329. w_sys_wait_jdt.st_msg.text="预处理[更新数据]:"+arg_zipfileinfo[ls_i].table_name //进度信息
  1330. arg_zipfileinfo[ls_i].table_name=lower(arg_zipfileinfo[ls_i].table_name)
  1331. ds_data.reset()
  1332. if trim(arg_zipfileinfo[ls_i].table_name)<>"" and arg_zipfileinfo[ls_i].table_name <> dts_deletelog then
  1333. //<1>取出该文件信息
  1334. if f_get_tntblinfo(arg_zipfileinfo[ls_i].table_name,ls_tntblinfo)=1 then
  1335. ls_sc_id_name=trim(ls_tntblinfo.Sc_id_name)
  1336. ls_Indcolumn_name=trim(ls_tntblinfo.Indcolumn_name)
  1337. ls_thr_Indcolumn_name=trim(ls_tntblinfo.thrindcolumn_name)
  1338. ls_fou_Indcolumn_name=trim(ls_tntblinfo.fouindcolumn_name)
  1339. int_tabletype=ls_tntblinfo.tabletype
  1340. exporttype=ls_tntblinfo.exporttype
  1341. else
  1342. ls_msg=arg_zipfileinfo[ls_i].table_name+"不在系统记录中;"
  1343. arg_log=arg_log+ls_msg+char_enter
  1344. export_fail++
  1345. goto nexttable
  1346. end if
  1347. if arg_if_usedefaultdt then //应用自动提取更新时间范围功能
  1348. rslt=uf_Getrsl_trandt(arg_transaction,arg_scid,arg_zipfileinfo[ls_i].table_name,d_newlydt,dg_newlydt,msg_err_sql)
  1349. if rslt=0 then
  1350. arg_log=arg_log+"["+arg_zipfileinfo[ls_i].table_name+"]同步时间读取失败>>"+msg_err_sql+char_enter
  1351. export_fail++
  1352. goto nexttable
  1353. end if
  1354. bg_changetime=d_newlydt
  1355. end if
  1356. //<2>生成select语句
  1357. str_dwSQl="select "+arg_zipfileinfo[ls_i].table_name+".* from "+arg_zipfileinfo[ls_i].table_name
  1358. //<3>生成DW
  1359. ls_msg=""
  1360. ////////////////////////////////////////////////////
  1361. //str_SyntaxFromSQL =arg_transaction.SyntaxFromSQL(str_dwSQl,"style(type=grid)",ls_msg)
  1362. str_SyntaxFromSQL =sqlca.SyntaxFromSQL(str_dwSQl,"style(type=grid)",ls_msg)
  1363. if ls_msg>'' then
  1364. arg_msg=arg_zipfileinfo[ls_i].table_name+"dw语法生成失败"
  1365. arg_log=arg_log+arg_msg+char_enter
  1366. export_fail++
  1367. goto nexttable
  1368. end if
  1369. ds_data.Create(str_SyntaxFromSQL,ls_msg)
  1370. if ls_msg>'' then
  1371. arg_msg=arg_zipfileinfo[ls_i].table_name+"建立相关DW失败"
  1372. arg_log=arg_log+arg_msg+char_enter
  1373. export_fail++
  1374. goto nexttable
  1375. end if
  1376. //<4>检查字段,修正select语句的where子句
  1377. i_udf=0
  1378. i_cgt=0
  1379. for ls_j=1 to integer(ds_data.Object.DataWindow.Column.Count)
  1380. if Lower(ds_data.Describe("#"+string(ls_j)+".Name"))=Lower(sys_changetime) then
  1381. i_cgt=1 //有此字段
  1382. end if
  1383. next
  1384. if i_cgt=1 then //生成sys_changetime where 子句
  1385. str_dwSQl=str_dwSQl+" where "+&
  1386. sys_changetime+">='"+string(bg_changetime)+"' and "+&
  1387. sys_changetime+"<='"+string(ed_changetime)+"'"
  1388. end if
  1389. if trim(arg_zipfileinfo[ls_i].filter_string)<>'' then
  1390. if pos(lower(str_dwSQl)," where ")>0 then
  1391. str_dwSQl=str_dwSQl+" and "+arg_zipfileinfo[ls_i].filter_string
  1392. else
  1393. str_dwSQl=str_dwSQl+" where "+arg_zipfileinfo[ls_i].filter_string
  1394. end if
  1395. end if
  1396. ds_data.Modify("datawindow.table.select = ~"" + str_dwSQl+ "~"")
  1397. //<5>DW取数
  1398. ds_data.settransobject(arg_transaction)
  1399. w_sys_wait_jdt.st_msg.text=arg_zipfileinfo[ls_i].table_name+" 正在取数据..." //进度信息
  1400. lg_rowcount=ds_data.retrieve()
  1401. if lg_rowcount>0 then //如果有数据,开始更新
  1402. /////////////////////////////////////////////////////////////////////////////////////////
  1403. PK1_sit=0
  1404. PK2_sit=0
  1405. //定位主关键字段位置,ls_Indcolumn_name为空则为单关键字表
  1406. for ls_k=1 to integer(ds_data.Object.DataWindow.Column.Count)
  1407. if Lower(ds_data.Describe("#"+string(ls_k)+".Name"))=Lower(ls_sc_id_name) then
  1408. PK1_sit=ls_k //有此字段
  1409. //PK1_type=ds_data.Describe("#"+string(ls_k)+".type")
  1410. end if
  1411. if not ls_Indcolumn_name='' then
  1412. if Lower(ds_data.Describe("#"+string(ls_k)+".Name"))=Lower(ls_Indcolumn_name) then
  1413. PK2_sit=ls_k
  1414. end if
  1415. end if
  1416. if not ls_thr_Indcolumn_name='' then
  1417. if Lower(ds_data.Describe("#"+string(ls_k)+".Name"))=Lower(ls_thr_Indcolumn_name) then
  1418. PK3_sit=ls_k
  1419. end if
  1420. end if
  1421. if not ls_fou_Indcolumn_name='' then
  1422. if Lower(ds_data.Describe("#"+string(ls_k)+".Name"))=Lower(ls_fou_Indcolumn_name) then
  1423. PK4_sit=ls_k
  1424. end if
  1425. end if
  1426. next //ls_k
  1427. if PK1_sit+PK2_sit=0 then
  1428. arg_log=arg_log+'<'+string(ls_i)+">["+arg_zipfileinfo[ls_i].table_name+"]错误主键名称."+char_enter
  1429. goto nexttable
  1430. end if
  1431. //<5>循环生成SQl语句,更新数据库
  1432. msg_err_sql=''
  1433. ins_c=0
  1434. upt_c=0
  1435. for ls_j=1 to lg_rowcount
  1436. field_str=""
  1437. obj_value=""
  1438. SelectPri1=""
  1439. SelectPri2=""
  1440. SelectPri3=""
  1441. SelectPri4=""
  1442. UpdateField=""
  1443. update_string=""
  1444. //取主关键字的内容
  1445. SelectPri1=iuf_getdwvalue(ds_data,ls_j,PK1_sit)
  1446. if SelectPri1="[err]" then
  1447. rowcount_update_false++
  1448. goto nextrow
  1449. end if
  1450. if not ls_Indcolumn_name='' then //双主键
  1451. SelectPri2=iuf_getdwvalue(ds_data,ls_j,PK2_sit)
  1452. if SelectPri2="[err]" then
  1453. rowcount_update_false++
  1454. goto nextrow
  1455. end if
  1456. end if
  1457. if not ls_thr_Indcolumn_name='' then //三主键
  1458. SelectPri3=iuf_getdwvalue(ds_data,ls_j,PK3_sit)
  1459. if SelectPri3="[err]" then
  1460. rowcount_update_false++
  1461. goto nextrow
  1462. end if
  1463. end if
  1464. if not ls_fou_Indcolumn_name='' then //四主键
  1465. SelectPri4=iuf_getdwvalue(ds_data,ls_j,PK4_sit)
  1466. if SelectPri4="[err]" then
  1467. rowcount_update_false++
  1468. goto nextrow
  1469. end if
  1470. end if
  1471. //++++++++生成更新子段语句++++++
  1472. //先更新记录---------------------------
  1473. for ls_k=1 to integer(ds_data.Object.DataWindow.Column.Count)
  1474. obj_value=iuf_getdwvalue(ds_data,ls_j,ls_k)
  1475. if SelectPri1="[err]" then
  1476. rowcount_update_false++
  1477. goto nextrow
  1478. end if
  1479. UpdateField=UpdateField+ds_data.describe("#"+string(ls_k)+".Name")+"="+obj_value+","
  1480. next //ls_k
  1481. UpdateField=left(UpdateField,len(UpdateField) - 1)
  1482. update_string="Update "+arg_zipfileinfo[ls_i].table_name+" set " +UpdateField + " where "+&
  1483. ls_sc_id_name+"="+SelectPri1
  1484. if ls_Indcolumn_name<>'' then //双主键
  1485. update_string=update_string+" and "+ls_Indcolumn_name+"="+SelectPri2
  1486. end if
  1487. if ls_thr_Indcolumn_name<>'' then //三主键
  1488. update_string=update_string+" and "+ls_thr_Indcolumn_name+"="+SelectPri3
  1489. end if
  1490. if ls_fou_Indcolumn_name<>'' then //四主键
  1491. update_string=update_string+" and "+ls_fou_Indcolumn_name+"="+SelectPri4
  1492. end if
  1493. Execute immediate :update_string using arg_obj_transaction; //执行Update
  1494. if arg_obj_transaction.sqlcode<>0 then
  1495. if len(msg_err_sql)<65000 then
  1496. msg_err_sql=msg_err_sql+' /'+string(ls_j)+' Error SQL{'+update_string+'}'+char_enter+'['+arg_obj_transaction.sqlerrtext+']'+char_enter
  1497. else
  1498. if left(right(msg_err_sql,5),3)<>'...' then msg_err_sql=msg_err_sql+'...'+char_enter
  1499. end if
  1500. rowcount_update_false++
  1501. goto nextrow
  1502. else
  1503. if arg_obj_transaction.sqlnrows=0 then
  1504. //更新不成功就插入-----------
  1505. field_str=""
  1506. obj_value=""
  1507. value_str=''
  1508. update_string=""
  1509. for ls_k=1 to integer(ds_data.Object.DataWindow.Column.Count)
  1510. obj_value=iuf_getdwvalue(ds_data,ls_j,ls_k)
  1511. if SelectPri1="[err]" then
  1512. rowcount_update_false++
  1513. goto nextrow
  1514. end if
  1515. field_str=field_str+ds_data.describe("#"+string(ls_k)+".Name")+","
  1516. value_str=value_str+obj_value+","
  1517. next //ls_k
  1518. field_str=left(field_str,len(field_str)-1)
  1519. value_str=left(value_str,len(value_str)-1)
  1520. update_string="Insert into "+arg_zipfileinfo[ls_i].table_name+" ("+field_str+&
  1521. ") values ("+value_str+")"
  1522. Execute immediate :update_string using arg_obj_transaction; //执行Insert
  1523. if arg_obj_transaction.sqlcode<>0 then
  1524. if len(msg_err_sql)<65000 then
  1525. msg_err_sql=msg_err_sql+' /'+string(ls_j)+' Error SQL{'+update_string+'}'+char_enter
  1526. else
  1527. if left(right(msg_err_sql,5),3)<>'...' then msg_err_sql=msg_err_sql+'...'+char_enter
  1528. end if
  1529. rowcount_update_false++
  1530. goto nextrow
  1531. end if
  1532. rslt_insert_rowcount++
  1533. ins_c++
  1534. else
  1535. rslt_update_rowcount++
  1536. upt_c++
  1537. end if
  1538. end if
  1539. rowcount_update_ok++
  1540. if Mod(ls_j , arg_commitstep)=0 then //够提交步长则提交
  1541. commit using arg_obj_transaction;
  1542. end if
  1543. nextrow:
  1544. w_sys_wait_jdt.st_msg.text="正在执行更新... >"+arg_zipfileinfo[ls_i].table_name+">"+string(rowcount_update_ok)+'/'+string(ls_j)
  1545. next //ls_j
  1546. arg_log=arg_log+'<'+string(ls_i)+">["+arg_zipfileinfo[ls_i].table_name+"]成功:"+string(rowcount_update_ok)+"(更新-"+string(upt_c)+"/插入-"+string(ins_c)+")失败:"+string(rowcount_update_false)+"."+char_enter
  1547. if trim(msg_err_sql)<>'' then arg_log=arg_log+msg_err_sql+char_enter
  1548. commit using arg_obj_transaction;
  1549. /////////////////////////////////////////////////////////////////////////////////////////
  1550. else
  1551. arg_log=arg_log+'<'+string(ls_i)+">0 ["+arg_zipfileinfo[ls_i].table_name+"]"+char_enter
  1552. end if
  1553. end if
  1554. exprot_suc++
  1555. nexttable:
  1556. commit using arg_obj_transaction;
  1557. //记录最近完成的时间
  1558. if rowcount_update_false=0 and rslt=1 then
  1559. rslt=uf_setrsl_trandt(arg_transaction,arg_scid,arg_zipfileinfo[ls_i].table_name,ed_changetime,datetime(1900-01-01),arg_msg)
  1560. if rslt=0 then
  1561. arg_log=arg_log+'更新完成时间失败>'+arg_msg+char_enter
  1562. end if
  1563. end if
  1564. w_sys_wait_jdt.wf_inc(ls_i+1) //进度
  1565. //end if
  1566. next//ls_i
  1567. arg_log=arg_log+"数据表导出:成功表-"+string(exprot_suc)+",失败-"+string(export_fail)+'[记录合计:插入-'+string(rslt_insert_rowcount)+'/更新-'+string(rslt_update_rowcount)+']'+char_enter
  1568. arg_log=arg_log+"导出记录数合计:"+string(rowc)+char_enter
  1569. w_sys_wait_jdt.wf_inc(arg_tableno+1) //进度完成
  1570. w_sys_wait_jdt.st_msg.text="正在建立日志文件..."
  1571. ls_temppathname=cur_path+importlogpath+'\'+"YF_Import_online"+string(today(),'yyyymmdd')+string(now(),'hhmmss')+".log"
  1572. if arg_if_buildlogfile then
  1573. rslt=pf_writetifofile(arg_log,ls_temppathname,arg_msg)
  1574. if rslt=0 then
  1575. arg_msg="写日志文件失败>>"+arg_msg
  1576. rslt=1
  1577. end if
  1578. end if
  1579. ext:
  1580. close(w_sys_wait_jdt)
  1581. return rslt
  1582. end function
  1583. public function integer f_tranmstpdata_online (ref transaction arg_transaction, ref transaction arg_obj_transaction, s_exporttableinfo arg_zipfileinfo[300], integer arg_tableno, boolean arg_if_buildlogfile, ref string arg_msg, ref string arg_log);//f_tranmstpdata_online(arg_transaction,arg_obj_transaction,arg_zipfileinfo[300],arg_tableno,arg_if_buildlogfile,arg_msg,arg_log)
  1584. //在线取未结清应收应付单据
  1585. //arg_zipfileinfo[300] :要导出的表的名称列表
  1586. //arg_tableno
  1587. //arg_if_buildlogfile
  1588. //arg_msg
  1589. //arg_log :返回日志内容
  1590. //
  1591. //1.循环:(源事务)动态建立DW\retrieve
  1592. //2. (目标事务)循环生成更新语句,更新不成功则新建,(源事务)删除或变为历史数据,两事务同时成功,同时失败
  1593. //3. 执行更新(注意不定时访问源事务,保证连接,如果连接失败,重试,如果也失败,就终止下一表数据提取)
  1594. string str_export_table_info=''
  1595. long exprot_suc=0,export_fail=0,rowc,del_fail,del_suc,rowcount_update_false,rowcount_update_ok
  1596. long rslt_insert_rowcount,rslt_update_rowcount,ins_c,upt_c
  1597. long rslt=1,l_rslt=1
  1598. int li_FileNum,int_tabletype
  1599. int exporttype=0
  1600. s_sys_tntblinfo ls_tntblinfo
  1601. string cur_path,ls_filepathname,ls_sc_id_name,ls_Indcolumn_name,ls_msg,msg_err_sql,ls_temppathname
  1602. long ls_i,ls_j,ls_k,lg_rowcount,lg_rslt
  1603. string char_enter
  1604. string str_dwSQl,str_SyntaxFromSQL,del_sqlstr
  1605. long PK1_sit,PK2_sit,PK3_sit,PK4_sit
  1606. string ls_thr_Indcolumn_name,ls_fou_Indcolumn_name
  1607. arg_log=""
  1608. string field_str,obj_value,SelectPri1,SelectPri2,SelectPri3,SelectPri4,UpdateField,update_string,value_str
  1609. char_enter=char(13)+char(10) //换行符
  1610. open(w_sys_wait_jdt) //初始化进度条
  1611. w_sys_wait_jdt.show()
  1612. w_sys_wait_jdt.wf_accepttol(arg_tableno+2)
  1613. //取得当前绝对路径
  1614. cur_path=sys_cur_path
  1615. /////////////////////////////(目标事务)处理转移单据
  1616. for ls_i=1 to arg_tableno
  1617. rowcount_update_ok=0
  1618. rowcount_update_false=0
  1619. w_sys_wait_jdt.st_msg.text="预处理[更新数据]:"+arg_zipfileinfo[ls_i].table_name //进度信息
  1620. arg_zipfileinfo[ls_i].table_name=lower(arg_zipfileinfo[ls_i].table_name)
  1621. ds_data.reset()
  1622. if trim(arg_zipfileinfo[ls_i].table_name)<>"" then
  1623. //<1>取出该文件信息
  1624. if f_get_tntblinfo(arg_zipfileinfo[ls_i].table_name,ls_tntblinfo)=1 then
  1625. ls_sc_id_name=trim(ls_tntblinfo.Sc_id_name)
  1626. ls_Indcolumn_name=trim(ls_tntblinfo.Indcolumn_name)
  1627. ls_thr_Indcolumn_name=trim(ls_tntblinfo.thrindcolumn_name)
  1628. ls_fou_Indcolumn_name=trim(ls_tntblinfo.fouindcolumn_name)
  1629. int_tabletype=ls_tntblinfo.tabletype
  1630. exporttype=ls_tntblinfo.exporttype
  1631. else
  1632. ls_msg=arg_zipfileinfo[ls_i].table_name+"不在系统记录中;"
  1633. arg_log=arg_log+ls_msg+char_enter
  1634. rslt=0
  1635. goto ext
  1636. end if
  1637. //<2>生成select语句
  1638. str_dwSQl="select "+arg_zipfileinfo[ls_i].table_name+".* from "+arg_zipfileinfo[ls_i].table_name
  1639. //<3>生成DW
  1640. ls_msg=""
  1641. //////////////////////////////////////////////////////////////////////////
  1642. //str_SyntaxFromSQL =arg_transaction.SyntaxFromSQL(str_dwSQl,"style(type=grid)",ls_msg)
  1643. str_SyntaxFromSQL =sqlca.SyntaxFromSQL(str_dwSQl,"style(type=grid)",ls_msg)
  1644. if ls_msg>'' then
  1645. arg_msg=arg_zipfileinfo[ls_i].table_name+"dw语法生成失败"
  1646. arg_log=arg_log+arg_msg+char_enter
  1647. rslt=0
  1648. goto ext
  1649. end if
  1650. ds_data.Create(str_SyntaxFromSQL,ls_msg)
  1651. if ls_msg>'' then
  1652. arg_msg=arg_zipfileinfo[ls_i].table_name+"建立相关DW失败"
  1653. arg_log=arg_log+arg_msg+char_enter
  1654. rslt=0
  1655. goto ext
  1656. end if
  1657. //<4>检查字段,修正select语句的where子句
  1658. if trim(arg_zipfileinfo[ls_i].filter_string)<>'' then
  1659. if pos(lower(str_dwSQl)," where ")>0 then
  1660. str_dwSQl=str_dwSQl+" and "+arg_zipfileinfo[ls_i].filter_string
  1661. else
  1662. str_dwSQl=str_dwSQl+" where "+arg_zipfileinfo[ls_i].filter_string
  1663. end if
  1664. end if
  1665. ds_data.Modify("datawindow.table.select = ~"" + str_dwSQl+ "~"")
  1666. //<5>DW取数
  1667. ds_data.settransobject(arg_transaction)
  1668. w_sys_wait_jdt.st_msg.text=arg_zipfileinfo[ls_i].table_name+" 正在取数据..." //进度信息
  1669. lg_rowcount=ds_data.retrieve()
  1670. if lg_rowcount>0 then //如果有数据,开始更新
  1671. /////////////////////////////////////////////////////////////////////////////////////////
  1672. PK1_sit=0
  1673. PK2_sit=0
  1674. //定位主关键字段位置,ls_Indcolumn_name为空则为单关键字表
  1675. for ls_k=1 to integer(ds_data.Object.DataWindow.Column.Count)
  1676. if Lower(ds_data.Describe("#"+string(ls_k)+".Name"))=Lower(ls_sc_id_name) then
  1677. PK1_sit=ls_k //有此字段
  1678. end if
  1679. if not ls_Indcolumn_name='' then
  1680. if Lower(ds_data.Describe("#"+string(ls_k)+".Name"))=Lower(ls_Indcolumn_name) then
  1681. PK2_sit=ls_k
  1682. end if
  1683. end if
  1684. if not ls_thr_Indcolumn_name='' then
  1685. if Lower(ds_data.Describe("#"+string(ls_k)+".Name"))=Lower(ls_thr_Indcolumn_name) then
  1686. PK3_sit=ls_k
  1687. end if
  1688. end if
  1689. if not ls_fou_Indcolumn_name='' then
  1690. if Lower(ds_data.Describe("#"+string(ls_k)+".Name"))=Lower(ls_fou_Indcolumn_name) then
  1691. PK4_sit=ls_k
  1692. end if
  1693. end if
  1694. next //ls_k
  1695. if PK1_sit+PK2_sit=0 then
  1696. arg_log=arg_log+'<'+string(ls_i)+">["+arg_zipfileinfo[ls_i].table_name+"]错误主键名称."+char_enter
  1697. rslt=0
  1698. goto ext
  1699. end if
  1700. //<5>循环生成SQl语句,更新数据库
  1701. msg_err_sql=''
  1702. ins_c=0
  1703. upt_c=0
  1704. for ls_j=1 to lg_rowcount
  1705. field_str=""
  1706. obj_value=""
  1707. SelectPri1=""
  1708. SelectPri2=""
  1709. SelectPri3=""
  1710. SelectPri4=""
  1711. UpdateField=""
  1712. update_string=""
  1713. //取主关键字的内容
  1714. SelectPri1=iuf_getdwvalue(ds_data,ls_j,PK1_sit)
  1715. if SelectPri1="[err]" then
  1716. rslt=0
  1717. goto ext
  1718. end if
  1719. if not ls_Indcolumn_name='' then //双主键
  1720. SelectPri2=iuf_getdwvalue(ds_data,ls_j,PK2_sit)
  1721. if SelectPri2="[err]" then
  1722. rslt=0
  1723. goto ext
  1724. end if
  1725. end if
  1726. if not ls_thr_Indcolumn_name='' then //三主键
  1727. SelectPri3=iuf_getdwvalue(ds_data,ls_j,PK3_sit)
  1728. if SelectPri3="[err]" then
  1729. rslt=0
  1730. goto ext
  1731. end if
  1732. end if
  1733. if not ls_fou_Indcolumn_name='' then //四主键
  1734. SelectPri4=iuf_getdwvalue(ds_data,ls_j,PK4_sit)
  1735. if SelectPri4="[err]" then
  1736. rslt=0
  1737. goto ext
  1738. end if
  1739. end if
  1740. //++++++++生成更新子段语句++++++
  1741. //先更新记录---------------------------
  1742. for ls_k=1 to integer(ds_data.Object.DataWindow.Column.Count)
  1743. obj_value=iuf_getdwvalue(ds_data,ls_j,ls_k)
  1744. if SelectPri1="[err]" then
  1745. rslt=0
  1746. goto ext
  1747. end if
  1748. UpdateField=UpdateField+ds_data.describe("#"+string(ls_k)+".Name")+"="+obj_value+","
  1749. next //ls_k
  1750. UpdateField=left(UpdateField,len(UpdateField) - 1)
  1751. update_string="Update "+arg_zipfileinfo[ls_i].table_name+" set " +UpdateField + " where "+&
  1752. ls_sc_id_name+"="+SelectPri1
  1753. if ls_Indcolumn_name<>'' then //双主键
  1754. update_string=update_string+" and "+ls_Indcolumn_name+"="+SelectPri2
  1755. end if
  1756. if ls_thr_Indcolumn_name<>'' then //三主键
  1757. update_string=update_string+" and "+ls_thr_Indcolumn_name+"="+SelectPri3
  1758. end if
  1759. if ls_fou_Indcolumn_name<>'' then //四主键
  1760. update_string=update_string+" and "+ls_fou_Indcolumn_name+"="+SelectPri4
  1761. end if
  1762. Execute immediate :update_string using arg_obj_transaction; //执行Update
  1763. if arg_obj_transaction.sqlcode<>0 then
  1764. if len(msg_err_sql)<65000 then
  1765. msg_err_sql=msg_err_sql+' /'+string(ls_j)+' Error SQL{'+update_string+'}'+char_enter+'['+arg_obj_transaction.sqlerrtext+']'+char_enter
  1766. else
  1767. if left(right(msg_err_sql,5),3)<>'...' then msg_err_sql=msg_err_sql+'...'+char_enter
  1768. end if
  1769. rslt=0
  1770. goto ext
  1771. else
  1772. if arg_obj_transaction.sqlnrows=0 then
  1773. //更新不成功就插入-----------
  1774. field_str=""
  1775. obj_value=""
  1776. value_str=''
  1777. update_string=""
  1778. for ls_k=1 to integer(ds_data.Object.DataWindow.Column.Count)
  1779. obj_value=iuf_getdwvalue(ds_data,ls_j,ls_k)
  1780. if SelectPri1="[err]" then
  1781. rslt=0
  1782. goto ext
  1783. end if
  1784. field_str=field_str+ds_data.describe("#"+string(ls_k)+".Name")+","
  1785. value_str=value_str+obj_value+","
  1786. next //ls_k
  1787. field_str=left(field_str,len(field_str)-1)
  1788. value_str=left(value_str,len(value_str)-1)
  1789. update_string="Insert into "+arg_zipfileinfo[ls_i].table_name+" ("+field_str+&
  1790. ") values ("+value_str+")"
  1791. Execute immediate :update_string using arg_obj_transaction; //执行Insert
  1792. if arg_obj_transaction.sqlcode<>0 then
  1793. if len(msg_err_sql)<65000 then
  1794. msg_err_sql=msg_err_sql+' /'+string(ls_j)+' Error SQL{'+update_string+'}'+char_enter
  1795. else
  1796. if left(right(msg_err_sql,5),3)<>'...' then msg_err_sql=msg_err_sql+'...'+char_enter
  1797. end if
  1798. rslt=0
  1799. goto ext
  1800. end if
  1801. rslt_insert_rowcount++
  1802. ins_c++
  1803. else
  1804. rslt_update_rowcount++
  1805. upt_c++
  1806. end if
  1807. end if
  1808. rowcount_update_ok++
  1809. w_sys_wait_jdt.st_msg.text="正在执行更新... >"+arg_zipfileinfo[ls_i].table_name+">"+string(rowcount_update_ok)+'/'+string(ls_j)
  1810. next //ls_j
  1811. arg_log=arg_log+'<'+string(ls_i)+">["+arg_zipfileinfo[ls_i].table_name+"]成功:"+string(rowcount_update_ok)+"(更新-"+string(upt_c)+"/插入-"+string(ins_c)+")失败:"+string(rowcount_update_false)+"."+char_enter
  1812. if trim(msg_err_sql)<>'' then arg_log=arg_log+msg_err_sql+char_enter
  1813. /////////////////////////////////////////////////////////////////////////////////////////
  1814. else
  1815. arg_log=arg_log+'<'+string(ls_i)+">0 ["+arg_zipfileinfo[ls_i].table_name+"]"+char_enter
  1816. end if
  1817. end if
  1818. exprot_suc++
  1819. w_sys_wait_jdt.wf_inc(ls_i+1) //进度
  1820. next//ls_i
  1821. /////////////////////////////(原事务)删除转移单据
  1822. for ls_i=1 to arg_tableno
  1823. w_sys_wait_jdt.st_msg.text="预处理[删除数据]:"+arg_zipfileinfo[ls_i].table_name //进度信息
  1824. del_sqlstr=""
  1825. //更新或新建成功则在源事务中删除或设为历史//生成删除语句
  1826. del_sqlstr="delete from "+arg_zipfileinfo[ls_i].table_name + " where "+arg_zipfileinfo[ls_i].filter_string
  1827. Execute immediate :del_sqlstr using arg_transaction; //执行delete
  1828. if arg_transaction.sqlcode<>0 then
  1829. if len(msg_err_sql)<65000 then
  1830. msg_err_sql=msg_err_sql+' /'+string(ls_j)+' Error SQL{'+update_string+'}'+char_enter
  1831. else
  1832. if left(right(msg_err_sql,5),3)<>'...' then msg_err_sql=msg_err_sql+'...'+char_enter
  1833. end if
  1834. rslt=0
  1835. goto ext
  1836. end if
  1837. w_sys_wait_jdt.wf_inc(ls_i+1) //进度
  1838. next//ls_i
  1839. arg_log=arg_log+"数据表导出:成功表-"+string(exprot_suc)+",失败-"+string(export_fail)+'[记录合计:插入-'+string(rslt_insert_rowcount)+'/更新-'+string(rslt_update_rowcount)+']'+char_enter
  1840. w_sys_wait_jdt.wf_inc(arg_tableno+1) //进度完成
  1841. w_sys_wait_jdt.st_msg.text="正在建立日志文件..."
  1842. ls_temppathname=cur_path+importlogpath+'\'+"YF_Import_online"+string(today(),'yyyymmdd')+string(now(),'hhmmss')+".log"
  1843. if arg_if_buildlogfile then
  1844. l_rslt=pf_writetifofile(arg_log,ls_temppathname,arg_msg)
  1845. if l_rslt=0 then arg_msg="写日志文件失败>>"+arg_msg
  1846. end if
  1847. ext:
  1848. if rslt=0 then
  1849. rollback using arg_obj_transaction;
  1850. rollback using arg_transaction;
  1851. else
  1852. commit using arg_obj_transaction;
  1853. commit using arg_transaction;
  1854. end if
  1855. close(w_sys_wait_jdt)
  1856. return rslt
  1857. end function
  1858. public function integer f_exportdata (transaction arg_transaction, s_exporttableinfo arg_zipfileinfo[300], integer arg_tableno, datetime arg_bg_changetime, datetime arg_ed_changetime, integer arg_usechangetime, integer arg_getflag, string arg_exportfilename, boolean arg_if_buildlogfile, ref string arg_msg, ref string arg_log);//f_exportdata
  1859. //arg_zipfileinfo[] :要导出的表的名称列表
  1860. //arg_bg_changetime :时间范围提取-开始时间
  1861. //arg_ed_changetime :时间范围提取-结束时间
  1862. //arg_usechangetime :是否应用时间范围提取(除了没有改变时间字段的)记录,1-是,0否
  1863. //arg_getflag :是否只取更新标记的(除了没有更新标记字段的)记录1-是,0否
  1864. //arg_exportfilename:生成的目标文件名称
  1865. //arg_log :返回日志内容
  1866. //1.删除临时目录中的相应DBF
  1867. //2.循环:动态建立DW\retrieve\导出DBF(文件名称为表名称)
  1868. //3.压缩文件为目标文件
  1869. string str_export_table_info=''
  1870. string DBFfilename[]
  1871. long exprot_suc=0,export_fail=0,rowc
  1872. long rslt=1,l_rslt=1
  1873. int li_FileNum,int_tabletype
  1874. int exporttype=0
  1875. s_sys_tntblinfo ls_tntblinfo
  1876. string cur_path,ls_filepathname,ls_sc_id_name,ls_Indcolumn_name,ls_msg
  1877. long ls_i,ls_j,ls_k,lg_rowcount,lg_rslt
  1878. string char_enter
  1879. string str_dwSQl,str_SyntaxFromSQL
  1880. int i_cgt,i_udf
  1881. arg_log=""
  1882. char_enter=char(13)+char(10) //换行符
  1883. open(w_sys_wait_jdt) //初始化进度条
  1884. If Pos(arg_exportfilename, ":\") <= 0 Then
  1885. arg_msg= "必须输入完整的目标文件文件路径."
  1886. rslt=0
  1887. GoTo ext
  1888. End If
  1889. w_sys_wait_jdt.show()
  1890. w_sys_wait_jdt.wf_accepttol(arg_tableno+2)
  1891. //取得当前绝对路径
  1892. cur_path=sys_cur_path
  1893. //删除原有文件
  1894. for ls_i=1 to arg_tableno
  1895. if trim(arg_zipfileinfo[ls_i].table_name)<>"" then
  1896. ls_filepathname=cur_path+exporttempfilepath+'\'+trim(arg_zipfileinfo[ls_i].table_name)+".dbf"
  1897. if FileExists(ls_filepathname) then
  1898. if not FileDelete(ls_filepathname) then
  1899. rslt=0
  1900. arg_msg="删除临时文件失败("+ls_filepathname+"),请先手动清除!"
  1901. goto ext
  1902. end if
  1903. end if
  1904. end if
  1905. next
  1906. ls_filepathname=cur_path+exporttempfilepath+'\'+infofilename
  1907. if FileExists(ls_filepathname) then
  1908. if not FileDelete(ls_filepathname) then
  1909. rslt=0
  1910. arg_msg="删除临时文件失败("+ls_filepathname+"),请先手动清除!"
  1911. goto ext
  1912. end if
  1913. end if
  1914. //循环生成DBF或blb
  1915. ls_k=0
  1916. for ls_i=1 to arg_tableno
  1917. setnull(blbdw_data)
  1918. //if trim(arg_zipfileinfo[ls_i].table_name)<>"" then
  1919. w_sys_wait_jdt.st_msg.text="预处理:"+arg_zipfileinfo[ls_i].table_name //进度信息
  1920. arg_zipfileinfo[ls_i].table_name=lower(arg_zipfileinfo[ls_i].table_name)
  1921. ds_data.reset()
  1922. if trim(arg_zipfileinfo[ls_i].table_name)<>"" then
  1923. //<1>取出该文件信息
  1924. if f_get_tntblinfo(arg_zipfileinfo[ls_i].table_name,ls_tntblinfo)=1 then
  1925. ls_sc_id_name=trim(ls_tntblinfo.Sc_id_name)
  1926. ls_Indcolumn_name=trim(ls_tntblinfo.Indcolumn_name)
  1927. int_tabletype=ls_tntblinfo.tabletype
  1928. exporttype=ls_tntblinfo.exporttype
  1929. else
  1930. ls_msg=arg_zipfileinfo[ls_i].table_name+"不在系统记录中;"
  1931. arg_log=arg_log+ls_msg+char_enter
  1932. export_fail++
  1933. goto nexttable
  1934. end if
  1935. //<2>生成select语句
  1936. if arg_zipfileinfo[ls_i].dw_creattype = 1 then //直接用filter_string作str_dwSQl
  1937. str_dwSQl=arg_zipfileinfo[ls_i].filter_string
  1938. else
  1939. str_dwSQl="select "+arg_zipfileinfo[ls_i].table_name+".* from "+arg_zipfileinfo[ls_i].table_name
  1940. end if
  1941. //<3>生成DW
  1942. ls_msg=""
  1943. str_SyntaxFromSQL =arg_transaction.SyntaxFromSQL(str_dwSQl,"style(type=grid)",ls_msg)
  1944. if ls_msg>'' then
  1945. arg_msg=arg_zipfileinfo[ls_i].table_name+"dw语法生成失败"
  1946. arg_log=arg_log+arg_msg+char_enter
  1947. export_fail++
  1948. goto nexttable
  1949. end if
  1950. ds_data.Create(str_SyntaxFromSQL,ls_msg)
  1951. if ls_msg>'' then
  1952. arg_msg=arg_zipfileinfo[ls_i].table_name+"建立相关DW失败"
  1953. arg_log=arg_log+arg_msg+char_enter
  1954. export_fail++
  1955. goto nexttable
  1956. end if
  1957. //<4>检查字段,修正select语句的where子句
  1958. if not arg_zipfileinfo[ls_i].dw_creattype = 1 then
  1959. i_udf=0
  1960. i_cgt=0
  1961. for ls_j=1 to integer(ds_data.Object.DataWindow.Column.Count)
  1962. if Lower(ds_data.Describe("#"+string(ls_j)+".Name"))=Lower(SYS_CHANGEFLAG) then
  1963. i_udf=1 //有此字段
  1964. end if
  1965. if Lower(ds_data.Describe("#"+string(ls_j)+".Name"))=Lower(sys_changetime) then
  1966. i_cgt=1 //有此字段
  1967. end if
  1968. next
  1969. if i_udf=1 and arg_getflag=1 then //通过更新标记提取
  1970. if i_cgt=1 and arg_usechangetime=1 then //通过
  1971. str_dwSQl=str_dwSQl+" where "+SYS_CHANGEFLAG+"=1 and "+&
  1972. sys_changetime+">='"+string(arg_bg_changetime)+"' and "+&
  1973. sys_changetime+"<='"+string(arg_ed_changetime)+"'"
  1974. else
  1975. str_dwSQl=str_dwSQl+" where "+SYS_CHANGEFLAG+"=1 "
  1976. end if
  1977. else
  1978. if i_cgt=1 and arg_usechangetime=1 then
  1979. str_dwSQl=str_dwSQl+" where "+&
  1980. sys_changetime+">='"+string(arg_bg_changetime)+"' and "+&
  1981. sys_changetime+"<='"+string(arg_ed_changetime)+"'"
  1982. else
  1983. end if
  1984. end if
  1985. if trim(arg_zipfileinfo[ls_i].filter_string)<>'' then
  1986. if pos(lower(str_dwSQl)," where ")>0 then
  1987. str_dwSQl=str_dwSQl+" and "+arg_zipfileinfo[ls_i].filter_string
  1988. else
  1989. str_dwSQl=str_dwSQl+" where "+arg_zipfileinfo[ls_i].filter_string
  1990. end if
  1991. end if
  1992. ds_data.Modify("datawindow.table.select = ~"" + str_dwSQl+ "~"")
  1993. end if
  1994. //<5>DW取数
  1995. ds_data.settransobject(arg_transaction)
  1996. w_sys_wait_jdt.st_msg.text=arg_zipfileinfo[ls_i].table_name+" 正在取数据..." //进度信息
  1997. lg_rowcount=ds_data.retrieve()
  1998. if lg_rowcount>0 then //如果有数据
  1999. //<6>导出文件
  2000. if exporttype=1 then //导出blob
  2001. ds_data.SetItemStatus(1, 0, Primary!, dataModified!)
  2002. ls_filepathname=cur_path+exporttempfilepath+'\'+trim(arg_zipfileinfo[ls_i].table_name+'.blb')
  2003. l_rslt=ds_data.getFullState(blbdw_data)
  2004. if l_rslt>0 then
  2005. lg_rslt=1
  2006. ds_data.reset()
  2007. else
  2008. lg_rslt=0
  2009. export_fail++
  2010. goto nexttable
  2011. end if
  2012. lg_rslt=f_saveblobtofile(blbdw_data,ls_filepathname,arg_msg)
  2013. if lg_rslt=1 then //如果成功,写日志内容
  2014. ls_k++
  2015. DBFfilename[ls_k]=ls_filepathname
  2016. arg_log=arg_log+">"+string(lg_rowcount)+" ["+str_dwSQl+"]"+char_enter
  2017. rowc=rowc+lg_rowcount
  2018. str_export_table_info=str_export_table_info+arg_zipfileinfo[ls_i].table_name+';'
  2019. else
  2020. arg_log=arg_log+"["+arg_zipfileinfo[ls_i].table_name+"]导出blob失败."+char_enter
  2021. export_fail++
  2022. goto nexttable
  2023. end if
  2024. elseif exporttype=2 then //导出txt
  2025. ls_filepathname=cur_path+exporttempfilepath+'\'+trim(arg_zipfileinfo[ls_i].table_name+'.txt')
  2026. lg_rslt=ds_data.saveas(ls_filepathname,text!, false)
  2027. if lg_rslt=1 then //如果成功,写日志内容
  2028. ls_k++
  2029. DBFfilename[ls_k]=ls_filepathname
  2030. arg_log=arg_log+">"+string(lg_rowcount)+" ["+str_dwSQl+"]"+char_enter
  2031. rowc=rowc+lg_rowcount
  2032. str_export_table_info=str_export_table_info+arg_zipfileinfo[ls_i].table_name+';'
  2033. else
  2034. arg_log=arg_log+"["+arg_zipfileinfo[ls_i].table_name+"]导出txt失败."+char_enter
  2035. export_fail++
  2036. goto nexttable
  2037. end if
  2038. else //DW Save as DBF
  2039. ls_filepathname=cur_path+exporttempfilepath+'\'+trim(arg_zipfileinfo[ls_i].table_name+'.DBF')
  2040. lg_rslt=ds_data.saveas(ls_filepathname,dBASE3!, true)
  2041. if lg_rslt=1 then //如果成功,写日志内容
  2042. ls_k++
  2043. DBFfilename[ls_k]=ls_filepathname
  2044. arg_log=arg_log+">"+string(lg_rowcount)+" ["+str_dwSQl+"]"+char_enter
  2045. rowc=rowc+lg_rowcount
  2046. str_export_table_info=str_export_table_info+arg_zipfileinfo[ls_i].table_name+';'
  2047. else
  2048. arg_log=arg_log+"["+arg_zipfileinfo[ls_i].table_name+"]导出DBF失败."+char_enter
  2049. export_fail++
  2050. goto nexttable
  2051. end if
  2052. end if
  2053. else
  2054. arg_log=arg_log+">0 ["+arg_zipfileinfo[ls_i].table_name+"]"+char_enter
  2055. end if
  2056. end if
  2057. exprot_suc++
  2058. nexttable:
  2059. w_sys_wait_jdt.wf_inc(ls_i) //进度
  2060. //end if
  2061. next
  2062. arg_log=arg_log+"数据表导出:成功-"+string(exprot_suc)+",失败-"+string(export_fail)+char_enter
  2063. arg_log=arg_log+"导出记录数合计:"+string(rowc)+char_enter
  2064. w_sys_wait_jdt.st_msg.text="写信息文件..."
  2065. //写信息文件
  2066. ls_filepathname=cur_path+exporttempfilepath+'\'+infofilename
  2067. if str_export_table_info<>"" then
  2068. rslt=pf_writetifofile(str_export_table_info,ls_filepathname,arg_msg)
  2069. if rslt=0 then
  2070. arg_msg="写信息文件失败>>"+arg_msg
  2071. goto ext
  2072. end if
  2073. else
  2074. arg_log="[无提取内容]"+char_enter+arg_log
  2075. rslt=1
  2076. goto ext
  2077. end if
  2078. ls_k++
  2079. DBFfilename[ls_k]=ls_filepathname
  2080. w_sys_wait_jdt.st_msg.text="压缩文件..."
  2081. // 压缩文件
  2082. rslt=uf_zipfile(DBFfilename,arg_exportfilename,arg_msg)
  2083. if rslt=0 then
  2084. arg_msg="文件压缩失败>>"+arg_msg
  2085. goto ext
  2086. end if
  2087. arg_log="生成目标文件:"+arg_exportfilename+char_enter+arg_log
  2088. w_sys_wait_jdt.wf_inc(arg_tableno+1) //进度完成
  2089. w_sys_wait_jdt.st_msg.text="删除文件..."
  2090. //删除原有文件
  2091. string ls_arg_msg
  2092. for ls_i=1 to arg_tableno
  2093. if trim(arg_zipfileinfo[ls_i].table_name)<>"" then
  2094. ls_filepathname=cur_path+exporttempfilepath+'\'+trim(arg_zipfileinfo[ls_i].table_name)+".dbf"
  2095. if FileExists(ls_filepathname) then
  2096. if not FileDelete(ls_filepathname) then
  2097. arg_msg="删除临时文件失败("+ls_filepathname+")! "
  2098. ls_arg_msg=ls_arg_msg + arg_msg
  2099. end if
  2100. end if
  2101. end if
  2102. next
  2103. ls_filepathname=cur_path+exporttempfilepath+'\'+infofilename
  2104. if FileExists(ls_filepathname) then
  2105. if not FileDelete(ls_filepathname) then
  2106. arg_msg="删除临时文件失败("+ls_filepathname+")!"
  2107. ls_arg_msg=ls_arg_msg + arg_msg
  2108. end if
  2109. end if
  2110. w_sys_wait_jdt.wf_inc(arg_tableno+2) //进度完成
  2111. /////
  2112. ls_filepathname=cur_path+exportlogpath+'\'+"LongJoe_EXP"+string(today(),'yyyymmdd')+string(now(),'hhmmss')+".log"
  2113. if arg_if_buildlogfile then
  2114. rslt=pf_writetifofile(arg_log,ls_filepathname,arg_msg)
  2115. if rslt=0 then
  2116. arg_msg="写日志文件失败>>"+arg_msg
  2117. rslt=1
  2118. end if
  2119. end if
  2120. //
  2121. ls_arg_msg=ls_arg_msg + arg_msg
  2122. arg_msg=ls_arg_msg
  2123. //
  2124. ext:
  2125. close(w_sys_wait_jdt)
  2126. return rslt
  2127. end function
  2128. public function integer f_exportdata_blob (integer arg_usechangetime, datetime arg_bg_changtime, datetime arg_ed_changtime, string arg_exportfilename, string arg_exportbfilename, integer arg_info, ref string arg_msg);//将导出文件处理转blob再写入文件
  2129. //f_exportdata_blob(arg_usechangetime,arg_bg_changtime,arg_ed_changtime,arg_exportfilename,arg_exportbfilename,arg_info,arg_msg)
  2130. //headinfo=sys_system_id + arg_info + arg_usechangetime + arg_bg_changtime + arg_ed_changtime
  2131. //arg_info 0:定义数据包
  2132. // 1:分部数据包
  2133. // -1:历史数据包
  2134. int rslt=1
  2135. blob blob_zipfile,blob_r_headinfo,blob_exportfilename
  2136. string headinfo,trailinfo,r_headinfo
  2137. if FileExists(arg_exportbfilename) then
  2138. if not FileDelete(arg_exportbfilename) then
  2139. rslt=0
  2140. arg_msg="删除临时文件失败("+arg_exportbfilename+"),请先手动清除!"
  2141. goto ext
  2142. end if
  2143. end if
  2144. headinfo=headinfo + sys_system_id +';'
  2145. headinfo=headinfo + string(arg_info) +';'
  2146. headinfo=headinfo + string(arg_usechangetime) +';'
  2147. headinfo=headinfo + string(arg_bg_changtime,'yyyy-mm-dd hh:mm:ss') +';'
  2148. headinfo=headinfo + string(arg_ed_changtime,'yyyy-mm-dd hh:mm:ss') +';'
  2149. trailinfo=fill('*',len_headinfo - len(headinfo))
  2150. r_headinfo=headinfo + trailinfo
  2151. r_headinfo=f_psw_bczh(r_headinfo,0,sys_power_key) //加密
  2152. blob_r_headinfo=blob(r_headinfo)
  2153. //1.zipfile -> blob
  2154. if f_getblobfromfile(blob_zipfile,arg_exportfilename,arg_msg)=0 then
  2155. rslt=0
  2156. goto ext
  2157. end if
  2158. //2.blob_exportfilename -> file
  2159. blob_exportfilename=blob_r_headinfo + blob_zipfile
  2160. if f_saveblobtofile(blob_exportfilename,arg_exportbfilename,arg_msg)=0 then
  2161. rslt=0
  2162. goto ext
  2163. end if
  2164. ext:
  2165. return rslt
  2166. end function
  2167. public function integer f_delzipfile (string arg_exportfilename, ref string arg_msg);//删除临时建立的压缩文件
  2168. int rslt=1
  2169. if FileExists(arg_exportfilename) then
  2170. if not FileDelete(arg_exportfilename) then
  2171. rslt=0
  2172. arg_msg="删除临时压缩文件失败("+arg_exportfilename+"),请手动清除!"
  2173. goto ext
  2174. end if
  2175. end if
  2176. ext:
  2177. return rslt
  2178. end function
  2179. public function integer f_importdata_blob (string arg_importfilename, string arg_zipfile, ref integer arg_info, ref integer arg_usechangetime, ref datetime arg_bg_changetime, ref datetime arg_ed_changtime, ref string arg_msg);//将文件导入分解出headinfo ,zipfile
  2180. //f_importdata_blob(arg_importfilename,arg_zipfile,arg_info,arg_usechangetime,arg_bg_changetime,arg_ed_changtime,arg_msg)
  2181. //1.导入文件变blob型
  2182. //2.取headinfo,检查sys_system_id
  2183. //3.生成zipfile,返回导入数据类型,时间等参数
  2184. int rslt=1
  2185. blob blob_zipfile,blob_r_headinfo,blob_importfilename
  2186. string bczh_headinfo,headinfo,ls_system_id,info[]
  2187. int ls_k,ls_psc
  2188. //1.arg_importfilename -> blob
  2189. if f_getblobfromfile(blob_importfilename,arg_importfilename,arg_msg)=0 then
  2190. rslt=0
  2191. goto ext
  2192. end if
  2193. //2.取headinfo,检查sys_system_id
  2194. bczh_headinfo=left(string(blob_importfilename),len_headinfo * 3)
  2195. headinfo=f_psw_bczh(bczh_headinfo,1,sys_power_key) //解密
  2196. ls_k=0
  2197. ls_psc=0
  2198. ls_psc=pos(headinfo,';')
  2199. DO WHILE ls_psc>0
  2200. if left(headinfo,ls_psc - 1)<>'' then
  2201. ls_k++
  2202. info[ls_k]=left(headinfo,ls_psc - 1)
  2203. end if
  2204. headinfo=right(headinfo,len(headinfo) - ls_psc)
  2205. ls_psc=pos(headinfo,';')
  2206. LOOP
  2207. if ls_k <> 5 then
  2208. arg_msg='信息段检查失败,可能数据包已破坏'
  2209. rslt=0
  2210. goto ext
  2211. end if
  2212. ls_system_id=info[1]
  2213. arg_info=integer(info[2])
  2214. arg_usechangetime=integer(info[3])
  2215. arg_bg_changetime=datetime(date(left(info[4],10)),time(right(info[4],8)))
  2216. arg_ed_changtime=datetime(date(left(info[5],10)),time(right(info[5],8)))
  2217. if ls_system_id <> sys_system_id then
  2218. arg_msg='导入的不是本系统的数据包,请检查'
  2219. rslt=0
  2220. goto ext
  2221. end if
  2222. //3.生成zipfile,返回导入数据类型,时间等参数
  2223. blob_zipfile=BlobMid ( blob_importfilename,len(bczh_headinfo) + 1 )
  2224. if f_saveblobtofile(blob_zipfile,arg_zipfile,arg_msg)=0 then
  2225. rslt=0
  2226. goto ext
  2227. end if
  2228. ext:
  2229. return rslt
  2230. end function
  2231. on uo_yfimex.create
  2232. TriggerEvent( this, "constructor" )
  2233. end on
  2234. on uo_yfimex.destroy
  2235. TriggerEvent( this, "destructor" )
  2236. end on
  2237. event constructor;ds_data=create datastore
  2238. end event