uo_credence_mode.sru 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900
  1. $PBExportHeader$uo_credence_mode.sru
  2. forward
  3. global type uo_credence_mode from nonvisualobject
  4. end type
  5. type s_credencemx_mode from structure within uo_credence_mode
  6. end type
  7. end forward
  8. type s_credencemx_mode from structure
  9. string subid
  10. string brief
  11. integer dcflag
  12. integer modetype
  13. integer ifnopost
  14. decimal {4} autorate
  15. string expressions
  16. decimal {4} debit
  17. decimal {4} credit
  18. decimal {4} amount
  19. decimal {4} price
  20. long deptid
  21. long itemid
  22. long billid
  23. string billno
  24. integer printid
  25. end type
  26. global type uo_credence_mode from nonvisualobject
  27. end type
  28. global uo_credence_mode uo_credence_mode
  29. type variables
  30. public protectedwrite LONG credid //凭证自动增量ID
  31. public protectedwrite int Credkind //凭证类型
  32. public protectedwrite int modetype_1_cnt = 0
  33. string Credname //凭证名称
  34. string monthdscrp //转帐期间
  35. int billnumber //附件
  36. string credtype //凭证字
  37. int ifalways=0 //常用标记
  38. private:
  39. S_credencemx_mode credencemx[] //明细结构数组
  40. long it_MXBT=0 //明细结构数组末指针
  41. BOOLEAN IT_NEWBEGIN=FALSE //新建标志
  42. BOOLEAN IT_UPDATEBEGIN=FALSE//修改标志
  43. end variables
  44. forward prototypes
  45. public function integer p_reset ()
  46. public function integer p_clearmx ()
  47. public function integer newbegin (integer arg_Credkind, ref string arg_msg)
  48. public function integer updatebegin (long arg_credid, ref string arg_msg)
  49. public function integer getinfo (long arg_credid, ref string arg_msg)
  50. public function integer del (long arg_credid, ref string arg_msg, boolean arg_ifcommit)
  51. public function integer save (ref string arg_msg, boolean arg_ifcommit)
  52. public function integer acceptmx (string arg_subid, string arg_brief, integer arg_dcflag, integer arg_modetype, integer arg_ifnopost, decimal arg_autorate, string arg_expressions, decimal arg_debit, decimal arg_credit, decimal arg_amount, decimal arg_price, long arg_deptid, long arg_itemid, long arg_billid, string arg_billno, ref string arg_msg, integer arg_printid)
  53. public function integer auto_createcred (long arg_credid, ref string arg_msg)
  54. end prototypes
  55. public function integer p_reset ();//INT p_RESET()
  56. //清除对象及其明细
  57. credid=0
  58. Credkind=0
  59. modetype_1_cnt=0
  60. it_newbegin=FALSE
  61. it_updatebegin=FALSE
  62. //清除明细
  63. P_CLEARMX()
  64. RETURN 1
  65. end function
  66. public function integer p_clearmx ();//INT p_clearmx()
  67. //清除明细
  68. it_mxbt=0
  69. modetype_1_cnt = 0
  70. RETURN 1
  71. end function
  72. public function integer newbegin (integer arg_Credkind, ref string arg_msg);//newbegin()
  73. //从置对象,准备建立新凭证
  74. //0 fail 1 success
  75. long rslt=1
  76. p_reset()
  77. if arg_credkind <> 0 and arg_credkind <> 1 then
  78. arg_msg='错误的凭证类型:[0:模式凭证,1:自动转帐凭证]'
  79. rslt=0
  80. goto ext
  81. end if
  82. credkind=arg_credkind
  83. it_newbegin=true
  84. it_updatebegin=false
  85. ext:
  86. if rslt=0 then p_reset()
  87. return rslt
  88. end function
  89. public function integer updatebegin (long arg_credid, ref string arg_msg);//UPDATEbegin(long arg_subaccsetid,long arg_credid,ref string arg_msg)
  90. //从置对象,准备更新凭证
  91. //0 fail 1 success
  92. int rslt=1
  93. modetype_1_cnt = 0
  94. if getinfo(arg_credid,arg_msg)=0 then
  95. rslt=0
  96. goto ext
  97. end if
  98. credid=arg_credid
  99. it_newbegin=FALSE
  100. it_updatebegin=TRUE
  101. p_clearmx() //清除明细
  102. ext:
  103. IF rslt=0 THEN p_RESET()
  104. return rslt
  105. end function
  106. public function integer getinfo (long arg_credid, ref string arg_msg);//取凭证信息
  107. int rslt=1
  108. long i=1,no_mxcheck
  109. IF arg_credid<=0 THEN
  110. rslt=0
  111. credid=0
  112. arg_msg='凭证ID错误'
  113. goto ext
  114. end if
  115. SELECT cw_credence_auto.Credname,
  116. cw_credence_auto.Credkind,
  117. cw_credence_auto.monthdscrp,
  118. cw_credence_auto.billnumber,
  119. cw_credence_auto.credtype,
  120. cw_credence_auto.billnumber,
  121. cw_credence_auto.ifalways
  122. INTO :Credname,
  123. :Credkind,
  124. :monthdscrp,
  125. :billnumber,
  126. :credtype,
  127. :billnumber,
  128. :ifalways
  129. FROM cw_credence_auto
  130. WHERE cw_credence_auto.credid = :arg_credid
  131. and cw_credence_auto.accsetid=:sys_accsetid;
  132. if sqlca.sqlcode<>0 then
  133. rslt=0
  134. ARG_MSG='查询数据操作失败,凭证'
  135. goto ext
  136. end if
  137. //用游标读取明细
  138. declare cur_credencemx_auto cursor for
  139. select cw_credencemx_auto.subid,
  140. cw_credencemx_auto.brief,
  141. cw_credencemx_auto.Dcflag,
  142. cw_credencemx_auto.modeType,
  143. cw_credencemx_auto.ifnopost,
  144. cw_credencemx_auto.autorate,
  145. cw_credencemx_auto.Expressions,
  146. cw_credencemx_auto.debit,
  147. cw_credencemx_auto.credit,
  148. cw_credencemx_auto.amount,
  149. cw_credencemx_auto.price,
  150. cw_credencemx_auto.deptid,
  151. cw_credencemx_auto.itemid,
  152. cw_credencemx_auto.billid,
  153. cw_credencemx_auto.billno,
  154. cw_credencemx_auto.printid
  155. from cw_credencemx_auto
  156. where cw_credencemx_auto.accsetid = :sys_accsetid and
  157. cw_credencemx_auto.credid = :arg_credid
  158. order by cw_credencemx_auto.modeType desc;
  159. open cur_credencemx_auto;
  160. fetch cur_credencemx_auto into :credencemx[i].subid,:credencemx[i].brief,:credencemx[i].Dcflag,
  161. :credencemx[i].modeType,:credencemx[i].ifnopost,:credencemx[i].autorate,
  162. :credencemx[i].Expressions,:credencemx[i].debit,:credencemx[i].credit,
  163. :credencemx[i].amount,:credencemx[i].price,:credencemx[i].deptid,
  164. :credencemx[i].itemid,:credencemx[i].billid,:credencemx[i].billno,
  165. :credencemx[i].printid;
  166. do while sqlca.sqlcode = 0
  167. i++
  168. fetch cur_credencemx_auto into :credencemx[i].subid,:credencemx[i].brief,:credencemx[i].Dcflag,
  169. :credencemx[i].modeType,:credencemx[i].ifnopost,:credencemx[i].autorate,
  170. :credencemx[i].Expressions,:credencemx[i].debit,:credencemx[i].credit,
  171. :credencemx[i].amount,:credencemx[i].price,:credencemx[i].deptid,
  172. :credencemx[i].itemid,:credencemx[i].billid,:credencemx[i].billno,
  173. :credencemx[i].printid;
  174. loop
  175. close cur_credencemx_auto;
  176. //检验明细是否读入完整
  177. select count(*) into :no_mxcheck
  178. from cw_credencemx_auto
  179. where cw_credencemx_auto.accsetid = :sys_accsetid and
  180. cw_credencemx_auto.credid = :arg_credid;
  181. if sqlca.sqlcode <> 0 then
  182. rslt = 0
  183. arg_msg = "查询操作失败,凭证明细数目"
  184. goto ext
  185. end if
  186. if i <> (no_mxcheck+1) then
  187. rslt = 0
  188. arg_msg = "查询操作失败,凭证明细数目"
  189. goto ext
  190. end if
  191. it_newbegin=false
  192. it_updatebegin=false
  193. it_mxbt = i - 1
  194. ext:
  195. return rslt
  196. end function
  197. public function integer del (long arg_credid, ref string arg_msg, boolean arg_ifcommit);//del(arg_subaccsetid,arg_credid,ref arg_msg,arg_ifcommit)
  198. //如果单据还没有审核删除凭证极其明细
  199. //0 FAIL, 1 SUCCESS
  200. //arg_delmode 0:手动1:自动
  201. int rslt=1
  202. boolean if_del=false
  203. if getinfo(arg_credid,arg_msg)=0 then
  204. rslt=0
  205. goto ext
  206. end if
  207. DELETE FROM cw_credence_auto
  208. WHERE cw_credence_auto.credid = :arg_credid
  209. and cw_credence_auto.accsetid = :sys_accsetid;
  210. if sqlca.sqlcode<>0 then
  211. rslt=0
  212. arG_MSG="删除凭证操作失败"+"~n"+SQLCA.SQLErrText
  213. goto ext
  214. end if
  215. DELETE FROM cw_credencemx_auto
  216. WHERE cw_credencemx_auto.credid = :arg_credid
  217. and cw_credencemx_auto.accsetid = :sys_accsetid;
  218. if sqlca.sqlcode<>0 then
  219. rslt=0
  220. arG_MSG="删除凭证明细操作失败"+"~n"+SQLCA.SQLErrText
  221. goto ext
  222. end if
  223. it_newbegin=FALSE
  224. it_updatebegin=FALSE
  225. IF rslt=0 THEN
  226. rollback;
  227. p_reset()
  228. elseif rslt=1 and arg_ifcommit then
  229. commit;
  230. end if
  231. EXT:
  232. return (rslt)
  233. end function
  234. public function integer save (ref string arg_msg, boolean arg_ifcommit);//save(ref string arg_msg,boolean arg_ifcommit)
  235. // 新建(credid=0)\更新(credid>0)
  236. //0 fail 1 success
  237. //
  238. // 函数执行凭证操作
  239. // 函数在表 cw_credence、cw_credencemx 记帐
  240. // 1 检查单据信息合法性
  241. // 2 新建-取得单据编号\新建凭证\读取凭证唯一码\插入明细
  242. // 2 修改-更新凭证\删除旧明细\插入明细
  243. // 3 提交,修改状态标志
  244. Integer rslt = 1,cnt = 0,i
  245. DateTime server_datetime
  246. Long ls_newid
  247. IF IsNull(credname) THEN credname = ''
  248. IF IsNull(credkind) THEN credkind = 0
  249. IF IsNull(monthdscrp) THEN monthdscrp = ''
  250. IF IsNull(billnumber) THEN billnumber = 0
  251. IF IsNull(credtype) THEN credtype = ''
  252. IF IsNull(ifalways) THEN ifalways = 0
  253. IF it_newbegin = FALSE AND it_updatebegin = FALSE THEN
  254. rslt = 0
  255. arg_msg = "非编辑状态不可以提交"
  256. GOTO ext
  257. END IF
  258. IF credkind <> 0 AND credkind <> 1 THEN
  259. arg_msg = '错误的凭证类型:[0:模式凭证,1:自动转帐凭证]'
  260. rslt = 0
  261. GOTO ext
  262. END IF
  263. SELECT Top 1 getdate() INTO :server_datetime FROM u_user ;
  264. //取得系统时间,借用操作员表
  265. IF sqlca.SQLCode <> 0 THEN
  266. rslt = 0
  267. arg_msg = "查询操作失败,日期 "
  268. GOTO ext
  269. END IF
  270. IF credname = '' THEN
  271. rslt = 0
  272. arg_msg = '凭证名称错误,请检查'
  273. GOTO ext
  274. END IF
  275. IF it_mxbt = 0 THEN
  276. rslt = 0
  277. arg_msg = "没有正确凭证明细内容"
  278. GOTO ext
  279. END IF
  280. IF credkind = 1 AND modetype_1_cnt <> 1 THEN
  281. rslt = 0
  282. arg_msg = '凭证明细科目缺少[转入]科目或[转入]科目多于一个'
  283. GOTO ext
  284. END IF
  285. //////////////////////////////////////////////开始区分:新建/更新 处理
  286. IF credid = 0 THEN //新建
  287. ls_newid = f_sys_scidentity(sys_accsetid,"cw_credence_auto","credid",arg_msg,TRUE,id_sqlca)
  288. IF ls_newid <= 0 THEN
  289. rslt = 0
  290. GOTO ext
  291. END IF
  292. INSERT INTO cw_credence_auto (
  293. accsetid,
  294. credid,
  295. Credname,
  296. Credkind,
  297. monthdscrp,
  298. credtype,
  299. billnumber,
  300. ifalways,
  301. opemp,
  302. opdate)
  303. VALUES ( :sys_accsetid,
  304. :ls_newid,
  305. :Credname,
  306. :Credkind,
  307. :monthdscrp,
  308. :credtype,
  309. :billnumber,
  310. :ifalways,
  311. :publ_operator,
  312. getdate());
  313. IF sqlca.SQLCode <> 0 THEN
  314. rslt = 0
  315. arg_msg = "因网络或其它原因导致新建凭证操作失败"+"~n"+sqlca.SQLErrText
  316. ROLLBACK ;
  317. GOTO ext
  318. END IF
  319. FOR i = 1 TO it_mxbt
  320. INSERT INTO cw_credencemx_auto
  321. ( accsetid,
  322. credid,
  323. subid,
  324. brief,
  325. Dcflag,
  326. modeType,
  327. ifnopost,
  328. autorate,
  329. Expressions,
  330. debit,
  331. credit,
  332. amount,
  333. price,
  334. deptid,
  335. itemid,
  336. billid,
  337. billno,
  338. printid)
  339. VALUES (:sys_accsetid,
  340. :ls_newid,
  341. :credencemx[i].subid,
  342. :credencemx[i].brief,
  343. :credencemx[i].Dcflag,
  344. :credencemx[i].modeType,
  345. :credencemx[i].ifnopost,
  346. :credencemx[i].autorate,
  347. :credencemx[i].Expressions,
  348. :credencemx[i].debit,
  349. :credencemx[i].credit,
  350. :credencemx[i].amount,
  351. :credencemx[i].price,
  352. :credencemx[i].deptid,
  353. :credencemx[i].itemid,
  354. :credencemx[i].billid,
  355. :credencemx[i].billno,
  356. :credencemx[i].printid);
  357. IF sqlca.SQLCode <> 0 THEN
  358. credid = 0 //还原outwareid
  359. rslt = 0
  360. arg_msg = "因网络或其它原因导致新建凭证明细操作失败"+"~n"+sqlca.SQLErrText
  361. GOTO ext
  362. END IF
  363. NEXT
  364. credid = ls_newid
  365. ELSE //////////////////////////////////////////////////更新
  366. UPDATE cw_credence_auto
  367. SET Credname = :Credname,
  368. Credkind = :Credkind,
  369. monthdscrp = :monthdscrp,
  370. credtype = :credtype,
  371. billnumber = :billnumber,
  372. ifalways = :ifalways,
  373. moddate = getdate(),
  374. modemp = :publ_operator
  375. WHERE cw_credence_auto.accsetid = :sys_accsetid
  376. AND cw_credence_auto.credid = :credid;
  377. IF sqlca.SQLCode <> 0 THEN
  378. rslt = 0
  379. arg_msg = "因网络或其它原因导致更新凭证操作失败"+"~n"+sqlca.SQLErrText
  380. GOTO ext
  381. END IF
  382. //删除原有明细
  383. DELETE FROM cw_credencemx_auto
  384. Where cw_credencemx_auto.accsetid = :sys_accsetid AND credid = :credid;
  385. IF sqlca.SQLCode <> 0 THEN
  386. rslt = 0
  387. arg_msg = "删除旧有凭证明细操作失败"+"~n"+sqlca.SQLErrText
  388. GOTO ext
  389. END IF
  390. FOR i = 1 TO it_mxbt
  391. INSERT INTO cw_credencemx_auto
  392. ( accsetid,
  393. credid,
  394. subid,
  395. brief,
  396. Dcflag,
  397. modeType,
  398. ifnopost,
  399. autorate,
  400. Expressions,
  401. debit,
  402. credit,
  403. amount,
  404. price,
  405. deptid,
  406. itemid,
  407. billid,
  408. billno,
  409. printid)
  410. VALUES (:sys_accsetid,
  411. :credid,
  412. :credencemx[i].subid,
  413. :credencemx[i].brief,
  414. :credencemx[i].Dcflag,
  415. :credencemx[i].modeType,
  416. :credencemx[i].ifnopost,
  417. :credencemx[i].autorate,
  418. :credencemx[i].Expressions,
  419. :credencemx[i].debit,
  420. :credencemx[i].credit,
  421. :credencemx[i].amount,
  422. :credencemx[i].price,
  423. :credencemx[i].deptid,
  424. :credencemx[i].itemid,
  425. :credencemx[i].billid,
  426. :credencemx[i].billno,
  427. :credencemx[i].printid);
  428. IF sqlca.SQLCode <> 0 THEN
  429. rslt = 0
  430. arg_msg = "因网络或其它原因新建凭证明细操作失败"+"~n"+sqlca.SQLErrText
  431. ROLLBACK ;
  432. GOTO ext
  433. END IF
  434. NEXT
  435. END IF
  436. it_newbegin = FALSE
  437. it_updatebegin = FALSE
  438. ext:
  439. IF rslt = 0 THEN
  440. ROLLBACK;
  441. credid = 0
  442. p_clearmx()
  443. ELSEIF rslt = 1 AND arg_ifcommit THEN
  444. COMMIT;
  445. END IF
  446. RETURN(rslt)
  447. end function
  448. public function integer acceptmx (string arg_subid, string arg_brief, integer arg_dcflag, integer arg_modetype, integer arg_ifnopost, decimal arg_autorate, string arg_expressions, decimal arg_debit, decimal arg_credit, decimal arg_amount, decimal arg_price, long arg_deptid, long arg_itemid, long arg_billid, string arg_billno, ref string arg_msg, integer arg_printid);//====================================================================
  449. // Function: uo_credence_mode::acceptmx()
  450. //--------------------------------------------------------------------
  451. // Description:
  452. //--------------------------------------------------------------------
  453. // Arguments:
  454. // string arg_subid
  455. // string arg_brief
  456. // integer arg_dcflag
  457. // integer arg_modetype
  458. // integer arg_ifnopost
  459. // decimal arg_autorate
  460. // string arg_expressions
  461. // decimal arg_debit
  462. // decimal arg_credit
  463. // decimal arg_amount
  464. // decimal arg_price
  465. // long arg_deptid
  466. // long arg_itemid
  467. // long arg_billid
  468. // string arg_billno
  469. // string arg_msg
  470. // integer arg_printid
  471. //--------------------------------------------------------------------
  472. // Returns: integer
  473. //--------------------------------------------------------------------
  474. // Author: yyx Date: 2004.02.26
  475. //--------------------------------------------------------------------
  476. // Modify History:
  477. //
  478. //====================================================================
  479. //RETURN 0 fail 1 success
  480. // 函数增加凭证明细项
  481. Long rslt = 1,cnt = 0,LS_i
  482. IF it_newbegin = FALSE AND it_updatebegin = FALSE THEN
  483. rslt = 0
  484. arG_MSG = "非编辑状态不可以使用,操作取消"
  485. GOTO ext
  486. END IF
  487. //清除空值
  488. IF IsNull(arg_subid) THEN arg_subid = ''
  489. IF IsNull(arg_brief) THEN arg_brief = ''
  490. IF IsNull(arg_Dcflag) THEN arg_Dcflag = 0
  491. IF IsNull(arg_modeType)THEN arg_modeType = 0
  492. IF IsNull(arg_ifnopost)THEN arg_ifnopost = 0
  493. IF IsNull(arg_autorate)THEN arg_autorate = 0
  494. IF IsNull(arg_Expressions)THEN arg_Expressions = ''
  495. IF IsNull(arg_debit)THEN arg_debit = 0
  496. IF IsNull(arg_credit)THEN arg_credit = 0
  497. IF IsNull(arg_amount)THEN arg_amount = 0
  498. IF IsNull(arg_price)THEN arg_price = 0
  499. IF IsNull(arg_deptid) THEN arg_deptid = 0
  500. IF IsNull(arg_itemid) THEN arg_itemid = 0
  501. IF IsNull(arg_billid) THEN arg_billid = 0
  502. IF IsNull(arg_billno) THEN arg_billno = ''
  503. IF IsNull(arg_printid) THEN arg_printid = 0
  504. IF Credkind = 0 THEN
  505. IF arg_subid = '' AND arg_debit = 0 AND arg_credit = 0 THEN // 如果借贷金额为 0 且摘要和科目为空,则不作任何处理
  506. rslt = 1
  507. GOTO ext
  508. END IF
  509. ELSE
  510. IF arg_subid = '' THEN // 如果摘要和科目为空,则不作任何处理
  511. rslt = 1
  512. GOTO ext
  513. END IF
  514. IF arg_autorate <= 0 OR arg_autorate > 100 THEN
  515. arG_MSG = '转帐比例必须在0 到 100之间,不包括0'
  516. rslt = 0
  517. GOTO ext
  518. END IF
  519. END IF
  520. SELECT count(*) INTO :cnt FROM cw_subject
  521. WHERE accsetid = :sys_accsetid
  522. AND subid = :arg_subid
  523. AND detailflag = 1;
  524. IF sqlca.SQLCode <> 0 THEN
  525. arG_MSG = '查询科目代码失败'
  526. rslt = 0
  527. GOTO ext
  528. END IF
  529. IF cnt = 0 THEN
  530. arG_MSG = '此帐套中不存在明细科目{'+arg_subid+'},请检查输入是否正确'
  531. rslt = 0
  532. GOTO ext
  533. END IF
  534. IF cnt > 1 THEN
  535. arG_MSG = '此帐套中存在两个相同科目{'+arg_subid+'}'
  536. rslt = 0
  537. GOTO ext
  538. END IF
  539. IF Credkind = 1 AND arg_modeType = 1 THEN modetype_1_cnt++
  540. //写入内容
  541. it_mxbt++
  542. credencemx[it_mxbt].subid = arg_subid
  543. credencemx[it_mxbt].brief = arg_brief
  544. credencemx[it_mxbt].Dcflag = arg_Dcflag
  545. credencemx[it_mxbt].modeType = arg_modeType
  546. credencemx[it_mxbt].ifnopost = arg_ifnopost
  547. credencemx[it_mxbt].autorate = arg_autorate
  548. credencemx[it_mxbt].Expressions = arg_Expressions
  549. credencemx[it_mxbt].debit = arg_debit
  550. credencemx[it_mxbt].credit = arg_credit
  551. credencemx[it_mxbt].amount = arg_amount
  552. credencemx[it_mxbt].price = arg_price
  553. credencemx[it_mxbt].deptid = arg_deptid
  554. credencemx[it_mxbt].itemid = arg_itemid
  555. credencemx[it_mxbt].billid = arg_billid
  556. credencemx[it_mxbt].billno = arg_billno
  557. credencemx[it_mxbt].printid = arg_printid
  558. ext:
  559. IF rslt = 0 THEN p_clearmx()
  560. RETURN(rslt)
  561. end function
  562. public function integer auto_createcred (long arg_credid, ref string arg_msg);Int rslt = 1
  563. Long i,ll_ref_credid,ll_ref_credno
  564. DateTime end_date,null_datetime
  565. s_credence arg_s_cred
  566. Long no_mxt = 0
  567. SetNull(null_datetime)
  568. IF getinfo(arg_credid,arg_msg) = 0 THEN
  569. rslt = 0
  570. GOTO ext
  571. END IF
  572. IF Credkind <> 1 THEN
  573. rslt = 0
  574. arg_msg = '错误的凭证类型'
  575. GOTO ext
  576. END IF
  577. SELECT cw_calendar.edate
  578. INTO :end_date
  579. FROM cw_calendar
  580. WHERE cw_calendar.accsetid = :sys_accsetid
  581. AND cmonth = :sys_curyearmon;
  582. IF sqlca.SQLCode <> 0 THEN
  583. arg_msg = '查询本期间期末日期间失败'
  584. rslt = 0
  585. GOTO ext
  586. END IF
  587. //accepttext
  588. String ls_subid,ls_brief
  589. Int ls_Dcflag,ls_modetype,ls_ifnopost
  590. Decimal ls_autorate
  591. String ls_Expressions
  592. Decimal ls_debit,ls_credit,ls_balcamt
  593. Long ls_itemid
  594. Int ls_rawrate
  595. Decimal ls_rawdebit,ls_rawcredit,ls_rawbalcamt
  596. Decimal sum_debit,sum_credit,sum_rawdebit,sum_rawcredit
  597. Int ls_subdcflag
  598. Decimal cnt
  599. FOR i = 1 TO it_mxbt
  600. ls_subid = credencemx[i].subid
  601. ls_brief = credencemx[i].brief
  602. ls_Dcflag = credencemx[i].Dcflag
  603. ls_modetype = credencemx[i].modetype
  604. ls_ifnopost = credencemx[i].ifnopost
  605. ls_autorate = credencemx[i].autorate
  606. ls_Expressions = credencemx[i].Expressions
  607. ls_itemid = credencemx[i].itemid
  608. //检查
  609. SELECT dcflag INTO :ls_subdcflag FROM cw_subject
  610. Where accsetid = :sys_accsetid AND subid = :ls_subid;
  611. IF sqlca.SQLCode <> 0 THEN
  612. arg_msg = '查询会计科目:'+ls_subid+'余额方向失败'
  613. rslt = 0
  614. GOTO ext
  615. END IF
  616. SELECT cw_currency.rate INTO :ls_rawrate
  617. FROM cw_subject,cw_currency
  618. WHERE cw_subject.accsetid = cw_currency.accsetid
  619. AND cw_subject.moneyid = cw_currency.moneyid
  620. AND cw_subject.accsetid = :sys_accsetid
  621. AND cw_subject.subid = :ls_subid;
  622. IF sqlca.SQLCode = -1 THEN
  623. arg_msg = '查询会计科目:'+ls_subid+'外币汇率失败'
  624. rslt = 0
  625. GOTO ext
  626. END IF
  627. IF IsNull(ls_rawrate) THEN ls_rawrate = 0
  628. //
  629. IF ls_modetype = 1 THEN GOTO auto_in
  630. CHOOSE CASE ls_modetype
  631. CASE 2
  632. SELECT sum(debit),sum(credit) INTO :ls_debit,:ls_credit
  633. FROM cw_credence,cw_credencemx
  634. WHERE cw_credence.accsetid = cw_credencemx.accsetid
  635. AND cw_credence.credid = cw_credencemx.credid
  636. AND cw_credence.accsetid = :sys_accsetid
  637. AND cw_credence.cmonth = :sys_curyearmon
  638. AND (cw_credence.postflag = :ls_ifnopost OR :ls_ifnopost = 0 )
  639. AND cw_credencemx.subid = :ls_subid;
  640. IF sqlca.SQLCode <> 0 THEN
  641. arg_msg = '查询会计科目:'+ls_subid+'本期余额失败'
  642. rslt = 0
  643. GOTO ext
  644. END IF
  645. IF IsNull(ls_debit) THEN ls_debit = 0
  646. IF IsNull(ls_credit) THEN ls_credit = 0
  647. IF ls_subdcflag = 1 THEN
  648. ls_balcamt = ls_debit - ls_credit
  649. ELSE
  650. ls_balcamt = ls_credit - ls_debit
  651. END IF
  652. ls_balcamt = ls_balcamt * ls_autorate / 100
  653. ls_rawbalcamt = ls_rawrate * ls_balcamt
  654. IF ls_Dcflag = 1 THEN
  655. ls_debit = ls_balcamt
  656. ls_credit = 0
  657. ls_rawdebit = ls_rawbalcamt
  658. ls_rawcredit = 0
  659. ELSE
  660. ls_debit = 0
  661. ls_credit = ls_balcamt
  662. ls_rawdebit = 0
  663. ls_rawcredit = ls_rawbalcamt
  664. END IF
  665. sum_debit = sum_debit + ls_debit
  666. sum_credit = sum_credit + ls_credit
  667. sum_rawdebit = sum_rawdebit + ls_rawdebit
  668. sum_rawcredit = sum_rawcredit + ls_rawcredit
  669. CASE 3
  670. SELECT sum(debit),sum(credit) INTO :ls_debit,:ls_credit
  671. FROM cw_credence,cw_credencemx
  672. WHERE cw_credence.accsetid = cw_credencemx.accsetid
  673. AND cw_credence.credid = cw_credencemx.credid
  674. AND cw_credence.accsetid = :sys_accsetid
  675. AND cw_credence.cmonth = :sys_curyearmon
  676. AND (cw_credence.postflag = :ls_ifnopost OR :ls_ifnopost = 0 )
  677. AND cw_credencemx.subid = :ls_subid;
  678. IF sqlca.SQLCode <> 0 THEN
  679. arg_msg = '查询会计科目:'+ls_subid+'本期余额失败'
  680. rslt = 0
  681. GOTO ext
  682. END IF
  683. IF IsNull(ls_debit) THEN ls_debit = 0
  684. IF IsNull(ls_credit) THEN ls_credit = 0
  685. IF ls_subdcflag = 1 THEN
  686. ls_balcamt = ls_debit
  687. ELSE
  688. ls_balcamt = ls_credit
  689. END IF
  690. ls_balcamt = ls_balcamt * ls_autorate / 100
  691. ls_rawbalcamt = ls_rawrate * ls_balcamt
  692. IF ls_Dcflag = 1 THEN
  693. ls_debit = ls_balcamt
  694. ls_credit = 0
  695. ls_rawdebit = ls_rawbalcamt
  696. ls_rawcredit = 0
  697. ELSE
  698. ls_debit = 0
  699. ls_credit = ls_balcamt
  700. ls_rawdebit = 0
  701. ls_rawcredit = ls_rawbalcamt
  702. END IF
  703. sum_debit = sum_debit + ls_debit
  704. sum_credit = sum_credit + ls_credit
  705. sum_rawdebit = sum_rawdebit + ls_rawdebit
  706. sum_rawcredit = sum_rawcredit + ls_rawcredit
  707. CASE 4
  708. END CHOOSE
  709. IF ls_debit <> 0 OR ls_credit <> 0 THEN
  710. no_mxt++
  711. arg_s_cred.arg_s_credmx[no_mxt].fuluno = no_mxt
  712. arg_s_cred.arg_s_credmx[no_mxt].subid = ls_subid
  713. arg_s_cred.arg_s_credmx[no_mxt].brief = ls_brief
  714. arg_s_cred.arg_s_credmx[no_mxt].rate = ls_rawrate
  715. arg_s_cred.arg_s_credmx[no_mxt].rawdebit = ls_rawdebit
  716. arg_s_cred.arg_s_credmx[no_mxt].rawcredit = ls_rawcredit
  717. arg_s_cred.arg_s_credmx[no_mxt].debit = ls_debit
  718. arg_s_cred.arg_s_credmx[no_mxt].credit = ls_credit
  719. arg_s_cred.arg_s_credmx[no_mxt].amount = 0
  720. arg_s_cred.arg_s_credmx[no_mxt].price = 0
  721. arg_s_cred.arg_s_credmx[no_mxt].deptid = 0
  722. arg_s_cred.arg_s_credmx[no_mxt].itemid = ls_itemid
  723. arg_s_cred.arg_s_credmx[no_mxt].billdate = null_datetime
  724. arg_s_cred.arg_s_credmx[no_mxt].billid = 0
  725. arg_s_cred.arg_s_credmx[no_mxt].billno = ''
  726. arg_s_cred.arg_s_credmx[no_mxt].cropbillid = 0
  727. arg_s_cred.arg_s_credmx[no_mxt].ifreadonly = 1
  728. END IF
  729. NEXT
  730. //
  731. //转入
  732. auto_in:
  733. IF sum_debit <> 0 OR sum_credit <> 0 THEN
  734. no_mxt++
  735. IF ls_Dcflag = 1 THEN
  736. sum_debit = sum_credit - sum_debit
  737. sum_credit = 0
  738. sum_rawdebit = sum_rawcredit - sum_rawdebit
  739. sum_rawdebit = 0
  740. ELSE
  741. sum_debit = 0
  742. sum_credit = sum_debit - sum_credit
  743. sum_rawdebit = 0
  744. sum_rawdebit = sum_rawdebit - sum_rawcredit
  745. END IF
  746. arg_s_cred.arg_s_credmx[no_mxt].fuluno = no_mxt
  747. arg_s_cred.arg_s_credmx[no_mxt].subid = ls_subid
  748. arg_s_cred.arg_s_credmx[no_mxt].brief = ls_brief
  749. arg_s_cred.arg_s_credmx[no_mxt].rate = ls_rawrate
  750. arg_s_cred.arg_s_credmx[no_mxt].rawdebit = sum_rawdebit
  751. arg_s_cred.arg_s_credmx[no_mxt].rawcredit = sum_rawcredit
  752. arg_s_cred.arg_s_credmx[no_mxt].debit = sum_debit
  753. arg_s_cred.arg_s_credmx[no_mxt].credit = sum_credit
  754. arg_s_cred.arg_s_credmx[no_mxt].amount = 0
  755. arg_s_cred.arg_s_credmx[no_mxt].price = 0
  756. arg_s_cred.arg_s_credmx[no_mxt].deptid = 0
  757. arg_s_cred.arg_s_credmx[no_mxt].itemid = ls_itemid
  758. arg_s_cred.arg_s_credmx[no_mxt].billdate = null_datetime
  759. arg_s_cred.arg_s_credmx[no_mxt].billid = 0
  760. arg_s_cred.arg_s_credmx[no_mxt].billno = ''
  761. arg_s_cred.arg_s_credmx[no_mxt].cropbillid = 0
  762. arg_s_cred.arg_s_credmx[no_mxt].ifreadonly = 1
  763. END IF
  764. arg_s_cred.credtype = credtype
  765. arg_s_cred.readtype = 300
  766. arg_s_cred.creddate = end_date
  767. arg_s_cred.ifauto = 0
  768. IF f_create_cred(arg_s_cred,TRUE,arg_msg,ll_ref_credid,ll_ref_credno) = 0 THEN
  769. rslt = 0
  770. GOTO ext
  771. END IF
  772. ext:
  773. RETURN rslt
  774. end function
  775. on uo_credence_mode.create
  776. call super::create
  777. TriggerEvent( this, "constructor" )
  778. end on
  779. on uo_credence_mode.destroy
  780. TriggerEvent( this, "destructor" )
  781. call super::destroy
  782. end on