uo_credence.sru 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100
  1. $PBExportHeader$uo_credence.sru
  2. $PBExportComments$凭证
  3. forward
  4. global type uo_credence from nonvisualobject
  5. end type
  6. end forward
  7. global type uo_credence from nonvisualobject
  8. end type
  9. global uo_credence uo_credence
  10. type variables
  11. public protectedwrite LONG credid //凭证自动增量ID
  12. public protectedwrite DATETIME billmakerdate //制单时间
  13. public protectedwrite string billmaker //制单
  14. public protectedwrite string billmakerid //制单ID
  15. public protectedwrite datetime billcheckdate //审核时间
  16. public protectedwrite string billcheck //审核
  17. public protectedwrite string billcheckid //审核ID
  18. public protectedwrite datetime billpostdate //登帐时间
  19. public protectedwrite string billpost //登帐
  20. public protectedwrite int checkflag=0 //审核标记
  21. public protectedwrite int postflag =0 //登帐标记
  22. LONG subaccsetid=0 //子帐ID
  23. LONG credno //编号
  24. DATETIME creddate //日期
  25. INT billnumber //附件
  26. STRING credtype //凭证字
  27. long readtype=0 //凭证读类型
  28. long relevantbillid //相关ID[固定资产]
  29. LONG cmonth //期间
  30. datetime reldate
  31. string reldcode
  32. int ifauto
  33. private:
  34. S_credencemx credencemx[] //明细结构数组
  35. long it_MXBT=0 //明细结构数组末指针
  36. BOOLEAN IT_NEWBEGIN=FALSE //新建标志
  37. BOOLEAN IT_UPDATEBEGIN=FALSE//修改标志
  38. end variables
  39. forward prototypes
  40. public function integer newbegin ()
  41. public function integer p_reset ()
  42. public function integer p_clearmx ()
  43. public function integer updatebegin (long arg_subaccsetid, long arg_credid, ref string arg_msg)
  44. public function integer check (long arg_subaccsetid, long arg_credid, ref string arg_msg, boolean arg_ifcommit)
  45. public function integer getinfo (long arg_subaccsetid, long arg_credid, ref string arg_msg)
  46. public function integer post_begin (integer arg_posttype, long arg_subaccsetid, ref string arg_msg)
  47. public function integer post (long arg_subaccsetid, ref string arg_msg, boolean arg_ifcommit)
  48. public function integer balance (boolean if_begin_accset, ref string arg_msg, boolean arg_ifcommit)
  49. public function integer cancel_post (long arg_subaccsetid, ref string arg_msg, boolean arg_ifcommit)
  50. public function integer cancel_balance (boolean if_del_porfit_loss, ref string arg_msg, boolean arg_ifcommit)
  51. public function integer cancel_check (long arg_subaccsetid, long arg_cmonth, long arg_firstcredno, long arg_endcredno, ref string arg_msg, boolean arg_ifcommit)
  52. public function integer save (string arg_opemp, ref string arg_msg, boolean arg_ifcommit)
  53. public function long get_new_credno (long arg_subaccsetid, string arg_credtype, long arg_cmonth, ref string arg_msg)
  54. public function integer p_check_cmonth (long arg_accsetid, long arg_cmonth, ref string arg_msg)
  55. public function integer p_check_month_date (long arg_accsetid, long arg_cmonth, datetime arg_creddate, ref string arg_msg)
  56. public function integer get_asset_credinfo (long arg_findtype, long arg_relid, long arg_credid, ref long arg_ref_credid, ref integer arg_ref_postflag, ref string arg_msg)
  57. public function integer uof_mod_mxdscrp (long arg_accsetid, long arg_credid, long arg_fuluno, string arg_mxdscrp, ref string arg_msg)
  58. public function integer cancel_check_1 (long arg_subaccsetid, long arg_credid, integer arg_ifauto_check, ref string arg_msg, boolean arg_ifcommit)
  59. public function integer del (integer arg_delmode, long arg_subaccsetid, long arg_credid, ref string arg_msg, boolean arg_ifcommit)
  60. public function integer acceptmx (long arg_fuluno, string arg_subid, string arg_brief, double arg_rate, decimal arg_rawdebit, decimal arg_rawcredit, decimal arg_debit, decimal arg_credit, decimal arg_amount, decimal arg_price, long arg_deptid, long arg_itemid, datetime arg_billdate, long arg_billid, string arg_billno, long arg_cropbillid, integer arg_readonly, long arg_cusid, long arg_sptid, long arg_empid, ref string arg_msg)
  61. end prototypes
  62. public function integer newbegin ();//newbegin()
  63. //从置对象,准备建立新凭证
  64. //0 fail 1 success
  65. LONG RSLT=1,CNT=0
  66. p_reset()
  67. it_newbegin=TRUE
  68. it_updatebegin=FALSE
  69. IF RSLT=0 THEN p_reset()
  70. return RSLT
  71. end function
  72. public function integer p_reset ();//INT p_RESET()
  73. //清除对象及其明细
  74. datetime null_dt
  75. setnull(null_dt)
  76. credid=0
  77. billmakerdate=null_dt
  78. billmaker=''
  79. billcheckdate=null_dt
  80. billcheck =''
  81. billpostdate=null_dt
  82. billpost=''
  83. checkflag=0
  84. postflag =0
  85. readtype =0
  86. it_newbegin=FALSE
  87. it_updatebegin=FALSE
  88. //清除明细
  89. P_CLEARMX()
  90. RETURN 1
  91. end function
  92. public function integer p_clearmx ();//INT p_clearmx()
  93. //清除明细
  94. it_mxbt=0
  95. RETURN 1
  96. end function
  97. public function integer updatebegin (long arg_subaccsetid, long arg_credid, ref string arg_msg);//UPDATEbegin(long arg_subaccsetid,long arg_credid,ref string arg_msg)
  98. //从置对象,准备更新凭证
  99. //0 fail 1 success
  100. Int rslt = 1
  101. IF getinfo(arg_subaccsetid,arg_credid,arg_msg) = 0 THEN
  102. rslt = 0
  103. GOTO ext
  104. END IF
  105. IF checkflag = 1 THEN
  106. rslt = 0
  107. arg_msg = '凭证已经过审核,不可以修改'
  108. GOTO ext
  109. END IF
  110. IF readtype = 888 THEN
  111. arg_msg = '出纳审核生成的单据,不能修改'
  112. rslt = 0
  113. GOTO ext
  114. END IF
  115. credid = arg_credid
  116. subaccsetid = arg_subaccsetid
  117. IF checkflag = 0 THEN p_CLEARMX()
  118. it_newbegin = FALSE
  119. it_updatebegin = TRUE
  120. ext:
  121. IF rslt = 0 THEN p_RESET()
  122. RETURN rslt
  123. end function
  124. public function integer check (long arg_subaccsetid, long arg_credid, ref string arg_msg, boolean arg_ifcommit);//check(arg_subaccsetid,arg_credid,ref arg_msg,arg_ifcommit)
  125. //0 fail 1 success
  126. //凭证审核
  127. Long rslt = 1,cnt = 0
  128. IF s_sys_accset.sameuser = 0 THEN
  129. IF publ_userid = billmakerid THEN
  130. arg_msg = '制单和审核不可以是同一个人'
  131. rslt = 0
  132. GOTO ext
  133. END IF
  134. END IF
  135. IF getinfo(arg_subaccsetid,arg_credid,arg_msg) = 0 THEN
  136. rslt = 0
  137. GOTO ext
  138. END IF
  139. IF it_newbegin OR it_updatebegin THEN
  140. rslt = 0
  141. arg_msg = "编辑状态下不可以执行审核"
  142. GOTO ext
  143. END IF
  144. IF checkflag = 1 THEN
  145. rslt = 0
  146. arg_msg = "凭证已经过审核"
  147. GOTO ext
  148. END IF
  149. SELECT count(*) INTO :cnt
  150. FROM u_user
  151. Where u_user.username = : publ_operator;
  152. IF sqlca.SQLCode <> 0 THEN
  153. rslt = 0
  154. arg_msg = "查询操作失败,操作员"
  155. GOTO ext
  156. END IF
  157. IF cnt = 0 THEN
  158. rslt = 0
  159. arg_msg = "操作员姓名未登记或已取消"
  160. GOTO ext
  161. END IF
  162. UPDATE cw_credence
  163. SET billcheckid = :publ_userid,
  164. billcheck = :publ_operator,
  165. billcheckdate = getdate(),
  166. checkflag = 1
  167. WHERE cw_credence.credid = :arg_credid
  168. AND cw_credence.checkflag = 0
  169. AND cw_credence.accsetid = :sys_accsetid
  170. AND cw_credence.subaccsetid = :arg_subaccsetid;
  171. IF sqlca.SQLCode <> 0 THEN
  172. rslt = 0
  173. arg_msg = "因网络或其它原因导致审核凭证操作失败"+"~n"+sqlca.SQLErrText
  174. GOTO ext
  175. ELSEIF sqlca.SQLNRows = 0 THEN
  176. rslt = 0
  177. arg_msg = "凭证正在审核,请稍后查询。"+"~n"+sqlca.SQLErrText
  178. GOTO ext
  179. END IF
  180. checkflag = 1
  181. ext:
  182. IF rslt = 0 THEN
  183. ROLLBACK ;
  184. ELSEIF rslt = 1 AND arg_ifcommit THEN
  185. COMMIT;
  186. END IF
  187. RETURN rslt
  188. end function
  189. public function integer getinfo (long arg_subaccsetid, long arg_credid, ref string arg_msg);//取凭证信息
  190. Int rslt = 1
  191. IF arg_credid <= 0 THEN
  192. rslt = 0
  193. credid = 0
  194. arg_msg = '凭证ID错误'
  195. GOTO ext
  196. END IF
  197. IF arg_subaccsetid <> 0 THEN
  198. rslt = 0
  199. subaccsetid = 0
  200. arg_msg = '子帐ID错误'
  201. GOTO ext
  202. END IF
  203. SELECT cw_credence.credno,
  204. cw_credence.cmonth,
  205. cw_credence.creddate,
  206. cw_credence.billnumber,
  207. cw_credence.billmaker,
  208. cw_credence.billmakerdate,
  209. cw_credence.billcheck,
  210. cw_credence.billcheckdate,
  211. cw_credence.billpost,
  212. cw_credence.billpostdate,
  213. cw_credence.checkflag,
  214. cw_credence.postflag,
  215. cw_credence.credtype,
  216. cw_credence.readtype,
  217. cw_credence.relevantbillid,
  218. cw_credence.reldcode,
  219. cw_credence.reldate,
  220. cw_credence.ifauto
  221. INTO :credno,
  222. :cmonth,
  223. :creddate,
  224. :billnumber,
  225. :billmaker,
  226. :billmakerdate,
  227. :billcheck,
  228. :billcheckdate,
  229. :billpost,
  230. :billpostdate,
  231. :checkflag,
  232. :postflag,
  233. :credtype,
  234. :readtype,
  235. :relevantbillid,
  236. :reldcode,
  237. :reldate,
  238. :ifauto
  239. FROM cw_credence
  240. WHERE cw_credence.credid = :arg_credid
  241. AND cw_credence.accsetid = :sys_accsetid
  242. AND cw_credence.subaccsetid = :arg_subaccsetid;
  243. IF sqlca.SQLCode <> 0 THEN
  244. rslt = 0
  245. arg_msg = '查询数据操作失败,凭证'
  246. GOTO ext
  247. END IF
  248. it_newbegin = FALSE
  249. it_updatebegin = FALSE
  250. ext:
  251. RETURN rslt
  252. end function
  253. public function integer post_begin (integer arg_posttype, long arg_subaccsetid, ref string arg_msg);//检查凭证号是否连续
  254. //p_post_begin(arg_posttype,arg_subaccsetid,ref arg_msg)
  255. //arg_posttype
  256. //查凭证字
  257. //1:不连续时终止登帐 2:不连续时可以登帐
  258. //1:yes 0:no
  259. int rslt = 1
  260. long cnt,i
  261. long piror_credno,next_credno
  262. string arr_credtype[],ls_credtype
  263. int cnt_credtype
  264. if arg_subaccsetid <> 0 then
  265. arg_msg = '非法帐套,不能登帐'
  266. rslt = 0
  267. goto ext
  268. end if
  269. select count(credid) into :cnt
  270. from cw_credence
  271. where cw_credence.postflag = 0
  272. and cw_credence.checkflag = 1
  273. and cw_credence.accsetid = :sys_accsetid
  274. and (cw_credence.subaccsetid = :arg_subaccsetid)
  275. and cw_credence.cmonth = :sys_curyearmon;
  276. if sqlca.sqlcode <> 0 then
  277. arg_msg = '查询凭证数失败'
  278. rslt = 0
  279. goto ext
  280. end if
  281. if cnt = 0 then
  282. rslt = 1
  283. goto ext
  284. end if
  285. if arg_posttype = 2 then
  286. rslt = 1
  287. goto ext
  288. end if
  289. //*******************查凭证字
  290. DECLARE cur_credtype CURSOR FOR
  291. SELECT cw_Credenceword.Credenceword
  292. FROM cw_Credenceword
  293. where cw_Credenceword.accsetid = :sys_accsetid;
  294. open cur_credtype;
  295. fetch cur_credtype into :ls_credtype;
  296. do while sqlca.sqlcode = 0
  297. cnt_credtype++
  298. arr_credtype[cnt_credtype] = trim(ls_credtype)
  299. fetch cur_credtype into :ls_credtype;
  300. loop
  301. close cur_credtype;
  302. if cnt_credtype = 0 then
  303. cnt_credtype++
  304. arr_credtype[cnt_credtype]=''
  305. end if
  306. //********************
  307. for i = 1 to cnt_credtype
  308. declare credno_cur cursor for
  309. select cw_credence.credno
  310. from cw_credence
  311. where cw_credence.accsetid = :sys_accsetid
  312. and cw_credence.subaccsetid = :arg_subaccsetid
  313. and cw_credence.cmonth = :sys_curyearmon
  314. and cw_credence.credtype = :arr_credtype[i]
  315. order by cw_credence.credno;
  316. open credno_cur;
  317. fetch credno_cur into :next_credno;
  318. piror_credno = next_credno - 1
  319. do while sqlca.sqlcode = 0
  320. if piror_credno + 1 <> next_credno then
  321. arg_msg = '帐套凭证号不连续,不能登帐.凭证字:'+arr_credtype[i]+'凭证号:'+string(piror_credno)+'→'+string(next_credno)
  322. rslt = 0
  323. goto ext
  324. end if
  325. piror_credno = next_credno
  326. fetch credno_cur into :next_credno;
  327. loop
  328. close credno_cur;
  329. next
  330. ext:
  331. return rslt
  332. end function
  333. public function integer post (long arg_subaccsetid, ref string arg_msg, boolean arg_ifcommit);//post(arg_subaccsetid,ref arg_msg,arg_ifcommit)
  334. //0 fail 1 success
  335. //登帐
  336. //1.更新登帐标记
  337. //2.写入balance表[先更新,再插入]
  338. //2.2 更新父科目
  339. //2.3 更新0子帐 //暂不处理
  340. //2.4 更新父科目 //暂不处理
  341. Long rslt = 1,cnt = 0,ds_cnt,i,credence_cnt = 0
  342. datastore ds_update_balance
  343. Decimal ls_rawdebit,ls_rawcredit,ls_debit,ls_credit,ls_damount,ls_camount
  344. Decimal ls_erawdebit,ls_erawcredit,ls_edebit,ls_ecredit
  345. String ls_subid
  346. uo_subject uo_sub
  347. String p_subid
  348. Int ls_dcflag,li_hswb
  349. IF arg_subaccsetid <> 0 THEN
  350. arg_msg = '非法帐套,不能登帐'
  351. rslt = 0
  352. GOTO ext
  353. END IF
  354. SELECT count(*) INTO :cnt
  355. FROM u_user
  356. WHERE u_user.username = :publ_operator;
  357. IF sqlca.SQLCode <> 0 THEN
  358. rslt = 0
  359. arg_msg = "查询操作失败,操作员"
  360. GOTO ext
  361. END IF
  362. IF cnt = 0 THEN
  363. rslt = 0
  364. arg_msg = "操作员未登记或已取消"
  365. GOTO ext
  366. END IF
  367. credence_cnt = 0
  368. SELECT count(credid) INTO :credence_cnt
  369. FROM cw_credence
  370. WHERE cw_credence.postflag = 0
  371. AND cw_credence.checkflag = 1
  372. AND cw_credence.accsetid = :sys_accsetid
  373. AND ( cw_credence.subaccsetid = :arg_subaccsetid)
  374. AND ( cw_credence.cmonth = :sys_curyearmon );
  375. IF sqlca.SQLCode <> 0 THEN
  376. arg_msg = '查询期间要登帐凭证数失败'
  377. rslt = 0
  378. GOTO ext
  379. END IF
  380. IF credence_cnt = 0 THEN
  381. rslt = 1
  382. GOTO zero
  383. END IF
  384. ds_update_balance = CREATE datastore
  385. ds_update_balance.DataObject = "ds_update_balance"
  386. ds_update_balance.SetTransObject(sqlca)
  387. uo_sub = CREATE uo_subject
  388. ds_cnt = 0
  389. ds_update_balance.Retrieve(sys_accsetid,0,sys_curyearmon)
  390. ds_cnt = ds_update_balance.RowCount()
  391. IF ds_cnt = 0 THEN
  392. rslt = 1
  393. GOTO update_credence
  394. END IF
  395. FOR i = 1 TO ds_cnt
  396. ls_subid = ds_update_balance.Object.subid[i]
  397. //***查询余额方向
  398. ls_dcflag = f_get_dcflag(ls_subid,arg_msg)
  399. IF ls_dcflag = -1 THEN
  400. rslt = 0
  401. GOTO ext
  402. END IF
  403. ls_rawdebit = ds_update_balance.Object.rawdebit[i]
  404. ls_rawcredit = ds_update_balance.Object.rawcredit[i]
  405. ls_debit = ds_update_balance.Object.debit[i]
  406. ls_credit = ds_update_balance.Object.credit[i]
  407. ls_damount = ds_update_balance.Object.damount[i]
  408. ls_camount = ds_update_balance.Object.camount[i]
  409. li_hswb = ds_update_balance.Object.cw_subject_hswb[i]
  410. IF ls_dcflag = 1 THEN
  411. IF li_hswb = 1 THEN
  412. ls_erawdebit = ls_rawdebit - ls_rawcredit
  413. ls_erawcredit = 0
  414. ELSE
  415. ls_erawdebit = 0
  416. ls_erawcredit = 0
  417. END IF
  418. ls_edebit = ls_debit - ls_credit
  419. ls_ecredit = 0
  420. ELSE
  421. IF li_hswb = 1 THEN
  422. ls_erawdebit = 0
  423. ls_erawcredit = ls_rawcredit - ls_rawdebit
  424. ELSE
  425. ls_erawdebit = 0
  426. ls_erawcredit = 0
  427. END IF
  428. ls_edebit = 0
  429. ls_ecredit = ls_credit - ls_debit
  430. END IF
  431. UPDATE cw_balance
  432. SET rawdebit = rawdebit + :ls_rawdebit,
  433. rawcredit = rawcredit + :ls_rawcredit,
  434. yrawdebit = yrawdebit + :ls_rawdebit,
  435. yrawcredit = yrawcredit + :ls_rawcredit,
  436. erawdebit = erawdebit + :ls_erawdebit,
  437. erawcredit = erawcredit + :ls_erawcredit,
  438. debit = debit + :ls_debit,
  439. credit = credit + :ls_credit,
  440. edebit = edebit + :ls_edebit,
  441. ecredit = ecredit + :ls_ecredit,
  442. ydebit = ydebit + :ls_debit,
  443. ycredit = ycredit + :ls_credit,
  444. damt = damt + :ls_damount,
  445. camt = camt + :ls_camount,
  446. ydamt = ydamt + :ls_damount,
  447. ycamt = ycamt + :ls_camount
  448. WHERE accsetid = :sys_accsetid
  449. AND subaccsetid = 0
  450. AND subid = :ls_subid
  451. AND yearmon = :sys_curyearmon;
  452. IF sqlca.SQLCode = 0 THEN
  453. IF sqlca.SQLNRows = 0 THEN
  454. INSERT cw_balance(accsetid,subaccsetid,subid,yearmon,rawdebit,rawcredit,
  455. erawdebit,erawcredit,yrawdebit,yrawcredit,debit,credit,
  456. edebit,ecredit,ydebit,ycredit,
  457. damt,camt,ydamt,ycamt)
  458. VALUES(:sys_accsetid, 0,:ls_subid,:sys_curyearmon,:ls_rawdebit,:ls_rawcredit,
  459. :ls_erawdebit,:ls_erawcredit,:ls_rawdebit,:ls_rawcredit,:ls_debit,:ls_credit,
  460. :ls_edebit,:ls_ecredit,:ls_debit,:ls_credit,
  461. :ls_damount,:ls_camount,:ls_damount,:ls_camount);
  462. IF sqlca.SQLCode <> 0 THEN
  463. rslt = 0
  464. arg_msg = '0子帐登帐失败,'+sqlca.SQLErrText
  465. GOTO ext
  466. END IF
  467. END IF
  468. ELSE
  469. rslt = 0
  470. arg_msg = '0子帐登帐失败,'+sqlca.SQLErrText
  471. GOTO ext
  472. END IF
  473. //更新父科目
  474. p_subid = ''
  475. zero_update_p:
  476. p_subid = uo_sub.p_parent_subid(ls_subid)
  477. IF p_subid = '' THEN
  478. ELSE
  479. UPDATE cw_balance
  480. SET rawdebit = rawdebit + :ls_rawdebit,
  481. rawcredit = rawcredit + :ls_rawcredit,
  482. yrawdebit = yrawdebit + :ls_rawdebit,
  483. yrawcredit = yrawcredit + :ls_rawcredit,
  484. erawdebit = erawdebit + :ls_erawdebit ,
  485. erawcredit = erawcredit + :ls_erawcredit,
  486. debit = debit + :ls_debit,
  487. credit = credit + :ls_credit,
  488. edebit = edebit + :ls_edebit,
  489. ecredit = ecredit + :ls_ecredit,
  490. ydebit = ydebit + :ls_debit,
  491. ycredit = ycredit + :ls_credit,
  492. damt = damt + :ls_damount,
  493. camt = camt + :ls_camount,
  494. ydamt = ydamt + :ls_damount,
  495. ycamt = ycamt + :ls_camount
  496. WHERE accsetid = :sys_accsetid
  497. AND subaccsetid = 0
  498. AND subid = :p_subid
  499. AND yearmon = :sys_curyearmon;
  500. IF sqlca.SQLCode = 0 THEN
  501. IF sqlca.SQLNRows = 0 THEN
  502. INSERT cw_balance(accsetid,subaccsetid,subid,yearmon,rawdebit,rawcredit,
  503. erawdebit,erawcredit,yrawdebit,yrawcredit,debit,credit,
  504. edebit,ecredit,ydebit,ycredit,
  505. damt,camt,ydamt,ycamt)
  506. VALUES(:sys_accsetid, 0,:p_subid,:sys_curyearmon,:ls_rawdebit,:ls_rawcredit,
  507. :ls_erawdebit,:ls_erawcredit,:ls_rawdebit,:ls_rawcredit,:ls_debit,:ls_credit,
  508. :ls_edebit,:ls_ecredit,:ls_debit,:ls_credit,
  509. :ls_damount,:ls_camount,:ls_damount,:ls_camount);
  510. IF sqlca.SQLCode <> 0 THEN
  511. rslt = 0
  512. arg_msg = '0子帐登帐失败[更新父科目金额],'+sqlca.SQLErrText
  513. GOTO ext
  514. END IF
  515. END IF
  516. ELSE
  517. rslt = 0
  518. arg_msg = '0子帐登帐失败,'+sqlca.SQLErrText
  519. GOTO ext
  520. END IF
  521. ls_subid = p_subid
  522. GOTO zero_update_p
  523. END IF
  524. NEXT
  525. update_credence:
  526. UPDATE cw_credence
  527. SET billpost = :publ_operator,
  528. billpostdate = getdate(),
  529. postflag = 1
  530. WHERE cw_credence.postflag = 0
  531. AND cw_credence.checkflag = 1
  532. AND cw_credence.accsetid = :sys_accsetid
  533. AND ( cw_credence.subaccsetid = :arg_subaccsetid)
  534. AND ( cw_credence.cmonth = :sys_curyearmon );
  535. IF sqlca.SQLCode <> 0 THEN
  536. rslt = 0
  537. arg_msg = "因网络或其它原因导致过帐凭证操作失败"+"~n"+sqlca.SQLErrText
  538. GOTO ext
  539. ELSEIF sqlca.SQLNRows = 0 THEN
  540. rslt = 0
  541. arg_msg = "凭证正在过帐,请稍后查询。"+"~n"+sqlca.SQLErrText
  542. GOTO ext
  543. END IF
  544. //更新累计折旧
  545. IF f_balc_astbalance(1,sys_curyearmon,arg_msg,FALSE) = 0 THEN
  546. rslt = 0
  547. GOTO ext
  548. END IF
  549. zero:
  550. arg_msg = '共有 '+String(credence_cnt) +' 张登帐'
  551. ext:
  552. IF rslt = 0 THEN
  553. ROLLBACK ;
  554. ELSEIF rslt = 1 AND arg_ifcommit THEN
  555. COMMIT;
  556. END IF
  557. RETURN rslt
  558. end function
  559. public function integer balance (boolean if_begin_accset, ref string arg_msg, boolean arg_ifcommit);//期末结帐
  560. //balance(if_begin_accset,ref arg_msg,arg_ifcommit)
  561. //if_begin_accset:
  562. //true:启动帐套 false:一般结帐
  563. //1:success 0:fail
  564. //1.查询当前期间有无凭证未过帐[未审核]
  565. //2.将每个科目 年初/期初/本年累计/期末数 复制一份到下一期间
  566. //2.1固定资产自动加入下月
  567. //3.更新帐套当前期间
  568. Int rslt = 1
  569. Long cred_nocheck_cnt,cred_nopost_cnt,cnt
  570. Long next_yearmon
  571. IF if_begin_accset THEN //启动帐套
  572. //////加入0子帐
  573. INSERT cw_balance(accsetid,subaccsetid,SubID,YearMon,YBRawDebit,YBRawCredit,
  574. BrawDebit,BrawCredit,ErawDebit,ErawCredit,YrawDebit,YrawCredit,
  575. YBDebit,YBCredit,Bdebit,Bcredit,Edebit,Ecredit,Ydebit,Ycredit,
  576. ybamt,ydamt,ycamt,bamt)
  577. SELECT :sys_accsetid,0,SubID,:sys_curyearmon,YBRawDebit,YBRawCredit,
  578. BrawDebit,BrawCredit,ErawDebit,ErawCredit,YrawDebit,YrawCredit,
  579. YBDebit,YBCredit,Bdebit,Bcredit,Edebit,Ecredit,Ydebit,Ycredit,
  580. bamount + camount - damount,damount,camount,bamount
  581. FROM uv_yminitbala
  582. Where accsetid = :sys_accsetid;
  583. IF sqlca.SQLCode <> 0 THEN
  584. rslt = 0
  585. arg_msg = '0子帐结帐失败,'+sqlca.SQLErrText
  586. GOTO ext
  587. END IF
  588. //初始化固定资产累计折旧表
  589. IF f_init_astbalance(1,sys_startyearmon,sys_startyearmon,arg_msg,False) = 0 THEN
  590. rslt = 0
  591. GOTO ext
  592. END IF
  593. ELSE // //一般结帐
  594. SELECT sum(num1+num2) INTO :cnt
  595. FROM uv_cwauditingflag_num
  596. Where cmonth = :sys_curyearmon;
  597. IF sqlca.SQLCode <> 0 THEN
  598. arg_msg = '查询本期是否有未会计审核的业务单据失败,'+sqlca.SQLErrText
  599. rslt = 0
  600. GOTO ext
  601. END IF
  602. IF cnt > 0 THEN
  603. arg_msg = '本期尚有'+String(cnt)+'张业务单据未会计审核,请先将这些单据会计审核或调整日期'
  604. rslt = 0
  605. GOTO ext
  606. END IF
  607. SELECT count(credid) INTO :cred_nopost_cnt
  608. FROM cw_credence
  609. WHERE cw_credence.postflag = 0
  610. AND cw_credence.accsetid = :sys_accsetid
  611. And cw_credence.cmonth = :sys_curyearmon;
  612. IF sqlca.SQLCode <> 0 THEN
  613. arg_msg = '查询未登帐凭证数失败'
  614. rslt = 0
  615. GOTO ext
  616. END IF
  617. SELECT count(credid) INTO :cred_nocheck_cnt
  618. FROM cw_credence
  619. WHERE cw_credence.checkflag = 0
  620. AND cw_credence.accsetid = :sys_accsetid
  621. And cw_credence.cmonth = :sys_curyearmon;
  622. IF sqlca.SQLCode <> 0 THEN
  623. arg_msg = '查询未审核凭证数失败'
  624. rslt = 0
  625. GOTO ext
  626. END IF
  627. IF IsNull(cred_nopost_cnt) THEN cred_nopost_cnt = 0
  628. IF IsNull(cred_nocheck_cnt) THEN cred_nocheck_cnt = 0
  629. IF cred_nopost_cnt <> 0 And cred_nocheck_cnt = 0 THEN
  630. arg_msg = '本期尚有'+String(cred_nopost_cnt)+'张凭证未登帐,不能进行结帐'
  631. rslt = 0
  632. GOTO ext
  633. ELSEIF cred_nocheck_cnt <> 0 And cred_nocheck_cnt <> 0 THEN
  634. arg_msg = '本期尚有'+String(cred_nopost_cnt)+'张凭证未登帐,其中'+String(cred_nocheck_cnt)+'张是未审核过的,不能进行结帐'
  635. rslt = 0
  636. GOTO ext
  637. END IF
  638. //2.将每个科目 年初/期初/本年累计/期末数 复制一份到下一期间
  639. IF Right(String(sys_curyearmon),2) = '12' THEN
  640. next_yearmon = Long(String(Long(Left(String(sys_curyearmon),4)) + 1) + '01')
  641. DELETE FROM cw_balance
  642. WHERE accsetid = :sys_accsetid
  643. And YearMon = :next_yearmon;
  644. IF sqlca.SQLCode <> 0 THEN
  645. arg_msg = '删除帐套月份:'+String(next_yearmon)+',结帐数据失败,'+sqlca.SQLErrText
  646. rslt = 0
  647. GOTO ext
  648. END IF
  649. INSERT cw_balance(accsetid,subaccsetid,SubID,YearMon,
  650. YBRawDebit,YBRawCredit,BrawDebit,BrawCredit,
  651. ErawDebit,ErawCredit,YrawDebit,YrawCredit,
  652. YBDebit,YBCredit,Bdebit,Bcredit,
  653. Edebit,Ecredit,Ydebit,Ycredit,
  654. ybamt,ydamt,ycamt,bamt)
  655. SELECT :sys_accsetid,subaccsetid,SubID,:next_yearmon,
  656. eRawDebit,eRawCredit,BrawDebit,BrawCredit,
  657. ErawDebit,ErawCredit,0,0,
  658. Edebit,Ecredit,Bdebit,Bcredit,
  659. Edebit,Ecredit,0,0,
  660. bamt,0,0,bamt
  661. FROM uv_ymbala
  662. Where accsetid = :sys_accsetid;
  663. ELSE
  664. next_yearmon = sys_curyearmon + 1
  665. DELETE FROM cw_balance
  666. WHERE accsetid = :sys_accsetid
  667. And YearMon = :next_yearmon;
  668. IF sqlca.SQLCode <> 0 THEN
  669. arg_msg = '删除帐套月份:'+String(next_yearmon)+',结帐数据失败,'+sqlca.SQLErrText
  670. rslt = 0
  671. GOTO ext
  672. END IF
  673. INSERT cw_balance(accsetid,subaccsetid,SubID,YearMon,YBRawDebit,YBRawCredit,
  674. BrawDebit,BrawCredit,ErawDebit,ErawCredit,YrawDebit,YrawCredit,
  675. YBDebit,YBCredit,Bdebit,Bcredit,Edebit,Ecredit,Ydebit,Ycredit,
  676. ybamt,ydamt,ycamt,bamt)
  677. SELECT :sys_accsetid,subaccsetid,SubID,:next_yearmon,YBRawDebit,YBRawCredit,
  678. BrawDebit,BrawCredit,ErawDebit,ErawCredit,YrawDebit,YrawCredit,
  679. YBDebit,YBCredit,Bdebit,Bcredit,Edebit,Ecredit,Ydebit,Ycredit,
  680. ybamt,ydamt,ycamt,bamt
  681. FROM uv_ymbala
  682. Where accsetid = :sys_accsetid;
  683. END IF
  684. IF sqlca.SQLCode <> 0 THEN
  685. rslt = 0
  686. arg_msg = '结帐失败,'+sqlca.SQLErrText
  687. GOTO ext
  688. END IF
  689. //初始化下月固定资产累计折旧表
  690. IF f_init_astbalance(1,sys_curyearmon,next_yearmon,arg_msg,False) = 0 THEN
  691. rslt = 0
  692. GOTO ext
  693. END IF
  694. //3.更新当前会计期间
  695. IF Right(String(sys_curyearmon),2) = '12' THEN
  696. UPDATE cw_accset
  697. SET curryear = :s_sys_accset.curryear + 1,
  698. currmon = 1,
  699. curyearmon = (:s_sys_accset.curryear + 1) * 100 + 1
  700. Where accsetid = :sys_accsetid;
  701. ELSE
  702. UPDATE cw_accset SET currmon = currmon + 1 ,curyearmon = curyearmon + 1
  703. Where accsetid = :sys_accsetid;
  704. END IF
  705. IF sqlca.SQLCode <> 0 THEN
  706. rslt = 0
  707. arg_msg = '更新当前帐套的当前期间失败'
  708. GOTO ext
  709. END IF
  710. //4.更新月历
  711. IF Right(String(sys_curyearmon),2) = '12' THEN
  712. Long next_y,ll_cnt_next_y
  713. s_calendar s_calendar_array[]
  714. next_y = Long(Left(String(sys_curyearmon),4)) + 1
  715. SELECT count(*) INTO :ll_cnt_next_y
  716. FROM cw_calendar
  717. WHERE Year(sdate) = :next_y
  718. And accsetid = :sys_accsetid;
  719. IF sqlca.SQLCode <> 0 THEN ll_cnt_next_y = 0
  720. IF ll_cnt_next_y = 0 THEN
  721. f_init_calendar_array(next_y,s_calendar_array[])
  722. Long k
  723. FOR k = 1 To UpperBound(s_calendar_array)
  724. INSERT INTO cw_calendar(accsetid,cmonth,sdate,edate)
  725. Values(:sys_accsetid,:s_calendar_array[k].cmonth,:s_calendar_array[k].sdate,:s_calendar_array[k].edate);
  726. IF sqlca.SQLCode <> 0 THEN
  727. arg_msg = '加入新月历失败'
  728. rslt = 0
  729. GOTO ext
  730. END IF
  731. NEXT
  732. END IF
  733. END IF
  734. END IF
  735. ext:
  736. IF rslt = 0 THEN
  737. ROLLBACK;
  738. ELSEIF rslt = 1 And arg_ifcommit THEN
  739. COMMIT;
  740. END IF
  741. RETURN rslt
  742. end function
  743. public function integer cancel_post (long arg_subaccsetid, ref string arg_msg, boolean arg_ifcommit);//反登帐
  744. //cancel_post(arg_subaccsetid,ref arg_msg,arg_ifcommit)
  745. //0 fail 1 success
  746. //1.更新凭证登帐标记
  747. //2.写入balance表[先更新,再插入]
  748. //2.1 更新0子帐
  749. //2.2 更新总帐
  750. Long rslt = 1,cnt = 0,ds_cnt,i
  751. datastore ds_update_balance
  752. Dec ls_rawdebit,ls_rawcredit,ls_debit,ls_credit,ls_amount
  753. String ls_subid
  754. DateTime null_date
  755. IF arg_subaccsetid <> 0 THEN
  756. arg_msg = '非法帐套,不能反登帐'
  757. rslt = 0
  758. GOTO ext
  759. END IF
  760. SELECT count(*) INTO :cnt
  761. FROM u_user
  762. Where u_user.username = :publ_operator;
  763. IF sqlca.SQLCode <> 0 THEN
  764. rslt = 0
  765. arg_msg = "查询操作失败,操作员"
  766. GOTO ext
  767. END IF
  768. IF cnt = 0 THEN
  769. rslt = 0
  770. arg_msg = "操作员未登记或已取消"
  771. GOTO ext
  772. END IF
  773. cnt = 0
  774. SELECT count(credid) INTO :cnt
  775. FROM cw_credence
  776. WHERE cw_credence.postflag = 1
  777. AND cw_credence.checkflag = 1
  778. AND cw_credence.accsetid = :sys_accsetid
  779. AND ( cw_credence.subaccsetid = :arg_subaccsetid)
  780. AND ( cw_credence.cmonth = :sys_curyearmon );
  781. IF sqlca.SQLCode <> 0 THEN
  782. arg_msg = '查询期间要反登帐凭证数失败'
  783. rslt = 0
  784. GOTO ext
  785. END IF
  786. IF cnt = 0 THEN
  787. rslt = 1
  788. GOTO ext
  789. END IF
  790. //1.更新凭证登帐标记
  791. SetNull(null_date)
  792. UPDATE cw_credence
  793. SET billpost = '',
  794. billpostdate = :null_date,
  795. postflag = 0
  796. WHERE cw_credence.postflag = 1
  797. AND cw_credence.checkflag = 1
  798. AND cw_credence.accsetid = :sys_accsetid
  799. AND ( cw_credence.subaccsetid = :arg_subaccsetid)
  800. AND ( cw_credence.cmonth = :sys_curyearmon );
  801. IF sqlca.SQLCode <> 0 THEN
  802. rslt = 0
  803. arg_msg = "因网络或其它原因导致过帐凭证操作失败"+"~n"+sqlca.SQLErrText
  804. GOTO ext
  805. ELSEIF sqlca.SQLNRows = 0 THEN
  806. rslt = 0
  807. arg_msg = "凭证正在反登帐,请稍后查询。"+"~n"+sqlca.SQLErrText
  808. GOTO ext
  809. END IF
  810. UPDATE cw_balance
  811. SET
  812. yrawdebit = yrawdebit - rawdebit,
  813. yrawcredit = yrawcredit - rawcredit,
  814. erawdebit = brawdebit ,
  815. erawcredit = brawcredit,
  816. rawdebit = 0,
  817. rawcredit = 0,
  818. ydebit = ydebit - debit,
  819. ycredit = ycredit - credit,
  820. edebit = bdebit,
  821. ecredit = bcredit,
  822. debit = 0,
  823. credit = 0,
  824. damt = 0,
  825. camt = 0,
  826. ydamt = ydamt - damt,
  827. ycamt = ycamt - camt
  828. WHERE accsetid = :sys_accsetid
  829. AND subaccsetid = :arg_subaccsetid
  830. AND yearmon = :sys_curyearmon;
  831. IF sqlca.SQLCode <> 0 THEN
  832. rslt = 0
  833. arg_msg = '0子帐反登帐失败,'+sqlca.SQLErrText
  834. GOTO ext
  835. END IF
  836. //更新累计折旧
  837. IF f_balc_astbalance(0,sys_curyearmon,arg_msg,FALSE) = 0 THEN
  838. rslt = 0
  839. GOTO ext
  840. END IF
  841. arg_msg = '共有 '+String(cnt) +' 张反登帐'
  842. ext:
  843. IF rslt = 0 THEN
  844. ROLLBACK ;
  845. ELSEIF rslt = 1 AND arg_ifcommit THEN
  846. COMMIT;
  847. END IF
  848. RETURN rslt
  849. end function
  850. public function integer cancel_balance (boolean if_del_porfit_loss, ref string arg_msg, boolean arg_ifcommit);//反期末结帐
  851. //cancel_balance(if_begin_accset,ref arg_msg,arg_ifcommit)
  852. //1:success 0:fail
  853. //1.删除当前期间balance
  854. //2.更新当前期间凭证的登帐标记
  855. //3.是否将结转本期损益产生的记帐凭证删除
  856. //4.更新帐套当前期间
  857. int rslt = 1
  858. datetime null_datetime
  859. setnull(null_datetime)
  860. if s_sys_accset.startyear = s_sys_accset.curryear and s_sys_accset.startyearmon = s_sys_accset.currmon then
  861. rslt = 0
  862. arg_msg = '反结帐失败,不能反结帐到启用会计期间之前'
  863. goto ext
  864. end if
  865. //删除累计折旧
  866. if f_init_astbalance(0,sys_curyearmon,sys_curyearmon,arg_msg,false) = 0 then
  867. rslt = 0
  868. goto ext
  869. end if
  870. //1.删除结帐[0子帐和总帐]
  871. delete from cw_balance where accsetid = :sys_accsetid and yearmon = :sys_curyearmon;
  872. if sqlca.sqlcode <> 0 then
  873. rslt = 0
  874. arg_msg = '反结帐失败,'+sqlca.sqlerrtext
  875. goto ext
  876. end if
  877. //2.更新当前期间凭证的登帐标记
  878. update cw_credence
  879. set postflag = 0,
  880. billpost = '',
  881. billpostdate = :null_datetime
  882. where cw_credence.accsetid = :sys_accsetid
  883. and cw_credence.cmonth = :sys_curyearmon;
  884. if sqlca.sqlcode <> 0 then
  885. arg_msg = '反结帐失败,更新当前期间凭证登帐标记失败'
  886. rslt = 0
  887. goto ext
  888. end if
  889. //3.是否将结转本期损益产生的记帐凭证删除
  890. if if_del_porfit_loss then
  891. delete from cw_credence
  892. where cw_credence.accsetid = :sys_accsetid
  893. and cw_credence.cmonth = :sys_curyearmon
  894. and cw_credence.readtype = 100;
  895. if sqlca.sqlcode <> 0 then
  896. arg_msg = '反结帐失败>>将结转本期损益产生的记帐凭证删除失败'
  897. rslt = 0
  898. goto ext
  899. end if
  900. end if
  901. //4.更新帐套当前期间
  902. if right(string(sys_curyearmon),2) = '01' then
  903. update cw_accset
  904. set curryear = :s_sys_accset.curryear - 1,
  905. currmon = 12,
  906. curyearmon = (:s_sys_accset.curryear - 1) * 100 + 12
  907. where accsetid = :sys_accsetid;
  908. else
  909. update cw_accset set currmon = currmon - 1 ,curyearmon = curyearmon - 1
  910. where accsetid = :sys_accsetid;
  911. end if
  912. if sqlca.sqlcode <> 0 then
  913. rslt = 0
  914. arg_msg = '更新当前帐套的当前期间失败'
  915. goto ext
  916. end if
  917. //5.删除月历
  918. if right(string(sys_curyearmon),2) = '01' then
  919. long cur_year
  920. cur_year = s_sys_accset.curryear
  921. delete from cw_calendar
  922. where accsetid = :sys_accsetid
  923. and cmonth > :cur_year * 100
  924. and cmonth < :cur_year * 100 + 13 ;
  925. if sqlca.sqlcode <> 0 then
  926. rslt = 0
  927. arg_msg = '删除月历失败'
  928. goto ext
  929. end if
  930. end if
  931. ext:
  932. if rslt = 0 then
  933. rollback ;
  934. elseif rslt = 1 and arg_ifcommit then
  935. commit;
  936. end if
  937. return rslt
  938. end function
  939. public function integer cancel_check (long arg_subaccsetid, long arg_cmonth, long arg_firstcredno, long arg_endcredno, ref string arg_msg, boolean arg_ifcommit);//反审核
  940. //cancel_check(arg_subaccsetid,arg_credid,ref arg_msg,arg_ifcommit)
  941. //0 fail 1 success
  942. Long rslt = 1,cnt = 0,cred_cnt = 0
  943. DateTime null_date
  944. SetNull(null_date)
  945. SELECT count(credid) INTO :cred_cnt FROM cw_credence
  946. WHERE cw_credence.checkflag = 1
  947. AND cw_credence.postflag = 0
  948. AND cw_credence.cmonth = :arg_cmonth
  949. AND cw_credence.credno >= :arg_firstcredno
  950. AND cw_credence.credno <= :arg_endcredno
  951. AND cw_credence.accsetid = :sys_accsetid
  952. AND cw_credence.ifauto = 0
  953. AND ( cw_credence.subaccsetid = :arg_subaccsetid OR :arg_subaccsetid = -1 ) ;
  954. IF sqlca.SQLCode <> 0 THEN
  955. rslt = 0
  956. arG_MSG = "查询已审核未登帐凭证数失败"
  957. GOTO ext
  958. END IF
  959. IF IsNull(cred_cnt) THEN
  960. cred_cnt = 0
  961. END IF
  962. IF cred_cnt = 0 THEN
  963. rslt = 1
  964. GOTO ext
  965. END IF
  966. cnt = 0
  967. SELECT count(*) INTO :cnt
  968. FROM u_user
  969. Where u_user.username = :publ_operator;
  970. IF sqlca.SQLCode <> 0 THEN
  971. rslt = 0
  972. arG_MSG = "查询操作失败,操作员"
  973. GOTO ext
  974. END IF
  975. IF cnt = 0 THEN
  976. rslt = 0
  977. arG_MSG = "操作员姓名未登记或已取消"
  978. GOTO ext
  979. END IF
  980. UPDATE cw_credence
  981. SET billcheckid = '',
  982. billcheck = '',
  983. billcheckdate = :null_date,
  984. checkflag = 0
  985. WHERE cw_credence.checkflag = 1
  986. AND cw_credence.postflag = 0
  987. AND cw_credence.cmonth = :arg_cmonth
  988. AND cw_credence.credno >= :arg_firstcredno
  989. AND cw_credence.credno <= :arg_endcredno
  990. AND cw_credence.accsetid = :sys_accsetid
  991. AND ( cw_credence.subaccsetid = :arg_subaccsetid OR :arg_subaccsetid = -1 ) ;
  992. IF sqlca.SQLCode <> 0 THEN
  993. rslt = 0
  994. arG_MSG = "因网络或其它原因导致反审核凭证操作失败"+"~n"+sqlca.SQLErrText
  995. GOTO ext
  996. ELSEIF sqlca.SQLNRows = 0 THEN
  997. rslt = 0
  998. arG_MSG = "凭证正在反审核,请稍后查询。"+"~n"+sqlca.SQLErrText
  999. GOTO ext
  1000. END IF
  1001. ext:
  1002. IF rslt = 1 THEN
  1003. arG_MSG = "反审核凭证成功,共反审"+String(cred_cnt)+"张凭证"
  1004. END IF
  1005. IF rslt = 0 THEN
  1006. ROLLBACK ;
  1007. ELSEIF rslt = 1 AND arg_ifcommit THEN
  1008. COMMIT;
  1009. END IF
  1010. RETURN rslt
  1011. end function
  1012. public function integer save (string arg_opemp, ref string arg_msg, boolean arg_ifcommit);//save(ref string arg_msg,boolean arg_ifcommit)
  1013. // 新建(credid=0)\更新(credid>0)
  1014. //0 fail 1 success
  1015. //
  1016. // 函数执行凭证操作
  1017. // 函数在表 cw_credence、cw_credencemx 记帐
  1018. // 1 检查单据信息合法性
  1019. // 2 新建-取得单据编号\新建凭证\读取凭证唯一码\插入明细
  1020. // 2 修改-更新凭证\删除旧明细\插入明细
  1021. // 3 提交,修改状态标志
  1022. Integer rslt = 1,cnt = 0,i
  1023. DateTime server_datetime
  1024. Long ls_newid
  1025. String errmsg = ''
  1026. uo_rapmoney uo_corpbill
  1027. uo_corpbill = Create uo_rapmoney
  1028. IF IsNull(subaccsetid) THEN subaccsetid = 0
  1029. IF IsNull(credno) THEN credno = 0
  1030. IF IsNull(billnumber) THEN billnumber = 0
  1031. IF IsNull(credtype) THEN credtype = ''
  1032. IF IsNull(reldcode) THEN reldcode = ''
  1033. IF IsNull(cmonth) THEN cmonth = 0
  1034. IF IsNull(ifauto) THEN ifauto = 0
  1035. IF it_newbegin = False And it_updatebegin = False THEN
  1036. rslt = 0
  1037. arG_MSG = "非编辑状态不可以提交"
  1038. GOTO ext
  1039. END IF
  1040. SELECT Top 1 getdate() Into :server_datetime From u_user ;
  1041. //取得系统时间,借用操作员表
  1042. IF sqlca.SQLCode <> 0 THEN
  1043. rslt = 0
  1044. arG_MSG = "查询操作失败,日期 "
  1045. GOTO ext
  1046. END IF
  1047. IF subaccsetid <> 0 THEN
  1048. rslt = 0
  1049. arG_MSG = '子帐ID错误,请检查'
  1050. GOTO ext
  1051. END IF
  1052. IF p_check_cmonth(sys_accsetid,cmonth,arG_MSG) = 0 THEN
  1053. rslt = 0
  1054. GOTO ext
  1055. END IF
  1056. IF p_check_month_date(sys_accsetid,cmonth,creddate,arG_MSG) = 0 THEN
  1057. rslt = 0
  1058. GOTO ext
  1059. END IF
  1060. If (sys_option_credno_save = 1 ) And it_newbegin THEN
  1061. credno = get_new_credno(0,credtype,cmonth,arG_MSG)
  1062. IF Trim(arG_MSG) <> '' THEN
  1063. rslt = 0
  1064. GOTO ext
  1065. END IF
  1066. ELSE
  1067. IF credno = 0 THEN
  1068. rslt = 0
  1069. arG_MSG = '凭证编号错误,请检查'
  1070. GOTO ext
  1071. END IF
  1072. END IF
  1073. IF it_newbegin THEN
  1074. cnt = 0
  1075. SELECT count(credno) INTO :cnt FROM cw_credence
  1076. WHERE cw_credence.accsetid = :sys_accsetid
  1077. AND cw_credence.cmonth = :cmonth
  1078. AND cw_credence.subaccsetid = :subaccsetid
  1079. AND cw_credence.credno = :credno
  1080. And cw_credence.credtype = :credtype;
  1081. IF sqlca.SQLCode = -1 THEN
  1082. rslt = 0
  1083. arG_MSG = '查询凭证编号失败'
  1084. GOTO ext
  1085. END IF
  1086. IF cnt > 0 THEN
  1087. rslt = 0
  1088. arG_MSG = '该帐套已经存在该凭证编号:'+credtype+string(credno)+',请检查'
  1089. GOTO ext
  1090. END IF
  1091. END IF
  1092. IF it_mxbt = 0 THEN
  1093. rslt = 0
  1094. arG_MSG = "没有正确凭证明细内容"
  1095. GOTO ext
  1096. END IF
  1097. IF Year(Date(creddate)) < 1900 Or IsNull(creddate) THEN
  1098. rslt = 0
  1099. arG_MSG = "缺少日期或日期不合理"
  1100. GOTO ext
  1101. END IF
  1102. IF arg_opemp <> '机制' THEN
  1103. cnt = 0
  1104. SELECT count(*) INTO :cnt
  1105. FROM u_user
  1106. Where username = :arg_opemp;
  1107. IF sqlca.SQLCode <> 0 THEN
  1108. rslt = 0
  1109. arG_MSG = "查询操作失败,操作员"
  1110. GOTO ext
  1111. END IF
  1112. IF cnt = 0 THEN
  1113. rslt = 0
  1114. arG_MSG = "操作员姓名未登记或已取消"
  1115. GOTO ext
  1116. END IF
  1117. END IF
  1118. ////////////////////////////////////////////// //开始区分:新建/更新 处理
  1119. IF credid = 0 THEN //新建
  1120. billmaker = arg_opemp
  1121. billmakerdate = server_datetime //填写凭证建立时间(最近修改时间)
  1122. ls_newid = f_sys_scidentity(sys_accsetid,"cw_credence","credid",errmsg,True,id_sqlca)
  1123. IF ls_newid <= 0 THEN
  1124. arG_MSG = errmsg
  1125. rslt = 0
  1126. GOTO ext
  1127. END IF
  1128. INSERT INTO cw_credence (
  1129. accsetid,
  1130. subaccsetid,
  1131. credid,
  1132. credno,
  1133. cmonth,
  1134. creddate,
  1135. billnumber,
  1136. billmaker,
  1137. billmakerid,
  1138. billmakerdate,
  1139. checkflag,
  1140. postflag,
  1141. credtype,
  1142. Readtype,
  1143. relevantbillid,
  1144. reldcode,
  1145. reldate,
  1146. ifauto)
  1147. VALUES ( :sys_accsetid,
  1148. :subaccsetid,
  1149. :ls_newid,
  1150. :credno,
  1151. :cmonth,
  1152. :creddate,
  1153. :billnumber,
  1154. :billmaker,
  1155. :billmakerid,
  1156. :billmakerdate,
  1157. :checkflag,
  1158. :postflag,
  1159. :credtype,
  1160. :Readtype,
  1161. :relevantbillid,
  1162. :reldcode,
  1163. :reldate,
  1164. :ifauto) ;
  1165. IF sqlca.SQLCode <> 0 THEN
  1166. rslt = 0
  1167. arG_MSG = "因网络或其它原因导致新建凭证操作失败"+"~n"+sqlca.SQLErrText
  1168. GOTO ext
  1169. END IF
  1170. FOR i = 1 To it_mxbt
  1171. INSERT INTO cw_credencemx
  1172. ( accsetid,
  1173. subaccsetid,
  1174. credid,
  1175. fuluno,
  1176. subid,
  1177. brief,
  1178. rate,
  1179. rawdebit,
  1180. rawcredit,
  1181. debit,
  1182. credit,
  1183. amount,
  1184. price,
  1185. deptid,
  1186. itemid,
  1187. billdate,
  1188. billid,
  1189. billno,
  1190. cropbillid,
  1191. cusid,
  1192. sptid,
  1193. empid)
  1194. VALUES (:sys_accsetid,
  1195. :subaccsetid,
  1196. :ls_newid,
  1197. :credencemx[i].fuluno,
  1198. :credencemx[i].subid,
  1199. :credencemx[i].brief,
  1200. :credencemx[i].rate,
  1201. :credencemx[i].rawdebit,
  1202. :credencemx[i].rawcredit,
  1203. :credencemx[i].debit,
  1204. :credencemx[I].credit,
  1205. :credencemx[I].amount,
  1206. :credencemx[I].price,
  1207. :credencemx[i].deptid,
  1208. :credencemx[i].itemid,
  1209. :credencemx[i].billdate,
  1210. :credencemx[i].billid,
  1211. :credencemx[i].billno,
  1212. :credencemx[i].cropbillid,
  1213. :credencemx[i].cusid,
  1214. :credencemx[i].sptid,
  1215. :credencemx[i].empid);
  1216. IF sqlca.SQLCode <> 0 THEN
  1217. credid = 0 //还原outWAREID
  1218. rslt = 0
  1219. arG_MSG = "因网络或其它原因导致新建凭证明细操作失败"+"~n"+sqlca.SQLErrText
  1220. GOTO ext
  1221. END IF
  1222. NEXT
  1223. credid = ls_newid
  1224. ELSE //////////////////////////////////////////////// //更新
  1225. UPDATE cw_credence
  1226. SET credno = :credno,
  1227. creddate = :creddate,
  1228. billnumber = :billnumber,
  1229. modemp = :arg_opemp,
  1230. moddate = getdate(),
  1231. checkflag = :checkflag,
  1232. postflag = :postflag,
  1233. credtype = :credtype,
  1234. readtype = :readtype,
  1235. reldcode = :reldcode,
  1236. reldate = :reldate,
  1237. ifauto = :ifauto
  1238. WHERE cw_credence.accsetid = :sys_accsetid
  1239. AND cw_credence.credid = :credid
  1240. And cw_credence.subaccsetid = :subaccsetid;
  1241. IF sqlca.SQLCode <> 0 THEN
  1242. rslt = 0
  1243. arG_MSG = "因网络或其它原因导致更新凭证操作失败"+"~n"+sqlca.SQLErrText
  1244. GOTO ext
  1245. END IF
  1246. //删除原有明细
  1247. DELETE FROM cw_credencemx
  1248. Where cw_credencemx.accsetid = :sys_accsetid And credid = :credid;
  1249. IF sqlca.SQLCode <> 0 THEN
  1250. rslt = 0
  1251. arG_MSG = "删除旧有凭证明细操作失败"+"~n"+sqlca.SQLErrText
  1252. GOTO ext
  1253. END IF
  1254. FOR i = 1 To it_mxbt
  1255. INSERT INTO cw_credencemx
  1256. ( accsetid,
  1257. subaccsetid,
  1258. credid,
  1259. fuluno,
  1260. subid,
  1261. brief,
  1262. rate,
  1263. rawdebit,
  1264. rawcredit,
  1265. debit,
  1266. credit,
  1267. amount,
  1268. price,
  1269. deptid,
  1270. itemid,
  1271. billdate,
  1272. billid,
  1273. billno,
  1274. cropbillid,
  1275. cusid,
  1276. sptid,
  1277. empid)
  1278. VALUES (:sys_accsetid,
  1279. :subaccsetid,
  1280. :credid,
  1281. :credencemx[i].fuluno,
  1282. :credencemx[i].subid,
  1283. :credencemx[i].brief,
  1284. :credencemx[i].rate,
  1285. :credencemx[i].rawdebit,
  1286. :credencemx[i].rawcredit,
  1287. :credencemx[i].debit,
  1288. :credencemx[I].credit,
  1289. :credencemx[I].amount,
  1290. :credencemx[I].price,
  1291. :credencemx[i].deptid,
  1292. :credencemx[i].itemid,
  1293. :credencemx[i].billdate,
  1294. :credencemx[i].billid,
  1295. :credencemx[I].billno,
  1296. :credencemx[i].cropbillid,
  1297. :credencemx[i].cusid,
  1298. :credencemx[i].sptid,
  1299. :credencemx[i].empid);
  1300. IF sqlca.SQLCode <> 0 THEN
  1301. rslt = 0
  1302. arG_MSG = "因网络或其它原因新建凭证明细操作失败"+"~n"+sqlca.SQLErrText
  1303. GOTO ext
  1304. END IF
  1305. NEXT
  1306. END IF
  1307. it_newbegin = False
  1308. it_updatebegin = False
  1309. ext:
  1310. IF rslt = 0 THEN
  1311. ROLLBACK;
  1312. credid = 0
  1313. p_clearmx()
  1314. ELSEIF rslt = 1 And arg_ifcommit THEN
  1315. COMMIT;
  1316. END IF
  1317. Destroy uo_corpbill
  1318. Return(rslt)
  1319. end function
  1320. public function long get_new_credno (long arg_subaccsetid, string arg_credtype, long arg_cmonth, ref string arg_msg);//取凭证编号
  1321. Long max_credno,rslt_credno,cnt_credno
  1322. Long piror_credno,next_credno
  1323. datastore ds_credno
  1324. ds_credno = Create datastore
  1325. ds_credno.DataObject = 'ds_credno'
  1326. ds_credno.SetTransObject(sqlca)
  1327. Long i
  1328. p_check_cmonth(sys_accsetid,arg_cmonth,arg_msg)
  1329. SELECT max(credno) INTO :max_credno FROM cw_credence with (nolock)
  1330. WHERE accsetid = :sys_accsetid
  1331. AND subaccsetid = :arg_subaccsetid
  1332. AND cmonth = :arg_cmonth
  1333. And credtype = :arg_credtype;
  1334. IF sqlca.SQLCode <> 0 THEN
  1335. rslt_credno = 1
  1336. GOTO ext
  1337. END IF
  1338. IF IsNull(max_credno) THEN max_credno = 0
  1339. SELECT count(*) INTO :cnt_credno FROM cw_credence with (nolock)
  1340. WHERE accsetid = :sys_accsetid
  1341. AND subaccsetid = :arg_subaccsetid
  1342. AND cmonth = :arg_cmonth
  1343. And credtype = :arg_credtype;
  1344. IF sqlca.SQLCode <> 0 THEN
  1345. rslt_credno = 1
  1346. GOTO ext
  1347. END IF
  1348. IF IsNull(cnt_credno) THEN cnt_credno = 0
  1349. IF max_credno = cnt_credno THEN
  1350. rslt_credno = max_credno + 1
  1351. ELSE
  1352. ds_credno.Retrieve(sys_accsetid,arg_subaccsetid,arg_cmonth,arg_credtype)
  1353. FOR i = 1 To ds_credno.RowCount()
  1354. next_credno = ds_credno.Object.credno[i]
  1355. IF i = 1 THEN
  1356. IF next_credno <> 1 THEN
  1357. rslt_credno = 1
  1358. GOTO ext
  1359. END IF
  1360. ELSE
  1361. IF piror_credno + 1 <> next_credno THEN
  1362. rslt_credno = piror_credno + 1
  1363. GOTO ext
  1364. END IF
  1365. END IF
  1366. piror_credno = next_credno
  1367. NEXT
  1368. END IF
  1369. ext:
  1370. Destroy ds_credno
  1371. RETURN rslt_credno
  1372. end function
  1373. public function integer p_check_cmonth (long arg_accsetid, long arg_cmonth, ref string arg_msg);//检查月份有效性
  1374. Int rslt = 1
  1375. Long cnt,ls_year
  1376. ls_year = Long(Left(String(arg_cmonth),4))
  1377. IF s_sys_accset.curryear <> ls_year THEN
  1378. arg_msg = '凭证年份:'+String(ls_year)+'不是当前年份:'+String(s_sys_accset.curryear)
  1379. rslt = 0
  1380. GOTO ext
  1381. END IF
  1382. IF arg_cmonth < sys_curyearmon THEN
  1383. arg_msg = '凭证会计期间'+String(arg_cmonth)+'小于当前会计期间'+String(sys_curyearmon)
  1384. rslt = 0
  1385. GOTO ext
  1386. END IF
  1387. SELECT count(*) INTO :cnt
  1388. FROM cw_credence
  1389. WHERE accsetid = :arg_accsetid
  1390. AND cmonth > :arg_cmonth
  1391. AND postflag = 1;
  1392. IF sqlca.SQLCode <> 0 THEN
  1393. arg_msg = '查询大于月份:'+String(arg_cmonth)+'的月份是否已有凭证登帐失败,不能再录入'
  1394. rslt = 0
  1395. GOTO ext
  1396. END IF
  1397. IF cnt > 0 THEN
  1398. arg_msg = '大于月份:'+String(arg_cmonth)+'的月份已有凭证登帐,不能再录入'
  1399. rslt = 0
  1400. GOTO ext
  1401. END IF
  1402. ext:
  1403. RETURN rslt
  1404. end function
  1405. public function integer p_check_month_date (long arg_accsetid, long arg_cmonth, datetime arg_creddate, ref string arg_msg);//检查凭证日期是否在相应的会计期间
  1406. int rslt = 1
  1407. long ls_year
  1408. datetime b_date,e_date
  1409. ls_year = long(left(string(arg_cmonth),4))
  1410. if s_sys_accset.curryear <> ls_year then
  1411. arg_msg = '凭证年份:'+string(ls_year)+'不是当前年份:'+string(s_sys_accset.curryear)
  1412. rslt = 0
  1413. goto ext
  1414. end if
  1415. select sdate,edate into :b_date,:e_date
  1416. from cw_calendar
  1417. where accsetid = :arg_accsetid
  1418. and cmonth = :arg_cmonth;
  1419. if sqlca.sqlcode <> 0 then
  1420. arg_msg = '查询会计期间:'+string(arg_cmonth)+'会计月历失败'
  1421. rslt = 0
  1422. goto ext
  1423. end if
  1424. e_date = datetime(RelativeDate(date(string(e_date,'yyyy-mm-dd')),1),time(0))
  1425. if arg_creddate < b_date or arg_creddate >= e_date then
  1426. arg_msg = '日期:'+string(arg_creddate,'yyyy-mm-dd')+'不在会计期间内:'+string(arg_cmonth)
  1427. rslt = 0
  1428. goto ext
  1429. end if
  1430. ext:
  1431. return rslt
  1432. end function
  1433. public function integer get_asset_credinfo (long arg_findtype, long arg_relid, long arg_credid, ref long arg_ref_credid, ref integer arg_ref_postflag, ref string arg_msg);Int rslt = 1
  1434. IF arg_credid = 0 THEN
  1435. SELECT postflag,credid
  1436. INTO :arg_ref_postflag,:arg_ref_credid
  1437. FROM cw_credence
  1438. WHERE relevantbillid = :arg_relid
  1439. AND readtype = :arg_findtype
  1440. AND accsetid = :sys_accsetid;
  1441. ELSE
  1442. SELECT postflag,credid
  1443. INTO :arg_ref_postflag,:arg_ref_credid
  1444. FROM cw_credence
  1445. WHERE relevantbillid = :arg_relid
  1446. AND credid <> :arg_credid
  1447. AND readtype = :arg_findtype
  1448. AND accsetid = :sys_accsetid;
  1449. END IF
  1450. IF sqlca.SQLCode <> 0 THEN
  1451. rslt = 0
  1452. arg_msg = '查询相关凭证失败>>'+sqlca.SQLErrText
  1453. GOTO ext
  1454. END IF
  1455. IF IsNull(arg_ref_postflag) THEN arg_ref_postflag = 0
  1456. IF IsNull(arg_ref_credid) THEN arg_ref_credid = 0
  1457. ext:
  1458. RETURN rslt
  1459. end function
  1460. public function integer uof_mod_mxdscrp (long arg_accsetid, long arg_credid, long arg_fuluno, string arg_mxdscrp, ref string arg_msg);Int rslt = 1
  1461. UPDATE cw_credencemx
  1462. SET mxdscrp = :arg_mxdscrp
  1463. WHERE accsetid = :arg_accsetid
  1464. AND credid = :arg_credid
  1465. AND fuluno = :arg_fuluno;
  1466. IF sqlca.SQLCode <> 0 THEN
  1467. arg_msg = '更新分录补充备注失败,'+sqlca.SQLErrText
  1468. rslt = 0
  1469. GOTO ext
  1470. END IF
  1471. ext:
  1472. IF rslt = 0 THEN
  1473. ROLLBACK;
  1474. ELSE
  1475. COMMIT;
  1476. END IF
  1477. RETURN rslt
  1478. end function
  1479. public function integer cancel_check_1 (long arg_subaccsetid, long arg_credid, integer arg_ifauto_check, ref string arg_msg, boolean arg_ifcommit);//check(arg_subaccsetid,arg_credid,ref arg_msg,arg_ifcommit)
  1480. //0 fail 1 success
  1481. //凭证审核
  1482. Long rslt = 1,cnt = 0
  1483. DateTime null_dt
  1484. SetNull(null_dt)
  1485. IF s_sys_accset.sameuser = 0 THEN
  1486. IF publ_userid = billmakerid THEN
  1487. arg_msg = '制单和审核不可以是同一个人'
  1488. rslt = 0
  1489. GOTO ext
  1490. END IF
  1491. END IF
  1492. IF getinfo(arg_subaccsetid,arg_credid,arg_msg) = 0 THEN
  1493. rslt = 0
  1494. GOTO ext
  1495. END IF
  1496. IF it_newbegin OR it_updatebegin THEN
  1497. rslt = 0
  1498. arg_msg = "编辑状态下不可以执行审核"
  1499. GOTO ext
  1500. END IF
  1501. IF checkflag = 0 THEN
  1502. rslt = 0
  1503. arg_msg = "凭证还未审核"
  1504. GOTO ext
  1505. END IF
  1506. IF postflag = 1 THEN
  1507. rslt = 0
  1508. arg_msg = '凭证已经登帐'
  1509. GOTO ext
  1510. END IF
  1511. IF arg_ifauto_check = 1 AND ifauto = 1 THEN
  1512. rslt = 0
  1513. arg_msg = '自动凭证不能撤审'
  1514. rslt = 0
  1515. GOTO ext
  1516. END IF
  1517. UPDATE cw_credence
  1518. SET billcheckid = '',
  1519. billcheck = '',
  1520. billcheckdate = :null_dt,
  1521. checkflag = 0
  1522. WHERE cw_credence.credid = :arg_credid
  1523. AND cw_credence.checkflag = 1
  1524. AND cw_credence.accsetid = :sys_accsetid
  1525. AND cw_credence.subaccsetid = :arg_subaccsetid;
  1526. IF sqlca.SQLCode <> 0 THEN
  1527. rslt = 0
  1528. arg_msg = "因网络或其它原因导致撤审凭证操作失败"+"~n"+sqlca.SQLErrText
  1529. GOTO ext
  1530. ELSEIF sqlca.SQLNRows = 0 THEN
  1531. rslt = 0
  1532. arg_msg = "凭证正在撤审,请稍后查询。"+"~n"+sqlca.SQLErrText
  1533. GOTO ext
  1534. END IF
  1535. checkflag = 0
  1536. ext:
  1537. IF rslt = 0 THEN
  1538. ROLLBACK ;
  1539. ELSEIF rslt = 1 AND arg_ifcommit THEN
  1540. COMMIT;
  1541. END IF
  1542. RETURN rslt
  1543. end function
  1544. public function integer del (integer arg_delmode, long arg_subaccsetid, long arg_credid, ref string arg_msg, boolean arg_ifcommit);//del(arg_subaccsetid,arg_credid,ref arg_msg,arg_ifcommit)
  1545. //如果单据还没有审核删除凭证极其明细
  1546. //0 FAIL, 1 SUCCESS
  1547. //arg_delmode 0:手动1:自动
  1548. Int rslt = 1
  1549. Boolean if_del = FALSE
  1550. IF getinfo(arg_subaccsetid,arg_credid,arg_msg) = 0 THEN
  1551. rslt = 0
  1552. GOTO ext
  1553. END IF
  1554. IF checkflag = 1 THEN
  1555. arg_msg = '凭证已经审核,不可以删除'
  1556. if_del = TRUE
  1557. END IF
  1558. IF arg_delmode = 0 THEN
  1559. CHOOSE CASE readtype
  1560. CASE 200
  1561. arg_msg = '该张凭证为固定资产业务对应的凭证,不可以删除'
  1562. if_del = TRUE
  1563. CASE 201
  1564. arg_msg = '该张凭证为固定资产业务折旧对应的凭证,不可以删除'
  1565. if_del = TRUE
  1566. CASE 202
  1567. arg_msg = '该张凭证为固定资产清理业务对应的凭证,不可以删除'
  1568. if_del = TRUE
  1569. CASE 888
  1570. arg_msg = '该张凭证为出纳业务对应的凭证,不可以删除'
  1571. if_del = TRUE
  1572. END CHOOSE
  1573. IF ifauto = 1 THEN
  1574. arg_msg = '业务单据自动建立的凭证,不能删除'
  1575. rslt = 0
  1576. GOTO ext
  1577. END IF
  1578. IF checkflag = 0 AND sys_power_issuper AND sys_option_super_del_assetcred = 1 THEN
  1579. if_del = FALSE
  1580. END IF
  1581. END IF
  1582. IF if_del THEN
  1583. rslt = 0
  1584. GOTO ext
  1585. END IF
  1586. DELETE FROM cw_CashItem
  1587. WHERE cw_CashItem.credid = :arg_credid
  1588. AND cw_CashItem.accsetid = :sys_accsetid;
  1589. IF sqlca.SQLCode <> 0 THEN
  1590. rslt = 0
  1591. arg_msg = "删除凭证现金流量操作失败"+"~n"+sqlca.SQLErrText
  1592. GOTO ext
  1593. END IF
  1594. DELETE FROM cw_credence
  1595. WHERE cw_credence.credid = :arg_credid
  1596. AND cw_credence.accsetid = :sys_accsetid
  1597. AND cw_credence.subaccsetid = :arg_subaccsetid;
  1598. IF sqlca.SQLCode <> 0 THEN
  1599. rslt = 0
  1600. arg_msg = "删除凭证操作失败"+"~n"+sqlca.SQLErrText
  1601. GOTO ext
  1602. END IF
  1603. DELETE FROM cw_credencemx
  1604. WHERE cw_credencemx.credid = :arg_credid
  1605. AND cw_credencemx.accsetid = :sys_accsetid
  1606. AND cw_credencemx.subaccsetid = :arg_subaccsetid;
  1607. IF sqlca.SQLCode <> 0 THEN
  1608. rslt = 0
  1609. arg_msg = "删除凭证明细操作失败"+"~n"+sqlca.SQLErrText
  1610. GOTO ext
  1611. END IF
  1612. it_newbegin = FALSE
  1613. it_updatebegin = FALSE
  1614. IF rslt = 0 THEN
  1615. ROLLBACK;
  1616. p_reset()
  1617. ELSEIF rslt = 1 AND arg_ifcommit THEN
  1618. COMMIT;
  1619. END IF
  1620. ext:
  1621. RETURN (rslt)
  1622. end function
  1623. public function integer acceptmx (long arg_fuluno, string arg_subid, string arg_brief, double arg_rate, decimal arg_rawdebit, decimal arg_rawcredit, decimal arg_debit, decimal arg_credit, decimal arg_amount, decimal arg_price, long arg_deptid, long arg_itemid, datetime arg_billdate, long arg_billid, string arg_billno, long arg_cropbillid, integer arg_readonly, long arg_cusid, long arg_sptid, long arg_empid, ref string arg_msg);//acceptmx(arg_fuluno,arg_subid,arg_brief,arg_rate,arg_rawdebit,arg_rawcredit,arg_debit,
  1624. // arg_credit,arg_amount,arg_price,arg_deptid,arg_itemid,arg_billdate,arg_billid,
  1625. // arg_billno,arg_cropbillid,arg_msg)
  1626. //
  1627. //RETURN 0 fail 1 success
  1628. // 函数增加凭证明细项
  1629. Long rslt = 1,cnt = 0,LS_i
  1630. Int li_hswb,li_detailflag
  1631. IF it_newbegin = FALSE AND it_updatebegin = FALSE THEN
  1632. rslt = 0
  1633. arG_MSG = "非编辑状态不可以使用,操作取消"
  1634. GOTO ext
  1635. END IF
  1636. //清除空值
  1637. IF IsNull(arg_fuluno) THEN arg_fuluno = 0
  1638. IF IsNull(arg_subid) THEN arg_subid = ''
  1639. IF IsNull(arg_brief) THEN arg_brief = ''
  1640. IF IsNull(arg_rate) THEN arg_rate = 0
  1641. IF IsNull(arg_rawdebit)THEN arg_rawdebit = 0
  1642. IF IsNull(arg_rawcredit)THEN arg_rawcredit = 0
  1643. IF IsNull(arg_debit)THEN arg_debit = 0
  1644. IF IsNull(arg_credit)THEN arg_credit = 0
  1645. IF IsNull(arg_amount)THEN arg_amount = 0
  1646. IF IsNull(arg_price)THEN arg_price = 0
  1647. IF IsNull(arg_deptid) THEN arg_deptid = 0
  1648. IF IsNull(arg_itemid) THEN arg_itemid = 0
  1649. IF IsNull(arg_billid) THEN arg_billid = 0
  1650. IF IsNull(arg_billno) THEN arg_billno = ''
  1651. IF IsNull(arg_cusid) THEN arg_cusid = 0
  1652. IF IsNull(arg_sptid) THEN arg_sptid = 0
  1653. IF IsNull(arg_empid) THEN arg_empid = 0
  1654. IF arg_subid = '' AND arg_debit = 0 AND arg_credit = 0 THEN // 如果借贷金额为 0 且摘要和科目为空,则不作任何处理
  1655. rslt = 1
  1656. GOTO ext
  1657. END IF
  1658. //IF Len(Trim(arg_brief)) > 20 AND Left(arg_brief,1) <> ' ' THEN
  1659. // arg_brief = ' ' +arg_brief
  1660. //END IF
  1661. IF arg_subid = '' AND (arg_debit <> 0 OR arg_credit <> 0) THEN
  1662. rslt = 0
  1663. arG_MSG = '分录:'+String(arg_fuluno)+',请选择会计科目'
  1664. GOTO ext
  1665. END IF
  1666. SELECT count(*) INTO :cnt FROM cw_subject
  1667. WHERE accsetid = :sys_accsetid
  1668. AND subid = :arg_subid
  1669. AND detailflag = 1;
  1670. IF sqlca.SQLCode <> 0 THEN
  1671. arG_MSG = '分录:'+String(arg_fuluno)+',查询科目代码失败'
  1672. rslt = 0
  1673. GOTO ext
  1674. END IF
  1675. IF cnt = 0 THEN
  1676. arG_MSG = '分录:'+String(arg_fuluno)+',此帐套中不存在明细科目{'+arg_subid+'},请检查输入是否正确'
  1677. rslt = 0
  1678. GOTO ext
  1679. END IF
  1680. IF cnt > 1 THEN
  1681. arG_MSG = '分录:'+String(arg_fuluno)+',此帐套中存在两个相同科目{'+arg_subid+'}'
  1682. rslt = 0
  1683. GOTO ext
  1684. END IF
  1685. SELECT hswb,detailflag INTO :li_hswb,:li_detailflag
  1686. FROM cw_subject
  1687. WHERE accsetid = :sys_accsetid
  1688. AND subid = :arg_subid
  1689. AND detailflag = 1;
  1690. IF sqlca.SQLCode <> 0 THEN
  1691. arG_MSG = '分录:'+String(arg_fuluno)+',查询科目代码失败'
  1692. rslt = 0
  1693. GOTO ext
  1694. END IF
  1695. IF li_detailflag = 0 THEN
  1696. arG_MSG = '分录:'+String(arg_fuluno)+','+arg_subid + '不是明细科目,不能做会计分录'
  1697. rslt = 0
  1698. GOTO ext
  1699. END IF
  1700. IF li_hswb = 1 AND arg_rate = 0 THEN
  1701. arG_MSG = '分录:'+String(arg_fuluno)+',科目:'+arg_subid+'核算外币,会计分录没有输入汇率'
  1702. rslt = 0
  1703. GOTO ext
  1704. END IF
  1705. IF Left(arg_subid,3) <> '102' AND ( arg_billid > 0 OR arg_billno <> '' ) THEN
  1706. arG_MSG = '分录:'+String(arg_fuluno)+',不是不银行存款科目不能输入结算方式'
  1707. rslt = 0
  1708. GOTO ext
  1709. END IF
  1710. IF arg_debit = 0 AND arg_credit = 0 THEN
  1711. rslt = 1
  1712. GOTO ext
  1713. END IF
  1714. IF arg_debit <> 0 AND arg_credit <> 0 THEN
  1715. rslt = 0
  1716. arG_MSG = '分录:'+String(arg_fuluno)+',借方金额和贷方金额不能同时输入金额'
  1717. GOTO ext
  1718. END IF
  1719. //写入内容
  1720. it_mxbt++
  1721. credencemx[it_mxbt].fuluno = it_mxbt //arg_fuluno
  1722. credencemx[it_mxbt].subid = arg_subid
  1723. credencemx[it_mxbt].brief = arg_brief
  1724. credencemx[it_mxbt].rate = arg_rate
  1725. credencemx[it_mxbt].rawdebit = arg_rawdebit
  1726. credencemx[it_mxbt].rawcredit = arg_rawcredit
  1727. credencemx[it_mxbt].debit = arg_debit
  1728. credencemx[it_mxbt].credit = arg_credit
  1729. credencemx[it_mxbt].amount = arg_amount
  1730. credencemx[it_mxbt].price = arg_price
  1731. credencemx[it_mxbt].deptid = arg_deptid
  1732. credencemx[it_mxbt].itemid = arg_itemid
  1733. credencemx[it_mxbt].billdate = arg_billdate
  1734. credencemx[it_mxbt].billid = arg_billid
  1735. credencemx[it_mxbt].billno = arg_billno
  1736. credencemx[it_mxbt].ifreadonly = arg_readonly
  1737. credencemx[it_mxbt].cusid = arg_cusid
  1738. credencemx[it_mxbt].sptid = arg_sptid
  1739. credencemx[it_mxbt].empid = arg_empid
  1740. ext:
  1741. IF rslt = 0 THEN p_clearmx()
  1742. RETURN(rslt)
  1743. end function
  1744. on uo_credence.create
  1745. call super::create
  1746. TriggerEvent( this, "constructor" )
  1747. end on
  1748. on uo_credence.destroy
  1749. TriggerEvent( this, "destructor" )
  1750. call super::destroy
  1751. end on