f_cmp_di_qty.srf 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. $PBExportHeader$f_cmp_di_qty.srf
  2. global type f_cmp_di_qty from function_object
  3. end type
  4. forward prototypes
  5. global function integer f_cmp_di_qty (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 decimal arg_ref_pack_min_nofpqty, ref decimal arg_ref_noauditingqty_ifpackpro, ref string arg_lsg, ref string arg_msg)
  6. end prototypes
  7. global function integer f_cmp_di_qty (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 decimal arg_ref_pack_min_nofpqty, ref decimal arg_ref_noauditingqty_ifpackpro, 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. Decimal ld_canpack_fp,ld_maxqty_fp,ld_allqty_fp,ld_qty_fp
  22. s_mtrlcfg_expr s_mtrlcfg[]
  23. Long ll_cfg,ll_cnt_s_mtrlcfg
  24. Int li_ifplancode
  25. Select ifplancode
  26. Into :li_ifplancode
  27. From u_storage
  28. Where storageid = :arg_storageid;
  29. If sqlca.SQLCode <> 0 Then
  30. arg_msg = '查询仓库是否使用批号发货属性失败,'+sqlca.SQLErrText
  31. Return 0
  32. End If
  33. Select ifpackpro,statusflag,woodcodeflag,pcodeflag,mtrlcode
  34. Into :li_ifpackpro,:ll_statusflag,:ll_woodcodeflag,:ll_pcodeflag,:ls_mtrlcode
  35. From u_mtrldef
  36. Where mtrlid = :arg_mtrlid;
  37. If sqlca.SQLCode <> 0 Then
  38. arg_msg = '查询物料是否包件产品失败,'+sqlca.SQLErrText
  39. rslt = 0
  40. Goto ext
  41. End If
  42. If ll_statusflag = 3 And ll_woodcodeflag = 3 And ll_pcodeflag = 3 Then
  43. If arg_status <> '' Or arg_woodcode <> '' Or arg_pcode <> '' Then
  44. arg_ref_qty = 0
  45. rslt = 1
  46. Goto ext
  47. End If
  48. End If
  49. Long ll_scid,ll_taskid,ll_printid
  50. Int li_ordertype_order
  51. If li_ifpackpro = 1 Or li_ifpackpro = 2 Then
  52. //查询个性包件产品订单明细是否有换包件
  53. If li_ifpackpro = 2 And arg_mtrlcuscode <> '' Then
  54. Select ordertype Into :li_ordertype_order
  55. From u_order_ml Where ordercode = :arg_mtrlcuscode;
  56. If sqlca.SQLCode <> 0 Then
  57. cnt = 0
  58. Else
  59. If li_ordertype_order = 4 Then
  60. Select u_order_ml_p.scid,u_order_ml_p.taskid,u_order_ml_p.taskmxid
  61. Into :ll_scid,:ll_taskid,:ll_printid
  62. From u_order_ml,u_order_ml u_order_ml_p
  63. Where u_order_ml.ordercode = :arg_mtrlcuscode
  64. And u_order_ml.scid = u_order_ml_p.scid
  65. And u_order_ml.porderid = u_order_ml_p.orderid;
  66. If sqlca.SQLCode <> 0 Then
  67. ll_taskid = 0
  68. End If
  69. Else
  70. Select scid,taskid,taskmxid
  71. Into :ll_scid,:ll_taskid,:ll_printid
  72. From u_order_ml
  73. Where ordercode = :arg_mtrlcuscode;
  74. If sqlca.SQLCode <> 0 Then
  75. ll_taskid = 0
  76. End If
  77. End If
  78. If ll_taskid = 0 Then
  79. cnt = 0
  80. Else
  81. //查是否有换清单
  82. Select count(*) Into :cnt From u_saletaskmx_pf
  83. Where scid = :ll_scid
  84. And taskid = :ll_taskid
  85. And printid = :ll_printid;
  86. If sqlca.SQLCode <> 0 Then
  87. cnt = 0
  88. End If
  89. End If
  90. End If
  91. End If
  92. If cnt > 0 Then
  93. Declare cur_pf_saletaskmx Cursor For
  94. Select u_saletaskmx_pf.SonMtrlid,
  95. u_saletaskmx_pf.Sonscale,
  96. u_saletaskmx_pf.Sonscale_fm,
  97. u_saletaskmx_pf.status,
  98. u_saletaskmx_pf.woodcode,
  99. u_saletaskmx_pf.pcode,
  100. 0,
  101. 0,
  102. u_mtrldef.ifpack,
  103. u_mtrldef.mtrlcode
  104. From u_saletaskmx_pf,u_mtrldef
  105. Where ( u_saletaskmx_pf.scid = :ll_scid )
  106. And ( u_saletaskmx_pf.taskid = :ll_taskid )
  107. And ( u_saletaskmx_pf.printid = :ll_printid )
  108. And ( u_saletaskmx_pf.SonMtrlid = u_mtrldef.mtrlid );
  109. Open cur_pf_saletaskmx;
  110. Fetch cur_pf_saletaskmx Into :ll_SonMtrlid[it_mxt],:ld_Sonscale[it_mxt],:ld_Sonscale_fm[it_mxt],:ls_pf_status[it_mxt],
  111. :ls_pf_woodcode[it_mxt],:ls_pf_pcode[it_mxt],:li_ifover[it_mxt],:li_dipztype[it_mxt],
  112. :li_ifpack[it_mxt],:ls_pf_mtrlcode[it_mxt];
  113. Do While sqlca.SQLCode = 0
  114. it_mxt++
  115. Fetch cur_pf_saletaskmx Into :ll_SonMtrlid[it_mxt],:ld_Sonscale[it_mxt],:ld_Sonscale_fm[it_mxt],:ls_pf_status[it_mxt],
  116. :ls_pf_woodcode[it_mxt],:ls_pf_pcode[it_mxt],:li_ifover[it_mxt],:li_dipztype[it_mxt],
  117. :li_ifpack[it_mxt],:ls_pf_mtrlcode[it_mxt];
  118. Loop
  119. it_mxt = it_mxt - 1
  120. Close cur_pf_saletaskmx;
  121. Else
  122. Declare cur_pf Cursor For
  123. Select u_PrdPF.SonMtrlid,
  124. u_PrdPF.Sonscale,
  125. 1,
  126. u_PrdPF.status,
  127. u_PrdPF.woodcode,
  128. u_PrdPF.pcode,
  129. u_PrdPF.ifover,
  130. u_prdpf.dipztype,
  131. u_mtrldef.ifpack,
  132. u_mtrldef.mtrlcode
  133. From u_PrdPF,u_mtrl_pf,u_mtrldef
  134. Where (u_PrdPF.mtrlid = :arg_mtrlid)
  135. And ( u_mtrl_pf.ifdi = 1 And :li_ifpackpro = 0
  136. Or u_mtrl_pf.ifdft = 1 And (:li_ifpackpro = 1 Or :li_ifpackpro = 2) And u_mtrldef.ifpack > 0)
  137. And ( u_PrdPF.mtrlid = u_mtrl_pf.mtrlid )
  138. And ( u_PrdPF.pfcode = u_mtrl_pf.pfcode )
  139. And ( u_PrdPF.SonMtrlid = u_mtrldef.mtrlid ) Order By u_PrdPF.printid;
  140. Open cur_pf;
  141. Fetch cur_pf Into :ll_SonMtrlid[it_mxt],:ld_Sonscale[it_mxt],:ld_Sonscale_fm[it_mxt],:ls_pf_status[it_mxt],
  142. :ls_pf_woodcode[it_mxt],:ls_pf_pcode[it_mxt],:li_ifover[it_mxt],:li_dipztype[it_mxt],
  143. :li_ifpack[it_mxt],:ls_pf_mtrlcode[it_mxt];
  144. Do While sqlca.SQLCode = 0
  145. it_mxt++
  146. Fetch cur_pf Into :ll_SonMtrlid[it_mxt],:ld_Sonscale[it_mxt],:ld_Sonscale_fm[it_mxt],:ls_pf_status[it_mxt],
  147. :ls_pf_woodcode[it_mxt],:ls_pf_pcode[it_mxt],:li_ifover[it_mxt],:li_dipztype[it_mxt],
  148. :li_ifpack[it_mxt],:ls_pf_mtrlcode[it_mxt];
  149. Loop
  150. it_mxt = it_mxt - 1
  151. Close cur_pf;
  152. End If
  153. If it_mxt = 0 Then
  154. If li_ifpackpro = 0 Then
  155. arg_msg = '该产品'+ls_mtrlcode+'没有建立组装清单,不能计算'
  156. Else
  157. arg_msg = '该产品'+ls_mtrlcode+'没有建立默认清单,不能计算'
  158. End If
  159. arg_ref_qty = 0
  160. rslt = 1
  161. Goto ext
  162. End If
  163. ElseIf li_ifpackpro = 5 Then
  164. Declare cur_pf5 Cursor For
  165. Select u_PrdPF.SonMtrlid,
  166. u_PrdPF.Sonscale,
  167. 1,
  168. u_PrdPF.status,
  169. u_PrdPF.woodcode,
  170. u_PrdPF.pcode,
  171. u_PrdPF.ifover,
  172. u_prdpf.dipztype,
  173. u_mtrldef.ifpack,
  174. u_mtrldef.mtrlcode
  175. From u_PrdPF,u_mtrldef
  176. Where (u_PrdPF.mtrlid = :arg_mtrlid)
  177. And ( u_PrdPF.pfcode = :arg_status )
  178. And ( u_PrdPF.SonMtrlid = u_mtrldef.mtrlid )
  179. And ( u_mtrldef.ifpack > 0 )
  180. Order By u_PrdPF.printid;
  181. Open cur_pf5;
  182. Fetch cur_pf5 Into :ll_SonMtrlid[it_mxt],:ld_Sonscale[it_mxt],:ld_Sonscale_fm[it_mxt],:ls_pf_status[it_mxt],
  183. :ls_pf_woodcode[it_mxt],:ls_pf_pcode[it_mxt],:li_ifover[it_mxt],:li_dipztype[it_mxt],
  184. :li_ifpack[it_mxt],:ls_pf_mtrlcode[it_mxt];
  185. Do While sqlca.SQLCode = 0
  186. it_mxt++
  187. Fetch cur_pf5 Into :ll_SonMtrlid[it_mxt],:ld_Sonscale[it_mxt],:ld_Sonscale_fm[it_mxt],:ls_pf_status[it_mxt],
  188. :ls_pf_woodcode[it_mxt],:ls_pf_pcode[it_mxt],:li_ifover[it_mxt],:li_dipztype[it_mxt],
  189. :li_ifpack[it_mxt],:ls_pf_mtrlcode[it_mxt];
  190. Loop
  191. it_mxt = it_mxt - 1
  192. Close cur_pf5;
  193. If it_mxt = 0 Then
  194. arg_msg = '该产品'+ls_mtrlcode+'没有包件清单,不能计算'
  195. arg_ref_qty = 0
  196. rslt = 1
  197. Goto ext
  198. End If
  199. ElseIf li_ifpackpro = 3 Or li_ifpackpro = 4 Then
  200. it_mxt = 0
  201. If arg_status = '' Then
  202. arg_ref_qty = 0
  203. arg_ref_pack_min_nofpqty = 0
  204. arg_ref_noauditingqty_ifpackpro = 0
  205. rslt = 1
  206. Goto ext
  207. Else
  208. f_checkpz(arg_status,s_mtrlcfg)
  209. ll_cnt_s_mtrlcfg = UpperBound(s_mtrlcfg)
  210. If ll_cnt_s_mtrlcfg = 0 Then
  211. arg_ref_qty = 0
  212. arg_ref_pack_min_nofpqty = 0
  213. arg_ref_noauditingqty_ifpackpro = 0
  214. rslt = 1
  215. Goto ext
  216. Else
  217. For ll_cfg = 1 To ll_cnt_s_mtrlcfg
  218. it_mxt++
  219. ll_SonMtrlid[it_mxt] = arg_mtrlid
  220. ls_pf_status[it_mxt] = s_mtrlcfg[ll_cfg].cfgname
  221. ls_pf_woodcode[it_mxt] = arg_woodcode
  222. ls_pf_pcode[it_mxt] = arg_pcode
  223. ls_pf_mtrlcode[it_mxt] = ls_mtrlcode
  224. ld_Sonscale[it_mxt] = Dec(s_mtrlcfg[ll_cfg].qty)
  225. ld_Sonscale_fm[it_mxt] = 1
  226. li_ifover[it_mxt] = 0
  227. li_ifpack[it_mxt] = 0
  228. Next
  229. End If
  230. End If
  231. Else
  232. it_mxt = 0
  233. End If
  234. Decimal ld_noallocqty,ld_noauditingqty,ld_allqty,ld_maxqty
  235. Decimal ld_pack_fpqty,ld_pack_min_nofpqty
  236. Decimal ld_noauditingqty_ifpackpro
  237. If it_mxt = 0 Then
  238. ld_maxqty = 0
  239. ld_pack_min_nofpqty = 0
  240. ld_noauditingqty_ifpackpro = 0
  241. Else
  242. ld_maxqty = 1000000000
  243. ld_pack_min_nofpqty = 1000000000
  244. ld_noauditingqty_ifpackpro = 1000000000
  245. End If
  246. For ll_i = 1 To it_mxt
  247. If sys_option_packpro2_not_use_pack1 = 1 Then
  248. If li_ifpackpro = 2 And li_ifpack[ll_i] = 1 Then
  249. Continue
  250. End If
  251. End If
  252. If li_ifover[ll_i] = 1 Then
  253. Choose Case li_dipztype[ll_i]
  254. Case 0
  255. ls_status = arg_status
  256. ls_woodcode = ''
  257. ls_pcode = ''
  258. Case 1
  259. ls_status = ''
  260. ls_woodcode = arg_woodcode
  261. ls_pcode = ''
  262. Case 2
  263. ls_status = ''
  264. ls_woodcode = ''
  265. ls_pcode = arg_pcode
  266. Case 3
  267. ls_status = arg_status
  268. ls_woodcode = arg_woodcode
  269. ls_pcode = ''
  270. Case 4
  271. ls_status = ''
  272. ls_woodcode = arg_woodcode
  273. ls_pcode = arg_pcode
  274. Case 5
  275. ls_status = arg_status
  276. ls_woodcode = ''
  277. ls_pcode = arg_pcode
  278. Case 6
  279. ls_status = arg_status
  280. ls_woodcode = arg_woodcode
  281. ls_pcode = arg_pcode
  282. End Choose
  283. Else
  284. ls_status = ls_pf_status[ll_i]
  285. ls_woodcode = ls_pf_woodcode[ll_i]
  286. ls_pcode = ls_pf_pcode[ll_i]
  287. End If
  288. If li_ifpackpro = 2 Or li_ifpackpro = 4 Then
  289. ls_mtrlcuscode = arg_mtrlcuscode
  290. Else
  291. ls_mtrlcuscode = ''
  292. End If
  293. ld_noallocqty = 0
  294. ld_allqty = 0
  295. ld_noauditingqty = 0
  296. ld_pack_fpqty = 0
  297. //如果是通用包件产品并且选项使用占用可装数,则计算占用可装数
  298. If li_ifpackpro = 1 And sys_option_canpack_ifzanyong = 1 Then
  299. Select sum(u_mtrlware_pack_fp.qty - u_mtrlware_pack_fp.outqty)
  300. Into :ld_qty_fp
  301. From u_mtrlware_pack_fp Inner JOIN
  302. u_mtrlware ON u_mtrlware_pack_fp.scid = u_mtrlware.scid And
  303. u_mtrlware_pack_fp.cpmtrlwareid = u_mtrlware.mtrlwareid Inner JOIN
  304. u_mtrlware u_mtrlware_pack ON
  305. u_mtrlware_pack_fp.scid = u_mtrlware_pack.scid And
  306. u_mtrlware_pack_fp.mtrlwareid = u_mtrlware_pack.mtrlwareid
  307. Where u_mtrlware.mtrlid = :arg_mtrlid
  308. And (u_mtrlware.storageid = :arg_storageid or :arg_storageid = -1)
  309. And u_mtrlware.Status = :arg_status
  310. And u_mtrlware.woodcode = :arg_woodcode
  311. And u_mtrlware.pcode = :arg_pcode
  312. And u_mtrlware.plancode = :arg_plancode
  313. And u_mtrlware.mtrlcuscode = :arg_mtrlcuscode
  314. And u_mtrlware_pack.mtrlid = :ll_SonMtrlid[ll_i]
  315. And (u_mtrlware_pack.storageid = :arg_storageid or :arg_storageid = -1)
  316. And u_mtrlware_pack.Status = :ls_status
  317. And u_mtrlware_pack.woodcode = :ls_woodcode
  318. And u_mtrlware_pack.pcode = :ls_pcode
  319. And u_mtrlware_pack.plancode = :arg_plancode
  320. And ( u_mtrlware_pack.plancode = :arg_plancode And :li_ifplancode = 1 Or :li_ifplancode = 0 )
  321. And ( u_mtrlware_pack.mtrlcuscode = :ls_mtrlcuscode And (:li_ifpack[ll_i] = 2 Or :li_ifpackpro = 4) Or (:li_ifpack[ll_i] <> 2 And :li_ifpackpro <> 4) );
  322. If sqlca.SQLCode <> 0 Then
  323. arg_msg = '查询该产品组装件或包件:'+ls_pf_mtrlcode[ll_i]+'分配给包件产品:'+ls_mtrlcode+'的数量失败,'+sqlca.SQLErrText
  324. rslt = 0
  325. Goto ext
  326. End If
  327. If ld_Sonscale[ll_i] = 0 Then
  328. ld_allqty_fp = 0
  329. Else
  330. ld_allqty_fp = ld_qty_fp * ld_Sonscale_fm[ll_i] / ld_Sonscale[ll_i]
  331. End If
  332. ld_maxqty = Min(ld_maxqty,ld_allqty_fp)
  333. If IsNull(ld_maxqty) Then ld_maxqty = 0
  334. Else
  335. Select isnull(sum(u_mtrlware.noallocqty),0),
  336. isnull(sum(u_mtrlware.noauditingqty),0),
  337. IsNull(sum(u_mtrlware.allocqty),0)
  338. Into :ld_noallocqty,
  339. :ld_noauditingqty,
  340. :ld_pack_fpqty
  341. From u_mtrlware Inner JOIN
  342. u_storage ON u_mtrlware.storageid = u_storage.storageid
  343. Where (( u_mtrlware.storageid = :arg_storageid And :arg_storageid > 0 ) Or
  344. (:arg_storageid = -1 And u_storage.ifmrp = 1 ))
  345. And u_mtrlware.mtrlid = :ll_SonMtrlid[ll_i]
  346. And ( u_mtrlware.status = :ls_status )
  347. And ( u_mtrlware.woodcode = :ls_woodcode )
  348. And ( u_mtrlware.pcode = :ls_pcode )
  349. And ( u_mtrlware.plancode = :arg_plancode And :li_ifplancode = 1 Or :li_ifplancode = 0 )
  350. And ( u_mtrlware.mtrlcuscode = :ls_mtrlcuscode And (:li_ifpack[ll_i] = 2 Or :li_ifpackpro = 4) Or (:li_ifpack[ll_i] <> 2 And :li_ifpackpro <> 4) );
  351. If sqlca.SQLCode <> 0 Then
  352. arg_msg = '查询该产品组装件或包件:'+ls_pf_mtrlcode[ll_i]+',库存总数失败,'+sqlca.SQLErrText
  353. rslt = 0
  354. Goto ext
  355. End If
  356. If ld_Sonscale[ll_i] = 0 Then
  357. ld_allqty = 0
  358. Else
  359. ld_allqty = ld_noallocqty * ld_Sonscale_fm[ll_i] / ld_Sonscale[ll_i]
  360. End If
  361. arg_lsg = arg_lsg + '组装件或包件:'+ls_pf_mtrlcode[ll_i]+',可装数:'+String(Truncate ( ld_allqty, 0 ),'#,##0')+'~n'
  362. ld_maxqty = Min(ld_maxqty,ld_allqty)
  363. If IsNull(ld_maxqty) Then ld_maxqty = 0
  364. If ld_Sonscale[ll_i] = 0 Then
  365. ld_pack_min_nofpqty = 0
  366. ld_noauditingqty_ifpackpro = 0
  367. Else
  368. ld_pack_min_nofpqty = Min(ld_pack_min_nofpqty,(ld_noallocqty - ld_pack_fpqty)/(ld_Sonscale[ll_i]/ld_Sonscale_fm[ll_i]))
  369. ld_noauditingqty_ifpackpro = Min(ld_noauditingqty_ifpackpro,(ld_noallocqty - ld_noauditingqty)/(ld_Sonscale[ll_i]/ld_Sonscale_fm[ll_i]))
  370. End If
  371. If IsNull(ld_pack_min_nofpqty) Then ld_pack_min_nofpqty = 0
  372. If IsNull(ld_noauditingqty_ifpackpro) Then ld_noauditingqty_ifpackpro = 0
  373. End If
  374. Next
  375. ld_qty = Truncate ( ld_maxqty, 0 )
  376. ld_canpack_fp = Truncate ( ld_maxqty_fp, 0 )
  377. ld_pack_min_nofpqty = Truncate ( ld_pack_min_nofpqty, 0 )
  378. ld_noauditingqty_ifpackpro = Truncate ( ld_noauditingqty_ifpackpro, 0 )
  379. If li_ifpackpro = 1 And sys_option_canpack_ifzanyong = 1 Then
  380. arg_lsg = '占用可装数:' + String(ld_qty,'#,##0')+'~n ~n' + arg_lsg
  381. Else
  382. arg_lsg = '最大组装数:' + String(ld_qty,'#,##0')+'~n ~n' + arg_lsg
  383. End If
  384. arg_ref_qty = ld_qty
  385. arg_ref_pack_min_nofpqty = ld_pack_min_nofpqty
  386. arg_ref_noauditingqty_ifpackpro = ld_noauditingqty_ifpackpro
  387. ext:
  388. Return rslt
  389. end function