uo_cmpl_mtrlprice.sru 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. $PBExportHeader$uo_cmpl_mtrlprice.sru
  2. forward
  3. global type uo_cmpl_mtrlprice from nonvisualobject
  4. end type
  5. end forward
  6. global type uo_cmpl_mtrlprice from nonvisualobject
  7. end type
  8. global uo_cmpl_mtrlprice uo_cmpl_mtrlprice
  9. type variables
  10. long deep = 0
  11. boolean ifcmpl_1 = false
  12. end variables
  13. forward prototypes
  14. public function integer uof_get_cost (long arg_mtrlid, string arg_mtrlcode, string arg_pfcode, decimal arg_qty, long arg_lp, ref s_mtrlprice_sum arg_s_price, ref string arg_msg)
  15. public function integer uof_get_wageprice (long arg_mtrlid, string arg_mtrlcode, decimal arg_qty, ref s_mtrlprice_sum arg_s_price, ref string arg_msg)
  16. end prototypes
  17. public function integer uof_get_cost (long arg_mtrlid, string arg_mtrlcode, string arg_pfcode, decimal arg_qty, long arg_lp, ref s_mtrlprice_sum arg_s_price, ref string arg_msg);Int rslt = 1
  18. Decimal Sonscale,SonLoss,SonDECLosS
  19. Long SonMtrlid,count = 0,ls_i
  20. String mtrlcode, mtrlname
  21. s_pfmx ls_s_pfmx[]
  22. Decimal ld_price,ld_qty,ld_outcost,ld_wageprice
  23. Decimal ld_planprice
  24. Int li_mtrlorigin
  25. String ls_mtrlsectype
  26. deep++
  27. IF deep > 10000 THEN //防止死递归
  28. arg_msg = '物料:'+arg_mtrlcode+'死循环'
  29. rslt = 0
  30. GOTO ext
  31. END IF
  32. DECLARE pf_cur CURSOR FOR
  33. SELECT u_PrdPF.Sonscale,
  34. u_PrdPF.SonLoss,
  35. u_PrdPF.SonDECLosS,
  36. u_PrdPF.SonMtrlid,
  37. u_mtrldef.mtrlcode,
  38. u_PrdPF.sonpfcode
  39. FROM u_PrdPF,
  40. u_mtrldef
  41. WHERE ( u_PrdPF.SonMtrlid = u_mtrldef.mtrlid ) AND
  42. ( u_PrdPF.mtrlid = :arg_mtrlid ) AND
  43. ( u_PrdPF.pfcode = :arg_pfcode );
  44. OPEN pf_cur;
  45. count = 1
  46. FETCH pf_cur INTO :ls_s_pfmx[count].Sonscale,:ls_s_pfmx[count].SonLoss,&
  47. :ls_s_pfmx[count].SonDECLosS,:ls_s_pfmx[count].SonMtrlid,&
  48. :ls_s_pfmx[count].mtrlcode,:ls_s_pfmx[count].sonpfcode;
  49. DO WHILE sqlca.SQLCode = 0
  50. count++
  51. FETCH pf_cur INTO :ls_s_pfmx[count].Sonscale,:ls_s_pfmx[count].SonLoss,&
  52. :ls_s_pfmx[count].SonDECLosS,:ls_s_pfmx[count].SonMtrlid,&
  53. :ls_s_pfmx[count].mtrlcode,:ls_s_pfmx[count].sonpfcode;
  54. LOOP
  55. count = count - 1
  56. CLOSE pf_cur;
  57. IF arg_lp > 1 OR ifcmpl_1 THEN
  58. SELECT mtrlorigin,planprice,mtrlsectype
  59. INTO :li_mtrlorigin,:ld_planprice,:ls_mtrlsectype
  60. FROM u_mtrldef
  61. Where mtrlid = :arg_mtrlid;
  62. IF sqlca.SQLCode <> 0 THEN
  63. arg_msg = '查询:'+arg_mtrlcode+'来源失败'
  64. rslt = 0
  65. GOTO ext
  66. END IF
  67. CHOOSE CASE li_mtrlorigin
  68. CASE 2,3
  69. SELECT price INTO :ld_price
  70. FROM v_maxprice_sptprice
  71. Where mtrlid = :arg_mtrlid;
  72. IF sqlca.SQLCode = -1 THEN
  73. arg_msg = '查询物料:'+arg_mtrlcode+'最新采购价或最新外加工单价失败'
  74. rslt = 0
  75. GOTO ext
  76. END IF
  77. IF IsNull(ld_price) THEN ld_price = 0
  78. IF li_mtrlorigin = 3 THEN
  79. arg_s_price.wfjgprice = arg_s_price.wfjgprice + ld_price * arg_qty
  80. END IF
  81. IF li_mtrlorigin = 2 AND count = 0 THEN
  82. CHOOSE CASE ls_mtrlsectype
  83. CASE '木材'
  84. arg_s_price.mucai = arg_s_price.mucai + ld_price * arg_qty
  85. CASE '板材/面板'
  86. arg_s_price.bancai = arg_s_price.bancai + ld_price * arg_qty
  87. CASE '油漆'
  88. arg_s_price.youqi = arg_s_price.youqi + ld_price * arg_qty
  89. CASE '皮/布'
  90. arg_s_price.pibu = arg_s_price.pibu + ld_price * arg_qty
  91. CASE '海绵'
  92. arg_s_price.haimian = arg_s_price.haimian + ld_price * arg_qty
  93. CASE '纸箱'
  94. arg_s_price.zhixiang = arg_s_price.zhixiang + ld_price * arg_qty
  95. CASE '包材'
  96. arg_s_price.baocai = arg_s_price.baocai + ld_price * arg_qty
  97. CASE '配件/五金'
  98. arg_s_price.peijian = arg_s_price.peijian + ld_price * arg_qty
  99. END CHOOSE
  100. rslt = 1
  101. GOTO ext
  102. END IF
  103. CASE 0
  104. //计算人工
  105. IF uof_get_wageprice(arg_mtrlid,arg_mtrlcode,arg_qty,arg_s_price,arg_msg) = 0 THEN
  106. rslt = 0
  107. GOTO ext
  108. END IF
  109. END CHOOSE
  110. END IF
  111. FOR ls_i = 1 TO count
  112. ld_qty = arg_qty * (ls_s_pfmx[ls_i].Sonscale / (1 - ls_s_pfmx[ls_i].SonLoss) + ls_s_pfmx[ls_i].SonDECLosS)
  113. IF uof_get_cost(ls_s_pfmx[ls_i].SonMtrlid,ls_s_pfmx[ls_i].mtrlcode,ls_s_pfmx[ls_i].sonpfcode,ld_qty,arg_lp+1,arg_s_price,arg_msg) = 0 THEN
  114. rslt = 0
  115. GOTO ext
  116. END IF
  117. NEXT
  118. ext:
  119. RETURN rslt
  120. end function
  121. public function integer uof_get_wageprice (long arg_mtrlid, string arg_mtrlcode, decimal arg_qty, ref s_mtrlprice_sum arg_s_price, ref string arg_msg);Int rslt = 1
  122. Decimal ld_wageprice
  123. SELECT sum(u_sc_workprice.workprice * u_sc_workprice.workqty) INTO :ld_wageprice
  124. FROM u_sc_workprice INNER JOIN
  125. u_sc_workgroup ON u_sc_workprice.wrkGrpid = u_sc_workgroup.wrkGrpid
  126. WHERE u_sc_workprice.ifownpro = 0
  127. AND u_sc_workprice.mtrlid = :arg_mtrlid
  128. AND u_sc_workgroup.dscrp = '木工';
  129. IF sqlca.SQLCode = -1 THEN
  130. arg_msg = '查询物料:'+arg_mtrlcode+'本厂工价失败'
  131. rslt = 0
  132. GOTO ext
  133. END IF
  134. IF IsNull(ld_wageprice) THEN ld_wageprice = 0
  135. arg_s_price.mugong_rl = arg_s_price.mugong_rl + ld_wageprice * arg_qty
  136. SELECT sum(u_sc_workprice.workprice * u_sc_workprice.workqty) INTO :ld_wageprice
  137. FROM u_sc_workprice INNER JOIN
  138. u_sc_workgroup ON u_sc_workprice.wrkGrpid = u_sc_workgroup.wrkGrpid
  139. WHERE u_sc_workprice.ifownpro = 0
  140. AND u_sc_workprice.mtrlid = :arg_mtrlid
  141. AND u_sc_workgroup.dscrp = '油漆';
  142. IF sqlca.SQLCode = -1 THEN
  143. arg_msg = '查询物料:'+arg_mtrlcode+'本厂工价失败'
  144. rslt = 0
  145. GOTO ext
  146. END IF
  147. IF IsNull(ld_wageprice) THEN ld_wageprice = 0
  148. arg_s_price.youqi_rl = arg_s_price.youqi_rl + ld_wageprice * arg_qty
  149. SELECT sum(u_sc_workprice.workprice * u_sc_workprice.workqty) INTO :ld_wageprice
  150. FROM u_sc_workprice INNER JOIN
  151. u_sc_workgroup ON u_sc_workprice.wrkGrpid = u_sc_workgroup.wrkGrpid
  152. WHERE u_sc_workprice.ifownpro = 0
  153. AND u_sc_workprice.mtrlid = :arg_mtrlid
  154. AND u_sc_workgroup.dscrp = '软体前工序';
  155. IF sqlca.SQLCode = -1 THEN
  156. arg_msg = '查询物料:'+arg_mtrlcode+'本厂工价失败'
  157. rslt = 0
  158. GOTO ext
  159. END IF
  160. IF IsNull(ld_wageprice) THEN ld_wageprice = 0
  161. arg_s_price.ruanti_rl = arg_s_price.ruanti_rl + ld_wageprice * arg_qty
  162. SELECT sum(u_sc_workprice.workprice * u_sc_workprice.workqty) INTO :ld_wageprice
  163. FROM u_sc_workprice INNER JOIN
  164. u_sc_workgroup ON u_sc_workprice.wrkGrpid = u_sc_workgroup.wrkGrpid
  165. WHERE u_sc_workprice.ifownpro = 0
  166. AND u_sc_workprice.mtrlid = :arg_mtrlid
  167. AND u_sc_workgroup.dscrp = '扪皮及包装';
  168. IF sqlca.SQLCode = -1 THEN
  169. arg_msg = '查询物料:'+arg_mtrlcode+'本厂工价失败'
  170. rslt = 0
  171. GOTO ext
  172. END IF
  173. IF IsNull(ld_wageprice) THEN ld_wageprice = 0
  174. arg_s_price.mengpi_rl = arg_s_price.mengpi_rl + ld_wageprice * arg_qty
  175. ext:
  176. RETURN rslt
  177. end function
  178. on uo_cmpl_mtrlprice.create
  179. call super::create
  180. TriggerEvent( this, "constructor" )
  181. end on
  182. on uo_cmpl_mtrlprice.destroy
  183. TriggerEvent( this, "destructor" )
  184. call super::destroy
  185. end on