123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438 |
- $PBExportHeader$f_cmp_di_qty_outware.srf
- global type f_cmp_di_qty_outware from function_object
- end type
- forward prototypes
- 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)
- end prototypes
- 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
- 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
- Int li_ifpackpro
- Long ll_statusflag,ll_woodcodeflag,ll_pcodeflag
- 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.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 = '该产品没有建立组装清单,不能计算'
- Else
- arg_msg = '该产品没有建立默认清单,不能计算'
- 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 = '该产品没有建立包件清单,不能计算'
- 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
- Decimal ld_ori_qty = 0
- Decimal ld_viewqty
- If it_mxt = 0 Then
- ld_maxqty = 0
- Else
- ld_maxqty = 1000000
- 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
-
- ls_status = Trim(ls_status)
- ls_woodcode = Trim(ls_woodcode)
- ls_pcode = Trim(ls_pcode)
- arg_plancode = Trim(arg_plancode)
-
- If li_ifpackpro = 2 Or li_ifpackpro = 4 Then
- ls_mtrlcuscode = Trim(arg_mtrlcuscode)
- Else
- ls_mtrlcuscode = ''
- End If
-
- ld_noallocqty = 0
- ld_allqty = 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_noallocqty
- 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 )
- 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) );
- If sqlca.SQLCode <> 0 Then
- arg_msg = '查询该产品组装件或包件:'+ls_pf_mtrlcode[ll_i]+'分配给包件产品:'+ls_mtrlcode+'的数量失败,'+sqlca.SQLErrText
- rslt = 0
- Goto ext
- End If
- Else
- Select isnull(sum(u_mtrlware.noallocqty - u_mtrlware.noauditingqty),0)
- Into :ld_noallocqty
- From u_mtrlware
- Where ( u_mtrlware.storageid = :arg_storageid Or :arg_storageid = -1 )
- And ( u_mtrlware.mtrlid = :ll_SonMtrlid[ll_i] )
- And ( ltrim(rtrim(u_mtrlware.status)) = :ls_status )
- And ( ltrim(rtrim(u_mtrlware.woodcode)) = :ls_woodcode )
- And ( ltrim(rtrim(u_mtrlware.pcode)) = :ls_pcode )
- And ( ltrim(rtrim(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
-
- Select sum(qty)
- Into :ld_viewqty
- From u_mtrlware_view Inner JOIN
- u_mtrlware ON u_mtrlware_view.scid = u_mtrlware.scid And
- u_mtrlware_view.mtrlwareid = u_mtrlware.mtrlwareid
- Where (u_mtrlware_view.inuse = 1)
- And ( u_mtrlware.storageid = :arg_storageid Or :arg_storageid = -1 )
- And ( u_mtrlware.mtrlid = :ll_SonMtrlid[ll_i] )
- And ( ltrim(rtrim(u_mtrlware.status)) = :ls_status )
- And ( ltrim(rtrim(u_mtrlware.woodcode)) = :ls_woodcode )
- And ( ltrim(rtrim(u_mtrlware.pcode)) = :ls_pcode )
- And ( ltrim(rtrim(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) )
- And ( u_mtrlware_view.cusid = :arg_cusid Or :arg_cusid = -1);
- If sqlca.SQLCode = -1 Then
- rslt = 0
- arg_msg = "查询该产品组装件或包件:"+ls_pf_mtrlcode[ll_i]+",库存虚拟数失败,"+sqlca.SQLErrText
- Goto ext
- ElseIf sqlca.SQLCode = 100 Then
- ld_viewqty = 0
- End If
-
- If IsNull(ld_viewqty) Then ld_viewqty = 0
- ld_noallocqty = ld_noallocqty + ld_viewqty
- End If
-
- If Not (li_ifpackpro = 1 And sys_option_canpack_ifzanyong = 1) Then
- If arg_outwareid > 0 Then
- Select IsNull(sum(Case qty when 0 Then planqty Else qty End ),0) Into :ld_ori_qty
- From u_outwaremx_mx
- Where (scid = :arg_scid)
- And ( outwareid = :arg_outwareid )
- And ( mtrlid = :ll_SonMtrlid[ll_i] )
- And ( ltrim(rtrim(status)) = :ls_status )
- And ( ltrim(rtrim(woodcode)) = :ls_woodcode )
- And ( ltrim(rtrim(pcode)) = :ls_pcode )
- And ( ltrim(rtrim(plancode)) = :arg_plancode And :li_ifplancode = 1 Or :li_ifplancode = 0 )
- 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) )
- And ( storageid = :arg_storageid Or :arg_storageid = -1 );
- If sqlca.SQLCode = -1 Then
- rslt = 0
- arg_msg = '查询该产品组装件或包件:'+ls_pf_mtrlcode[ll_i]+',原开单数量失败,'+sqlca.SQLErrText
- Goto ext
- End If
-
- If IsNull(ld_ori_qty) Then ld_ori_qty = 0
-
- ld_noallocqty = ld_noallocqty + ld_ori_qty
- End If
- 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
|