uo_oa_workremind.sru 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822
  1. $PBExportHeader$uo_oa_workremind.sru
  2. forward
  3. global type uo_oa_workremind from nonvisualobject
  4. end type
  5. end forward
  6. global type uo_oa_workremind from nonvisualobject
  7. end type
  8. global uo_oa_workremind uo_oa_workremind
  9. forward prototypes
  10. PUBLIC FUNCTION Boolean uf_delete (Long arg_wrmid, REF String arg_msg)
  11. PUBLIC FUNCTION Boolean uf_get_userworkremind (REF String arg_remindstr, String arg_userid, REF String arg_msg)
  12. PUBLIC FUNCTION Boolean uf_add_userworkremind (String arg_remindstr, String arg_userid, REF String arg_msg)
  13. public function boolean uf_save (s_userworkremind arg_uwrm, ref string arg_msg)
  14. PUBLIC FUNCTION String uf_test (String arg)
  15. public function boolean uf_retr_userworkremind (long arg_wrmid, ref s_userworkremindrslt arg_result[], ref string arg_funcname, ref long arg_funcid, ref string arg_msg)
  16. PUBLIC FUNCTION Boolean uf_get_cansee (String arg_userid, REF String arg_cansee, REF String arg_msg)
  17. PUBLIC FUNCTION Boolean uf_add_canseestr (String arg_remindstr, String arg_userid, REF String arg_msg)
  18. public function boolean uf_chk_synax (ref string arg_sqlstr, ref string arg_msg)
  19. public function boolean uf_chk_synaxmx (ref string arg_sqlstr, ref string arg_msg)
  20. public function boolean uf_get_userworkremind_mx (long arg_wrmid, ref string arg_result, ref string arg_msg)
  21. end prototypes
  22. PUBLIC FUNCTION Boolean uf_delete (Long arg_wrmid, REF String arg_msg);
  23. //删除工作提醒
  24. DELETE oa_workremindDef
  25. Where wrmid = :arg_wrmid;
  26. IF sqlca.SQLCode <> 0 THEN
  27. ROLLBACK;
  28. arg_msg = "删除工作提醒失败~n"+sqlca.SQLErrText
  29. RETURN FALSE
  30. ELSE
  31. COMMIT;
  32. END IF
  33. RETURN TRUE
  34. END FUNCTION
  35. PUBLIC FUNCTION Boolean uf_get_userworkremind (REF String arg_remindstr, String arg_userid, REF String arg_msg);
  36. //获取用户订阅的工作提醒,返回用户有效提醒
  37. SELECT WrmIdStr
  38. INTO :arg_remindStr
  39. FROM u_user
  40. Where UserID = :arg_userid;
  41. IF sqlca.SQLCode <> 0 THEN
  42. arg_msg = "获取用户订阅提醒失败~n"+sqlca.SQLErrText
  43. RETURN FALSE
  44. END IF
  45. RETURN TRUE
  46. END FUNCTION
  47. PUBLIC FUNCTION Boolean uf_add_userworkremind (String arg_remindstr, String arg_userid, REF String arg_msg);
  48. //保存或更新用户订阅的工作提醒
  49. UPDATE u_user
  50. SET WrmIdStr = :arg_remindStr
  51. Where UserID = :arg_userid;
  52. IF sqlca.SQLCode <> 0 THEN
  53. ROLLBACK;
  54. arg_msg = "保存用户工作提醒失败~n"+sqlca.SQLErrText
  55. RETURN FALSE
  56. ELSE
  57. COMMIT;
  58. END IF
  59. RETURN TRUE
  60. END FUNCTION
  61. public function boolean uf_save (s_userworkremind arg_uwrm, ref string arg_msg);
  62. //保存或更新工作提醒
  63. Boolean rslt = True
  64. //检查语句
  65. IF Not uf_chk_synax(arg_uwrm.Expressions,arg_msg) THEN
  66. rslt = False
  67. GOTO ext
  68. END IF
  69. IF arg_uwrm.ifdftwin = 1 THEN
  70. IF arg_uwrm.ExpressionsMx = "" THEN
  71. rslt = False
  72. arg_msg = "使用默认窗口, 提醒SQL明细语句不能为空"
  73. GOTO ext
  74. END IF
  75. //检查明细语句
  76. IF Not uf_chk_synaxMx(arg_uwrm.ExpressionsMx,arg_msg) THEN
  77. rslt = False
  78. GOTO ext
  79. END IF
  80. arg_uwrm.Funcid = 809
  81. arg_uwrm.WinName = "自定义订阅明细窗口"
  82. END IF
  83. IF arg_uwrm.ifautoopen = 1 THEN
  84. IF arg_uwrm.Funcid = 0 THEN
  85. rslt = False
  86. arg_msg = "使用自动打开窗口, 请选择关联窗口"
  87. GOTO ext
  88. END IF
  89. END IF
  90. //检查权限限制的使用
  91. IF arg_uwrm.Ifsc = 1 THEN
  92. END IF
  93. IF arg_uwrm.Ifstorage = 1 THEN
  94. END IF
  95. //订单的业务员 u_saletask.assign_emp
  96. //发货单的业务员 u_outware.outrep
  97. //客户区域 ( u_cust.cusareaid in (:arg_cusareaid) or u_cust.cusareaid = 0 )
  98. //供应商类别 (u_spt.spttypeid in (:arg_spttypeid)
  99. IF arg_uwrm.ifcusarea = 1 THEN
  100. IF Pos(Lower(arg_uwrm.Expressions), ' u_cust ') <= 0 THEN
  101. arg_msg = "使用客户区域限制, 提醒SQL语句必须包含客户定义表[u_cust]"
  102. rslt = False
  103. GOTO ext
  104. END IF
  105. IF Pos(Lower(arg_uwrm.ExpressionsMx), ' u_cust ') <= 0 THEN
  106. arg_msg = "使用客户区域限制, 提醒SQL明细语句必须包含客户定义表[u_cust]"
  107. rslt = False
  108. GOTO ext
  109. END IF
  110. END IF
  111. IF arg_uwrm.ifoutrep = 1 THEN
  112. IF Pos(Lower(arg_uwrm.Expressions), ' u_saletask ') <= 0 And &
  113. Pos(Lower(arg_uwrm.Expressions), ' u_outware ') <= 0 THEN
  114. arg_msg = "使用业务员限制, 提醒SQL语句必须最少包含销售订单表[u_saletask]或销售发货单表[u_outware]之一"
  115. rslt = False
  116. GOTO ext
  117. END IF
  118. IF Pos(Lower(arg_uwrm.ExpressionsMx), ' u_saletask ') <= 0 And &
  119. Pos(Lower(arg_uwrm.ExpressionsMx), ' u_outware ') <= 0 THEN
  120. arg_msg = "使用业务员限制, 提醒SQL明细语句必须最少包含销售订单表[u_saletask]或销售发货单表[u_outware]之一"
  121. rslt = False
  122. GOTO ext
  123. END IF
  124. END IF
  125. IF arg_uwrm.ifspttype = 1 THEN
  126. IF Pos(Lower(arg_uwrm.Expressions), ' u_spt ') <= 0 THEN
  127. arg_msg = "使用供应商类别限制, 提醒SQL语句必须包含供应商定义表[u_spt]"
  128. rslt = False
  129. GOTO ext
  130. END IF
  131. IF Pos(Lower(arg_uwrm.ExpressionsMx), ' u_spt ') <= 0 THEN
  132. arg_msg = "使用供应商类别限制, 提醒SQL明细语句必须包含供应商定义表[u_spt]"
  133. rslt = False
  134. GOTO ext
  135. END IF
  136. END IF
  137. //执行更新语句
  138. UPDATE oa_workremindDef
  139. SET wrmcode = :arg_uwrm.wrmcode,
  140. Expressions = :arg_uwrm.Expressions,
  141. ExpressionsMx = :arg_uwrm.ExpressionsMx,
  142. WrmType = :arg_uwrm.WrmType,
  143. ChkTimeRule = :arg_uwrm.ChkTimeRule,
  144. Funcid = :arg_uwrm.Funcid,
  145. WinName = :arg_uwrm.WinName,
  146. ModuleName = :arg_uwrm.ModuleName,
  147. Operationstr = :arg_uwrm.Operationstr,
  148. Ifsc = :arg_uwrm.Ifsc,
  149. Ifstorage = :arg_uwrm.Ifstorage,
  150. ifcusarea = :arg_uwrm.ifcusarea,
  151. ifoutrep = :arg_uwrm.ifoutrep,
  152. ifspttype = :arg_uwrm.ifspttype,
  153. ifdftwin = :arg_uwrm.ifdftwin,
  154. ifautoopen = :arg_uwrm.ifautoopen,
  155. WrmName = :arg_uwrm.WrmName,
  156. ChkTimeDir = :arg_uwrm.timedirection
  157. Where wrmid = :arg_uwrm.wrmid;
  158. IF sqlca.SQLCode = 0 THEN
  159. IF sqlca.SQLNRows = 0 THEN
  160. //执行插入语句
  161. INSERT INTO oa_workremindDef(wrmid,wrmcode,Expressions,
  162. ExpressionsMx,
  163. WrmType,
  164. ChkTimeRule,Funcid,
  165. WinName,ModuleName,
  166. Operationstr,Ifsc,
  167. Ifstorage,
  168. ifcusarea ,
  169. ifoutrep ,
  170. ifspttype ,
  171. ifdftwin ,
  172. ifautoopen,
  173. WrmName,
  174. ChkTimeDir)
  175. VALUES(:arg_uwrm.wrmid,
  176. :arg_uwrm.wrmcode,
  177. :arg_uwrm.Expressions,
  178. :arg_uwrm.ExpressionsMx,
  179. :arg_uwrm.WrmType,
  180. :arg_uwrm.ChkTimeRule,
  181. :arg_uwrm.Funcid,
  182. :arg_uwrm.WinName,
  183. :arg_uwrm.ModuleName,
  184. :arg_uwrm.Operationstr,
  185. :arg_uwrm.Ifsc,
  186. :arg_uwrm.Ifstorage,
  187. :arg_uwrm.ifcusarea ,
  188. :arg_uwrm.ifoutrep ,
  189. :arg_uwrm.ifspttype ,
  190. :arg_uwrm.ifdftwin ,
  191. :arg_uwrm.ifautoopen,
  192. :arg_uwrm.WrmName,
  193. :arg_uwrm.timedirection);
  194. IF sqlca.SQLCode <> 0 THEN
  195. arg_msg = "插入数据失败~n"+sqlca.SQLErrText
  196. rslt = False
  197. GOTO ext
  198. END IF
  199. // ELSE
  200. // arg_msg = "更新数据失败~n"+sqlca.SQLErrText
  201. // RETURN FALSE
  202. END IF
  203. ELSE
  204. arg_msg = "更新数据失败~n"+sqlca.SQLErrText
  205. rslt = False
  206. GOTO ext
  207. END IF
  208. ext:
  209. IF Not rslt THEN
  210. ROLLBACK;
  211. ELSE
  212. COMMIT ;
  213. END IF
  214. RETURN rslt
  215. end function
  216. PUBLIC FUNCTION String uf_test (String arg);
  217. RETURN arg
  218. END FUNCTION
  219. public function boolean uf_retr_userworkremind (long arg_wrmid, ref s_userworkremindrslt arg_result[], ref string arg_funcname, ref long arg_funcid, ref string arg_msg);
  220. //根据类型查询工作提醒,返回查询结果
  221. String ls_result
  222. String ls_Expressions,ls_ExpressionsMx,ls_sqlstr,sc,stor
  223. Long ll_ifsc,ll_ifstorage
  224. Int li_ifCusarea, li_ifOutrep, li_ifSpttype
  225. Int li_IfAutoopen, li_ifDftwin
  226. String ls_scList[],ls_storList[]
  227. Long cnt,cnt_stor,cnt_sc,cnt2,cnt_rslt = 1
  228. String ls_name_wrm,ls_name_sc[],ls_name_stor[]
  229. String ls_curname_sc,ls_curname_stor,ls_name_operate
  230. s_userworkremindrslt param
  231. Long arg_wrmtype
  232. SELECT WrmType,funcid,winname
  233. INTO :arg_wrmtype,:arg_funcid,:arg_funcname
  234. FROM oa_workreminddef
  235. Where wrmid = :arg_wrmid;
  236. IF arg_wrmtype = 0 THEN
  237. //前台工作提醒
  238. SELECT Expressions,
  239. ExpressionsMx,
  240. ifsc,ifstorage,
  241. ifcusarea,
  242. ifoutrep,
  243. ifspttype,
  244. ifautoopen,
  245. ifdftwin,
  246. wrmname,Operationstr
  247. INTO :ls_Expressions,
  248. :ls_ExpressionsMx,
  249. :ll_ifsc,:ll_ifstorage,
  250. :li_ifcusarea,
  251. :li_ifoutrep,
  252. :li_ifspttype,
  253. :li_ifautoopen,
  254. :li_ifdftwin,
  255. :ls_name_wrm,:ls_name_operate
  256. FROM oa_workremindDef
  257. Where wrmid = :arg_wrmid;
  258. IF sqlca.SQLCode <> 0 THEN
  259. arg_msg = "获取提醒查询语句失败~n"+sqlca.SQLErrText
  260. RETURN FALSE
  261. END IF
  262. //考虑分部
  263. IF ll_ifsc = 1 THEN
  264. SELECT count(0)
  265. INTO :cnt_sc
  266. FROM u_scdef;
  267. IF cnt_sc <> 0 THEN
  268. DECLARE cr_sc CURSOR FOR
  269. SELECT scid,scname
  270. FROM u_scdef;
  271. OPEN cr_sc;
  272. FOR cnt = 1 TO cnt_sc
  273. FETCH cr_sc INTO :ls_scList[cnt],:ls_name_sc[cnt];
  274. NEXT
  275. CLOSE cr_sc;
  276. ls_Expressions+= " and scid=?"
  277. ELSE
  278. ls_Expressions+= " and -1=?"
  279. END IF
  280. ELSE
  281. cnt_sc = 0
  282. ls_Expressions+= " and -1=?"
  283. END IF
  284. //考虑仓库
  285. IF ll_ifstorage = 1 THEN
  286. SELECT count(0)
  287. INTO :cnt_stor
  288. FROM u_storage;
  289. IF cnt_stor <> 0 THEN
  290. DECLARE cr_stor CURSOR FOR
  291. SELECT storageid,storagename
  292. FROM u_storage;
  293. OPEN cr_stor;
  294. FOR cnt = 1 TO cnt_stor
  295. FETCH cr_stor INTO :ls_storList[cnt],:ls_name_stor[cnt];
  296. NEXT
  297. CLOSE cr_stor;
  298. ls_Expressions+= " and storageid=?"
  299. ELSE
  300. ls_Expressions+= " and -1=?"
  301. END IF
  302. ELSE
  303. cnt_stor = 0
  304. ls_Expressions+= " and -1=?"
  305. END IF
  306. //订单的业务员 u_saletask.assign_emp
  307. //发货单的业务员 u_outware.outrep
  308. //客户区域 ( u_cust.cusareaid in (:arg_cusareaid) or u_cust.cusareaid = 0 )
  309. //供应商类别 (u_spt.spttypeid in (:arg_spttypeid)
  310. String ls_areastr, ls_outrepstr, ls_spttypest
  311. String ls_outrep_arr[], ls_table_outrep
  312. Long i
  313. ls_areastr = sys_areastr
  314. ls_outrepstr = sys_user_outrepstr
  315. ls_spttypest = sys_user_spttypestr
  316. IF li_ifCusarea = 1 THEN
  317. IF sys_areastr <> '' THEN
  318. IF ls_areastr = '-1' THEN
  319. ls_Expressions+= " and u_cust.cusareaid in ( 0 ) "
  320. ELSEIF ls_areastr <> '0' THEN
  321. ls_Expressions+= " and u_cust.cusareaid in ( 0 " + ls_areastr + " 0 ) "
  322. END IF
  323. END IF
  324. END IF
  325. IF li_ifOutrep = 1 THEN
  326. IF ls_outrepstr <> '' THEN
  327. IF Pos(Trim(ls_Expressions), "u_outware") > 0 THEN
  328. ls_table_outrep = "u_outware.outrep"
  329. ELSEIF Pos(Trim(ls_Expressions), "u_saletask") > 0 THEN
  330. ls_table_outrep = "u_saletask.assign_emp"
  331. END IF
  332. IF ls_outrepstr = '-1' THEN
  333. ls_Expressions+= " and "+ls_table_outrep+" in ( '' ) "
  334. ELSEIF ls_outrepstr <> '0' THEN
  335. f_oa_workremind_splitstr(ls_outrepstr, ',', ls_outrep_arr)
  336. ls_outrepstr = ""
  337. FOR i = 1 TO UpperBound(ls_outrep_arr)
  338. IF ls_outrep_arr[i] <> '' THEN
  339. ls_outrepstr += "'"+ls_outrep_arr[i]+"',"
  340. END IF
  341. NEXT
  342. IF ls_outrepstr <> "" THEN
  343. ls_outrepstr = Left(ls_outrepstr, Len(ls_outrepstr) - 1)
  344. ls_Expressions+= " and "+ls_table_outrep+" in (" + ls_outrepstr + " ) "
  345. END IF
  346. END IF
  347. END IF
  348. END IF
  349. IF li_ifSpttype = 1 THEN
  350. IF ls_spttypest <> '' THEN
  351. IF ls_spttypest = '-1' THEN
  352. ls_Expressions+= " and u_spt.spttypeid in ( 0 ) "
  353. ELSEIF ls_spttypest <> '0' THEN
  354. ls_Expressions+= " and u_spt.spttypeid in ( 0 " + ls_spttypest + " 0 ) "
  355. END IF
  356. END IF
  357. END IF
  358. DECLARE cr DYNAMIC CURSOR FOR sqlsa;
  359. PREPARE sqlsa FROM :ls_Expressions;
  360. FOR cnt = 0 TO cnt_sc
  361. IF cnt_sc <> 0 THEN
  362. IF cnt = 0 THEN
  363. cnt = 1
  364. END IF
  365. ls_curname_sc = "["+ls_name_sc[cnt]+"]"
  366. sc = string(ls_scList[cnt])
  367. ELSE
  368. sc = "-1"
  369. ls_curname_sc = ""
  370. END IF
  371. FOR cnt2 = 0 TO cnt_stor
  372. IF cnt_stor <> 0 THEN
  373. IF cnt2 = 0 THEN
  374. cnt2 = 1
  375. END IF
  376. ls_curname_stor = "["+ls_name_stor[cnt2]+"]"
  377. stor = string(ls_storList[cnt2])
  378. ELSE
  379. stor = "-1"
  380. ls_curname_stor = ""
  381. END IF
  382. OPEN DYNAMIC cr USING :sc,:stor;
  383. FETCH cr INTO :ls_result;
  384. DO WHILE sqlca.SQLCode = 0
  385. arg_result[cnt_rslt].wrmid = arg_wrmid
  386. arg_result[cnt_rslt].QueryTime = DateTime(Today(),Now())
  387. arg_result[cnt_rslt].Result = ls_curname_sc+ls_curname_stor+ls_result+"待"+publ_operator+"您"+ls_name_operate
  388. arg_result[cnt_rslt].scid = Long(sc)
  389. arg_result[cnt_rslt].storageid = Long(stor)
  390. arg_result[cnt_rslt].wrmname = ls_name_wrm
  391. FETCH cr INTO :ls_result;
  392. LOOP
  393. CLOSE cr;
  394. NEXT
  395. NEXT
  396. // close cr;
  397. ELSE
  398. //后台工作提醒
  399. DECLARE cr1 CURSOR FOR
  400. SELECT QueryTime,Result,Scid,Storageid,WrmName
  401. FROM oa_workremindRslt
  402. Where wrmid = :arg_wrmid;
  403. OPEN cr1;
  404. cnt = 1
  405. FETCH cr INTO :param.QueryTime,:param.Result,:param.scid,:param.storageid,:param.wrmname;
  406. DO WHILE sqlca.SQLCode = 0
  407. Long a
  408. a = Len("*用户*")
  409. MessageBox('',String(a))
  410. param.Result = Replace(param.Result,Pos(param.Result,"*用户*"),a,publ_operator)
  411. arg_result[cnt].QueryTime = param.QueryTime
  412. arg_result[cnt].Result = param.Result
  413. arg_result[cnt].scid = param.scid
  414. arg_result[cnt].storageid = param.storageid
  415. arg_result[cnt].wrmname = param.wrmname
  416. cnt++
  417. FETCH cr1 INTO :param.QueryTime,:param.Result,:param.scid,:param.storageid,:param.wrmname;
  418. LOOP
  419. CLOSE cr1;
  420. END IF
  421. IF UpperBound(arg_result) = 0 THEN
  422. RETURN FALSE
  423. ELSE
  424. RETURN TRUE
  425. END IF
  426. end function
  427. PUBLIC FUNCTION Boolean uf_get_cansee (String arg_userid, REF String arg_cansee, REF String arg_msg);
  428. SELECT CanSeeWrm
  429. INTO :arg_CanSee
  430. FROM u_user
  431. Where UserID = :arg_userid;
  432. IF sqlca.SQLCode <> 0 THEN
  433. arg_msg = "获取用户订阅提醒失败~n"+sqlca.SQLErrText
  434. RETURN FALSE
  435. END IF
  436. RETURN TRUE
  437. END FUNCTION
  438. PUBLIC FUNCTION Boolean uf_add_canseestr (String arg_remindstr, String arg_userid, REF String arg_msg);
  439. //保存或更新用户的可视工作提醒
  440. UPDATE u_user
  441. SET CanSeeWrm = :arg_remindStr
  442. Where UserID = :arg_userid;
  443. IF sqlca.SQLCode <> 0 THEN
  444. ROLLBACK;
  445. arg_msg = "保存用户可视工作提醒列表失败~n"+sqlca.SQLErrText
  446. RETURN FALSE
  447. ELSE
  448. COMMIT;
  449. END IF
  450. RETURN TRUE
  451. END FUNCTION
  452. public function boolean uf_chk_synax (ref string arg_sqlstr, ref string arg_msg);
  453. //检查SQL语句的合法性
  454. Long selectPlace,fromPlace,wherePlace
  455. String newstr
  456. selectPlace = Pos(lower(arg_sqlstr),"select ")
  457. fromPlace = Pos(lower(arg_sqlstr),"from ")
  458. wherePlace = Pos(lower(arg_sqlstr),"where ")
  459. IF selectPlace = 0 THEN
  460. arg_msg = "语句有误,缺少select部分"
  461. RETURN FALSE
  462. END IF
  463. IF fromPlace = 0 THEN
  464. arg_msg = "语句有误,缺少from部分"
  465. RETURN FALSE
  466. END IF
  467. IF wherePlace = 0 THEN
  468. newstr = arg_sqlstr
  469. arg_sqlstr+= " where 1=1"
  470. ELSE
  471. newstr = Mid(arg_sqlstr,1,wherePlace - 1)
  472. END IF
  473. //try
  474. PREPARE sqlsa FROM : newstr ;
  475. DESCRIBE sqlsa INTO SQLDA ;
  476. DECLARE my_cursor DYNAMIC CURSOR FOR sqlsa ;
  477. OPEN DYNAMIC my_cursor USING DESCRIPTOR SQLDA ;
  478. FETCH my_cursor USING DESCRIPTOR SQLDA ;
  479. //If SQLCA.Sqlcode = 100 Then
  480. // arg_msg="没有找到指定的数据! "
  481. // Close my_cursor;
  482. // Return false
  483. //End If
  484. IF SQLDA.NumOutputs > 1 THEN
  485. arg_msg = "SQL语句返回值个数不能大于1"
  486. CLOSE my_cursor;
  487. RETURN FALSE
  488. END IF
  489. IF SQLDA.OutParmType[1] = TypeString! THEN
  490. ELSEIF SQLDA.OutParmType[1] = typelong! THEN
  491. ELSEIF SQLDA.OutParmType[1] = TypeInteger! THEN
  492. ELSE
  493. arg_msg = "SQL语句返回值必须是字符串或者数字类型!"
  494. CLOSE my_cursor;
  495. RETURN FALSE
  496. END IF
  497. CLOSE my_cursor ;
  498. RETURN TRUE
  499. //catch (Transcation)
  500. // arg_msg=Transcation
  501. //end try
  502. end function
  503. public function boolean uf_chk_synaxmx (ref string arg_sqlstr, ref string arg_msg);
  504. //检查SQL明细语句的合法性
  505. Boolean rslt = TRUE
  506. Long selectPlace,fromPlace,wherePlace
  507. String newstr
  508. Int li_chk_NumOutput
  509. IF Trim(arg_sqlstr) = "" THEN
  510. arg_msg = "语句不能为空"
  511. RETURN FALSE
  512. END IF
  513. selectPlace = Pos(lower(arg_sqlstr),"select ")
  514. fromPlace = Pos(lower(arg_sqlstr),"from ")
  515. wherePlace = Pos(lower(arg_sqlstr),"where ")
  516. IF selectPlace = 0 THEN
  517. arg_msg = "语句有误,缺少select部分"
  518. RETURN FALSE
  519. END IF
  520. IF fromPlace = 0 THEN
  521. arg_msg = "语句有误,缺少from部分"
  522. RETURN FALSE
  523. END IF
  524. IF wherePlace = 0 THEN
  525. newstr = arg_sqlstr
  526. arg_sqlstr+= " where 1=1"
  527. ELSE
  528. newstr = Mid(arg_sqlstr,1,wherePlace - 1)
  529. END IF
  530. //try
  531. PREPARE sqlsa FROM : newstr ;
  532. DESCRIBE sqlsa INTO SQLDA ;
  533. DECLARE my_cursor DYNAMIC CURSOR FOR sqlsa ;
  534. OPEN DYNAMIC my_cursor USING DESCRIPTOR SQLDA ;
  535. FETCH my_cursor USING DESCRIPTOR SQLDA ;
  536. IF sqlca.SQLCode <> 0 THEN
  537. arg_msg = "SQL明细语句执行错误,"+sqlca.SQLErrText
  538. rslt = FALSE
  539. GOTO ext
  540. END IF
  541. IF SQLDA.NumOutputs > 5 THEN
  542. arg_msg = "SQL明细语句返回值个数不能大于5"
  543. rslt = FALSE
  544. GOTO ext
  545. END IF
  546. IF SQLDA.NumOutputs <= 0 THEN
  547. arg_msg = "SQL明细语句没有返回值或执行错误"
  548. rslt = FALSE
  549. GOTO ext
  550. END IF
  551. //
  552. //1) 单据编号:字符型,作为明细唯一标识,能根据此号双击打开对应的单据窗口;
  553. //2) 单据摘要:字符型,由用户自定义设置;
  554. //3) 相关数值:数值型,由用户自定义设置;
  555. //4) 相关日期:日期型,由用户自定义设置;
  556. //5) 相关人员:字符型,由用户自定义设置;
  557. li_chk_NumOutput = 1
  558. IF SQLDA.NumOutputs >= li_chk_NumOutput THEN
  559. IF SQLDA.OutParmType[li_chk_NumOutput] <> TypeString! THEN
  560. arg_msg = "SQL明细语句返回值"+String(li_chk_NumOutput)+", 必须是字符类型!"
  561. rslt = FALSE
  562. GOTO ext
  563. END IF
  564. END IF
  565. li_chk_NumOutput = 2
  566. IF SQLDA.NumOutputs >= li_chk_NumOutput THEN
  567. IF SQLDA.OutParmType[li_chk_NumOutput] <> TypeString! THEN
  568. arg_msg = "SQL明细语句返回值"+String(li_chk_NumOutput)+", 必须是字符类型!"
  569. rslt = FALSE
  570. GOTO ext
  571. END IF
  572. END IF
  573. li_chk_NumOutput = 3
  574. IF SQLDA.NumOutputs >= li_chk_NumOutput THEN
  575. IF SQLDA.OutParmType[li_chk_NumOutput] <> typelong! &
  576. AND SQLDA.OutParmType[li_chk_NumOutput] <> TypeInteger! &
  577. AND SQLDA.OutParmType[li_chk_NumOutput] <> TypeDecimal! THEN
  578. arg_msg = "SQL明细语句返回值"+String(li_chk_NumOutput)+", 必须是数值类型!"
  579. rslt = FALSE
  580. GOTO ext
  581. END IF
  582. END IF
  583. li_chk_NumOutput = 4
  584. IF SQLDA.NumOutputs >= li_chk_NumOutput THEN
  585. IF SQLDA.OutParmType[li_chk_NumOutput] <> TypeDateTime! &
  586. AND SQLDA.OutParmType[li_chk_NumOutput] <> TypeDate! THEN
  587. arg_msg = "SQL明细语句返回值"+String(li_chk_NumOutput)+", 必须是日期类型!"
  588. rslt = FALSE
  589. GOTO ext
  590. END IF
  591. END IF
  592. li_chk_NumOutput = 5
  593. IF SQLDA.NumOutputs >= li_chk_NumOutput THEN
  594. IF SQLDA.OutParmType[li_chk_NumOutput] <> TypeString! THEN
  595. arg_msg = "SQL明细语句返回值"+String(li_chk_NumOutput)+", 必须是字符类型!"
  596. rslt = FALSE
  597. GOTO ext
  598. END IF
  599. END IF
  600. ext:
  601. CLOSE my_cursor ;
  602. RETURN rslt
  603. //catch (Transcation)
  604. // arg_msg=Transcation
  605. //end try
  606. end function
  607. public function boolean uf_get_userworkremind_mx (long arg_wrmid, ref string arg_result, ref string arg_msg);//根据类型查询工作提醒,返回查询结果
  608. String ls_result
  609. String ls_ExpressionsMx
  610. Long ll_ifsc,ll_ifstorage
  611. Int li_ifCusarea, li_ifOutrep, li_ifSpttype
  612. Int li_IfAutoopen, li_ifDftwin
  613. Long cnt,cnt_stor,cnt_sc,cnt2,cnt_rslt = 1
  614. //前台工作提醒
  615. SELECT
  616. ExpressionsMx,
  617. ifsc,ifstorage,
  618. ifcusarea,
  619. ifoutrep,
  620. ifspttype
  621. INTO
  622. :ls_ExpressionsMx,
  623. :ll_ifsc,:ll_ifstorage,
  624. :li_ifCusarea,
  625. :li_ifOutrep,
  626. :li_ifSpttype
  627. FROM oa_workremindDef
  628. Where wrmid = :arg_wrmid;
  629. IF sqlca.SQLCode <> 0 THEN
  630. arg_msg = "获取提醒查询语句失败~n"+sqlca.SQLErrText
  631. RETURN FALSE
  632. END IF
  633. IF NOT Pos(Lower(ls_ExpressionsMx), 'where ') > 0 THEN
  634. ls_ExpressionsMx += " where 1 = 1 "
  635. END IF
  636. //订单的业务员 u_saletask.assign_emp
  637. //发货单的业务员 u_outware.outrep
  638. //客户区域 ( u_cust.cusareaid in (:arg_cusareaid) or u_cust.cusareaid = 0 )
  639. //供应商类别 (u_spt.spttypeid in (:arg_spttypeid)
  640. String ls_scstr, ls_storagestr
  641. String ls_areastr, ls_outrepstr, ls_spttypest
  642. String ls_outrep_arr[], ls_table_outrep
  643. Long i
  644. ls_scstr = sys_user_scstr
  645. ls_storagestr = sys_user_storagestr
  646. ls_areastr = sys_areastr
  647. ls_outrepstr = sys_user_outrepstr
  648. ls_spttypest = sys_user_spttypestr
  649. IF ll_ifsc = 1 THEN
  650. IF ls_scstr <> '' THEN
  651. IF ls_scstr = '-1' THEN
  652. ls_ExpressionsMx+= " and scid in ( 0 ) "
  653. ELSEIF ls_areastr <> '0' THEN
  654. ls_ExpressionsMx+= " and scid in ( 0 " + ls_scstr + " 0 ) "
  655. END IF
  656. END IF
  657. END IF
  658. IF ll_ifstorage = 1 THEN
  659. IF ls_storagestr <> '' THEN
  660. IF ls_storagestr = '-1' THEN
  661. ls_ExpressionsMx+= " and storageid in ( 0 ) "
  662. ELSEIF ls_storagestr <> '0' THEN
  663. ls_ExpressionsMx+= " and storageid in ( 0 " + ls_storagestr + " 0 ) "
  664. END IF
  665. END IF
  666. END IF
  667. IF li_ifCusarea = 1 THEN
  668. IF ls_areastr <> '' THEN
  669. IF ls_areastr = '-1' THEN
  670. ls_ExpressionsMx+= " and u_cust.cusareaid in ( 0 ) "
  671. ELSEIF ls_areastr <> '0' THEN
  672. ls_ExpressionsMx+= " and u_cust.cusareaid in ( 0 " + ls_areastr + " 0 ) "
  673. END IF
  674. END IF
  675. END IF
  676. IF li_ifOutrep = 1 THEN
  677. IF ls_outrepstr <> '' THEN
  678. IF Pos(Trim(ls_ExpressionsMx), "u_outware") > 0 THEN
  679. ls_table_outrep = "u_outware.outrep"
  680. ELSEIF Pos(Trim(ls_ExpressionsMx), "u_saletask") > 0 THEN
  681. ls_table_outrep = "u_saletask.assign_emp"
  682. END IF
  683. IF ls_outrepstr = '-1' THEN
  684. ls_ExpressionsMx+= " and "+ls_table_outrep+" in ( '' ) "
  685. ELSEIF ls_outrepstr <> '0' THEN
  686. f_oa_workremind_splitstr(ls_outrepstr, ',', ls_outrep_arr)
  687. ls_outrepstr = ""
  688. FOR i = 1 TO UpperBound(ls_outrep_arr)
  689. IF ls_outrep_arr[i] <> '' THEN
  690. ls_outrepstr += "'"+ls_outrep_arr[i]+"',"
  691. END IF
  692. NEXT
  693. IF ls_outrepstr <> "" THEN
  694. ls_outrepstr = Left(ls_outrepstr, Len(ls_outrepstr) - 1)
  695. ls_ExpressionsMx+= " and "+ls_table_outrep+" in (" + ls_outrepstr + " ) "
  696. END IF
  697. END IF
  698. END IF
  699. END IF
  700. IF li_ifSpttype = 1 THEN
  701. IF ls_spttypest <> '' THEN
  702. IF ls_spttypest = '-1' THEN
  703. ls_ExpressionsMx+= " and u_spt.spttypeid in ( 0 ) "
  704. ELSEIF ls_spttypest <> '0' THEN
  705. ls_ExpressionsMx+= " and u_spt.spttypeid in ( 0 " + ls_spttypest + " 0 ) "
  706. END IF
  707. END IF
  708. END IF
  709. arg_result = ls_ExpressionsMx
  710. RETURN TRUE
  711. end function
  712. on uo_oa_workremind.create
  713. call super::create
  714. TriggerEvent( this, "constructor" )
  715. end on
  716. on uo_oa_workremind.destroy
  717. TriggerEvent( this, "destructor" )
  718. call super::destroy
  719. end on