$PBExportHeader$f_cmp_di_qty_fpqty.srf global type f_cmp_di_qty_fpqty from function_object end type forward prototypes global function integer f_cmp_di_qty_fpqty (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 decimal arg_ref_qty_fp, ref string arg_lsg, ref string arg_msg) end prototypes global function integer f_cmp_di_qty_fpqty (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 decimal arg_ref_qty_fp, ref string arg_lsg, ref string arg_msg);Int rslt = 1 Long cnt Long ll_SonMtrlid[] String ls_status,ls_woodcode,ls_pcode,ls_mtrlcuscode Decimal ld_Sonscale[],ld_Sonscale_fm[] Int li_ifover[],li_dipztype[],li_ifpack[] String ls_pf_status[],ls_pf_woodcode[],ls_pf_pcode[] Long it_mxt = 1 Decimal ld_qty Long ll_i Long ll_statusflag,ll_woodcodeflag,ll_pcodeflag Int li_ifpackpro String ls_mtrlcode String ls_pf_mtrlcode[] Decimal ld_canpack_fp,ld_maxqty_fp,ld_allqty_fp,ld_qty_fp s_mtrlcfg_expr s_mtrlcfg[] Long ll_cfg,ll_cnt_s_mtrlcfg Int li_ifplancode Select ifplancode Into :li_ifplancode From u_storage Where storageid = :arg_storageid; If sqlca.SQLCode <> 0 Then arg_msg = '查询仓库是否使用批号发货属性失败,'+sqlca.SQLErrText Return 0 End If Select ifpackpro,statusflag,woodcodeflag,pcodeflag,mtrlcode Into :li_ifpackpro,:ll_statusflag,:ll_woodcodeflag,:ll_pcodeflag,:ls_mtrlcode From u_mtrldef Where mtrlid = :arg_mtrlid; If sqlca.SQLCode <> 0 Then arg_msg = '查询物料是否包件产品失败,'+sqlca.SQLErrText rslt = 0 Goto ext End If If ll_statusflag = 3 And ll_woodcodeflag = 3 And ll_pcodeflag = 3 Then If arg_status <> '' Or arg_woodcode <> '' Or arg_pcode <> '' Then arg_ref_qty = 0 rslt = 1 Goto ext End If End If Long ll_scid,ll_taskid,ll_printid Int li_ordertype_order If li_ifpackpro = 1 Or li_ifpackpro = 2 Then //查询个性包件产品订单明细是否有换包件 If li_ifpackpro = 2 And arg_mtrlcuscode <> '' Then Select ordertype Into :li_ordertype_order From u_order_ml Where ordercode = :arg_mtrlcuscode; If sqlca.SQLCode <> 0 Then cnt = 0 Else If li_ordertype_order = 4 Then Select u_order_ml_p.scid,u_order_ml_p.taskid,u_order_ml_p.taskmxid Into :ll_scid,:ll_taskid,:ll_printid From u_order_ml,u_order_ml u_order_ml_p Where u_order_ml.ordercode = :arg_mtrlcuscode And u_order_ml.scid = u_order_ml_p.scid And u_order_ml.porderid = u_order_ml_p.orderid; If sqlca.SQLCode <> 0 Then ll_taskid = 0 End If Else Select scid,taskid,taskmxid Into :ll_scid,:ll_taskid,:ll_printid From u_order_ml Where ordercode = :arg_mtrlcuscode; If sqlca.SQLCode <> 0 Then ll_taskid = 0 End If End If If ll_taskid = 0 Then cnt = 0 Else //查是否有换清单 Select count(*) Into :cnt From u_saletaskmx_pf Where scid = :ll_scid And taskid = :ll_taskid And printid = :ll_printid; If sqlca.SQLCode <> 0 Then cnt = 0 End If End If End If End If If cnt > 0 Then Declare cur_pf_saletaskmx Cursor For Select u_saletaskmx_pf.SonMtrlid, u_saletaskmx_pf.Sonscale, u_saletaskmx_pf.Sonscale_fm, u_saletaskmx_pf.status, u_saletaskmx_pf.woodcode, u_saletaskmx_pf.pcode, 0, 0, u_mtrldef.ifpack, u_mtrldef.mtrlcode From u_saletaskmx_pf,u_mtrldef Where ( u_saletaskmx_pf.scid = :ll_scid ) And ( u_saletaskmx_pf.taskid = :ll_taskid ) And ( u_saletaskmx_pf.printid = :ll_printid ) And ( u_saletaskmx_pf.SonMtrlid = u_mtrldef.mtrlid ); Open cur_pf_saletaskmx; Fetch cur_pf_saletaskmx Into :ll_SonMtrlid[it_mxt],:ld_Sonscale[it_mxt],:ld_Sonscale_fm[it_mxt],:ls_pf_status[it_mxt], :ls_pf_woodcode[it_mxt],:ls_pf_pcode[it_mxt],:li_ifover[it_mxt],:li_dipztype[it_mxt], :li_ifpack[it_mxt],:ls_pf_mtrlcode[it_mxt]; Do While sqlca.SQLCode = 0 it_mxt++ Fetch cur_pf_saletaskmx Into :ll_SonMtrlid[it_mxt],:ld_Sonscale[it_mxt],:ld_Sonscale_fm[it_mxt],:ls_pf_status[it_mxt], :ls_pf_woodcode[it_mxt],:ls_pf_pcode[it_mxt],:li_ifover[it_mxt],:li_dipztype[it_mxt], :li_ifpack[it_mxt],:ls_pf_mtrlcode[it_mxt]; Loop it_mxt = it_mxt - 1 Close cur_pf_saletaskmx; Else Declare cur_pf Cursor For Select u_PrdPF.SonMtrlid, u_PrdPF.Sonscale, 1, u_PrdPF.status, u_PrdPF.woodcode, u_PrdPF.pcode, u_PrdPF.ifover, u_prdpf.dipztype, u_mtrldef.ifpack, u_mtrldef.mtrlcode From u_PrdPF,u_mtrl_pf,u_mtrldef Where (u_PrdPF.mtrlid = :arg_mtrlid) And ( u_mtrl_pf.ifdi = 1 And :li_ifpackpro = 0 Or u_mtrl_pf.ifdft = 1 And (:li_ifpackpro = 1 Or :li_ifpackpro = 2) And u_mtrldef.ifpack > 0) And ( u_PrdPF.mtrlid = u_mtrl_pf.mtrlid ) And ( u_PrdPF.pfcode = u_mtrl_pf.pfcode ) And ( u_PrdPF.SonMtrlid = u_mtrldef.mtrlid ) Order By u_PrdPF.printid; Open cur_pf; Fetch cur_pf Into :ll_SonMtrlid[it_mxt],:ld_Sonscale[it_mxt],:ld_Sonscale_fm[it_mxt],:ls_pf_status[it_mxt], :ls_pf_woodcode[it_mxt],:ls_pf_pcode[it_mxt],:li_ifover[it_mxt],:li_dipztype[it_mxt], :li_ifpack[it_mxt],:ls_pf_mtrlcode[it_mxt]; Do While sqlca.SQLCode = 0 it_mxt++ Fetch cur_pf Into :ll_SonMtrlid[it_mxt],:ld_Sonscale[it_mxt],:ld_Sonscale_fm[it_mxt],:ls_pf_status[it_mxt], :ls_pf_woodcode[it_mxt],:ls_pf_pcode[it_mxt],:li_ifover[it_mxt],:li_dipztype[it_mxt], :li_ifpack[it_mxt],:ls_pf_mtrlcode[it_mxt]; Loop it_mxt = it_mxt - 1 Close cur_pf; End If If it_mxt = 0 Then If li_ifpackpro = 0 Then arg_msg = '该产品'+ls_mtrlcode+'没有建立组装清单,不能计算' Else arg_msg = '该产品'+ls_mtrlcode+'没有建立默认清单,不能计算' End If arg_ref_qty = 0 rslt = 1 Goto ext End If ElseIf li_ifpackpro = 5 Then Declare cur_pf5 Cursor For Select u_PrdPF.SonMtrlid, u_PrdPF.Sonscale, 1, u_PrdPF.status, u_PrdPF.woodcode, u_PrdPF.pcode, u_PrdPF.ifover, u_prdpf.dipztype, u_mtrldef.ifpack, u_mtrldef.mtrlcode From u_PrdPF,u_mtrldef Where (u_PrdPF.mtrlid = :arg_mtrlid) And ( u_PrdPF.pfcode = :arg_status ) And ( u_PrdPF.SonMtrlid = u_mtrldef.mtrlid ) And ( u_mtrldef.ifpack > 0 ) Order By u_PrdPF.printid; Open cur_pf5; Fetch cur_pf5 Into :ll_SonMtrlid[it_mxt],:ld_Sonscale[it_mxt],:ld_Sonscale_fm[it_mxt],:ls_pf_status[it_mxt], :ls_pf_woodcode[it_mxt],:ls_pf_pcode[it_mxt],:li_ifover[it_mxt],:li_dipztype[it_mxt], :li_ifpack[it_mxt],:ls_pf_mtrlcode[it_mxt]; Do While sqlca.SQLCode = 0 it_mxt++ Fetch cur_pf5 Into :ll_SonMtrlid[it_mxt],:ld_Sonscale[it_mxt],:ld_Sonscale_fm[it_mxt],:ls_pf_status[it_mxt], :ls_pf_woodcode[it_mxt],:ls_pf_pcode[it_mxt],:li_ifover[it_mxt],:li_dipztype[it_mxt], :li_ifpack[it_mxt],:ls_pf_mtrlcode[it_mxt]; Loop it_mxt = it_mxt - 1 Close cur_pf5; If it_mxt = 0 Then arg_msg = '该产品'+ls_mtrlcode+'没有包件清单,不能计算' arg_ref_qty = 0 rslt = 1 Goto ext End If ElseIf li_ifpackpro = 3 Or li_ifpackpro = 4 Then it_mxt = 0 If arg_status = '' Then arg_ref_qty = 0 arg_ref_pack_min_nofpqty = 0 arg_ref_noauditingqty_ifpackpro = 0 rslt = 1 Goto ext Else f_checkpz(arg_status,s_mtrlcfg) ll_cnt_s_mtrlcfg = UpperBound(s_mtrlcfg) If ll_cnt_s_mtrlcfg = 0 Then arg_ref_qty = 0 arg_ref_pack_min_nofpqty = 0 arg_ref_noauditingqty_ifpackpro = 0 rslt = 1 Goto ext Else For ll_cfg = 1 To ll_cnt_s_mtrlcfg it_mxt++ ll_SonMtrlid[it_mxt] = arg_mtrlid ls_pf_status[it_mxt] = s_mtrlcfg[ll_cfg].cfgname ls_pf_woodcode[it_mxt] = arg_woodcode ls_pf_pcode[it_mxt] = arg_pcode ls_pf_mtrlcode[it_mxt] = ls_mtrlcode ld_Sonscale[it_mxt] = Dec(s_mtrlcfg[ll_cfg].qty) ld_Sonscale_fm[it_mxt] = 1 li_ifover[it_mxt] = 0 li_ifpack[it_mxt] = 0 Next End If End If Else it_mxt = 0 End If Decimal ld_noallocqty,ld_noauditingqty,ld_allqty,ld_maxqty Decimal ld_pack_fpqty,ld_pack_min_nofpqty Decimal ld_noauditingqty_ifpackpro If it_mxt = 0 Then ld_maxqty = 0 ld_pack_min_nofpqty = 0 ld_noauditingqty_ifpackpro = 0 ld_maxqty_fp = 0 Else ld_maxqty = 1000000000 ld_maxqty_fp = 1000000000 ld_pack_min_nofpqty = 1000000000 ld_noauditingqty_ifpackpro = 1000000000 End If For ll_i = 1 To it_mxt If sys_option_packpro2_not_use_pack1 = 1 Then If li_ifpackpro = 2 And li_ifpack[ll_i] = 1 Then Continue End If End If If li_ifover[ll_i] = 1 Then Choose Case li_dipztype[ll_i] Case 0 ls_status = arg_status ls_woodcode = '' ls_pcode = '' Case 1 ls_status = '' ls_woodcode = arg_woodcode ls_pcode = '' Case 2 ls_status = '' ls_woodcode = '' ls_pcode = arg_pcode Case 3 ls_status = arg_status ls_woodcode = arg_woodcode ls_pcode = '' Case 4 ls_status = '' ls_woodcode = arg_woodcode ls_pcode = arg_pcode Case 5 ls_status = arg_status ls_woodcode = '' ls_pcode = arg_pcode Case 6 ls_status = arg_status ls_woodcode = arg_woodcode ls_pcode = arg_pcode End Choose Else ls_status = ls_pf_status[ll_i] ls_woodcode = ls_pf_woodcode[ll_i] ls_pcode = ls_pf_pcode[ll_i] End If If li_ifpackpro = 2 Or li_ifpackpro = 4 Then ls_mtrlcuscode = arg_mtrlcuscode Else ls_mtrlcuscode = '' End If ld_noallocqty = 0 ld_allqty = 0 ld_noauditingqty = 0 ld_pack_fpqty = 0 Select isnull(sum(u_mtrlware.noallocqty),0), isnull(sum(u_mtrlware.noauditingqty),0), IsNull(sum(u_mtrlware.allocqty),0) Into :ld_noallocqty, :ld_noauditingqty, :ld_pack_fpqty From u_mtrlware Inner JOIN u_storage ON u_mtrlware.storageid = u_storage.storageid Where (( u_mtrlware.storageid = :arg_storageid And :arg_storageid > 0 ) Or (:arg_storageid = -1 And u_storage.ifmrp = 1 )) And u_mtrlware.mtrlid = :ll_SonMtrlid[ll_i] And ( u_mtrlware.status = :ls_status ) And ( u_mtrlware.woodcode = :ls_woodcode ) And ( u_mtrlware.pcode = :ls_pcode ) And ( u_mtrlware.plancode = :arg_plancode And :li_ifplancode = 1 Or :li_ifplancode = 0 ) 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) ); If sqlca.SQLCode <> 0 Then arg_msg = '查询该产品组装件或包件:'+ls_pf_mtrlcode[ll_i]+',库存总数失败,'+sqlca.SQLErrText rslt = 0 Goto ext End If If ld_Sonscale[ll_i] = 0 Then ld_allqty = 0 Else ld_allqty = ld_noallocqty * ld_Sonscale_fm[ll_i] / ld_Sonscale[ll_i] End If arg_lsg = arg_lsg + '组装件或包件:'+ls_pf_mtrlcode[ll_i]+',可装数:'+String(Truncate ( ld_allqty, 0 ),'#,##0')+'~n' ld_maxqty = Min(ld_maxqty,ld_allqty) If IsNull(ld_maxqty) Then ld_maxqty = 0 If ld_Sonscale[ll_i] = 0 Then ld_pack_min_nofpqty = 0 ld_noauditingqty_ifpackpro = 0 Else ld_pack_min_nofpqty = Min(ld_pack_min_nofpqty,(ld_noallocqty - ld_pack_fpqty)/(ld_Sonscale[ll_i]/ld_Sonscale_fm[ll_i])) ld_noauditingqty_ifpackpro = Min(ld_noauditingqty_ifpackpro,(ld_noallocqty - ld_noauditingqty)/(ld_Sonscale[ll_i]/ld_Sonscale_fm[ll_i])) End If If IsNull(ld_pack_min_nofpqty) Then ld_pack_min_nofpqty = 0 If IsNull(ld_noauditingqty_ifpackpro) Then ld_noauditingqty_ifpackpro = 0 //如果是通用包件产品并且选项使用占用可装数,则计算占用可装数 If li_ifpackpro = 1 And sys_option_canpack_ifzanyong = 1 Then Select sum(u_mtrlware_pack_fp.qty - u_mtrlware_pack_fp.outqty) Into :ld_qty_fp From u_mtrlware_pack_fp Inner JOIN u_mtrlware ON u_mtrlware_pack_fp.scid = u_mtrlware.scid And u_mtrlware_pack_fp.cpmtrlwareid = u_mtrlware.mtrlwareid Inner JOIN u_mtrlware u_mtrlware_pack ON u_mtrlware_pack_fp.scid = u_mtrlware_pack.scid And u_mtrlware_pack_fp.mtrlwareid = u_mtrlware_pack.mtrlwareid Where u_mtrlware.mtrlid = :arg_mtrlid And (u_mtrlware.storageid = :arg_storageid or :arg_storageid = -1) And u_mtrlware.Status = :arg_status And u_mtrlware.woodcode = :arg_woodcode And u_mtrlware.pcode = :arg_pcode And u_mtrlware.plancode = :arg_plancode And u_mtrlware.mtrlcuscode = :arg_mtrlcuscode And u_mtrlware_pack.mtrlid = :ll_SonMtrlid[ll_i] And (u_mtrlware_pack.storageid = :arg_storageid or :arg_storageid = -1) And u_mtrlware_pack.Status = :ls_status And u_mtrlware_pack.woodcode = :ls_woodcode And u_mtrlware_pack.pcode = :ls_pcode And ( u_mtrlware_pack.plancode = :arg_plancode And :li_ifplancode = 1 Or :li_ifplancode = 0 ); If sqlca.SQLCode <> 0 Then arg_msg = '查询该产品组装件或包件:'+ls_pf_mtrlcode[ll_i]+'分配给包件产品:'+ls_mtrlcode+'的数量失败,'+sqlca.SQLErrText rslt = 0 Goto ext End If If ld_Sonscale[ll_i] = 0 Then ld_allqty_fp = 0 Else ld_allqty_fp = ld_qty_fp * ld_Sonscale_fm[ll_i] / ld_Sonscale[ll_i] End If ld_maxqty_fp = Min(ld_maxqty_fp,ld_allqty_fp) If IsNull(ld_maxqty_fp) Then ld_maxqty_fp = 0 End If Next ld_qty = Truncate ( ld_maxqty, 0 ) ld_canpack_fp = Truncate ( ld_maxqty_fp, 0 ) ld_pack_min_nofpqty = Truncate ( ld_pack_min_nofpqty, 0 ) ld_noauditingqty_ifpackpro = Truncate ( ld_noauditingqty_ifpackpro, 0 ) arg_lsg = '最大组装数:' + String(ld_qty,'#,##0')+'~r~n' + arg_lsg If li_ifpackpro = 1 And sys_option_canpack_ifzanyong = 1 Then arg_lsg = arg_lsg + ' 占用可装数:'+string(ld_canpack_fp,'#,##0')+'~r~n' end if arg_ref_qty = ld_qty arg_ref_qty_fp = ld_canpack_fp arg_ref_pack_min_nofpqty = ld_pack_min_nofpqty arg_ref_noauditingqty_ifpackpro = ld_noauditingqty_ifpackpro ext: Return rslt end function