f_cmp_di_qty_outware.srf 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. $PBExportHeader$f_cmp_di_qty_outware.srf
  2. global type f_cmp_di_qty_outware from function_object
  3. end type
  4. forward prototypes
  5. global function integer f_cmp_di_qty_outware (long arg_scid, long arg_outwareid, long arg_mtrlid, long arg_storageid, string arg_status, string arg_woodcode, string arg_pcode, string arg_plancode, string arg_mtrlcuscode, long arg_cusid, ref decimal arg_ref_qty, ref string arg_lsg, ref string arg_msg)
  6. end prototypes
  7. global function integer f_cmp_di_qty_outware (long arg_scid, long arg_outwareid, long arg_mtrlid, long arg_storageid, string arg_status, string arg_woodcode, string arg_pcode, string arg_plancode, string arg_mtrlcuscode, long arg_cusid, 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. Int li_ifpackpro
  18. Long ll_statusflag,ll_woodcodeflag,ll_pcodeflag
  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.pfcode = u_mtrl_pf.pfcode )
  138. And ( u_PrdPF.SonMtrlid = u_mtrldef.mtrlid ) 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. End If
  152. If it_mxt = 0 Then
  153. If li_ifpackpro = 0 Then
  154. arg_msg = '该产品没有建立组装清单,不能计算'
  155. Else
  156. arg_msg = '该产品没有建立默认清单,不能计算'
  157. End If
  158. arg_ref_qty = 0
  159. rslt = 1
  160. Goto ext
  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.pfcode = :arg_status )
  177. And ( u_PrdPF.SonMtrlid = u_mtrldef.mtrlid )
  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. Decimal ld_ori_qty = 0
  228. Decimal ld_viewqty
  229. If it_mxt = 0 Then
  230. ld_maxqty = 0
  231. Else
  232. ld_maxqty = 1000000
  233. End If
  234. For ll_i = 1 To it_mxt
  235. If sys_option_packpro2_not_use_pack1 = 1 Then
  236. If li_ifpackpro = 2 And li_ifpack[ll_i] = 1 Then
  237. Continue
  238. End If
  239. End If
  240. If li_ifover[ll_i] = 1 Then
  241. Choose Case li_dipztype[ll_i]
  242. Case 0
  243. ls_status = arg_status
  244. ls_woodcode = ''
  245. ls_pcode = ''
  246. Case 1
  247. ls_status = ''
  248. ls_woodcode = arg_woodcode
  249. ls_pcode = ''
  250. Case 2
  251. ls_status = ''
  252. ls_woodcode = ''
  253. ls_pcode = arg_pcode
  254. Case 3
  255. ls_status = arg_status
  256. ls_woodcode = arg_woodcode
  257. ls_pcode = ''
  258. Case 4
  259. ls_status = ''
  260. ls_woodcode = arg_woodcode
  261. ls_pcode = arg_pcode
  262. Case 5
  263. ls_status = arg_status
  264. ls_woodcode = ''
  265. ls_pcode = arg_pcode
  266. Case 6
  267. ls_status = arg_status
  268. ls_woodcode = arg_woodcode
  269. ls_pcode = arg_pcode
  270. End Choose
  271. Else
  272. ls_status = ls_pf_status[ll_i]
  273. ls_woodcode = ls_pf_woodcode[ll_i]
  274. ls_pcode = ls_pf_pcode[ll_i]
  275. End If
  276. ls_status = Trim(ls_status)
  277. ls_woodcode = Trim(ls_woodcode)
  278. ls_pcode = Trim(ls_pcode)
  279. arg_plancode = Trim(arg_plancode)
  280. If li_ifpackpro = 2 Or li_ifpackpro = 4 Then
  281. ls_mtrlcuscode = Trim(arg_mtrlcuscode)
  282. Else
  283. ls_mtrlcuscode = ''
  284. End If
  285. ld_noallocqty = 0
  286. ld_allqty = 0
  287. //如果是通用包件产品并且选项使用占用可装数,则计算占用可装数
  288. If li_ifpackpro = 1 And sys_option_canpack_ifzanyong = 1 Then
  289. Select sum(u_mtrlware_pack_fp.qty - u_mtrlware_pack_fp.outqty)
  290. Into :ld_noallocqty
  291. From u_mtrlware_pack_fp Inner JOIN
  292. u_mtrlware ON u_mtrlware_pack_fp.scid = u_mtrlware.scid And
  293. u_mtrlware_pack_fp.cpmtrlwareid = u_mtrlware.mtrlwareid Inner JOIN
  294. u_mtrlware u_mtrlware_pack ON
  295. u_mtrlware_pack_fp.scid = u_mtrlware_pack.scid And
  296. u_mtrlware_pack_fp.mtrlwareid = u_mtrlware_pack.mtrlwareid
  297. Where u_mtrlware.mtrlid = :arg_mtrlid
  298. And (u_mtrlware.storageid = :arg_storageid Or :arg_storageid = -1)
  299. And u_mtrlware.Status = :arg_status
  300. And u_mtrlware.woodcode = :arg_woodcode
  301. And u_mtrlware.pcode = :arg_pcode
  302. And u_mtrlware.plancode = :arg_plancode
  303. And u_mtrlware.mtrlcuscode = :arg_mtrlcuscode
  304. And u_mtrlware_pack.mtrlid = :ll_SonMtrlid[ll_i]
  305. And (u_mtrlware_pack.storageid = :arg_storageid Or :arg_storageid = -1)
  306. And u_mtrlware_pack.Status = :ls_status
  307. And u_mtrlware_pack.woodcode = :ls_woodcode
  308. And u_mtrlware_pack.pcode = :ls_pcode
  309. And ( u_mtrlware_pack.plancode = :arg_plancode And :li_ifplancode = 1 Or :li_ifplancode = 0 )
  310. 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) );
  311. If sqlca.SQLCode <> 0 Then
  312. arg_msg = '查询该产品组装件或包件:'+ls_pf_mtrlcode[ll_i]+'分配给包件产品:'+ls_mtrlcode+'的数量失败,'+sqlca.SQLErrText
  313. rslt = 0
  314. Goto ext
  315. End If
  316. Else
  317. Select isnull(sum(u_mtrlware.noallocqty - u_mtrlware.noauditingqty),0)
  318. Into :ld_noallocqty
  319. From u_mtrlware
  320. Where ( u_mtrlware.storageid = :arg_storageid Or :arg_storageid = -1 )
  321. And ( u_mtrlware.mtrlid = :ll_SonMtrlid[ll_i] )
  322. And ( ltrim(rtrim(u_mtrlware.status)) = :ls_status )
  323. And ( ltrim(rtrim(u_mtrlware.woodcode)) = :ls_woodcode )
  324. And ( ltrim(rtrim(u_mtrlware.pcode)) = :ls_pcode )
  325. And ( ltrim(rtrim(u_mtrlware.plancode)) = :arg_plancode And :li_ifplancode = 1 Or :li_ifplancode = 0 )
  326. 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) );
  327. If sqlca.SQLCode <> 0 Then
  328. arg_msg = '查询该产品组装件或包件:'+ls_pf_mtrlcode[ll_i]+',库存总数失败,'+sqlca.SQLErrText
  329. rslt = 0
  330. Goto ext
  331. End If
  332. Select sum(qty)
  333. Into :ld_viewqty
  334. From u_mtrlware_view Inner JOIN
  335. u_mtrlware ON u_mtrlware_view.scid = u_mtrlware.scid And
  336. u_mtrlware_view.mtrlwareid = u_mtrlware.mtrlwareid
  337. Where (u_mtrlware_view.inuse = 1)
  338. And ( u_mtrlware.storageid = :arg_storageid Or :arg_storageid = -1 )
  339. And ( u_mtrlware.mtrlid = :ll_SonMtrlid[ll_i] )
  340. And ( ltrim(rtrim(u_mtrlware.status)) = :ls_status )
  341. And ( ltrim(rtrim(u_mtrlware.woodcode)) = :ls_woodcode )
  342. And ( ltrim(rtrim(u_mtrlware.pcode)) = :ls_pcode )
  343. And ( ltrim(rtrim(u_mtrlware.plancode)) = :arg_plancode And :li_ifplancode = 1 Or :li_ifplancode = 0 )
  344. 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) )
  345. And ( u_mtrlware_view.cusid = :arg_cusid Or :arg_cusid = -1);
  346. If sqlca.SQLCode = -1 Then
  347. rslt = 0
  348. arg_msg = "查询该产品组装件或包件:"+ls_pf_mtrlcode[ll_i]+",库存虚拟数失败,"+sqlca.SQLErrText
  349. Goto ext
  350. ElseIf sqlca.SQLCode = 100 Then
  351. ld_viewqty = 0
  352. End If
  353. If IsNull(ld_viewqty) Then ld_viewqty = 0
  354. ld_noallocqty = ld_noallocqty + ld_viewqty
  355. End If
  356. If Not (li_ifpackpro = 1 And sys_option_canpack_ifzanyong = 1) Then
  357. If arg_outwareid > 0 Then
  358. Select IsNull(sum(Case qty when 0 Then planqty Else qty End ),0) Into :ld_ori_qty
  359. From u_outwaremx_mx
  360. Where (scid = :arg_scid)
  361. And ( outwareid = :arg_outwareid )
  362. And ( mtrlid = :ll_SonMtrlid[ll_i] )
  363. And ( ltrim(rtrim(status)) = :ls_status )
  364. And ( ltrim(rtrim(woodcode)) = :ls_woodcode )
  365. And ( ltrim(rtrim(pcode)) = :ls_pcode )
  366. And ( ltrim(rtrim(plancode)) = :arg_plancode And :li_ifplancode = 1 Or :li_ifplancode = 0 )
  367. And ( u_outwaremx_mx.mtrlcuscode = :ls_mtrlcuscode And (:li_ifpack[ll_i] = 2 Or :li_ifpackpro = 4) Or (:li_ifpack[ll_i] <> 2 And :li_ifpackpro <> 4) )
  368. And ( storageid = :arg_storageid Or :arg_storageid = -1 );
  369. If sqlca.SQLCode = -1 Then
  370. rslt = 0
  371. arg_msg = '查询该产品组装件或包件:'+ls_pf_mtrlcode[ll_i]+',原开单数量失败,'+sqlca.SQLErrText
  372. Goto ext
  373. End If
  374. If IsNull(ld_ori_qty) Then ld_ori_qty = 0
  375. ld_noallocqty = ld_noallocqty + ld_ori_qty
  376. End If
  377. End If
  378. If ld_Sonscale[ll_i] = 0 Then
  379. ld_allqty = 0
  380. Else
  381. ld_allqty = ld_noallocqty * ld_Sonscale_fm[ll_i]/ ld_Sonscale[ll_i]
  382. End If
  383. arg_lsg = arg_lsg + '组装件或包件:'+ls_pf_mtrlcode[ll_i]+',可装数:'+String(Truncate ( ld_allqty, 0 ),'#,##0')+'~n'
  384. ld_maxqty = Min(ld_maxqty,ld_allqty)
  385. If IsNull(ld_maxqty) Then ld_maxqty = 0
  386. Next
  387. ld_qty = Truncate ( ld_maxqty, 0 )
  388. arg_lsg = '最大组装数:' + String(ld_qty,'#,##0')+'~n ~n' + arg_lsg
  389. arg_ref_qty = ld_qty
  390. ext:
  391. Return rslt
  392. end function