uo_subject.sru 23 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034
  1. $PBExportHeader$uo_subject.sru
  2. forward
  3. global type uo_subject from nonvisualobject
  4. end type
  5. end forward
  6. global type uo_subject from nonvisualobject
  7. end type
  8. global uo_subject uo_subject
  9. type variables
  10. string subid=''
  11. string name=''
  12. int dcflag=0
  13. int detailflag=1
  14. int hswb=0
  15. long moneyid=0
  16. int hsqty=0
  17. string unit=''
  18. int hsdept=0
  19. int hsemp=0
  20. int hsitem=0
  21. int hstrader=0
  22. int attrflag=0
  23. int specialcode=0
  24. int relevantid=0
  25. int hscust=0
  26. int hsspt=0
  27. private:
  28. string old_subid=''
  29. long it_MXBT=0 //明细结构数组末指针
  30. BOOLEAN IT_NEWBEGIN=TRUE //新建同级标志
  31. BOOLEAN IT_NEWSUBBEGIN=FALSE //新建下级标志
  32. BOOLEAN IT_UPDATEBEGIN=FALSE//修改标志
  33. long len_grade1,len_grade2,len_grade3
  34. long len_grade4,len_grade5,len_grade6
  35. long subtree_cnt
  36. end variables
  37. forward prototypes
  38. public function integer p_reset ()
  39. public function integer save (ref string arg_msg, boolean arg_ifcommit)
  40. public function string get_subid (integer arg_newtype, string arg_psubid, ref string arg_msg)
  41. public function string get_subid_format (string arg_psubid, long arg_csubid)
  42. public function integer getinfo (string arg_subid, ref string arg_msg)
  43. public function integer check_data (ref string arg_msg)
  44. public function integer check_firstsub (ref string arg_msg)
  45. public function integer new_begin (integer arg_newtype, string arg_psubid, ref string arg_msg)
  46. public function integer check_onlyonesub ()
  47. public function integer del_sub (ref string arg_msg, boolean arg_ifcommit)
  48. public function integer check_ifmxsub (ref string arg_msg)
  49. public function integer p_uo_begin ()
  50. public function integer update_begin (string arg_subid, ref string arg_msg)
  51. public function string p_parent_subid (string arg_subid)
  52. public function integer p_check_suboperation (string arg_subid, ref string arg_msg)
  53. public function integer check_suboperation (integer arg_checktype, ref string arg_msg)
  54. public function integer update_add_del (integer arg_add_or_del, string arg_subid, ref string arg_msg, boolean arg_ifcommit)
  55. public function integer uof_update_status (integer arg_type)
  56. public function integer p_update_subid_p (string arg_subid, ref string arg_msg)
  57. end prototypes
  58. public function integer p_reset ();//INT p_RESET()
  59. //清除对象及其明细
  60. it_newbegin=false
  61. it_newsubbegin=false
  62. it_updatebegin=false
  63. old_subid=''
  64. RETURN 1
  65. end function
  66. public function integer save (ref string arg_msg, boolean arg_ifcommit);Long rslt = 1
  67. String parent_subid,ls_displaycode
  68. IF s_sys_accset.ifnewsubid = 0 THEN
  69. IF Left(subid,1) <> '1' AND Left(subid,1) <> '2' AND Left(subid,1) <> '3' AND Left(subid,1) <> '4' AND Left(subid,1) <> '5' THEN
  70. rslt = 0
  71. arg_msg = '科目代码错误,1 - 资产类,2 - 负债类,3 - 权益类,4 - 成本类,5 - 损益类'
  72. GOTO ext
  73. END IF
  74. ELSE
  75. IF Left(subid,1) <> '1' AND Left(subid,1) <> '2' AND Left(subid,1) <> '3' AND Left(subid,1) <> '4' AND Left(subid,1) <> '5' AND Left(subid,1) <> '6' THEN
  76. rslt = 0
  77. arg_msg = '科目代码错误,1 - 资产类,2 - 负债类,3 - 共同类,4 - 权益类,5 - 成本类,6 - 损益类'
  78. GOTO ext
  79. END IF
  80. END IF
  81. //***检查同级名称是否相同
  82. Int cnt = 0
  83. Long ll_parent_len
  84. CHOOSE CASE Len(subid)
  85. CASE len_grade1
  86. ll_parent_len = 3
  87. CASE len_grade2
  88. ll_parent_len = 3
  89. CASE len_grade3
  90. ll_parent_len = len_grade2
  91. CASE len_grade4
  92. ll_parent_len = len_grade3
  93. CASE len_grade5
  94. ll_parent_len = len_grade4
  95. CASE len_grade6
  96. ll_parent_len = len_grade5
  97. END CHOOSE
  98. IF Trim(Name) = '' THEN
  99. arg_msg = '请输入科目名称'
  100. rslt = 0
  101. GOTO ext
  102. END IF
  103. ls_displaycode = f_rst_subdisplay(subid,Name)
  104. SELECT count(*) INTO :cnt FROM cw_subject
  105. WHERE subid <> :subid
  106. AND name = :Name
  107. AND accsetid = :sys_accsetid
  108. AND len(subid) > 3
  109. AND Left(subid,:ll_parent_len) = Left(:subid,:ll_parent_len);
  110. IF sqlca.SQLCode = -1 THEN
  111. rslt = 0
  112. arg_msg = '查询同级科目名称是否有相同失败'
  113. GOTO ext
  114. END IF
  115. IF cnt > 0 THEN
  116. rslt = 0
  117. arg_msg = '同级已有科目名称存在,请检查'
  118. GOTO ext
  119. END IF
  120. //*********
  121. //1.新建
  122. IF it_newbegin OR it_newsubbegin THEN
  123. INSERT INTO
  124. cw_subject(accsetid,
  125. subid,
  126. name,
  127. dcflag,
  128. detailflag,
  129. hswb,
  130. moneyid,
  131. hsqty,
  132. unit,
  133. hsdept,
  134. hsemp,
  135. hsitem,
  136. hstrader,
  137. attrflag,
  138. specialcode,
  139. relevantid,
  140. displaycode,
  141. hscust,
  142. hsspt)
  143. VALUES(:sys_accsetid,
  144. :subid,
  145. :Name,
  146. :dcflag,
  147. :detailflag,
  148. :hswb,
  149. :moneyid,
  150. :hsqty,
  151. :unit,
  152. :hsdept,
  153. :hsemp,
  154. :hsitem,
  155. :hstrader,
  156. :attrflag,
  157. :specialcode,
  158. :relevantid,
  159. :ls_displaycode,
  160. :hscust,
  161. :hsspt);
  162. IF sqlca.SQLCode <> 0 THEN
  163. arg_msg = '新建会计科目失败! ~n'+sqlca.SQLErrText
  164. rslt = 0
  165. GOTO ext
  166. END IF
  167. IF sys_accsetbegin THEN
  168. cnt = 0
  169. SELECT count(*) INTO :cnt
  170. FROM cw_balance
  171. WHERE accsetid = :sys_accsetid
  172. AND subid = :subid;
  173. IF sqlca.SQLCode <> 0 THEN
  174. arg_msg = '查询新建会计科目是否已存在于试算平衡表失败! ~n'+sqlca.SQLErrText
  175. rslt = 0
  176. GOTO ext
  177. END IF
  178. INSERT INTO cw_balance(accsetid,subid,YearMon)Values(:sys_accsetid,:subid,:sys_curyearmon);
  179. IF sqlca.SQLCode <> 0 THEN
  180. arg_msg = '新建会计科目增加到试算平衡表失败! ~n'+sqlca.SQLErrText
  181. rslt = 0
  182. GOTO ext
  183. END IF
  184. END IF
  185. ELSEIF it_updatebegin THEN
  186. String ls_old_name
  187. Long ll_length_subid
  188. SELECT name
  189. INTO :ls_old_name
  190. FROM cw_subject
  191. WHERE accsetid = :sys_accsetid
  192. AND subid = :subid;
  193. IF sqlca.SQLCode <> 0 THEN
  194. arg_msg = '查询原科目名称失败,'+sqlca.SQLErrText
  195. rslt = 0
  196. GOTO ext
  197. END IF
  198. UPDATE cw_subject SET
  199. subid = :subid,
  200. name = :Name,
  201. dcflag = :dcflag,
  202. hswb = :hswb,
  203. moneyid = :moneyid,
  204. hsqty = :hsqty,
  205. unit = :unit,
  206. hsdept = :hsdept,
  207. hsemp = :hsemp,
  208. hsitem = :hsitem,
  209. hstrader = :hstrader,
  210. attrflag = :attrflag,
  211. specialcode = :specialcode,
  212. relevantid = :relevantid,
  213. displaycode = :ls_displaycode,
  214. hscust = :hscust,
  215. hsspt = :hsspt
  216. Where accsetid = :sys_accsetid AND subid = :old_subid ;
  217. IF sqlca.SQLCode <> 0 THEN
  218. arg_msg = '修改会计科目失败! ~n'+sqlca.SQLErrText
  219. rslt = 0
  220. GOTO ext
  221. END IF
  222. IF Trim(ls_old_name) <> Trim(Name) THEN
  223. ll_length_subid = Len(subid)
  224. UPDATE cw_subject
  225. SET displaycode = replace(displaycode,:ls_old_name,:Name)
  226. WHERE accsetid = :sys_accsetid
  227. AND subid <> :subid
  228. AND Left(subid,:ll_length_subid) = :subid;
  229. IF sqlca.SQLCode <> 0 THEN
  230. arg_msg = '更新下级科目资料失败,'+sqlca.SQLErrText
  231. rslt = 0
  232. GOTO ext
  233. END IF
  234. END IF
  235. END IF
  236. IF p_update_subid_p(subid,arg_msg) = 0 THEN
  237. rslt = 0
  238. GOTO ext
  239. END IF
  240. ext:
  241. IF rslt = 0 THEN
  242. ROLLBACK;
  243. ELSEIF rslt = 1 AND arg_ifcommit THEN
  244. COMMIT;
  245. END IF
  246. RETURN rslt
  247. end function
  248. public function string get_subid (integer arg_newtype, string arg_psubid, ref string arg_msg);//取下级科目编号
  249. //get_subid(arg_newtype,arg_psubid,ref arg_msg)
  250. //arg_newtype 取科目编号类型 0取同级,1取下级
  251. String rslt_csubid = 'err'
  252. String ls_p_subid,ls_c_subid,ls_subid,ls_arg_subid
  253. String ls_max_subid
  254. Long i,j
  255. Long li_frow
  256. Long cnt
  257. Long ll_len_subid
  258. IF arg_newtype = 0 THEN
  259. ls_arg_subid = arg_psubid
  260. ELSE
  261. ls_arg_subid = arg_psubid
  262. ll_len_subid = Len(ls_arg_subid)
  263. SELECT count(*) INTO :cnt
  264. FROM cw_subject
  265. WHERE accsetid = :sys_accsetid
  266. AND len(subid) > :ll_len_subid
  267. AND Left(subid,:ll_len_subid) = :ls_arg_subid;
  268. IF sqlca.SQLCode <> 0 THEN
  269. rslt_csubid = 'err'
  270. GOTO ext
  271. END IF
  272. IF cnt = 0 THEN
  273. CHOOSE CASE ll_len_subid
  274. CASE len_grade1
  275. ls_arg_subid = ls_arg_subid + Fill('0',len_grade2 - len_grade1 )
  276. CASE len_grade2
  277. ls_arg_subid = ls_arg_subid + Fill('0',len_grade3 - len_grade2 )
  278. CASE len_grade3
  279. ls_arg_subid = ls_arg_subid + Fill('0',len_grade4 - len_grade3 )
  280. CASE len_grade4
  281. ls_arg_subid = ls_arg_subid + Fill('0',len_grade5 - len_grade4 )
  282. CASE len_grade5
  283. ls_arg_subid = ls_arg_subid + Fill('0',len_grade6 - len_grade5 )
  284. CASE len_grade6
  285. rslt_csubid = 'err'
  286. GOTO ext
  287. END CHOOSE
  288. ELSE
  289. SELECT top 1 subid INTO :ls_max_subid
  290. FROM cw_subject
  291. WHERE accsetid = :sys_accsetid
  292. AND len(subid) > :ll_len_subid
  293. AND left(subid,:ll_len_subid) = :ls_arg_subid
  294. Order By subid Desc;
  295. IF sqlca.SQLCode <> 0 THEN
  296. rslt_csubid = 'err'
  297. GOTO ext
  298. END IF
  299. ls_arg_subid = ls_max_subid
  300. END IF
  301. END IF
  302. CHOOSE CASE Len(ls_arg_subid)
  303. CASE len_grade1
  304. ls_p_subid = ''
  305. ls_c_subid = ls_arg_subid
  306. ls_c_subid = String(Long(ls_c_subid) + 1,Fill('0',len_grade1))
  307. CASE len_grade2
  308. ls_p_subid = Left(ls_arg_subid,len_grade1)
  309. ls_c_subid = Right(ls_arg_subid,len_grade2 - len_grade1)
  310. ls_c_subid = String(Long(ls_c_subid) + 1,Fill('0',len_grade2 - len_grade1))
  311. CASE len_grade3
  312. ls_p_subid = Left(ls_arg_subid,len_grade2)
  313. ls_c_subid = Right(ls_arg_subid,len_grade3 - len_grade2)
  314. ls_c_subid = String(Long(ls_c_subid) + 1,Fill('0',len_grade3 - len_grade2))
  315. CASE len_grade4
  316. ls_p_subid = Left(ls_arg_subid,len_grade3)
  317. ls_c_subid = Right(ls_arg_subid,len_grade4 - len_grade3)
  318. ls_c_subid = String(Long(ls_c_subid) + 1,Fill('0',len_grade4 - len_grade3))
  319. CASE len_grade5
  320. ls_p_subid = Left(ls_arg_subid,len_grade4)
  321. ls_c_subid = Right(ls_arg_subid,len_grade5 - len_grade4)
  322. ls_c_subid = String(Long(ls_c_subid) + 1,Fill('0',len_grade5 - len_grade4))
  323. CASE len_grade6
  324. ls_p_subid = Left(ls_arg_subid,len_grade5)
  325. ls_c_subid = Right(ls_arg_subid,len_grade6 - len_grade5)
  326. ls_c_subid = String(Long(ls_c_subid) + 1,Fill('0',len_grade6 - len_grade5))
  327. END CHOOSE
  328. ls_subid = ls_p_subid + ls_c_subid
  329. li_frow = ds_subjecttree.Find("subid='"+ls_subid+"'", 1, subtree_cnt)
  330. DO WHILE li_frow > 0
  331. CHOOSE CASE Len(ls_subid)
  332. CASE len_grade1
  333. ls_p_subid = ''
  334. ls_c_subid = ls_subid
  335. ls_c_subid = String(Long(ls_subid) + 1,Fill('0',len_grade1))
  336. CASE len_grade2
  337. ls_p_subid = Left(ls_subid,len_grade1)
  338. ls_c_subid = Right(ls_subid,len_grade2 - len_grade1)
  339. ls_c_subid = String(Long(ls_c_subid) + 1,Fill('0',len_grade2 - len_grade1))
  340. CASE len_grade3
  341. ls_p_subid = Left(ls_subid,len_grade2)
  342. ls_c_subid = Right(ls_subid,len_grade3 - len_grade2)
  343. ls_c_subid = String(Long(ls_c_subid) + 1,Fill('0',len_grade3 - len_grade2))
  344. CASE len_grade4
  345. ls_p_subid = Left(ls_subid,len_grade3)
  346. ls_c_subid = Right(ls_subid,len_grade4 - len_grade3)
  347. ls_c_subid = String(Long(ls_c_subid) + 1,Fill('0',len_grade4 - len_grade3))
  348. CASE len_grade5
  349. ls_p_subid = Left(ls_subid,len_grade4)
  350. ls_c_subid = Right(ls_subid,len_grade5 - len_grade4)
  351. ls_c_subid = String(Long(ls_c_subid) + 1,Fill('0',len_grade5 - len_grade4))
  352. CASE len_grade6
  353. ls_p_subid = Left(ls_subid,len_grade5)
  354. ls_c_subid = Right(ls_subid,len_grade6 - len_grade5)
  355. ls_c_subid = String(Long(ls_c_subid) + 1,Fill('0',len_grade6 - len_grade5))
  356. END CHOOSE
  357. ls_subid = ls_p_subid + ls_c_subid
  358. li_frow = ds_subjecttree.Find("subid='"+ls_subid+"'", li_frow, subtree_cnt)
  359. LOOP
  360. rslt_csubid = ls_subid
  361. ext:
  362. IF rslt_csubid = 'err' THEN
  363. IF arg_newtype = 0 THEN
  364. arg_msg = '查找同级级科目编号失败'
  365. ELSE
  366. arg_msg = '查找下级科目编号失败'
  367. END IF
  368. END IF
  369. RETURN rslt_csubid
  370. end function
  371. public function string get_subid_format (string arg_psubid, long arg_csubid);string rslt_subid
  372. choose case len(arg_psubid)
  373. case len_grade1
  374. rslt_subid=string(arg_csubid,fill('0',len_grade1))
  375. case len_grade2
  376. rslt_subid=string(arg_csubid,fill('0',len_grade2))
  377. case len_grade3
  378. rslt_subid=string(arg_csubid,fill('0',len_grade3))
  379. case len_grade4
  380. rslt_subid=string(arg_csubid,fill('0',len_grade4))
  381. case len_grade5
  382. rslt_subid=string(arg_csubid,fill('0',len_grade5))
  383. case len_grade6
  384. rslt_subid=string(arg_csubid,fill('0',len_grade6))
  385. end choose
  386. return rslt_subid
  387. end function
  388. public function integer getinfo (string arg_subid, ref string arg_msg);//getinfo(arg_subid,ref arg_msg)
  389. //1:sucess,0:fail
  390. long rslt=1
  391. if sys_accsetid<=0 then
  392. rslt=0
  393. arg_msg='帐套ID错误'
  394. goto ext
  395. end if
  396. if len(arg_subid)<=0 then
  397. rslt=0
  398. arg_msg='科目编号错误'
  399. goto ext
  400. end if
  401. select name,
  402. dcflag,
  403. detailflag,
  404. hswb,
  405. moneyid,
  406. hsqty,
  407. unit,
  408. hsdept,
  409. hsemp,
  410. hsitem,
  411. hstrader,
  412. attrflag,
  413. specialcode,
  414. relevantid,
  415. hscust,
  416. hsspt
  417. into :name,
  418. :dcflag,
  419. :detailflag,
  420. :hswb,
  421. :moneyid,
  422. :hsqty,
  423. :unit,
  424. :hsdept,
  425. :hsemp,
  426. :hsitem,
  427. :hstrader,
  428. :attrflag,
  429. :specialcode,
  430. :relevantid,
  431. :hscust,
  432. :hsspt
  433. from cw_subject where accsetid=:sys_accsetid and subid=:arg_subid;
  434. if sqlca.sqlcode<>0 then
  435. arg_msg='查询会计科目失败! ~n'+sqlca.SQLErrText
  436. rslt=0
  437. goto ext
  438. end if
  439. subid = arg_subid
  440. it_newbegin=false
  441. it_newsubbegin=false
  442. it_updatebegin=false
  443. p_uo_begin()
  444. ext:
  445. IF rslt=0 THEN p_reset()
  446. return rslt
  447. end function
  448. public function integer check_data (ref string arg_msg);long rslt=1
  449. if sys_accsetid=0 then
  450. rslt=0
  451. arg_msg='帐套ID错误'
  452. goto ext
  453. end if
  454. if len(subid)<=0 then
  455. rslt=0
  456. arg_msg='请输入会计科目编号'
  457. goto ext
  458. end if
  459. if len(subid)<>len_grade1 and len(subid)<>len_grade2 and len(subid)<>len_grade3 and &
  460. len(subid)<>len_grade4 and len(subid)<>len_grade5 and len(subid)<>len_grade6 then
  461. rslt=0
  462. arg_msg='科目代码格式错,正确格式应为:' + string(s_sys_accset.step1) + '-'
  463. arg_msg=arg_msg + string(s_sys_accset.step2) + '-' + string(s_sys_accset.step3) + '-'
  464. arg_msg=arg_msg + string(s_sys_accset.step4) + '-' + string(s_sys_accset.step5) + '-'
  465. arg_msg=arg_msg + string(s_sys_accset.step6)
  466. goto ext
  467. end if
  468. if long(subid)=0 then
  469. rslt=0
  470. arg_msg='科目代码输入有误,请检查'
  471. goto ext
  472. end if
  473. if name='' then
  474. rslt=0
  475. arg_msg='请输入会计科目名称'
  476. goto ext
  477. end if
  478. ext:
  479. return rslt
  480. end function
  481. public function integer check_firstsub (ref string arg_msg);//查科目是否第一个子科目
  482. //check_firstsub(ref arg_msg)
  483. //1:yes 0:no,2:error
  484. Long rslt = 0,i
  485. String parent_subid
  486. Int li_detailflag = 0
  487. parent_subid = p_parent_subid(subid)
  488. SELECT detailflag
  489. INTO :li_detailflag
  490. FROM cw_subject
  491. WHERE accsetid = :sys_accsetid
  492. AND subid = :parent_subid;
  493. IF sqlca.SQLCode <> 0 THEN
  494. rslt = 2
  495. arg_msg = '查询上级科目的下级科目失败'
  496. GOTO ext
  497. END IF
  498. rslt = li_detailflag
  499. ext:
  500. RETURN rslt
  501. end function
  502. public function integer new_begin (integer arg_newtype, string arg_psubid, ref string arg_msg);//new_begin(arg_newtype,arg_psubid,ref arg_msg)
  503. //arg_newtype 1:增加下级,0增加同级
  504. long rslt=1
  505. if arg_newtype = 1 then
  506. if len(arg_psubid)=len_grade6 then
  507. rslt=0
  508. arg_msg='第6级科目不能增加下级科目'
  509. goto ext
  510. end if
  511. it_newbegin=false
  512. it_newsubbegin=true
  513. it_updatebegin=false
  514. else
  515. it_newbegin=true
  516. it_newsubbegin=false
  517. it_updatebegin=false
  518. end if
  519. ext:
  520. return rslt
  521. end function
  522. public function integer check_onlyonesub ();//查科目是否是唯一子科目
  523. //p_conlyonesub()
  524. //0:不是或是一级科目,1:是
  525. Long rslt = 1,i,ins_len,ins_parent_len,child_cnt = 0
  526. ins_len = Len(subid)
  527. ins_parent_len = Len(p_parent_subid(subid))
  528. FOR i = 1 TO subtree_cnt
  529. IF ins_len = Len(String(ds_subjecttree.Object.subid[i])) THEN
  530. IF p_parent_subid(subid) = Left(ds_subjecttree.Object.subid[i],ins_parent_len) THEN
  531. child_cnt++
  532. END IF
  533. END IF
  534. NEXT
  535. IF child_cnt = 1 THEN
  536. IF ins_len = len_grade1 THEN
  537. rslt = 0
  538. ELSE
  539. rslt = 1
  540. END IF
  541. ELSE
  542. rslt = 0
  543. END IF
  544. RETURN rslt
  545. end function
  546. public function integer del_sub (ref string arg_msg, boolean arg_ifcommit);//删除科目
  547. //del_sub(arg_subid,refarg_msg,arg_ifcommit)
  548. //0 fail, 1 success
  549. Long rslt = 1
  550. String parent_subid
  551. Long cnt,ll_subid_length
  552. cnt = 0
  553. SELECT count(*) INTO :cnt
  554. FROM cw_credencemx
  555. WHERE accsetid = :sys_accsetid
  556. AND subid = :subid;
  557. IF sqlca.SQLCode <> 0 THEN
  558. arg_msg = '查询会计科目是否已用于凭证失败,'+sqlca.SQLErrText
  559. rslt = 0
  560. GOTO ext
  561. END IF
  562. IF cnt > 0 THEN
  563. arg_msg = '会计科目已用于凭证,不能删除'
  564. rslt = 0
  565. GOTO ext
  566. END IF
  567. IF sys_accsetbegin THEN
  568. cnt = 0
  569. SELECT count(*) INTO :cnt
  570. FROM cw_balance
  571. WHERE accsetid = :sys_accsetid
  572. AND subid = :subid
  573. AND YearMon <> :sys_curyearmon;
  574. IF sqlca.SQLCode <> 0 THEN
  575. arg_msg = '查询会计科目是否已用失败,'+sqlca.SQLErrText
  576. rslt = 0
  577. GOTO ext
  578. END IF
  579. IF cnt > 0 THEN
  580. arg_msg = '会计科目已使用,不能删除'
  581. rslt = 0
  582. GOTO ext
  583. END IF
  584. END IF
  585. parent_subid = p_parent_subid(subid)
  586. IF parent_subid <> '' THEN
  587. ll_subid_length = Len(Trim(parent_subid))
  588. cnt = 0
  589. SELECT count(*) INTO :cnt
  590. FROM cw_subject
  591. WHERE cw_subject.accsetid = :sys_accsetid
  592. AND left(subid,:ll_subid_length) = :parent_subid
  593. AND Len(subid) > :ll_subid_length
  594. AND subid <> :subid;
  595. IF sqlca.SQLCode <> 0 THEN
  596. rslt = 0
  597. arg_msg = '查询上级科目是否存在下级科目失败,'+sqlca.SQLErrText
  598. GOTO ext
  599. END IF
  600. IF cnt = 0 THEN
  601. UPDATE cw_subject SET detailflag = 1
  602. WHERE accsetid = :sys_accsetid
  603. AND subid = :parent_subid;
  604. IF sqlca.SQLCode <> 0 THEN
  605. rslt = 0
  606. arg_msg = '更新上级科目的下级科目标记失败,'+sqlca.SQLErrText
  607. GOTO ext
  608. END IF
  609. END IF
  610. END IF
  611. DELETE FROM cw_balance
  612. WHERE cw_balance.accsetid = :sys_accsetid
  613. AND cw_balance.subid = :subid
  614. AND cw_balance.YearMon = :sys_curyearmon;
  615. IF sqlca.SQLCode <> 0 THEN
  616. rslt = 0
  617. arg_msg = "删除科目试算平衡表数据操作失败"+"~n"+sqlca.SQLErrText
  618. GOTO ext
  619. END IF
  620. DELETE FROM cw_subject
  621. Where cw_subject.accsetid = :sys_accsetid AND subid = :subid;
  622. IF sqlca.SQLCode <> 0 THEN
  623. rslt = 0
  624. arg_msg = "删除科目操作失败"+"~n"+sqlca.SQLErrText
  625. GOTO ext
  626. END IF
  627. ext:
  628. IF rslt = 0 THEN
  629. p_reset()
  630. ROLLBACK;
  631. ELSEIF rslt = 1 AND arg_ifcommit THEN
  632. COMMIT;
  633. END IF
  634. RETURN rslt
  635. end function
  636. public function integer check_ifmxsub (ref string arg_msg);//查科目是否是唯一并且是最下级科目子科目
  637. //p_conlyonesub()
  638. //1:yes 0:no
  639. long rslt=1,i,ins_len,ins_parent_len,child_cnt=0
  640. ins_len=len(subid)
  641. for i=1 to subtree_cnt
  642. if left(subid,ins_len)=left(ds_subjecttree.object.subid[i],ins_len) &
  643. and len(subid) < len(string(ds_subjecttree.object.subid[i])) then
  644. child_cnt++
  645. end if
  646. next
  647. if child_cnt = 0 then
  648. rslt=1
  649. else
  650. rslt=0
  651. arg_msg='不是明细科目'
  652. end if
  653. return rslt
  654. end function
  655. public function integer p_uo_begin ();len_grade1=s_sys_accset.step1
  656. len_grade2=s_sys_accset.step1+s_sys_accset.step2
  657. len_grade3=s_sys_accset.step1+s_sys_accset.step2+s_sys_accset.step3
  658. len_grade4=s_sys_accset.step1+s_sys_accset.step2+s_sys_accset.step3+s_sys_accset.step4
  659. len_grade5=s_sys_accset.step1+s_sys_accset.step2+s_sys_accset.step3+s_sys_accset.step4+s_sys_accset.step5
  660. len_grade6=s_sys_accset.step1+s_sys_accset.step2+s_sys_accset.step3+s_sys_accset.step4+s_sys_accset.step5+s_sys_accset.step6
  661. subtree_cnt=ds_subjecttree.rowcount()
  662. return 1
  663. end function
  664. public function integer update_begin (string arg_subid, ref string arg_msg);if getinfo(arg_subid,arg_msg)=0 then
  665. return 0
  666. end if
  667. it_newbegin=false
  668. it_newsubbegin=false
  669. it_updatebegin=true
  670. old_subid=arg_subid
  671. return 1
  672. end function
  673. public function string p_parent_subid (string arg_subid);string rst_parent_subid
  674. choose case len(arg_subid)
  675. case len_grade1
  676. rst_parent_subid=''
  677. case len_grade2
  678. rst_parent_subid=left(arg_subid,len_grade1)
  679. case len_grade3
  680. rst_parent_subid=left(arg_subid,len_grade2)
  681. case len_grade4
  682. rst_parent_subid=left(arg_subid,len_grade3)
  683. case len_grade5
  684. rst_parent_subid=left(arg_subid,len_grade4)
  685. case len_grade6
  686. rst_parent_subid=left(arg_subid,len_grade5)
  687. end choose
  688. return rst_parent_subid
  689. end function
  690. public function integer p_check_suboperation (string arg_subid, ref string arg_msg);//查科目是否发生过业务
  691. //p_check_suboperation(arg_subid,ref arg_msg)
  692. //0:error 1:yes 2:no
  693. //1.查询部门初始化数据
  694. //2.查询项目初始化数据
  695. //3.查询初始化期初数据
  696. //4.查询凭证
  697. //5.查询余额表
  698. Int rslt = 2,cnt = 0
  699. //1.查询部门初始化数据
  700. cnt = 0
  701. //SELECT count(subid) INTO :cnt FROM cw_initdeptbala Where accsetid = :sys_accsetid AND subid = :arg_subid;
  702. //IF sqlca.SQLCode = -1 THEN
  703. // rslt = 0
  704. // arg_msg = '查询科目部门初始化数据失败 ~n'+sqlca.SQLErrText
  705. // GOTO ext
  706. //ELSEIF sqlca.SQLCode = 100 THEN
  707. // rslt = 2
  708. // GOTO ext
  709. //END IF
  710. //
  711. //IF cnt > 0 THEN
  712. // rslt = 1
  713. // arg_msg = '该科目已经有业务发生'
  714. // GOTO ext
  715. //END IF
  716. //2.查询项目初始化数据
  717. cnt = 0
  718. //SELECT count(subid) INTO :cnt FROM cw_inititembala Where accsetid = :sys_accsetid AND subid = :arg_subid;
  719. //IF sqlca.SQLCode = -1 THEN
  720. // rslt = 0
  721. // arg_msg = '查询科目项目初始化数据失败 ~n'+sqlca.SQLErrText
  722. // GOTO ext
  723. //ELSEIF sqlca.SQLCode = 100 THEN
  724. // rslt = 2
  725. // GOTO ext
  726. //END IF
  727. //
  728. //IF cnt > 0 THEN
  729. // arg_msg = '该科目已经有业务发生'
  730. // GOTO ext
  731. //END IF
  732. //3.查询初始化期初数据
  733. cnt = 0
  734. SELECT count(subid) INTO :cnt FROM cw_initbalance
  735. WHERE accsetid = :sys_accsetid AND subid = :arg_subid
  736. AND (debit <> 0 OR credit <> 0 OR balance <> 0);
  737. IF sqlca.SQLCode = -1 THEN
  738. rslt = 0
  739. arg_msg = '查询科目初始化期初数据失败 ~n'+sqlca.SQLErrText
  740. GOTO ext
  741. ELSEIF sqlca.SQLCode = 100 THEN
  742. rslt = 2
  743. GOTO ext
  744. END IF
  745. IF cnt > 0 THEN
  746. rslt = 1
  747. arg_msg = '该科目已经有业务发生'
  748. GOTO ext
  749. END IF
  750. //4.查询凭证
  751. cnt = 0
  752. SELECT count(subid) INTO :cnt FROM cw_credencemx Where accsetid = :sys_accsetid AND subid = :arg_subid;
  753. IF sqlca.SQLCode = -1 THEN
  754. rslt = 0
  755. arg_msg = '查询科目凭证数据失败 ~n'+sqlca.SQLErrText
  756. GOTO ext
  757. ELSEIF sqlca.SQLCode = 100 THEN
  758. rslt = 2
  759. GOTO ext
  760. END IF
  761. IF cnt > 0 THEN
  762. rslt = 1
  763. arg_msg = '该科目已经有业务发生'
  764. GOTO ext
  765. END IF
  766. ext:
  767. RETURN rslt
  768. end function
  769. public function integer check_suboperation (integer arg_checktype, ref string arg_msg);//p_check_suboperation(arg_checktype,ref arg_msg)
  770. //arg_checktype
  771. //0:del,1:addchild
  772. //return 0:error ,1:yes ,2:no
  773. Int rslt
  774. String parent_subid
  775. IF arg_checktype = 0 THEN
  776. rslt = p_check_suboperation(subid,arg_msg)
  777. ELSE
  778. parent_subid = p_parent_subid(subid)
  779. rslt = p_check_suboperation(parent_subid,arg_msg)
  780. END IF
  781. RETURN rslt
  782. end function
  783. public function integer update_add_del (integer arg_add_or_del, string arg_subid, ref string arg_msg, boolean arg_ifcommit);Int rslt = 1
  784. String p_subid
  785. uo_init uo_init_update
  786. p_subid = p_parent_subid(arg_subid)
  787. IF p_subid = '' THEN
  788. rslt = 1
  789. GOTO ext
  790. END IF
  791. uo_init_update = CREATE uo_init
  792. IF uo_init_update.sub_add_del_update(arg_add_or_del,arg_subid,p_subid,arg_msg,arg_ifcommit) = 0 THEN
  793. rslt = 0
  794. GOTO ext
  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. public function integer uof_update_status (integer arg_type);if arg_type = 2 then
  805. it_newbegin = true
  806. it_newsubbegin = false
  807. it_updatebegin = false
  808. elseif arg_type = 1 then
  809. it_newbegin = false
  810. it_newsubbegin = true
  811. it_updatebegin = false
  812. elseif arg_type = 3 then
  813. it_newbegin = false
  814. it_newsubbegin = false
  815. it_updatebegin = true
  816. end if
  817. return 1
  818. end function
  819. public function integer p_update_subid_p (string arg_subid, ref string arg_msg);Int rslt = 1
  820. String ls_parent_subid
  821. ls_parent_subid = p_parent_subid(arg_subid)
  822. DO WHILE ls_parent_subid <> ''
  823. UPDATE cw_subject SET detailflag = 0
  824. WHERE accsetid = :sys_accsetid
  825. AND subid = :ls_parent_subid;
  826. IF sqlca.SQLCode <> 0 THEN
  827. rslt = 0
  828. arg_msg = '更新上级科目的下级科目标记失败'+ls_parent_subid
  829. GOTO ext
  830. END IF
  831. ls_parent_subid = p_parent_subid(ls_parent_subid)
  832. LOOP
  833. ext:
  834. IF rslt = 0 THEN
  835. ROLLBACK;
  836. END IF
  837. RETURN rslt
  838. end function
  839. on uo_subject.create
  840. call super::create
  841. TriggerEvent( this, "constructor" )
  842. end on
  843. on uo_subject.destroy
  844. TriggerEvent( this, "destructor" )
  845. call super::destroy
  846. end on
  847. event constructor;len_grade1=s_sys_accset.step1
  848. len_grade2=s_sys_accset.step1+s_sys_accset.step2
  849. len_grade3=s_sys_accset.step1+s_sys_accset.step2+s_sys_accset.step3
  850. len_grade4=s_sys_accset.step1+s_sys_accset.step2+s_sys_accset.step3+s_sys_accset.step4
  851. len_grade5=s_sys_accset.step1+s_sys_accset.step2+s_sys_accset.step3+s_sys_accset.step4+s_sys_accset.step5
  852. len_grade6=s_sys_accset.step1+s_sys_accset.step2+s_sys_accset.step3+s_sys_accset.step4+s_sys_accset.step5+s_sys_accset.step6
  853. subtree_cnt=ds_subjecttree.rowcount()
  854. end event