f_cmp_di_qty_noauditqty.srf 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. $PBExportHeader$f_cmp_di_qty_noauditqty.srf
  2. global type f_cmp_di_qty_noauditqty from function_object
  3. end type
  4. forward prototypes
  5. global function integer f_cmp_di_qty_noauditqty (long arg_mtrlid, long arg_storageid, string arg_status, string arg_woodcode, string arg_pcode, string arg_plancode, string arg_mtrlcuscode, ref decimal arg_ref_qty, ref string arg_lsg, ref string arg_msg)
  6. end prototypes
  7. global function integer f_cmp_di_qty_noauditqty (long arg_mtrlid, long arg_storageid, string arg_status, string arg_woodcode, string arg_pcode, string arg_plancode, string arg_mtrlcuscode, ref decimal arg_ref_qty, ref string arg_lsg, ref string arg_msg);Int rslt = 1
  8. Long cnt
  9. Long ll_SonMtrlid[]
  10. String ls_status,ls_woodcode,ls_pcode,ls_mtrlcuscode
  11. Decimal ld_Sonscale[],ld_Sonscale_fm[]
  12. Int li_ifover[],li_dipztype[],li_ifpack[]
  13. String ls_pf_status[],ls_pf_woodcode[],ls_pf_pcode[]
  14. Long it_mxt = 1
  15. Decimal ld_qty
  16. Long ll_i
  17. Long ll_statusflag,ll_woodcodeflag,ll_pcodeflag
  18. Int li_ifpackpro
  19. String ls_mtrlcode
  20. String ls_pf_mtrlcode[]
  21. s_mtrlcfg_expr s_mtrlcfg[]
  22. Long ll_cfg,ll_cnt_s_mtrlcfg
  23. int li_ifplancode
  24. SELECT ifplancode
  25. INTO :li_ifplancode
  26. FROM u_storage
  27. Where storageid = :arg_storageid;
  28. IF sqlca.SQLCode <> 0 THEN
  29. arg_msg = '查询仓库是否使用批号发货属性失败,'+sqlca.SQLErrText
  30. RETURN 0
  31. END IF
  32. SELECT ifpackpro,statusflag,woodcodeflag,pcodeflag,mtrlcode
  33. INTO :li_ifpackpro,:ll_statusflag,:ll_woodcodeflag,:ll_pcodeflag,:ls_mtrlcode
  34. FROM u_mtrldef
  35. Where mtrlid = :arg_mtrlid;
  36. IF sqlca.SQLCode <> 0 THEN
  37. arg_msg = '查询物料是否包件产品失败,'+sqlca.SQLErrText
  38. rslt = 0
  39. GOTO ext
  40. END IF
  41. IF ll_statusflag = 3 And ll_woodcodeflag = 3 And ll_pcodeflag = 3 THEN
  42. IF arg_status <> '' Or arg_woodcode <> '' Or arg_pcode <> '' THEN
  43. arg_ref_qty = 0
  44. rslt = 1
  45. GOTO ext
  46. END IF
  47. END IF
  48. Long ll_scid,ll_taskid,ll_printid
  49. Int li_ordertype_order
  50. IF li_ifpackpro = 1 Or li_ifpackpro = 2 THEN
  51. //查询个性包件产品订单明细是否有换包件
  52. IF li_ifpackpro = 2 And arg_mtrlcuscode <> '' THEN
  53. SELECT ordertype INTO :li_ordertype_order
  54. From u_order_ml Where ordercode = :arg_mtrlcuscode;
  55. IF sqlca.SQLCode <> 0 THEN
  56. cnt = 0
  57. ELSE
  58. IF li_ordertype_order = 4 THEN
  59. SELECT u_order_ml_p.scid,u_order_ml_p.taskid,u_order_ml_p.taskmxid
  60. INTO :ll_scid,:ll_taskid,:ll_printid
  61. FROM u_order_ml,u_order_ml u_order_ml_p
  62. WHERE u_order_ml.ordercode = :arg_mtrlcuscode
  63. AND u_order_ml.scid = u_order_ml_p.scid
  64. And u_order_ml.porderid = u_order_ml_p.orderid;
  65. IF sqlca.SQLCode <> 0 THEN
  66. ll_taskid = 0
  67. END IF
  68. ELSE
  69. SELECT scid,taskid,taskmxid
  70. INTO :ll_scid,:ll_taskid,:ll_printid
  71. FROM u_order_ml
  72. Where ordercode = :arg_mtrlcuscode;
  73. IF sqlca.SQLCode <> 0 THEN
  74. ll_taskid = 0
  75. END IF
  76. END IF
  77. IF ll_taskid = 0 THEN
  78. cnt = 0
  79. ELSE
  80. //查是否有换清单
  81. SELECT count(*) INTO :cnt FROM u_saletaskmx_pf
  82. WHERE scid = :ll_scid
  83. AND taskid = :ll_taskid
  84. And printid = :ll_printid;
  85. IF sqlca.SQLCode <> 0 THEN
  86. cnt = 0
  87. END IF
  88. END IF
  89. END IF
  90. END IF
  91. IF cnt > 0 THEN
  92. DECLARE cur_pf_saletaskmx CURSOR FOR
  93. SELECT u_saletaskmx_pf.SonMtrlid,
  94. u_saletaskmx_pf.Sonscale,
  95. u_saletaskmx_pf.Sonscale_fm,
  96. u_saletaskmx_pf.status,
  97. u_saletaskmx_pf.woodcode,
  98. u_saletaskmx_pf.pcode,
  99. 0,
  100. 0,
  101. u_mtrldef.ifpack,
  102. u_mtrldef.mtrlcode
  103. FROM u_saletaskmx_pf,u_mtrldef
  104. WHERE ( u_saletaskmx_pf.scid = :ll_scid )
  105. AND ( u_saletaskmx_pf.taskid = :ll_taskid )
  106. AND ( u_saletaskmx_pf.printid = :ll_printid )
  107. And ( u_saletaskmx_pf.SonMtrlid = u_mtrldef.mtrlid );
  108. OPEN cur_pf_saletaskmx;
  109. FETCH cur_pf_saletaskmx INTO :ll_SonMtrlid[it_mxt],:ld_Sonscale[it_mxt],:ld_Sonscale_fm[it_mxt],:ls_pf_status[it_mxt],
  110. :ls_pf_woodcode[it_mxt],:ls_pf_pcode[it_mxt],:li_ifover[it_mxt],:li_dipztype[it_mxt],
  111. :li_ifpack[it_mxt],:ls_pf_mtrlcode[it_mxt];
  112. DO WHILE sqlca.SQLCode = 0
  113. it_mxt++
  114. FETCH cur_pf_saletaskmx INTO :ll_SonMtrlid[it_mxt],:ld_Sonscale[it_mxt],:ld_Sonscale_fm[it_mxt],:ls_pf_status[it_mxt],
  115. :ls_pf_woodcode[it_mxt],:ls_pf_pcode[it_mxt],:li_ifover[it_mxt],:li_dipztype[it_mxt],
  116. :li_ifpack[it_mxt],:ls_pf_mtrlcode[it_mxt];
  117. LOOP
  118. it_mxt = it_mxt - 1
  119. CLOSE cur_pf_saletaskmx;
  120. ELSE
  121. DECLARE cur_pf CURSOR FOR
  122. SELECT u_PrdPF.SonMtrlid,
  123. u_PrdPF.Sonscale,
  124. 1,
  125. u_PrdPF.status,
  126. u_PrdPF.woodcode,
  127. u_PrdPF.pcode,
  128. u_PrdPF.ifover,
  129. u_prdpf.dipztype,
  130. u_mtrldef.ifpack,
  131. u_mtrldef.mtrlcode
  132. FROM u_PrdPF,u_mtrl_pf,u_mtrldef
  133. WHERE (u_PrdPF.mtrlid = :arg_mtrlid)
  134. AND ( u_mtrl_pf.ifdi = 1 AND :li_ifpackpro = 0
  135. OR u_mtrl_pf.ifdft = 1 AND (:li_ifpackpro = 1 OR :li_ifpackpro = 2) AND u_mtrldef.ifpack > 0)
  136. AND ( u_PrdPF.mtrlid = u_mtrl_pf.mtrlid )
  137. AND ( u_PrdPF.SonMtrlid = u_mtrldef.mtrlid )
  138. And ( u_PrdPF.pfcode = u_mtrl_pf.pfcode ) Order By u_PrdPF.printid;
  139. OPEN cur_pf;
  140. FETCH cur_pf INTO :ll_SonMtrlid[it_mxt],:ld_Sonscale[it_mxt],:ld_Sonscale_fm[it_mxt],:ls_pf_status[it_mxt],
  141. :ls_pf_woodcode[it_mxt],:ls_pf_pcode[it_mxt],:li_ifover[it_mxt],:li_dipztype[it_mxt],
  142. :li_ifpack[it_mxt],:ls_pf_mtrlcode[it_mxt];
  143. DO WHILE sqlca.SQLCode = 0
  144. it_mxt++
  145. FETCH cur_pf INTO :ll_SonMtrlid[it_mxt],:ld_Sonscale[it_mxt],:ld_Sonscale_fm[it_mxt],:ls_pf_status[it_mxt],
  146. :ls_pf_woodcode[it_mxt],:ls_pf_pcode[it_mxt],:li_ifover[it_mxt],:li_dipztype[it_mxt],
  147. :li_ifpack[it_mxt],:ls_pf_mtrlcode[it_mxt];
  148. LOOP
  149. it_mxt = it_mxt - 1
  150. CLOSE cur_pf;
  151. IF it_mxt = 0 THEN
  152. IF li_ifpackpro = 0 THEN
  153. arg_msg = '该产品没有建立组装清单,不能计算'
  154. ELSE
  155. arg_msg = '该产品没有建立默认清单,不能计算'
  156. END IF
  157. arg_ref_qty = 0
  158. rslt = 1
  159. GOTO ext
  160. END IF
  161. END IF
  162. elseif li_ifpackpro = 5 then
  163. DECLARE cur_pf5 CURSOR FOR
  164. SELECT u_PrdPF.SonMtrlid,
  165. u_PrdPF.Sonscale,
  166. 1,
  167. u_PrdPF.status,
  168. u_PrdPF.woodcode,
  169. u_PrdPF.pcode,
  170. u_PrdPF.ifover,
  171. u_prdpf.dipztype,
  172. u_mtrldef.ifpack,
  173. u_mtrldef.mtrlcode
  174. FROM u_PrdPF,u_mtrldef
  175. WHERE (u_PrdPF.mtrlid = :arg_mtrlid)
  176. AND ( u_PrdPF.SonMtrlid = u_mtrldef.mtrlid )
  177. And ( u_PrdPF.pfcode = :arg_status )
  178. And ( u_mtrldef.ifpack > 0 ) Order By u_PrdPF.printid;
  179. OPEN cur_pf5;
  180. FETCH cur_pf5 INTO :ll_SonMtrlid[it_mxt],:ld_Sonscale[it_mxt],:ld_Sonscale_fm[it_mxt],:ls_pf_status[it_mxt],
  181. :ls_pf_woodcode[it_mxt],:ls_pf_pcode[it_mxt],:li_ifover[it_mxt],:li_dipztype[it_mxt],
  182. :li_ifpack[it_mxt],:ls_pf_mtrlcode[it_mxt];
  183. DO WHILE sqlca.SQLCode = 0
  184. it_mxt++
  185. FETCH cur_pf5 INTO :ll_SonMtrlid[it_mxt],:ld_Sonscale[it_mxt],:ld_Sonscale_fm[it_mxt],:ls_pf_status[it_mxt],
  186. :ls_pf_woodcode[it_mxt],:ls_pf_pcode[it_mxt],:li_ifover[it_mxt],:li_dipztype[it_mxt],
  187. :li_ifpack[it_mxt],:ls_pf_mtrlcode[it_mxt];
  188. LOOP
  189. it_mxt = it_mxt - 1
  190. CLOSE cur_pf5;
  191. IF it_mxt = 0 THEN
  192. arg_msg = '该产品没有建立包件清单,不能计算'
  193. arg_ref_qty = 0
  194. rslt = 1
  195. GOTO ext
  196. END IF
  197. ELSEIF li_ifpackpro = 3 Or li_ifpackpro = 4 THEN
  198. it_mxt = 0
  199. IF arg_status = '' THEN
  200. arg_ref_qty = 0
  201. rslt = 1
  202. GOTO ext
  203. ELSE
  204. f_checkpz(arg_status,s_mtrlcfg)
  205. ll_cnt_s_mtrlcfg = UpperBound(s_mtrlcfg)
  206. IF ll_cnt_s_mtrlcfg = 0 THEN
  207. arg_ref_qty = 0
  208. rslt = 1
  209. GOTO ext
  210. ELSE
  211. FOR ll_cfg = 1 To ll_cnt_s_mtrlcfg
  212. it_mxt++
  213. ll_SonMtrlid[it_mxt] = arg_mtrlid
  214. ls_pf_status[it_mxt] = s_mtrlcfg[ll_cfg].cfgname
  215. ls_pf_woodcode[it_mxt] = arg_woodcode
  216. ls_pf_pcode[it_mxt] = arg_pcode
  217. ls_pf_mtrlcode[it_mxt] = ls_mtrlcode
  218. ld_Sonscale[it_mxt] = Dec(s_mtrlcfg[ll_cfg].qty)
  219. ld_Sonscale_fm[it_mxt] = 1
  220. li_ifover[it_mxt] = 0
  221. li_ifpack[it_mxt] = 0
  222. NEXT
  223. END IF
  224. END IF
  225. END IF
  226. Decimal ld_noallocqty,ld_allqty,ld_maxqty
  227. ld_maxqty = 1000000
  228. FOR ll_i = 1 To it_mxt
  229. IF li_ifover[ll_i] = 1 THEN
  230. CHOOSE CASE li_dipztype[ll_i]
  231. CASE 0
  232. ls_status = arg_status
  233. ls_woodcode = ''
  234. ls_pcode = ''
  235. CASE 1
  236. ls_status = ''
  237. ls_woodcode = arg_woodcode
  238. ls_pcode = ''
  239. CASE 2
  240. ls_status = ''
  241. ls_woodcode = ''
  242. ls_pcode = arg_pcode
  243. CASE 3
  244. ls_status = arg_status
  245. ls_woodcode = arg_woodcode
  246. ls_pcode = ''
  247. CASE 4
  248. ls_status = ''
  249. ls_woodcode = arg_woodcode
  250. ls_pcode = arg_pcode
  251. CASE 5
  252. ls_status = arg_status
  253. ls_woodcode = ''
  254. ls_pcode = arg_pcode
  255. CASE 6
  256. ls_status = arg_status
  257. ls_woodcode = arg_woodcode
  258. ls_pcode = arg_pcode
  259. END CHOOSE
  260. ELSE
  261. ls_status = ls_pf_status[ll_i]
  262. ls_woodcode = ls_pf_woodcode[ll_i]
  263. ls_pcode = ls_pf_pcode[ll_i]
  264. END IF
  265. IF li_ifpackpro = 2 Or li_ifpackpro = 4 THEN
  266. ls_mtrlcuscode = arg_mtrlcuscode
  267. ELSE
  268. ls_mtrlcuscode = ''
  269. END IF
  270. ld_noallocqty = 0
  271. ld_allqty = 0
  272. SELECT isnull(sum(u_mtrlware.noallocqty - u_mtrlware.noauditingqty),0)
  273. INTO :ld_noallocqty
  274. FROM u_mtrlware INNER JOIN
  275. u_storage ON u_mtrlware.storageid = u_storage.storageid
  276. WHERE (( u_mtrlware.storageid = :arg_storageid AND :arg_storageid > 0 )OR
  277. (:arg_storageid = -1 AND u_storage.ifmrp = 1 ))
  278. AND u_mtrlware.mtrlid = :ll_SonMtrlid[ll_i]
  279. AND ( u_mtrlware.status = :ls_status )
  280. AND ( u_mtrlware.woodcode = :ls_woodcode )
  281. AND ( u_mtrlware.pcode = :ls_pcode )
  282. AND ( u_mtrlware.plancode = :arg_plancode and :li_ifplancode = 1 or :li_ifplancode = 0 )
  283. And ( u_mtrlware.mtrlcuscode = :ls_mtrlcuscode And :li_ifpack[ll_i] = 2 Or :li_ifpack[ll_i] <> 2 );
  284. IF sqlca.SQLCode <> 0 THEN
  285. arg_msg = '查询该产品组装件或包件:'+ls_pf_mtrlcode[ll_i]+',库存未开单数失败,'+sqlca.SQLErrText
  286. rslt = 0
  287. GOTO ext
  288. END IF
  289. if ld_Sonscale[ll_i] = 0 then
  290. ld_allqty = 0
  291. else
  292. ld_allqty = ld_noallocqty * ld_Sonscale_fm[ll_i]/ld_Sonscale[ll_i]
  293. end if
  294. arg_lsg = arg_lsg + '组装件或包件:'+ls_pf_mtrlcode[ll_i]+',可装数:'+String(Truncate ( ld_allqty, 0 ),'#,##0')+'~n'
  295. ld_maxqty = Min(ld_maxqty,ld_allqty)
  296. IF IsNull(ld_maxqty) THEN ld_maxqty = 0
  297. NEXT
  298. ld_qty = Truncate ( ld_maxqty, 0 )
  299. arg_lsg = '最大组装数:' + String(ld_qty,'#,##0')+'~n ~n' + arg_lsg
  300. arg_ref_qty = ld_qty
  301. ext:
  302. RETURN rslt
  303. end function