$PBExportHeader$f_cmp_di_qty_noauditqty.srf global type f_cmp_di_qty_noauditqty from function_object end type forward prototypes 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) end prototypes 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 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[] 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.SonMtrlid = u_mtrldef.mtrlid ) And ( u_PrdPF.pfcode = u_mtrl_pf.pfcode ) 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; IF it_mxt = 0 THEN IF li_ifpackpro = 0 THEN arg_msg = '该产品没有建立组装清单,不能计算' ELSE arg_msg = '该产品没有建立默认清单,不能计算' END IF arg_ref_qty = 0 rslt = 1 GOTO ext END IF 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.SonMtrlid = u_mtrldef.mtrlid ) And ( u_PrdPF.pfcode = :arg_status ) 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 = '该产品没有建立包件清单,不能计算' 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 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 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 END IF Decimal ld_noallocqty,ld_allqty,ld_maxqty ld_maxqty = 1000000 FOR ll_i = 1 To it_mxt 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 SELECT isnull(sum(u_mtrlware.noallocqty - u_mtrlware.noauditingqty),0) INTO :ld_noallocqty 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_ifpack[ll_i] <> 2 ); 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 NEXT ld_qty = Truncate ( ld_maxqty, 0 ) arg_lsg = '最大组装数:' + String(ld_qty,'#,##0')+'~n ~n' + arg_lsg arg_ref_qty = ld_qty ext: RETURN rslt end function