uo_musttake.sru 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958
  1. $PBExportHeader$uo_musttake.sru
  2. forward
  3. global type uo_musttake from nonvisualobject
  4. end type
  5. type delmx from structure within uo_musttake
  6. end type
  7. end forward
  8. type delmx from structure
  9. long takeid
  10. long listno
  11. end type
  12. global type uo_musttake from nonvisualobject
  13. end type
  14. global uo_musttake uo_musttake
  15. type variables
  16. long ref_takeid = 0
  17. end variables
  18. forward prototypes
  19. public function integer del_takerecmx (integer arg_del, long arg_takeid, long arg_listno, ref string arg_msg, boolean arg_ifcommit)
  20. public function integer salebill_del_mx (long arg_salebillid, ref string arg_msg, boolean arg_ifcommit)
  21. public function integer del_takerec (long arg_scid, integer arg_del, long arg_takeid, long arg_cusid, ref string arg_msg, boolean arg_ifcommit)
  22. public function integer add_takerec (long arg_scid, long arg_cusid, datetime arg_takedate, string arg_inrep, decimal arg_oriamt, decimal arg_msttakeamt, decimal arg_takeamt, string arg_dscrp, string arg_billcode, long arg_banktypeid, integer arg_buildtype, string arg_opemp, long arg_outwareid, long arg_salebillid, ref string arg_msg, boolean arg_ifcommit, datetime arg_viewdate, long arg_accountsid, long arg_itemid, long arg_moneyid, string arg_relcode)
  23. public function integer add_takerecmx (long arg_scid, long arg_takeid, string arg_billcode, datetime arg_takedate, long arg_banktypeid, decimal arg_msttakeamt, decimal arg_takeamt, string arg_opemp, string arg_dscrp, string arg_inrep, integer arg_buildtype, long arg_salebillid, long arg_itemid, long arg_cusid, long arg_moneyid, ref string arg_msg, boolean arg_ifcommit, string arg_relcode)
  24. public function integer add_takerec (ref s_bmsttake arg_s_mx, ref string arg_msg, boolean arg_ifcommit)
  25. public function integer add_takerecmx (ref s_bmsttake arg_s_mx, ref string arg_msg, boolean arg_ifcommit)
  26. end prototypes
  27. public function integer del_takerecmx (integer arg_del, long arg_takeid, long arg_listno, ref string arg_msg, boolean arg_ifcommit);//删除应收帐
  28. //del_TAKErecmx(arg_del,arg_takeid,arg_listno,arg_msg,arg_ifcommit)
  29. //arg_del 0:手动删除,1:应收帐删除,2:收入单删除;3:销售单删除
  30. Int rslt = 1
  31. long cnt = 0
  32. Long buildtype = 0
  33. Decimal msttakeamt,takeamt
  34. DateTime null_datetime
  35. SELECT count(*)
  36. INTO :cnt
  37. FROM u_bmstTAKEmx
  38. WHERE u_bmstTAKEmx.takeid = :arg_takeid
  39. And u_bmstTAKEmx.listno = :arg_listno;
  40. IF sqlca.SQLCode <> 0 THEN
  41. arg_msg = '查询操作失败,应收明细帐唯一码'
  42. rslt = 0
  43. GOTO ext
  44. END IF
  45. IF cnt = 0 THEN
  46. arg_msg = '错误应收明细帐唯一码'
  47. rslt = 0
  48. GOTO ext
  49. END IF
  50. SELECT buildtype,msttakeamt,takeamt
  51. INTO :buildtype,:msttakeamt,:takeamt
  52. FROM u_bmstTAKEmx
  53. WHERE u_bmstTAKEmx.takeid = :arg_takeid
  54. And u_bmstTAKEmx.listno = :arg_listno;
  55. IF sqlca.SQLCode <> 0 THEN
  56. arg_msg = "查询应收明细帐失败,请重试!"+'~n'+sqlca.SQLErrText
  57. rslt = 0
  58. GOTO ext
  59. END IF
  60. IF arg_del = 0 THEN
  61. IF buildtype <> 0 THEN
  62. arg_msg = '系统自动建立的应收明细帐不可以手动删除'
  63. rslt = 0
  64. GOTO ext
  65. END IF
  66. END IF
  67. SetNull(null_datetime)
  68. UPDATE U_bmstTAKE
  69. SET msttakeamt = msttakeamt - :msttakeamt,
  70. takeamt = takeamt - :takeamt,
  71. finishflag = 0,
  72. finishdate = :null_datetime
  73. Where U_bmstTAKE.takeid = :arg_takeid;
  74. IF sqlca.SQLCode <> 0 THEN
  75. arg_msg = '更新应收帐金额失败,请重试>>'+sqlca.SQLErrText
  76. rslt = 0
  77. GOTO ext
  78. END IF
  79. DELETE U_bmstTAKEmx
  80. WHERE u_bmstTAKEmx.takeid = :arg_takeid
  81. And u_bmstTAKEmx.listno = :arg_listno;
  82. IF sqlca.SQLCode <> 0 THEN
  83. arg_msg = "删除应收明细帐操作失败,请重试!"+'~n'+sqlca.SQLErrText
  84. rslt = 0
  85. GOTO ext
  86. END IF
  87. ext:
  88. IF rslt = 0 THEN
  89. ROLLBACK;
  90. ELSEIF rslt = 1 And arg_ifcommit THEN
  91. COMMIT;
  92. END IF
  93. RETURN rslt
  94. end function
  95. public function integer salebill_del_mx (long arg_salebillid, ref string arg_msg, boolean arg_ifcommit);//根据收入单删除应收帐明细
  96. //salebill_del_mx(arg_salebillid,arg_msg,arg_ifcommit)
  97. delmx del_mx[]
  98. Long it_mxt
  99. Long deltakeid[]
  100. Long cusid[],ll_cusid,scid[],ll_scid
  101. Long ls_takeid,ls_listno,i
  102. Int rslt = 1
  103. it_mxt = 0
  104. DECLARE listno_cur CURSOR FOR
  105. SELECT U_BmsttakeMX.Takeid,
  106. U_BmsttakeMX.listno
  107. FROM U_BmsttakeMX
  108. Where salebillid = :arg_salebillid;
  109. OPEN listno_cur;
  110. FETCH listno_cur Into :ls_takeid,:ls_listno;
  111. DO WHILE sqlca.SQLCode = 0
  112. it_mxt++
  113. del_mx[it_mxt].Takeid = ls_takeid
  114. del_mx[it_mxt].listno = ls_listno
  115. FETCH listno_cur Into :ls_takeid,:ls_listno;
  116. LOOP
  117. CLOSE listno_cur;
  118. FOR i = 1 To it_mxt
  119. IF del_takerecmx (2,del_mx[i].Takeid, del_mx[i].listno,arg_msg,False) = 0 THEN
  120. rslt = 0
  121. GOTO ext
  122. END IF
  123. NEXT
  124. ext:
  125. IF rslt = 0 THEN
  126. ROLLBACK;
  127. ELSEIF rslt = 1 And arg_ifcommit THEN
  128. COMMIT;
  129. END IF
  130. RETURN rslt
  131. end function
  132. public function integer del_takerec (long arg_scid, integer arg_del, long arg_takeid, long arg_cusid, ref string arg_msg, boolean arg_ifcommit);//删除应收帐
  133. //del_TAKErec(arg_takeid,arg_cusid,arg_msg,arg_ifcommit)
  134. //1 判断是否有当前客户
  135. //2 判断这个ID是否当前客户的最后一个明细记录。
  136. //3 删除最后一行的记录行,失败回滚,成功提交。
  137. Int rslt = 1,li_finishflag
  138. long cnt = 0
  139. Long maxid = 0
  140. Long buildtype = 0
  141. Long ll_buildtype
  142. Long ll_ctmint
  143. Decimal ls_msttakeamt,ls_takeamt
  144. Long ll_itemid,ll_dateint
  145. DateTime ld_ctdatetime,ld_takedate
  146. uo_iteminput uo_item
  147. uo_item = Create uo_iteminput
  148. SELECT count(*)
  149. INTO :cnt
  150. FROM u_CUST
  151. Where u_CUST.CUSid = :arg_CUSid ;
  152. IF sqlca.SQLCode <> 0 THEN
  153. arg_msg = '查询操作失败,客户唯一码'
  154. rslt = 0
  155. GOTO ext
  156. END IF
  157. IF cnt = 0 THEN
  158. arg_msg = '错误客户唯一码'
  159. rslt = 0
  160. GOTO ext
  161. END IF
  162. SELECT buildtype,
  163. msttakeamt,
  164. takeamt,
  165. itemid,
  166. rapmoneyid,
  167. takedate,
  168. ctmint,
  169. finishflag
  170. INTO :ll_buildtype,
  171. :ls_msttakeamt,
  172. :ls_takeamt,
  173. :ll_itemid,
  174. :ll_dateint,
  175. :ld_takedate,
  176. :ll_ctmint,
  177. :li_finishflag
  178. FROM u_bmsttake
  179. Where u_bmsttake.takeid = :arg_takeid;
  180. IF sqlca.SQLCode <> 0 THEN
  181. arg_msg = "查询应收帐建立类型失败,请重试!"+'~n'+sqlca.SQLErrText
  182. rslt = 0
  183. GOTO ext
  184. END IF
  185. IF ll_ctmint > 0 THEN
  186. arg_msg = '该记录资料已被截数,不能处理'
  187. rslt = 0
  188. GOTO ext
  189. END IF
  190. If (ll_buildtype = 1 Or ll_buildtype = 4) And arg_del = 0 THEN
  191. arg_msg = '系统自动建立的应收帐不可以手动删除'
  192. rslt = 0
  193. GOTO ext
  194. END IF
  195. cnt = 0
  196. IF ll_buildtype = 0 THEN //手动建立的,
  197. SELECT count(*) INTO :cnt FROM u_bmsttakemx
  198. WHERE takeid = :arg_takeid
  199. And (buildtype <> 0);
  200. ELSEIF ll_buildtype = 1 THEN //销售单据建立
  201. SELECT count(*) INTO :cnt FROM u_bmsttakemx
  202. WHERE takeid = :arg_takeid
  203. And (buildtype <> 1 And buildtype <> 3);
  204. ELSEIF ll_buildtype = 4 THEN //收款单据建立
  205. SELECT count(*) INTO :cnt FROM u_bmsttakemx
  206. WHERE takeid = :arg_takeid
  207. And (buildtype <> 4);
  208. ELSE
  209. SELECT count(*) INTO :cnt FROM u_bmsttakemx
  210. WHERE takeid = :arg_takeid
  211. And (buildtype = 2);
  212. END IF
  213. IF sqlca.SQLCode <> 0 THEN
  214. arg_msg = '查询应收帐明细帐失败'
  215. rslt = 0
  216. GOTO ext
  217. END IF
  218. IF cnt > 0 THEN
  219. arg_msg = '该应帐记录已存在明细帐记录,不能删除>>如果要删除,请先删除明细帐'
  220. rslt = 0
  221. GOTO ext
  222. END IF
  223. //********删除出纳帐
  224. IF sys_option_msttake_takeamt_secaudit = 0 THEN
  225. IF ls_takeamt <> 0 THEN
  226. IF uo_item.del_iteminput(ll_itemid,ll_dateint,1,arg_msg,False) = 0 THEN
  227. arg_msg = '删除出纳明细帐失败!~n' + arg_msg
  228. rslt = 0
  229. GOTO ext
  230. END IF
  231. END IF
  232. END IF
  233. DELETE U_bmstTAKEmx
  234. Where takeid = :arg_takeid;
  235. IF sqlca.SQLCode <> 0 THEN
  236. arg_msg = "删除应收明细帐操作失败,请重试!"+'~n'+sqlca.SQLErrText
  237. rslt = 0
  238. GOTO ext
  239. END IF
  240. DELETE U_bmstTAKE
  241. Where takeid = :arg_takeid;
  242. IF sqlca.SQLCode <> 0 THEN
  243. arg_msg = "删除应收帐操作失败,请重试!"+'~n'+sqlca.SQLErrText
  244. rslt = 0
  245. GOTO ext
  246. END IF
  247. ext:
  248. IF rslt = 0 THEN
  249. ROLLBACK;
  250. ELSEIF rslt = 1 And arg_ifcommit THEN
  251. COMMIT;
  252. END IF
  253. RETURN rslt
  254. end function
  255. public function integer add_takerec (long arg_scid, long arg_cusid, datetime arg_takedate, string arg_inrep, decimal arg_oriamt, decimal arg_msttakeamt, decimal arg_takeamt, string arg_dscrp, string arg_billcode, long arg_banktypeid, integer arg_buildtype, string arg_opemp, long arg_outwareid, long arg_salebillid, ref string arg_msg, boolean arg_ifcommit, datetime arg_viewdate, long arg_accountsid, long arg_itemid, long arg_moneyid, string arg_relcode);s_bmsttake s_take
  256. s_take.scid = arg_scid
  257. s_take.cusid = arg_cusid
  258. s_take.takedate = arg_takedate
  259. s_take.inrep = arg_inrep
  260. s_take.oriamt = arg_oriamt
  261. s_take.msttakeamt = arg_msttakeamt
  262. s_take.takeamt_cn = arg_takeamt
  263. s_take.takeamt = arg_takeamt
  264. s_take.dscrp = arg_dscrp
  265. s_take.billcode = arg_billcode
  266. s_take.banktypeid = arg_banktypeid
  267. s_take.buildtype = arg_buildtype
  268. s_take.opemp = arg_opemp
  269. s_take.outwareid = arg_outwareid
  270. s_take.salebillid = arg_salebillid
  271. s_take.viewdate = arg_viewdate
  272. s_take.accountsid = arg_accountsid
  273. s_take.itemid = arg_itemid
  274. s_take.moneyid = arg_moneyid
  275. // s_take.moneyid_cn = arg_ll_moneyid_account
  276. s_take.relcode = arg_relcode
  277. return add_takerec(s_take,arg_msg,arg_ifcommit)
  278. end function
  279. public function integer add_takerecmx (long arg_scid, long arg_takeid, string arg_billcode, datetime arg_takedate, long arg_banktypeid, decimal arg_msttakeamt, decimal arg_takeamt, string arg_opemp, string arg_dscrp, string arg_inrep, integer arg_buildtype, long arg_salebillid, long arg_itemid, long arg_cusid, long arg_moneyid, ref string arg_msg, boolean arg_ifcommit, string arg_relcode);s_bmsttake s_take
  280. s_take.scid = arg_scid
  281. s_take.takeid = arg_takeid
  282. s_take.billcode = arg_billcode
  283. s_take.takedate = arg_takedate
  284. s_take.banktypeid = arg_banktypeid
  285. s_take.msttakeamt = arg_msttakeamt
  286. s_take.takeamt = arg_takeamt
  287. s_take.opemp = arg_opemp
  288. s_take.dscrp = arg_dscrp
  289. s_take.inrep = arg_inrep
  290. s_take.buildtype = arg_buildtype
  291. s_take.salebillid = arg_salebillid
  292. s_take.itemid = arg_itemid
  293. s_take.cusid = arg_cusid
  294. s_take.moneyid = arg_moneyid
  295. s_take.relcode = arg_relcode
  296. //s_take.oriamt = arg_oriamt
  297. //s_take.outwareid = arg_outwareid
  298. //s_take.viewdate = arg_viewdate
  299. //s_take.accountsid = arg_accountsid
  300. return add_takerecmx(s_take,arg_msg,arg_ifcommit)
  301. end function
  302. public function integer add_takerec (ref s_bmsttake arg_s_mx, ref string arg_msg, boolean arg_ifcommit);//arg_s_mx.buildtype = 0 - 手动;1 -自动;2-对单; 3-项目;4-收付款单; (2,3只用在明细中)
  303. Int rslt = 1
  304. long cnt = 0
  305. DateTime server_datetime
  306. Long ls_newtakeid
  307. Long ref_dateint
  308. String ls_cusname, ls_custype, ls_dscrp, ls_cuscode
  309. String ls_relcode
  310. Int li_item_dfttype,li_itemflag
  311. Decimal ld_takeamt
  312. IF IsNull(arg_s_mx.dscrp) THEN arg_s_mx.dscrp = ''
  313. IF IsNull(arg_s_mx.inrep) THEN arg_s_mx.inrep = ''
  314. IF IsNull(arg_s_mx.banktypeid) THEN arg_s_mx.banktypeid = 0
  315. IF IsNull(arg_s_mx.billcode) THEN arg_s_mx.billcode = ''
  316. IF IsNull(arg_s_mx.opemp) THEN arg_s_mx.opemp = ''
  317. IF IsNull(arg_s_mx.scid) THEN arg_s_mx.scid = 0
  318. IF IsNull(arg_s_mx.accountsid) THEN arg_s_mx.accountsid = 0
  319. IF IsNull(arg_s_mx.itemid) THEN arg_s_mx.itemid = 0
  320. IF IsNull(arg_s_mx.moneyid) THEN arg_s_mx.moneyid = 0
  321. IF IsNull(arg_s_mx.relcode) THEN arg_s_mx.relcode = ''
  322. //IF Len(arg_s_mx.dscrp) > 255 THEN arg_s_mx.dscrp = Left(arg_s_mx.dscrp, 255)
  323. uo_iteminput uo_item
  324. uo_item = Create uo_iteminput
  325. //未注册限制
  326. IF sys_if_register = 0 THEN
  327. Long ll_bill_count
  328. SELECT count(*)
  329. INTO :ll_bill_count
  330. From U_Bmsttake;
  331. IF sqlca.SQLCode <> 0 THEN
  332. rslt = 0
  333. arg_msg = "查询操作失败,应收帐数量 "
  334. GOTO ext
  335. END IF
  336. IF ll_bill_count > 80 THEN
  337. rslt = 0
  338. arg_msg = "未注册版本,应收帐只能保存80条记录!"
  339. GOTO ext
  340. END IF
  341. END IF
  342. IF Not (arg_s_mx.buildtype = 0 Or arg_s_mx.buildtype = 1 Or arg_s_mx.buildtype = 4) THEN
  343. arg_msg = '错误建立类型,必须为:0-手工记帐;1-单据记帐;4-收款单记帐'
  344. rslt = 0
  345. GOTO ext
  346. END IF
  347. IF arg_s_mx.moneyid <= 0 THEN
  348. rslt = 0
  349. arg_msg = '请选择币种.'
  350. GOTO ext
  351. END IF
  352. IF arg_s_mx.banktypeid = 0 THEN
  353. arg_msg = '没有结算方式'
  354. rslt = 0
  355. GOTO ext
  356. END IF
  357. IF arg_s_mx.itemid = 0 THEN
  358. arg_msg = '没有收支项目'
  359. rslt = 0
  360. GOTO ext
  361. END IF
  362. IF arg_s_mx.billcode = '' THEN
  363. arg_msg = '请输入凭证号码'
  364. rslt = 0
  365. GOTO ext
  366. END IF
  367. IF Date(arg_s_mx.TAKEdate) <= 1990-01-01 THEN
  368. arg_msg = '错误发生日期'
  369. rslt = 0
  370. GOTO ext
  371. END IF
  372. IF Trim(arg_s_mx.inrep) = '' THEN
  373. arg_msg = '请输入经手人'
  374. rslt = 0
  375. GOTO ext
  376. END IF
  377. cnt = 0
  378. SELECT count(*) Into :cnt From u_scdef Where scid = :arg_s_mx.scid;
  379. IF sqlca.SQLCode <> 0 THEN
  380. rslt = 0
  381. arg_msg = '查询分部资料失败!'
  382. GOTO ext
  383. END IF
  384. IF cnt = 0 THEN
  385. rslt = 0
  386. arg_msg = '无效的分部,不存在该分部!'
  387. GOTO ext
  388. END IF
  389. Int li_btype,li_native
  390. SELECT btype Into :li_btype From cw_banktype Where banktypeid = :arg_s_mx.banktypeid;
  391. IF sqlca.SQLCode <> 0 THEN
  392. rslt = 0
  393. arg_msg = '查询结算方式失败!'
  394. GOTO ext
  395. END IF
  396. SELECT native Into :li_native From cw_currency Where moneyid = :arg_s_mx.moneyid;
  397. IF sqlca.SQLCode <> 0 THEN
  398. rslt = 0
  399. arg_msg = '查询币种失败!'
  400. GOTO ext
  401. END IF
  402. IF arg_s_mx.outwareid > 0 And arg_s_mx.buildtype = 1 THEN
  403. SELECT part Into :ls_relcode From u_outware Where outwareid = :arg_s_mx.outwareid;
  404. IF sqlca.SQLCode <> 0 THEN
  405. ls_relcode = ''
  406. END IF
  407. END IF
  408. SELECT Top 1 getdate() Into :server_datetime From u_user ;
  409. IF sqlca.SQLCode <> 0 THEN
  410. rslt = 0
  411. arg_msg = "查询操作失败,系统时间"
  412. GOTO ext
  413. END IF
  414. IF arg_s_mx.mstTAKEamt = 0 And arg_s_mx.TAKEamt = 0 THEN
  415. arg_msg = "应收金额与已收金额不能同时为0!"
  416. rslt = 0
  417. GOTO ext
  418. END IF
  419. arg_s_mx.oriamt = arg_s_mx.mstTAKEamt - arg_s_mx.TAKEamt //当前会计分录的金额, 如果是现金结算则为0
  420. //2 判断是否已经选择当前客户和操作员
  421. SELECT cuscode,name, custype
  422. INTO :ls_cuscode, :ls_cusname, :ls_custype
  423. FROM u_cust
  424. Where u_cust.cusid = :arg_s_mx.cusid;
  425. IF sqlca.SQLCode <> 0 THEN
  426. arg_msg = '查询操作失败,客户唯一码'
  427. rslt = 0
  428. GOTO ext
  429. END IF
  430. cnt = 0
  431. SELECT count(*) INTO :cnt
  432. FROM u_user
  433. Where username = :arg_s_mx.opemp ;
  434. IF sqlca.SQLCode <> 0 THEN
  435. rslt = 0
  436. arg_msg = "查询操作失败,操作员!"
  437. GOTO ext
  438. END IF
  439. IF cnt = 0 THEN
  440. rslt = 0
  441. arg_msg = "操作员姓名未登记或已取消!"
  442. GOTO ext
  443. END IF
  444. //加出纳帐****************
  445. DateTime ldt_viewdate
  446. IF sys_option_msttake_takeamt_secaudit = 0 THEN
  447. IF arg_s_mx.TAKEamt <> 0 THEN
  448. IF arg_s_mx.accountsid = 0 THEN
  449. arg_msg = '请选择账号'
  450. rslt = 0
  451. GOTO ext
  452. END IF
  453. SELECT dfttype,itemflag
  454. INTO :li_item_dfttype,:li_itemflag
  455. FROM u_itemdef
  456. Where u_itemdef.itemid = :arg_s_mx.itemid;
  457. IF sqlca.SQLCode <> 0 THEN
  458. arg_msg = '查询当前收支项目核算类型和核算方向失败!'
  459. rslt = 0
  460. GOTO ext
  461. END IF
  462. CHOOSE CASE li_item_dfttype
  463. CASE 1,3,4
  464. ld_takeamt = arg_s_mx.takeamt_cn * li_itemflag
  465. CASE ELSE
  466. ld_takeamt = arg_s_mx.takeamt_cn
  467. END CHOOSE
  468. //客户收款单的选项, 暂时无法区别是否客户收款单?
  469. //不过其他单据,默认TAKEdate = viewdate
  470. IF sys_option_cusamt_dftdate = 0 THEN
  471. ldt_viewdate = arg_s_mx.TAKEdate
  472. ELSE
  473. ldt_viewdate = arg_s_mx.viewdate
  474. END IF
  475. //Int sys_option_rap_money_dscrp_mode= 0 // 281 出纳帐摘要生成模式
  476. IF sys_option_rap_money_dscrp_mode = 0 THEN
  477. ls_dscrp = ls_cuscode + ' ' + ls_cusname + ' ' + ls_custype + ' '+arg_s_mx.dscrp
  478. ELSEIF sys_option_rap_money_dscrp_mode = 1 THEN
  479. ls_dscrp = ls_cusname + ' '+arg_s_mx.dscrp
  480. ELSE
  481. ls_dscrp = ls_cuscode + ' ' + ls_cusname + ' ' + ls_custype + ' '+arg_s_mx.dscrp
  482. END IF
  483. s_iteminput s_input
  484. s_input.itemid = arg_s_mx.itemid
  485. s_input.dateint = 0
  486. s_input.outdate = ldt_viewdate
  487. s_input.dscrp = ls_dscrp
  488. s_input.outamt = ld_takeamt
  489. s_input.accountsid = arg_s_mx.accountsid
  490. s_input.banktypeid = arg_s_mx.banktypeid
  491. s_input.billcode = arg_s_mx.billcode
  492. s_input.relcode = arg_s_mx.relcode
  493. s_input.buildtype = 1
  494. s_input.opemp = publ_operator
  495. s_input.relrep = ''
  496. s_input.scid = arg_s_mx.scid
  497. s_input.moneyid = arg_s_mx.moneyid
  498. IF uo_item.add_iteminput(s_input,arg_msg,False) = 0 THEN
  499. arg_msg = '增加收支明细帐失败!~n' + arg_msg
  500. rslt = 0
  501. GOTO ext
  502. END IF
  503. ref_dateint = uo_item.ref_dateint
  504. IF ref_dateint = 0 THEN
  505. arg_msg = '增加收支出纳明细帐失败!'
  506. rslt = 0
  507. GOTO ext
  508. END IF
  509. ELSE
  510. arg_s_mx.accountsid = 0
  511. END IF
  512. ELSE
  513. arg_s_mx.accountsid = 0
  514. END IF
  515. //-----------------------------------------------------------------------
  516. ls_newtakeid = f_sys_scidentity(0,"U_Bmsttake","takeid",arg_msg,False,sqlca)
  517. IF ls_newtakeid <= 0 THEN
  518. rslt = 0
  519. GOTO ext
  520. END IF
  521. INSERT INTO U_Bmsttake
  522. ( scid,
  523. takeid,
  524. CUSid,
  525. TAKEdate,
  526. inrep,
  527. oriamt,
  528. mstTAKEamt,
  529. takeamt,
  530. Dscrp,
  531. billcode,
  532. banktypeid,
  533. buildtype,
  534. opdate,
  535. opemp,
  536. outwareid,
  537. salebillid,
  538. viewdate,
  539. accountsid,
  540. rapmoneyid,
  541. itemid,
  542. moneyid,
  543. relcode)
  544. VALUES (
  545. :arg_s_mx.scid,
  546. :ls_newtakeid,
  547. :arg_s_mx.CUSid,
  548. :arg_s_mx.TAKEdate,
  549. :arg_s_mx.inrep,
  550. :arg_s_mx.oriamt,
  551. :arg_s_mx.mstTAKEamt,
  552. :arg_s_mx.TAKEamt,
  553. :arg_s_mx.dscrp,
  554. :arg_s_mx.billcode,
  555. :arg_s_mx.banktypeid,
  556. :arg_s_mx.buildtype,
  557. :server_datetime,
  558. :arg_s_mx.opemp,
  559. :arg_s_mx.outwareid,
  560. :arg_s_mx.salebillid,
  561. :arg_s_mx.viewdate,
  562. :arg_s_mx.accountsid,
  563. :ref_dateint,
  564. :arg_s_mx.itemid,
  565. :arg_s_mx.moneyid,
  566. :arg_s_mx.relcode) ;
  567. IF sqlca.SQLCode <> 0 THEN
  568. IF Pos(Lower(sqlca.SQLErrText),'pk_U_Bmsttake') > 0 THEN
  569. arg_msg = '向应收帐表插入应收记录失败,关键字ID重复'
  570. ELSE
  571. arg_msg = "向应收帐表插入应收记录失败"+"~n"+sqlca.SQLErrText
  572. END IF
  573. rslt = 0
  574. GOTO ext
  575. END IF
  576. arg_s_mx.takeid = ls_newtakeid
  577. s_bmsttake s_takemx
  578. s_takemx = arg_s_mx
  579. IF arg_s_mx.buildtype = 0 Or arg_s_mx.buildtype = 4 THEN
  580. s_takemx.buildtype = arg_s_mx.buildtype
  581. ELSE
  582. s_takemx.buildtype = 1
  583. END IF
  584. s_takemx.salebillid = 0
  585. IF add_takerecmx(s_takemx,arg_msg,False) = 0 THEN
  586. rslt = 0
  587. GOTO ext
  588. END IF
  589. ref_takeid = ls_newtakeid
  590. ext:
  591. Destroy uo_item
  592. IF rslt = 0 THEN
  593. ROLLBACK;
  594. ELSEIF rslt = 1 And arg_ifcommit THEN
  595. COMMIT;
  596. END IF
  597. RETURN rslt
  598. end function
  599. public function integer add_takerecmx (ref s_bmsttake arg_s_mx, ref string arg_msg, boolean arg_ifcommit);
  600. Int rslt = 1
  601. Long cnt = 0,list_no
  602. DateTime server_datetime,null_datetime
  603. Decimal balcamt
  604. IF IsNull(arg_s_mx.dscrp) THEN arg_s_mx.dscrp = ''
  605. IF IsNull(arg_s_mx.inrep) THEN arg_s_mx.inrep = ''
  606. IF IsNull(arg_s_mx.banktypeid) THEN arg_s_mx.banktypeid = 0
  607. IF IsNull(arg_s_mx.billcode) THEN arg_s_mx.billcode = ''
  608. IF IsNull(arg_s_mx.opemp) THEN arg_s_mx.opemp = ''
  609. IF IsNull(arg_s_mx.scid) THEN arg_s_mx.scid = 0
  610. IF IsNull(arg_s_mx.itemid) THEN arg_s_mx.itemid = 0
  611. IF IsNull(arg_s_mx.cusid) THEN arg_s_mx.cusid = 0
  612. IF IsNull(arg_s_mx.moneyid) THEN arg_s_mx.moneyid = 0
  613. IF IsNull(arg_s_mx.relcode) THEN arg_s_mx.relcode = ''
  614. //防止超长
  615. arg_s_mx.billcode = lefta(arg_s_mx.billcode, 30)
  616. cnt = 0
  617. SELECT count(*) Into :cnt From u_scdef Where scid = :arg_s_mx.scid;
  618. IF sqlca.SQLCode <> 0 THEN
  619. rslt = 0
  620. arg_msg = '查询分部资料失败!'
  621. GOTO ext
  622. END IF
  623. IF cnt = 0 THEN
  624. rslt = 0
  625. arg_msg = '无效的分部,不存在该分部!'
  626. GOTO ext
  627. END IF
  628. SELECT Top 1 getdate() Into :server_datetime From u_user ;
  629. IF sqlca.SQLCode <> 0 THEN
  630. rslt = 0
  631. arg_msg = "查询操作失败,系统时间"
  632. GOTO ext
  633. END IF
  634. IF Not (arg_s_mx.buildtype = 0 Or &
  635. arg_s_mx.buildtype = 1 Or &
  636. arg_s_mx.buildtype = 2 Or &
  637. arg_s_mx.buildtype = 3 Or &
  638. arg_s_mx.buildtype = 4) THEN
  639. arg_msg = '错误建立类型,必须为:0-手工记帐;1-单据记帐;2-对数记帐;3-项目记帐;4-收款单记帐'
  640. rslt = 0
  641. GOTO ext
  642. END IF
  643. IF arg_s_mx.billcode = '' THEN
  644. arg_msg = '请输入凭证号码'
  645. rslt = 0
  646. GOTO ext
  647. END IF
  648. IF Date(arg_s_mx.TAKEdate) <= 1990-01-01 THEN
  649. arg_msg = '错误发生日期'
  650. rslt = 0
  651. GOTO ext
  652. END IF
  653. IF Trim(arg_s_mx.inrep) = '' THEN
  654. arg_s_mx.inrep = '无'
  655. END IF
  656. IF arg_s_mx.banktypeid = 0 THEN
  657. arg_msg = '没有结算方式'
  658. rslt = 0
  659. GOTO ext
  660. END IF
  661. //2019 04 09 因 财务》应收帐:放宽限制 屏蔽
  662. //IF arg_s_mx.mstTAKEamt = 0 And arg_s_mx.TAKEamt = 0 THEN
  663. // arg_msg = "应收金额与已收金额不能同时为0!"
  664. // rslt = 0
  665. // GOTO ext
  666. //END IF
  667. //2 判断是否已经选择当前操作员
  668. cnt = 0
  669. SELECT count(*) INTO :cnt
  670. FROM u_user
  671. Where username = :arg_s_mx.opemp ;
  672. IF sqlca.SQLCode <> 0 THEN
  673. rslt = 0
  674. arg_msg = "查询操作失败,操作员!"
  675. GOTO ext
  676. END IF
  677. IF cnt = 0 THEN
  678. rslt = 0
  679. arg_msg = "操作员姓名未登记或已取消!"
  680. GOTO ext
  681. END IF
  682. if arg_s_mx.mstTAKEamt <>0 or arg_s_mx.TAKEamt<>0 then //明细不插入不参与计算的单据
  683. IF arg_s_mx.buildtype = 0 Or arg_s_mx.buildtype = 2 Or arg_s_mx.buildtype = 3 Or arg_s_mx.buildtype = 4 THEN
  684. SELECT max(listno) + 1 INTO :List_no FROM u_bmsttakemx
  685. Where takeid = :arg_s_mx.takeid;
  686. IF sqlca.SQLCode = -1 THEN
  687. arg_msg = '查询应收明细帐最大编号失败>>'+sqlca.SQLErrText
  688. rslt = 0
  689. GOTO ext
  690. ELSEIF sqlca.SQLCode = 100 Or IsNull(list_no) THEN
  691. list_no = 0
  692. END IF
  693. ELSE
  694. list_no = 0
  695. END IF
  696. //3 向应收帐明细表插入新记录,失败则回滚
  697. INSERT INTO U_Bmsttakemx
  698. ( scid,
  699. takeid,
  700. Listno,
  701. billcode,
  702. TAKEdate,
  703. banktypeid,
  704. mstTAKEamt,
  705. TAKEamt,
  706. opdate,
  707. opemp,
  708. Dscrp,
  709. inrep,
  710. buildtype,
  711. salebillid,
  712. itemid,
  713. cusid,
  714. moneyid,
  715. relcode)
  716. VALUES (
  717. :arg_s_mx.scid,
  718. :arg_s_mx.takeid,
  719. :list_no,
  720. :arg_s_mx.billcode,
  721. :arg_s_mx.takedate,
  722. :arg_s_mx.banktypeid,
  723. :arg_s_mx.mstTAKEamt,
  724. :arg_s_mx.TAKEamt,
  725. :server_datetime,
  726. :arg_s_mx.opemp,
  727. :arg_s_mx.dscrp,
  728. :arg_s_mx.inrep,
  729. :arg_s_mx.buildtype,
  730. :arg_s_mx.salebillid,
  731. :arg_s_mx.itemid,
  732. :arg_s_mx.cusid,
  733. :arg_s_mx.moneyid,
  734. :arg_s_mx.relcode) ;
  735. IF sqlca.SQLCode <> 0 THEN
  736. IF Pos(Lower(sqlca.SQLErrText),'pk_U_Bmsttakemx') > 0 THEN
  737. arg_msg = '向应收帐表插入应收明细帐记录失败,关键字ID重复'
  738. ELSE
  739. arg_msg = "向应收帐表插入应收明细帐记录失败"+"~n"+sqlca.SQLErrText
  740. END IF
  741. rslt = 0
  742. GOTO ext
  743. END IF
  744. end if
  745. SELECT mstTAKEamt - TAKEamt Into :balcamt From u_bmsttake Where takeid = :arg_s_mx.takeid;
  746. IF sqlca.SQLCode <> 0 THEN
  747. arg_msg = '查询当前单据结余金额失败'
  748. rslt = 0
  749. GOTO ext
  750. END IF
  751. IF arg_s_mx.buildtype = 3 THEN //销售单据, 增加税率应用
  752. IF arg_s_mx.dscrp = arg_s_mx.billcode + '税金' THEN
  753. UPDATE u_bmsttake
  754. SET oriamt = oriamt + :arg_s_mx.msttakeamt
  755. Where takeid = :arg_s_mx.takeid;
  756. IF sqlca.SQLCode <> 0 THEN
  757. arg_msg = '更新应收帐单据金额失败,请重试!'
  758. rslt = 0
  759. GOTO ext
  760. END IF
  761. END IF
  762. END IF
  763. IF list_no <> 0 and (arg_s_mx.mstTAKEamt <>0 or arg_s_mx.TAKEamt<>0)THEN
  764. UPDATE u_bmsttake
  765. SET msttakeamt = msttakeamt + :arg_s_mx.msttakeamt,
  766. takeamt = takeamt + :arg_s_mx.takeamt
  767. Where takeid = :arg_s_mx.takeid;
  768. IF sqlca.SQLCode <> 0 THEN
  769. arg_msg = '更新应收帐应收已收款失败,请重试!'
  770. rslt = 0
  771. GOTO ext
  772. END IF
  773. END IF
  774. IF balcamt = arg_s_mx.TAKEamt - arg_s_mx.mstTAKEamt THEN
  775. UPDATE u_bmsttake
  776. SET finishflag = 1,
  777. finishdate = :arg_s_mx.takedate
  778. Where takeid = :arg_s_mx.takeid;
  779. IF sqlca.SQLCode <> 0 THEN
  780. arg_msg = '更新应收帐完成标记失败'
  781. rslt = 0
  782. GOTO ext
  783. END IF
  784. ELSE
  785. SetNull(null_datetime)
  786. UPDATE u_bmsttake
  787. SET finishflag = 0,
  788. finishdate = :null_datetime
  789. Where takeid = :arg_s_mx.takeid;
  790. IF sqlca.SQLCode <> 0 THEN
  791. arg_msg = '更新应收帐完成标记失败'
  792. rslt = 0
  793. GOTO ext
  794. END IF
  795. END IF
  796. ext:
  797. IF rslt = 0 THEN
  798. ROLLBACK;
  799. ELSEIF rslt = 1 And arg_ifcommit THEN
  800. COMMIT;
  801. END IF
  802. RETURN rslt
  803. end function
  804. on uo_musttake.create
  805. call super::create
  806. TriggerEvent( this, "constructor" )
  807. end on
  808. on uo_musttake.destroy
  809. TriggerEvent( this, "destructor" )
  810. call super::destroy
  811. end on