$PBExportHeader$uo_cmplcost.sru forward global type uo_cmplcost from nonvisualobject end type end forward global type uo_cmplcost from nonvisualobject end type global uo_cmplcost uo_cmplcost type variables Long deep = 0 Boolean ifcmpl_1 = False Int uo_option_produce_dec,uo_option_cost_notax Int uo_option_pfmrp_ifuse_mtrlmrparg long ins_cnt = 0 long ins_cl_errcnt = 0,ins_wf_errcnt = 0,ins_rl_errcnt = 0 end variables forward prototypes public function integer uof_get_f_price (long arg_mtrlid, string arg_mtrlcode, decimal arg_qty, ref decimal arg_f_price, ref string arg_msg) public function integer uof_get_wageprice (long arg_mtrlid, string arg_mtrlcode, string arg_status, decimal arg_qty, ref decimal arg_wageprice, ref string arg_msg) public function integer uof_get_equipprice (long arg_mtrlid, string arg_mtrlcode, string arg_status, decimal arg_qty, ref decimal arg_eqprice, ref string arg_msg) public function integer uof_get_cost_dz (integer arg_pricetype, long arg_mtrlid, string arg_status, string arg_woodcode, string arg_pcode, ref decimal arg_price, ref decimal arg_mprice, ref decimal arg_outcost, ref decimal arg_wageprice, ref decimal arg_eqprice, ref string arg_msg, ref s_mtrlprice_mx arg_s_mx[]) public function integer uof_get_cost (integer arg_pricetype, long arg_scid, long arg_mtrlid, string arg_mtrlcode, string arg_pfcode, decimal arg_qty, long arg_lp, ref decimal arg_price, ref decimal arg_mprice, ref decimal arg_outcost, ref decimal arg_wageprice, ref decimal arg_eqprice, integer arg_ifcfg, ref string arg_msg, ref s_mtrlprice_mx arg_s_mx[], integer arg_protype) public function integer uof_add_mtrlprice_mx (long arg_sumdate, long arg_mtrlid, string arg_status, string arg_woodcode, string arg_pcode, string arg_pfcode, s_mtrlprice_mx arg_s_mx[], ref string arg_msg) public function integer uof_cmpl_mtrlcost (long ll_mtrlid, string ls_pfcode, string ls_status, string ls_woodcode, string ls_pcode, long li_dec, boolean if_auto_copy, integer ifprice, integer ifwfjgprice, integer ifjgprice, integer ifoutcost, integer ifotherprice, integer ifeqprice, ref string arg_msg) end prototypes public function integer uof_get_f_price (long arg_mtrlid, string arg_mtrlcode, decimal arg_qty, ref decimal arg_f_price, ref string arg_msg);Int rslt = 1 Decimal ld_f_rice SELECT isnull(sum(u_mtrl_cost.cost),0) INTO :ld_f_rice FROM u_mtrl_cost Where u_mtrl_cost.mtrlid = :arg_mtrlid; IF sqlca.SQLCode = -1 THEN arg_msg = '查询:'+arg_mtrlcode+'分摊费用成本失败,'+sqlca.sqlerrtext rslt = 0 GOTO ext END IF IF IsNull(arg_f_price) THEN arg_f_price = 0 arg_f_price = ld_f_rice * arg_qty ext: RETURN rslt end function public function integer uof_get_wageprice (long arg_mtrlid, string arg_mtrlcode, string arg_status, decimal arg_qty, ref decimal arg_wageprice, ref string arg_msg);Int rslt = 1 Decimal ld_wageprice Int li_statusflag Long ll_dftwrkgrpid String ls_wpcode Long ll_rl_errcnt = 0 Select statusflag,dftwrkgrpid Into :li_statusflag,:ll_dftwrkgrpid From u_mtrldef Where mtrlid = :arg_mtrlid; If sqlca.SQLCode <> 0 Then MessageBox('Error','查询物料是否使用组合配置及默认生产车间失败,'+sqlca.SQLErrText) Return 0 End If Select wpcode Into :ls_wpcode From u_mtrl_workprice Where mtrlid = :arg_mtrlid And ifdft = 1; If sqlca.SQLCode = 100 Then Select top 1 wpcode Into :ls_wpcode From u_mtrl_workprice Where mtrlid = :arg_mtrlid And wrkid = :ll_dftwrkgrpid; If sqlca.SQLCode = -1 Then arg_msg = '查询物料:'+arg_mtrlcode+'默认工价表失败' rslt = 0 Goto ext End If ElseIf sqlca.SQLCode = -1 Then arg_msg = '查询物料:'+arg_mtrlcode+'默认工价表失败' rslt = 0 Goto ext End If If li_statusflag <> 2 Then arg_status = '' Select sum(u_sc_workprice.workprice * u_sc_workprice.workqty) Into :ld_wageprice From u_sc_workprice Where u_sc_workprice.ifownpro = 0 And u_sc_workprice.mtrlid = :arg_mtrlid And u_sc_workprice.wpcode = :ls_wpcode And u_sc_workprice.status = :arg_status And (ltrim(rtrim(u_sc_workprice.rpcode)) <> '' And u_sc_workprice.ifdftjj = 1 Or ltrim(rtrim(u_sc_workprice.rpcode)) = ''); If sqlca.SQLCode = -1 Then arg_msg = '查询物料:'+arg_mtrlcode+'本厂工价失败' rslt = 0 Goto ext End If Select count(*) Into :ll_rl_errcnt From u_sc_workprice Where u_sc_workprice.ifownpro = 0 And u_sc_workprice.mtrlid = :arg_mtrlid And u_sc_workprice.wpcode = :ls_wpcode And u_sc_workprice.status = :arg_status And (ltrim(rtrim(u_sc_workprice.rpcode)) <> '' And u_sc_workprice.ifdftjj = 1 Or ltrim(rtrim(u_sc_workprice.rpcode)) = '') And u_sc_workprice.workprice = 0; If sqlca.SQLCode = 0 Then ins_rl_errcnt = ins_rl_errcnt + ll_rl_errcnt End If If IsNull(ld_wageprice) Then ld_wageprice = 0 arg_wageprice = ld_wageprice * arg_qty ext: Return rslt end function public function integer uof_get_equipprice (long arg_mtrlid, string arg_mtrlcode, string arg_status, decimal arg_qty, ref decimal arg_eqprice, ref string arg_msg);Int rslt = 1 Int li_statusflag,li_equiptype,li_issuliao Decimal ld_eqprice = 0,ld_eqprice_suliao = 0 Decimal ld_period,ld_Cost_Elec_Degree,ld_depreciation_cost Decimal ld_sbcost,ld_glcost ,ld_ectcost,ld_modelqty = 1 Long ll_macnt string ls_wpcode long ll_dftwrkgrpid SELECT statusflag,equiptype,issuliao,dftwrkgrpid INTO :li_statusflag,:li_equiptype,:li_issuliao,:ll_dftwrkgrpid FROM u_mtrldef Where mtrlid = :arg_mtrlid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询物料'+arg_mtrlcode+'相关信息失败,'+sqlca.SQLErrText GOTO ext END IF SELECT wpcode INTO :ls_wpcode FROM u_mtrl_workprice WHERE mtrlid = :arg_mtrlid and ifdft = 1; IF sqlca.SQLCode = 100 THEN SELECT top 1 wpcode INTO :ls_wpcode FROM u_mtrl_workprice WHERE mtrlid = :arg_mtrlid And wrkid = :ll_dftwrkgrpid; IF sqlca.SQLCode = -1 THEN arg_msg = '查询物料:'+arg_mtrlcode+'默认工价表失败' rslt = 0 GOTO ext END IF ELSEIF sqlca.SQLCode = -1 THEN arg_msg = '查询物料:'+arg_mtrlcode+'默认工价表失败' rslt = 0 GOTO ext END IF //查询本厂机台数量,用于计算管理成本 SELECT count(*) INTO :ll_macnt FROM u_workgroup WHERE mode = 1 And ifm = 1; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询机台数量失败,'+sqlca.SQLErrText GOTO ext END IF IF li_statusflag = 2 And Trim(arg_status) <> '' THEN IF li_equiptype = 0 THEN SELECT sum(u_sc_workprice.eqworkhour * u_Equipment_type.zjamt * 60) INTO :ld_eqprice FROM u_sc_workprice INNER JOIN u_Equipment_type ON u_sc_workprice.EquipmentID = u_Equipment_type.typeid WHERE u_sc_workprice.mtrlid = :arg_mtrlid And u_sc_workprice.status = :arg_status and u_sc_workprice.wpcode = :ls_wpcode; IF sqlca.SQLCode <> 0 THEN ld_eqprice = 0 END IF ELSE SELECT sum(u_mtrl_wkp_tech_mx.eqworkhour_minute * u_Equipment_type.zjamt) INTO :ld_eqprice FROM u_mtrl_wkp_tech_mx INNER JOIN u_mtrl_wkp_tech ON u_mtrl_wkp_tech_mx.mtrlid = u_mtrl_wkp_tech.mtrlid AND u_mtrl_wkp_tech_mx.printid = u_mtrl_wkp_tech.printid INNER JOIN u_Equipment_type ON u_mtrl_wkp_tech.equipmenttypeid = u_Equipment_type.typeid WHERE u_mtrl_wkp_tech_mx.mtrlid = :arg_mtrlid And u_mtrl_wkp_tech_mx.pzname = :arg_status; IF sqlca.SQLCode <> 0 THEN ld_eqprice = 0 END IF END IF ELSE IF li_equiptype = 0 THEN SELECT sum(u_sc_workprice.eqworkhour * u_Equipment_type.zjamt * 60) INTO :ld_eqprice FROM u_sc_workprice INNER JOIN u_Equipment_type ON u_sc_workprice.EquipmentID = u_Equipment_type.typeid Where u_sc_workprice.mtrlid = :arg_mtrlid and u_sc_workprice.wpcode = :ls_wpcode; IF sqlca.SQLCode <> 0 THEN ld_eqprice = 0 END IF ELSE SELECT sum(u_mtrl_wkp_tech.eqworkhour_minute * u_Equipment_type.zjamt) INTO :ld_eqprice FROM u_mtrl_wkp_tech INNER JOIN u_Equipment_type ON u_mtrl_wkp_tech.equipmenttypeid = u_Equipment_type.typeid Where u_mtrl_wkp_tech.mtrlid = :arg_mtrlid; IF sqlca.SQLCode <> 0 THEN ld_eqprice = 0 END IF END IF END IF IF li_issuliao = 1 THEN SELECT top 1 u_model_mtrl.modelqty INTO :ld_modelqty FROM u_model_mtrl WHERE u_model_mtrl.mtrlid = :arg_mtrlid Order By u_model_mtrl.ifdft Desc; IF sqlca.SQLCode <> 0 THEN ld_modelqty = 1 END IF IF IsNull(ld_modelqty) THEN ld_modelqty = 0 IF ld_modelqty = 0 THEN ld_modelqty = 1 SELECT u_mtrldef_sl.period, U_Equipment_Manage.Cost_Elec_Degree, U_Equipment_Manage.depreciation_cost INTO :ld_period, :ld_Cost_Elec_Degree, :ld_depreciation_cost FROM u_mtrldef_sl INNER JOIN U_Equipment_Manage ON u_mtrldef_sl.equipmentid = U_Equipment_Manage.EquipmentID Where u_mtrldef_sl.mtrlid = :arg_mtrlid; IF sqlca.SQLCode <> 0 THEN ld_eqprice_suliao = 0 ELSE IF IsNull(ld_period) THEN ld_period = 0 IF IsNull(ld_Cost_Elec_Degree) THEN ld_Cost_Elec_Degree = 0 IF IsNull(ld_depreciation_cost) THEN ld_depreciation_cost = 0 IF ld_depreciation_cost = 0 THEN ld_sbcost = 0 ELSE ld_sbcost = (ld_period / ld_modelqty / 3600) * ld_depreciation_cost END IF IF ll_macnt = 0 THEN ld_glcost = 0 ELSE ld_glcost = (sys_option_management_cost / 30 / ll_macnt / 24 ) * (ld_period / ld_modelqty / 3600) END IF ld_ectcost = (ld_Cost_Elec_Degree / 3600) * (ld_period / ld_modelqty) * sys_option_ect_price END IF END IF IF IsNull(ld_eqprice) THEN ld_eqprice = 0 ld_eqprice = ld_eqprice + ld_sbcost + ld_glcost + ld_ectcost ext: IF IsNull(ld_eqprice) THEN ld_eqprice = 0 arg_eqprice = ld_eqprice * arg_qty RETURN rslt end function public function integer uof_get_cost_dz (integer arg_pricetype, long arg_mtrlid, string arg_status, string arg_woodcode, string arg_pcode, ref decimal arg_price, ref decimal arg_mprice, ref decimal arg_outcost, ref decimal arg_wageprice, ref decimal arg_eqprice, ref string arg_msg, ref s_mtrlprice_mx arg_s_mx[]);Int rslt = 1 Long ll_orderid,ll_scid,ll_i,ll_lp Int li_ifnext = 0,li_Mtrlorigin Decimal ld_orderqty,ld_qty Decimal ld_price,ld_mprice,ld_wageprice,ld_eqprice,ld_outcost Decimal ld_jgamt , ld_jgqty,ld_jgamt_notax Long ll_mtrlid Decimal ld_mxprice,ld_mxjgprice,ld_mxeqprice datastore ds_tree ds_tree = Create datastore ds_tree.DataObject = 'ds_orderrqmtrl_tree_cmp_cost' ds_tree.SetTransObject(sqlca) SELECT top 1 orderid ,scid,orderqty INTO :ll_orderid,:ll_scid,:ld_orderqty FROM u_order_ml WHERE ordertype <> 4 AND status <> 0 AND mtrlid = :arg_mtrlid AND status_mode = :arg_status AND woodcode = :arg_woodcode AND pcode = :arg_pcode Order By ordercode Desc; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '统计部件选配项与标准值不相等,需要用相关生产计划用料明细进行核算,但产品配置无排过生产计划,所以不能核算' GOTO ext END IF IF arg_pricetype = 0 THEN SELECT sum(v_maxprice_sptprice.price * (u_OrderRqMtrl_scll.trueRqqty / u_Order_ml.orderqty)) INTO :ld_price FROM u_OrderRqMtrl_scll INNER JOIN u_Order_ml ON u_OrderRqMtrl_scll.scid = u_Order_ml.scid AND u_OrderRqMtrl_scll.OrderID = u_Order_ml.OrderID INNER JOIN u_mtrldef ON u_OrderRqMtrl_scll.MtrlID = u_mtrldef.mtrlid INNER JOIN v_maxprice_sptprice ON u_mtrldef.mtrlid = v_maxprice_sptprice.mtrlid WHERE ((u_Order_ml.OrderID = :ll_orderid) OR (u_Order_ml.porderid = :ll_orderid)) AND ( u_order_ml.scid = :ll_scid) And ( u_mtrldef.Mtrlorigin = 2); IF sqlca.SQLCode <> 0 THEN IF sqlca.SQLCode = 100 THEN ld_price = 0 ELSE arg_msg = '查询材料成本失败(最新价),'+sqlca.SQLErrText rslt = 0 GOTO ext END IF END IF //ELSE // SELECT sum(isnull(v_mtrlcost.price,0) * (u_OrderRqMtrl_scll.trueRqqty / u_Order_ml.orderqty)) // INTO :ld_price // FROM u_OrderRqMtrl_scll INNER JOIN // u_Order_ml ON u_OrderRqMtrl_scll.scid = u_Order_ml.scid AND // u_OrderRqMtrl_scll.OrderID = u_Order_ml.OrderID INNER JOIN // u_mtrldef ON u_OrderRqMtrl_scll.MtrlID = u_mtrldef.mtrlid LEFT OUTER JOIN // (SELECT CASE SUM(u_mtrlware.noallocqty) WHEN 0 THEN MAX(u_mtrlware.cost) // ELSE SUM(u_mtrlware.wareamt) / SUM(u_mtrlware.noallocqty) END AS price, // u_mtrlware.mtrlid // FROM u_mtrlware INNER JOIN // u_storage ON u_mtrlware.storageid = u_storage.storageid // WHERE (u_storage.Mtrlprp <> 3) AND (u_storage.inuse = 1) // GROUP BY u_mtrlware.mtrlid) v_mtrlcost ON // u_mtrldef.mtrlid = v_mtrlcost.mtrlid // WHERE ((u_Order_ml.OrderID = :ll_orderid) OR (u_Order_ml.porderid = :ll_orderid)) // AND ( u_order_ml.scid = :ll_scid) // And ( u_mtrldef.Mtrlorigin = 2); // IF sqlca.SQLCode <> 0 THEN // IF sqlca.SQLCode = 100 THEN // ld_price = 0 // ELSE // arg_msg = '查询材料成本失败(库存成本价),'+sqlca.SQLErrText // rslt = 0 // GOTO ext // END IF // END IF //END IF SELECT sum( v_maxprice_sptprice.price * (u_OrderRqMtrl_scll.trueRqqty / u_Order_ml.orderqty)) INTO :ld_mprice FROM u_OrderRqMtrl_scll INNER JOIN u_Order_ml ON u_OrderRqMtrl_scll.scid = u_Order_ml.scid AND u_OrderRqMtrl_scll.OrderID = u_Order_ml.OrderID INNER JOIN u_mtrldef ON u_OrderRqMtrl_scll.MtrlID = u_mtrldef.mtrlid INNER JOIN v_maxprice_sptprice ON u_mtrldef.mtrlid = v_maxprice_sptprice.mtrlid WHERE ((u_Order_ml.OrderID = :ll_orderid) OR (u_Order_ml.porderid = :ll_orderid)) AND ( u_order_ml.scid = :ll_scid) And ( u_mtrldef.Mtrlorigin = 3); IF sqlca.SQLCode <> 0 THEN IF sqlca.SQLCode = 100 THEN ld_mprice = 0 ELSE arg_msg = '查询外协成本失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF END IF DECLARE cur_buy CURSOR FOR SELECT u_OrderRqMtrl_scll.MtrlID, u_mtrldef.Mtrlorigin, isnull(v_maxprice_sptprice.price,0) * (u_OrderRqMtrl_scll.trueRqqty / u_Order_ml.orderqty), u_OrderRqMtrl_scll.trueRqqty / u_Order_ml.orderqty FROM u_OrderRqMtrl_scll INNER JOIN u_Order_ml ON u_OrderRqMtrl_scll.scid = u_Order_ml.scid AND u_OrderRqMtrl_scll.OrderID = u_Order_ml.OrderID INNER JOIN u_mtrldef ON u_OrderRqMtrl_scll.MtrlID = u_mtrldef.mtrlid LEFT OUTER JOIN v_maxprice_sptprice ON u_mtrldef.mtrlid = v_maxprice_sptprice.mtrlid WHERE ((u_Order_ml.OrderID = :ll_orderid) OR (u_Order_ml.porderid = :ll_orderid)) AND ( u_order_ml.scid = :ll_scid) And ( u_mtrldef.Mtrlorigin = 2 Or u_mtrldef.Mtrlorigin = 3); OPEN cur_buy; FETCH cur_buy Into :ll_mtrlid,:li_Mtrlorigin,:ld_mxprice,:ld_qty; DO WHILE sqlca.SQLCode = 0 ins_cnt++ arg_s_mx[ins_cnt].SonMtrlid = ll_mtrlid arg_s_mx[ins_cnt].qty = ld_qty IF li_Mtrlorigin = 2 THEN arg_s_mx[ins_cnt].price = ld_mxprice ELSE arg_s_mx[ins_cnt].wfjgprice = ld_mxprice END IF FETCH cur_buy Into :ll_mtrlid,:li_Mtrlorigin,:ld_mxprice,:ld_qty; LOOP CLOSE cur_buy; ELSE ds_tree.Retrieve(ll_scid,ll_orderid) FOR ll_i = 1 To ds_tree.RowCount() IF li_ifnext = 1 THEN IF ll_lp < ds_tree.Object.u_orderrqmtrl_tree_lp[ll_i] THEN CONTINUE END IF li_ifnext = 0 IF ds_tree.Object.u_mtrldef_mtrlorigin[ll_i] = 2 Or ds_tree.Object.u_mtrldef_mtrlorigin[ll_i] = 3 THEN ins_cnt++ arg_s_mx[ins_cnt].SonMtrlid = ds_tree.Object.u_orderrqmtrl_tree_mtrlid[ll_i] arg_s_mx[ins_cnt].qty = ds_tree.Object.qty[ll_i] END IF IF ds_tree.Object.u_mtrldef_mtrlorigin[ll_i] = 2 THEN ld_price = ld_price + ds_tree.Object.costamt[ll_i] arg_s_mx[ins_cnt].price = ds_tree.Object.costamt[ll_i] ELSEIF ds_tree.Object.u_mtrldef_mtrlorigin[ll_i] = 3 THEN ld_jgqty = ds_tree.Object.jgqty[ll_i] IF ld_jgqty > 0 THEN IF uo_option_cost_notax = 0 THEN ld_mprice = ld_mprice + ld_jgamt / ld_jgqty arg_s_mx[ins_cnt].wfjgprice = ld_jgamt / ld_jgqty ELSE ld_mprice = ld_mprice + ld_jgamt_notax / ld_jgqty arg_s_mx[ins_cnt].wfjgprice = ld_jgamt_notax / ld_jgqty END IF ELSE ld_price = ld_price + ds_tree.Object.costamt[ll_i] ll_lp = ds_tree.Object.u_orderrqmtrl_tree_lp[ll_i] arg_s_mx[ins_cnt].price = ds_tree.Object.costamt[ll_i] //直接取外协件库存成本,下级不考虑,跳过 li_ifnext = 1 END IF END IF NEXT END IF SELECT sum(isnull(u_mtrl_cost.cost,0) * (u_OrderRqMtrl_scll.trueRqqty / u_Order_ml.orderqty)) INTO :ld_outcost FROM u_OrderRqMtrl_scll INNER JOIN u_Order_ml ON u_OrderRqMtrl_scll.scid = u_Order_ml.scid AND u_OrderRqMtrl_scll.OrderID = u_Order_ml.OrderID INNER JOIN u_mtrldef ON u_OrderRqMtrl_scll.MtrlID = u_mtrldef.mtrlid INNER JOIN u_mtrl_cost ON u_mtrldef.mtrlid = u_mtrl_cost.mtrlid WHERE ((u_Order_ml.OrderID = :ll_orderid) OR (u_Order_ml.porderid = :ll_orderid)) AND ( u_order_ml.scid = :ll_scid) And ( u_mtrldef.Mtrlorigin = 0); IF sqlca.SQLCode <> 0 THEN IF sqlca.SQLCode = 100 THEN ld_outcost = 0 ELSE arg_msg = '查询费用成本失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF END IF DECLARE cur_outcost CURSOR FOR SELECT u_mtrldef.mtrlid , isnull(u_mtrl_cost.cost,0) * (u_OrderRqMtrl_scll.trueRqqty / u_Order_ml.orderqty), u_OrderRqMtrl_scll.trueRqqty / u_Order_ml.orderqty FROM u_OrderRqMtrl_scll INNER JOIN u_Order_ml ON u_OrderRqMtrl_scll.scid = u_Order_ml.scid AND u_OrderRqMtrl_scll.OrderID = u_Order_ml.OrderID INNER JOIN u_mtrldef ON u_OrderRqMtrl_scll.MtrlID = u_mtrldef.mtrlid INNER JOIN u_mtrl_cost ON u_mtrldef.mtrlid = u_mtrl_cost.mtrlid WHERE ((u_Order_ml.OrderID = :ll_orderid) OR (u_Order_ml.porderid = :ll_orderid)) AND ( u_order_ml.scid = :ll_scid) And ( u_mtrldef.Mtrlorigin = 0); OPEN cur_outcost; FETCH cur_outcost Into :ll_mtrlid,:ld_mxprice,:ld_qty; DO WHILE sqlca.SQLCode = 0 IF ld_mxprice > 0 THEN ins_cnt++ arg_s_mx[ins_cnt].SonMtrlid = ll_mtrlid arg_s_mx[ins_cnt].qty = ld_qty arg_s_mx[ins_cnt].outcost = ld_mxprice END IF FETCH cur_outcost Into :ll_mtrlid,:ld_mxprice,:ld_qty; LOOP CLOSE cur_outcost; SELECT sum(U_OrderRqwp.proqty / u_Order_ml.orderqty * U_OrderRqwp.workPrice), sum(ISNULL(u_Equipment_type.zjamt, 0) * U_OrderRqwp.eqworkhour * 60 ) INTO :ld_wageprice, :ld_eqprice FROM U_OrderRqwp INNER JOIN u_Order_ml ON U_OrderRqwp.scid = u_Order_ml.scid AND U_OrderRqwp.orderid = u_Order_ml.OrderID LEFT OUTER JOIN u_Equipment_type ON U_OrderRqwp.EquipmentID = u_Equipment_type.typeid WHERE ((u_Order_ml.OrderID = :ll_orderid) OR (u_Order_ml.porderid = :ll_orderid)) And ( u_order_ml.scid = :ll_scid); IF sqlca.SQLCode <> 0 THEN IF sqlca.SQLCode = 100 THEN ld_wageprice = 0 ld_eqprice = 0 ELSE arg_msg = '查询人力成本,费用成本失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF END IF DECLARE cur_rl CURSOR FOR SELECT u_Order_ml.mtrlid, U_OrderRqwp.proqty / u_Order_ml.orderqty , U_OrderRqwp.proqty / u_Order_ml.orderqty * U_OrderRqwp.workPrice, ISNULL(u_Equipment_type.zjamt, 0) * U_OrderRqwp.eqworkhour * 60 FROM U_OrderRqwp INNER JOIN u_Order_ml ON U_OrderRqwp.scid = u_Order_ml.scid AND U_OrderRqwp.orderid = u_Order_ml.OrderID LEFT OUTER JOIN u_Equipment_type ON U_OrderRqwp.EquipmentID = u_Equipment_type.typeid WHERE ((u_Order_ml.OrderID = :ll_orderid) OR (u_Order_ml.porderid = :ll_orderid)) And ( u_order_ml.scid = :ll_scid); OPEN cur_rl; FETCH cur_rl Into :ll_mtrlid,:ld_qty,:ld_mxjgprice,:ld_mxeqprice; DO WHILE sqlca.SQLCode = 0 IF ld_mxjgprice > 0 Or ld_mxeqprice > 0 THEN ins_cnt++ arg_s_mx[ins_cnt].SonMtrlid = ll_mtrlid arg_s_mx[ins_cnt].qty = ld_qty arg_s_mx[ins_cnt].jgprice = ld_mxjgprice arg_s_mx[ins_cnt].eqprice = ld_mxeqprice END IF FETCH cur_rl Into :ll_mtrlid,:ld_qty,:ld_mxjgprice,:ld_mxeqprice; LOOP CLOSE cur_rl; IF IsNull(ld_price) THEN ld_price = 0 IF IsNull(ld_mprice) THEN ld_mprice = 0 IF IsNull(ld_wageprice) THEN ld_wageprice = 0 IF IsNull(ld_eqprice) THEN ld_eqprice = 0 IF IsNull(ld_outcost) THEN ld_outcost = 0 arg_price = ld_price arg_mprice = ld_mprice arg_wageprice = ld_wageprice arg_eqprice = ld_eqprice arg_outcost = ld_outcost Destroy ds_tree ext: RETURN rslt end function public function integer uof_get_cost (integer arg_pricetype, long arg_scid, long arg_mtrlid, string arg_mtrlcode, string arg_pfcode, decimal arg_qty, long arg_lp, ref decimal arg_price, ref decimal arg_mprice, ref decimal arg_outcost, ref decimal arg_wageprice, ref decimal arg_eqprice, integer arg_ifcfg, ref string arg_msg, ref s_mtrlprice_mx arg_s_mx[], integer arg_protype);Int rslt rslt = 1 If uo_option_produce_dec = -1000 Then rslt = 0 arg_msg = '选项:[089]生产计划物料运算小数位,读取初始默认值失败,操作取消!' Goto ext End If If uo_option_cost_notax = -1000 Then rslt = 0 arg_msg = '选项:[362]采购外协使用不含税价进仓,读取初始默认值失败,操作取消!' Goto ext End If Decimal Sonscale,SonLoss,SonDECLosS Long SonMtrlid,count = 0,ls_i String mtrlcode, mtrlname s_pfmx ls_s_pfmx[] Decimal ld_price,ld_qty,ld_outcost,ld_wageprice,ld_eqprice Decimal ld_planprice Int li_mtrlorigin,li_statusflag,li_ifpzpf Long ll_scid,ll_pzpfcnt Decimal ld_cmpqty Decimal ld_noallocqty,ld_wareamt Long tem_long Int li_ifpackpro Decimal ld_jgamt,ld_jgamt_notax,ld_jgqty Int li_if_wfjg,li_protype,li_ifselforder deep++ If deep > 10000 Then //防止死递归 arg_msg = '物料:'+arg_mtrlcode+'死循环' rslt = 0 Goto ext End If Select cmpqty,statusflag,protype,ifselforder Into :ld_cmpqty,:li_statusflag,:li_protype,:li_ifselforder From u_mtrldef Where mtrlid = :arg_mtrlid; If sqlca.SQLCode <> 0 Then MessageBox('Error','查询物料清单基数及是否使用组合配置失败,'+sqlca.SQLErrText) Return 0 End If If li_statusflag = 2 And arg_ifcfg = 0 Then ll_pzpfcnt = 0 Select count(*) Into :ll_pzpfcnt From u_mtrl_pf Where mtrlid = :arg_mtrlid And pfcode = :arg_pfcode And ifpzpf = 1; If sqlca.SQLCode <> 0 Then arg_msg = '查询物料是否启用组合配置清单失败,'+sqlca.SQLErrText rslt = 0 Goto ext End If If ll_pzpfcnt > 0 Then li_ifpzpf = 1 Else li_ifpzpf = 0 End If Else li_ifpzpf = 0 End If s_mtrlcfg_expr s_mtrlcfg[] Long ll_cfg,ll_cnt_s_mtrlcfg,cnt //配置运算 count = 0 //yyx2013-6-22 //+整套(空子件)的工价人力成本 If li_statusflag = 2 And arg_ifcfg = 0 And deep = 1 Then ld_wageprice = 0 If uof_get_wageprice(arg_mtrlid,arg_mtrlcode,'',arg_qty,ld_wageprice,arg_msg) = 0 Then rslt = 0 Goto ext End If arg_wageprice = arg_wageprice + ld_wageprice End If //yyx2013-6-22_end If li_statusflag = 2 And arg_ifcfg = 0 And li_ifpzpf = 0 Then //分解配置 f_checkpz(arg_pfcode,s_mtrlcfg) // ll_cnt_s_mtrlcfg = UpperBound(s_mtrlcfg) If ll_cnt_s_mtrlcfg = 0 Then count = 0 Else For ll_cfg = 1 To ll_cnt_s_mtrlcfg count++ ls_s_pfmx[count].SonMtrlid = arg_mtrlid ls_s_pfmx[count].sonpfcode = s_mtrlcfg[ll_cfg].cfgname ls_s_pfmx[count].ifcfg = 1 ls_s_pfmx[count].Sonscale = Dec(s_mtrlcfg[ll_cfg].qty) ls_s_pfmx[count].SonLoss = 0 ls_s_pfmx[count].SonDECLosS = 0 Next End If If count = 0 Then arg_msg = '物料分拆配置失败,请检查配置内容' rslt = 0 Goto ext End If //查询附加常规清单 cnt = 0 Select count(*) Into :cnt From u_mtrl_pf Where ( u_mtrl_pf.mtrlid = :arg_mtrlid ) And ( u_mtrl_pf.ifdi = 0 ) And ( u_mtrl_pf.ifdft = 1 ); If sqlca.SQLCode <> 0 Then arg_msg = '查询组合配置产品附加默认清单失败,请检查是否已建立默认清单' rslt = 0 Goto ext End If If cnt > 1 Then arg_msg = '组合配置产品附加默认清单只能设置1个,请检查资料' rslt = 0 Goto ext End If If cnt = 1 Then Declare pf_cur_dft Cursor For Select u_PrdPF.Sonscale, u_PrdPF.SonLoss, u_PrdPF.SonDECLosS, u_PrdPF.SonMtrlid, u_mtrldef.mtrlcode, u_PrdPF.sonpfcode,0, u_mtrldef.mrptype, u_mtrldef.mrparg From u_PrdPF,u_mtrldef,u_mtrl_pf Where ( u_PrdPF.mtrlid = u_mtrl_pf.mtrlid ) And ( u_mtrl_pf.ifdi = 0 ) And ( u_mtrl_pf.ifdft = 1 ) And ( u_PrdPF.pfcode = u_mtrl_pf.pfcode ) And ( u_PrdPF.mtrlid = :arg_mtrlid ) And ( u_PrdPF.mtrlid = u_mtrldef.mtrlid ); Open pf_cur_dft; count++ Fetch pf_cur_dft Into :ls_s_pfmx[count].Sonscale,:ls_s_pfmx[count].SonLoss,& :ls_s_pfmx[count].SonDECLosS,:ls_s_pfmx[count].SonMtrlid,& :ls_s_pfmx[count].mtrlcode,:ls_s_pfmx[count].sonpfcode,:ls_s_pfmx[count].ifcfg,:ls_s_pfmx[count].u_mtrldef_mrptype,& :ls_s_pfmx[count].u_mtrldef_mrparg; Do While sqlca.SQLCode = 0 count++ Fetch pf_cur_dft Into :ls_s_pfmx[count].Sonscale,:ls_s_pfmx[count].SonLoss,& :ls_s_pfmx[count].SonDECLosS,:ls_s_pfmx[count].SonMtrlid,& :ls_s_pfmx[count].mtrlcode,:ls_s_pfmx[count].sonpfcode,:ls_s_pfmx[count].ifcfg,:ls_s_pfmx[count].u_mtrldef_mrptype,& :ls_s_pfmx[count].u_mtrldef_mrparg; Loop count = count - 1 Close pf_cur_dft; End If Else Declare pf_cur Cursor For Select u_PrdPF.Sonscale, u_PrdPF.SonLoss, u_PrdPF.SonDECLosS, u_PrdPF.SonMtrlid, u_mtrldef.mtrlcode, u_PrdPF.sonpfcode, 0, u_mtrldef.mrptype, u_mtrldef.mrparg From u_PrdPF, u_mtrldef Where ( u_PrdPF.SonMtrlid = u_mtrldef.mtrlid ) And ( u_PrdPF.mtrlid = :arg_mtrlid ) And ( u_PrdPF.pfcode = :arg_pfcode ); Open pf_cur; count = 1 Fetch pf_cur Into :ls_s_pfmx[count].Sonscale,:ls_s_pfmx[count].SonLoss,& :ls_s_pfmx[count].SonDECLosS,:ls_s_pfmx[count].SonMtrlid,& :ls_s_pfmx[count].mtrlcode,:ls_s_pfmx[count].sonpfcode,:ls_s_pfmx[count].ifcfg,:ls_s_pfmx[count].u_mtrldef_mrptype,& :ls_s_pfmx[count].u_mtrldef_mrparg; Do While sqlca.SQLCode = 0 count++ Fetch pf_cur Into :ls_s_pfmx[count].Sonscale,:ls_s_pfmx[count].SonLoss,& :ls_s_pfmx[count].SonDECLosS,:ls_s_pfmx[count].SonMtrlid,& :ls_s_pfmx[count].mtrlcode,:ls_s_pfmx[count].sonpfcode,:ls_s_pfmx[count].ifcfg,:ls_s_pfmx[count].u_mtrldef_mrptype,& :ls_s_pfmx[count].u_mtrldef_mrparg; Loop count = count - 1 Close pf_cur; End If //***查询最新采购价 If (arg_lp > 1 Or ifcmpl_1) And Not (li_statusflag = 2 And arg_ifcfg = 0) Then Select mtrlorigin,scid,ifpackpro Into :li_mtrlorigin,:ll_scid,:li_ifpackpro From u_mtrldef Where mtrlid = :arg_mtrlid; If sqlca.SQLCode <> 0 Then arg_msg = '查询:'+arg_mtrlcode+'来源失败' rslt = 0 Goto ext End If Select planprice Into :ld_planprice From u_mtrldef_planprice Where mtrlid = :arg_mtrlid And status = '' And woodcode = '' And pcode = ''; If sqlca.SQLCode <> 0 Then ld_planprice = 0 End If ins_cnt++ arg_s_mx[ins_cnt].SonMtrlid = arg_mtrlid arg_s_mx[ins_cnt].qty = arg_qty Choose Case li_mtrlorigin Case 2,3 If arg_pricetype = 0 Then If uo_option_cost_notax = 0 Then Select Case when price = 0 Then price_bj Else price End Into :ld_price From v_maxprice_sptprice Where mtrlid = :arg_mtrlid; If sqlca.SQLCode = -1 Then arg_msg = '查询物料:'+arg_mtrlcode+'最新采购价或最新外加工单价失败' rslt = 0 Goto ext End If Else Select price_notax Into :ld_price From v_maxprice_sptprice_notax Where mtrlid = :arg_mtrlid; If sqlca.SQLCode = -1 Then arg_msg = '查询物料:'+arg_mtrlcode+'最新采购价或最新外加工单价失败' rslt = 0 Goto ext End If End If Else If li_mtrlorigin = 3 Then Select SUM(ow_wfjgmx_in_aft.jgprice * ow_wfjgmx_in_aft.uqty * ow_wfjgmx_in_aft.rebate) , SUM((ow_wfjgmx_in_aft.jgprice * ow_wfjgmx_in_aft.uqty * ow_wfjgmx_in_aft.rebate) / (1 + ow_wfjgmx_in_aft.taxrate)), sum(ow_wfjgmx_in_aft.uqty) Into :ld_jgamt, :ld_jgamt_notax, :ld_jgqty From (Select u_inware.relid, u_inwaremx.mtrlid, u_inwaremx.printid, u_inware.storageid, u_inware.balcdateint From u_inware Inner JOIN u_inwaremx ON u_inware.scid = u_inwaremx.scid And u_inware.inwareid = u_inwaremx.inwareid Where (u_inware.billtype = 4)) v_inware Inner JOIN (Select DISTINCT Storageid, MAX(balcdateint) AS balcdateint From u_warebalc Where (balcdateint > 0) Group By Storageid) v_balcint ON v_inware.storageid = v_balcint.Storageid And v_inware.balcdateint = v_balcint.balcdateint Inner JOIN ow_wfjgmx_in_aft ON v_inware.relid = ow_wfjgmx_in_aft.inwareid And v_inware.printid = ow_wfjgmx_in_aft.printid Where (ow_wfjgmx_in_aft.mtrlid = :arg_mtrlid); If sqlca.SQLCode <> 0 Then li_if_wfjg = 0 Else If IsNull(ld_jgamt) Then ld_jgamt = 0 If IsNull(ld_jgamt_notax) Then ld_jgamt_notax = 0 If IsNull(ld_jgqty) Then ld_jgqty = 0 If ld_jgqty = 0 Then li_if_wfjg = 0 Else li_if_wfjg = 1 End If End If If li_if_wfjg = 1 Then If uo_option_cost_notax = 0 Then ld_price = ld_jgamt / ld_jgqty Else ld_price = ld_jgamt_notax / ld_jgqty End If End If End If If li_mtrlorigin = 2 Or (li_mtrlorigin = 3 And li_if_wfjg = 0) Then Select sum(u_mtrlware.noallocqty), sum(u_mtrlware.wareamt) Into :ld_noallocqty, :ld_wareamt From u_mtrlware Inner JOIN u_storage ON u_mtrlware.storageid = u_storage.storageid Where (u_storage.Mtrlprp <> 3) And (u_storage.inuse = 1) And (u_mtrlware.mtrlid = :arg_mtrlid) ; If sqlca.SQLCode = -1 Then arg_msg = '查询物料:'+arg_mtrlcode+'最新成本价失败(总库存量),'+sqlca.SQLErrText rslt = 0 Goto ext End If If IsNull(ld_noallocqty) Then ld_noallocqty = 0 If IsNull(ld_wareamt) Then ld_wareamt = 0 If ld_noallocqty = 0 Then Select top 1 u_mtrlware.cost Into :ld_price From u_mtrlware Inner JOIN u_storage ON u_mtrlware.storageid = u_storage.storageid Where (u_storage.Mtrlprp <> 3) And (u_storage.inuse = 1) And (u_mtrlware.mtrlid = :arg_mtrlid) Order By u_mtrlware.cost Desc; If sqlca.SQLCode = -1 Then arg_msg = '查询物料:'+arg_mtrlcode+'最新成本价失败,'+sqlca.SQLErrText rslt = 0 Goto ext ElseIf sqlca.SQLCode = 100 Or ld_price = 0 Then li_if_wfjg = 1 If uo_option_cost_notax = 0 Then Select price Into :ld_price From v_maxprice_sptprice Where mtrlid = :arg_mtrlid; If sqlca.SQLCode = -1 Then arg_msg = '查询物料:'+arg_mtrlcode+'最新采购价或最新外加工单价失败' rslt = 0 Goto ext End If Else Select price_notax Into :ld_price From v_maxprice_sptprice_notax Where mtrlid = :arg_mtrlid; If sqlca.SQLCode = -1 Then arg_msg = '查询物料:'+arg_mtrlcode+'最新采购价或最新外加工单价失败' rslt = 0 Goto ext End If End If End If Else ld_price = ld_wareamt / ld_noallocqty If ld_wareamt = 0 Then li_if_wfjg = 1 If uo_option_cost_notax = 0 Then Select price Into :ld_price From v_maxprice_sptprice Where mtrlid = :arg_mtrlid; If sqlca.SQLCode = -1 Then arg_msg = '查询物料:'+arg_mtrlcode+'最新采购价或最新外加工单价失败' rslt = 0 Goto ext End If Else Select price_notax Into :ld_price From v_maxprice_sptprice_notax Where mtrlid = :arg_mtrlid; If sqlca.SQLCode = -1 Then arg_msg = '查询物料:'+arg_mtrlcode+'最新采购价或最新外加工单价失败' rslt = 0 Goto ext End If End If End If End If End If End If If IsNull(ld_price) Then ld_price = 0 If li_mtrlorigin = 3 Then If arg_pricetype = 0 Or li_if_wfjg = 1 Then arg_mprice = arg_mprice + ld_price * arg_qty arg_s_mx[ins_cnt].wfjgprice = ld_price * arg_qty If ld_price = 0 Then ins_wf_errcnt++ Else arg_price = arg_price + ld_price * arg_qty arg_s_mx[ins_cnt].price = ld_price * arg_qty If ld_price = 0 Then ins_cl_errcnt++ rslt = 1 Goto ext End If End If If li_mtrlorigin = 2 And (li_ifpackpro = 0 Or count = 0) Then arg_price = arg_price + ld_price * arg_qty arg_s_mx[ins_cnt].price = ld_price * arg_qty If ld_price = 0 Then ins_cl_errcnt++ rslt = 1 Goto ext End If Case 0 If arg_scid <> ll_scid Then arg_price = arg_price + ld_planprice * arg_qty arg_s_mx[ins_cnt].price = ld_planprice * arg_qty If ld_planprice = 0 Then ins_cl_errcnt++ rslt = 1 Goto ext Else //计算分摊费用 If uof_get_f_price(arg_mtrlid,arg_mtrlcode,arg_qty,ld_outcost,arg_msg) = 0 Then rslt = 0 Goto ext End If arg_outcost = arg_outcost + ld_outcost arg_s_mx[ins_cnt].outcost = ld_outcost //计算人工 If li_ifselforder = 0 And arg_protype = 0 Then ld_wageprice = 0 Else If uof_get_wageprice(arg_mtrlid,arg_mtrlcode,arg_pfcode,arg_qty,ld_wageprice,arg_msg) = 0 Then rslt = 0 Goto ext End If End If arg_wageprice = arg_wageprice + ld_wageprice arg_s_mx[ins_cnt].jgprice = ld_wageprice //计算设备成本 If uof_get_equipprice(arg_mtrlid,arg_mtrlcode,arg_pfcode,arg_qty,ld_eqprice,arg_msg) = 0 Then rslt = 0 Goto ext End If arg_eqprice = arg_eqprice + ld_eqprice arg_s_mx[ins_cnt].eqprice = ld_eqprice End If End Choose End If For ls_i = 1 To count // ld_qty = Round(arg_qty * (ls_s_pfmx[ls_i].Sonscale / (1 - ls_s_pfmx[ls_i].SonLoss) + ls_s_pfmx[ls_i].SonDECLosS) / ld_cmpqty,uo_option_produce_dec) If uo_option_pfmrp_ifuse_mtrlmrparg = 0 Then If ls_s_pfmx[ls_i].u_mtrldef_mrptype = 0 Then ld_qty = Round(arg_qty * (ls_s_pfmx[ls_i].Sonscale/(1 - ls_s_pfmx[ls_i].SonLoss)+ls_s_pfmx[ls_i].SonDECLosS)/ld_cmpqty,ls_s_pfmx[ls_i].u_mtrldef_mrparg) Else If ls_s_pfmx[ls_i].u_mtrldef_mrparg = 0 Then ld_qty = Ceiling(Truncate(arg_qty * ls_s_pfmx[ls_i].Sonscale/(1 - ls_s_pfmx[ls_i].SonLoss)+ls_s_pfmx[ls_i].SonDECLosS,10)/ld_cmpqty) Else tem_long = 10^ls_s_pfmx[ls_i].u_mtrldef_mrparg ld_qty = Ceiling((Truncate(arg_qty * ls_s_pfmx[ls_i].Sonscale/(1 - ls_s_pfmx[ls_i].SonLoss)+ls_s_pfmx[ls_i].SonDECLosS,10)/ld_cmpqty) * tem_long)/tem_long ld_qty = Round(ld_qty , ls_s_pfmx[ls_i].u_mtrldef_mrparg) End If End If Else ld_qty = Round(arg_qty * (ls_s_pfmx[ls_i].Sonscale/(1 - ls_s_pfmx[ls_i].SonLoss)+ls_s_pfmx[ls_i].SonDECLosS)/ld_cmpqty,uo_option_produce_dec) End If If uof_get_cost(arg_pricetype,arg_scid,ls_s_pfmx[ls_i].SonMtrlid,ls_s_pfmx[ls_i].mtrlcode,& ls_s_pfmx[ls_i].sonpfcode,ld_qty,arg_lp+1,arg_price,arg_mprice,arg_outcost,& arg_wageprice,arg_eqprice,ls_s_pfmx[ls_i].ifcfg,arg_msg,arg_s_mx,li_protype) = 0 Then rslt = 0 Goto ext End If Next ext: Return rslt end function public function integer uof_add_mtrlprice_mx (long arg_sumdate, long arg_mtrlid, string arg_status, string arg_woodcode, string arg_pcode, string arg_pfcode, s_mtrlprice_mx arg_s_mx[], ref string arg_msg);Int rslt = 1 String ls_wpcode uo_mtrl_pf uo_pf uo_workpricetable u_wrkprice uo_pf = create uo_mtrl_pf u_wrkprice = create uo_workpricetable If uo_pf.f_clearprdpfmx(arg_mtrlid,arg_pfcode,arg_msg,False) = 0 Then rslt = 0 Goto ext End If uo_pf.deep_count = 0 uo_pf.il_printid = 0 If uo_pf.f_cmpprdpf(arg_mtrlid,arg_mtrlid,arg_pfcode,arg_pfcode,1,1,1,arg_msg,False,0) = 0 Then rslt = 0 Goto ext End If Delete From u_mtrlprice_prdpfmx Where mtrlid = :arg_mtrlid And pfcode = :arg_pfcode And sumdate = :arg_sumdate; If sqlca.SQLCode <> 0 Then rslt = 0 arg_msg = '删除旧数据失败(物料清单用料列表),'+sqlca.SQLErrText Goto ext End If Insert Into u_mtrlprice_prdpfmx (mtrlid, pfcode, printid, pfgroup, SonMtrlid, Sonscale, SonLoss, SonDECLosS, Sonahead, dscrp, pfgroupqty, pfgroupmode, promode, wrkgrpid, status, sonflag, grade, woodcode, pcode, realqty, pfklmode, sonpfcode, upmtrlid, uprealqty, wenli, fengbian, paikong, luoji, penyou,sumdate) Select mtrlid, pfcode, printid, pfgroup, SonMtrlid, Sonscale, SonLoss, SonDECLosS, Sonahead, dscrp, pfgroupqty, pfgroupmode, promode, wrkgrpid, status, sonflag, grade, woodcode, pcode, realqty, pfklmode, sonpfcode, upmtrlid, uprealqty, wenli, fengbian, paikong, luoji, penyou,:arg_sumdate From u_PrdPF_mx Where mtrlid = :arg_mtrlid And pfcode = :arg_pfcode; If sqlca.SQLCode <> 0 Then rslt = 0 arg_msg = '插入物料清单用料列表失败,'+sqlca.SQLErrText Goto ext End If //更新用料价格 Update u_mtrlprice_prdpfmx Set price = v_mx.price From u_mtrlprice_prdpfmx Inner JOIN (Select u_mtrlprice_mx.mtrlid, u_mtrlprice_mx.pfcode, u_mtrlprice_mx.sonmtrlid, CASE u_mtrlprice_mx.qty WHEN 0 THEN 0 ELSE CASE u_mtrldef.Mtrlorigin WHEN 2 THEN u_mtrlprice_mx.price / u_mtrlprice_mx.qty WHEN 3 THEN u_mtrlprice_mx.wfjgprice / u_mtrlprice_mx.qty ELSE 0 END END AS price From u_mtrlprice_mx Inner JOIN u_mtrldef ON u_mtrlprice_mx.sonmtrlid = u_mtrldef.mtrlid Where (u_mtrldef.Mtrlorigin = 2 Or u_mtrldef.Mtrlorigin = 3) And u_mtrlprice_mx.mtrlid = :arg_mtrlid And u_mtrlprice_mx.pfcode = :arg_pfcode And u_mtrlprice_mx.status = :arg_status And u_mtrlprice_mx.woodcode = :arg_woodcode And u_mtrlprice_mx.pcode = :arg_pcode) v_mx ON u_mtrlprice_prdpfmx.mtrlid = v_mx.mtrlid And u_mtrlprice_prdpfmx.pfcode = v_mx.pfcode COLLATE Chinese_PRC_CI_AS And u_mtrlprice_prdpfmx.SonMtrlid = v_mx.sonmtrlid Where u_mtrlprice_prdpfmx.mtrlid = :arg_mtrlid And u_mtrlprice_prdpfmx.pfcode = :arg_pfcode and u_mtrlprice_prdpfmx.sumdate = :arg_sumdate; If sqlca.SQLCode <> 0 Then rslt = 0 arg_msg = '插入物料清单用料列表单价失败,'+sqlca.SQLErrText Goto ext End If //工价表 Select wpcode Into :ls_wpcode From u_mtrl_workprice Where mtrlid = :arg_mtrlid And ifdft = 1; If sqlca.SQLCode <> 0 Then arg_msg = '查询物料默认工价表失败' rslt = 0 Goto ext End If u_wrkprice.mtrlid = arg_mtrlid If u_wrkprice.f_clearpfmx(arg_mtrlid,ls_wpcode,arg_msg,False) = 0 Then rslt = 0 Goto ext End If //插入自身工价表 u_wrkprice.deep_count = 0 u_wrkprice.il_printid = 0 If u_wrkprice.f_addworkprice(arg_mtrlid,ls_wpcode,arg_msg,False) = 0 Then rslt = 0 Goto ext End If //插入下级自制物料工价表 If u_wrkprice.f_addpfmx(arg_mtrlid,ls_wpcode,arg_pfcode,1,1,arg_msg,False,1) = 0 Then rslt = 0 Goto ext End If Delete From u_mtrlprice_wpmx Where parentmtrlid = :arg_mtrlid And sumdate = :arg_sumdate; If sqlca.SQLCode <> 0 Then rslt = 0 arg_msg = '删除旧数据失败(全套工价),'+sqlca.SQLErrText Goto ext End If Insert Into u_mtrlprice_wpmx (parentmtrlid, printid, wpcode, wrkid, mtrlid, proid, proorder, procode, proname, wrkgrpid, workprice, workqty, worklevel, techlevel, workhour, dscrp, auditflag, auditrep, auditdate, Lastflag, lp, status, ifjd, sumdate) Select parentmtrlid, printid, wpcode, wrkid, mtrlid, proid, proorder, procode, proname, wrkgrpid, workprice, workqty, worklevel, techlevel, workhour, dscrp, auditflag, auditrep, auditdate, Lastflag, lp, status, ifjd, :arg_sumdate From u_sc_workprice_mx Where parentmtrlid = :arg_mtrlid; If sqlca.SQLCode <> 0 Then rslt = 0 arg_msg = '插入全套工价失败,'+sqlca.SQLErrText Goto ext End If ext: destroy uo_pf destroy u_wrkprice If rslt = 1 Then Commit; ElseIf rslt = 0 Then Rollback; End If Return rslt end function public function integer uof_cmpl_mtrlcost (long ll_mtrlid, string ls_pfcode, string ls_status, string ls_woodcode, string ls_pcode, long li_dec, boolean if_auto_copy, integer ifprice, integer ifwfjgprice, integer ifjgprice, integer ifoutcost, integer ifotherprice, integer ifeqprice, ref string arg_msg);Int rslt = 1 Long li_statusflag, li_woodcodeflag, li_pcodeflag, ll_scid String ls_status_config, ls_woodcode_config, ls_pcode_config String ls_mtrlcode Decimal ld_price, ld_wfjgprice, ld_outcost_self, ld_outcost, ld_wageprice, ld_otherprice, ld_eqprice s_mtrlprice_mx arg_s_mx[],arg_s_empty[] Long ll_cl_errcnt,ll_wf_errcnt,ll_rl_errcnt Long ll_i Long sumdate sumdate = Year(Date(Today())) * 10000 + Month(Date(Today())) * 100 + Day(Date(Today())) IF ls_pfcode = '' THEN GOTO ext END IF SELECT statusflag, woodcodeflag, pcodeflag, scid, status_config, woodcode_config, pcode_config INTO :li_statusflag,:li_woodcodeflag,:li_pcodeflag,:ll_scid,:ls_status_config,:ls_woodcode_config,:ls_pcode_config FROM u_mtrldef Where mtrlid = :ll_mtrlid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询物料资料失败,' + sqlca.SQLErrText GOTO ext END IF ld_price = 0 ld_wfjgprice = 0 ld_outcost_self = 0 ld_outcost = 0 ld_wageprice = 0 ld_otherprice = 0 ld_eqprice = 0 arg_msg = '' deep = 0 ifcmpl_1 = True ins_cnt = 0 ins_cl_errcnt = 0 ins_wf_errcnt = 0 ins_rl_errcnt = 0 arg_s_mx = arg_s_empty If (li_statusflag = 4 And ls_status <> ls_status_config Or & li_woodcodeflag = 4 And ls_woodcode <> ls_woodcode_config Or & li_pcodeflag = 4 And ls_pcode <> ls_pcode_config) THEN IF uof_get_cost_dz(0,ll_mtrlid,ls_status,ls_woodcode,ls_pcode,ld_price,ld_wfjgprice,ld_outcost,ld_wageprice,ld_eqprice,arg_msg,arg_s_mx) = 0 THEN arg_msg = '物料:'+ls_mtrlcode+'取成本失败,'+arg_msg // Continue ld_price = 0 ld_wfjgprice = 0 ld_outcost = 0 ld_wageprice = 0 ld_eqprice = 0 END IF ELSE IF uof_get_cost(0,ll_scid,ll_mtrlid,ls_mtrlcode,ls_pfcode,1,1,ld_price,ld_wfjgprice,ld_outcost,ld_wageprice,ld_eqprice,0,arg_msg,arg_s_mx,1) = 0 THEN arg_msg = '物料:'+ls_mtrlcode+'取成本失败,'+arg_msg rslt = 0 GOTO ext ld_price = 0 ld_wfjgprice = 0 ld_outcost = 0 ld_wageprice = 0 ld_eqprice = 0 END IF END IF ld_price = Round(ld_price,li_dec) ld_wfjgprice = Round(ld_wfjgprice,li_dec) ld_outcost = Round(ld_outcost,li_dec) ld_wageprice = Round(ld_wageprice,li_dec) ld_eqprice = Round(ld_eqprice,li_dec) ll_cl_errcnt = ins_cl_errcnt ll_wf_errcnt = ins_wf_errcnt ll_rl_errcnt = ins_rl_errcnt IF if_auto_copy THEN SELECT top 1 otherprice INTO :ld_otherprice FROM u_mtrlprice_sum WHERE mtrlid = :ll_mtrlid AND pfcode = :ls_pfcode AND sumdate < :sumdate AND status = :ls_status AND woodcode = :ls_woodcode AND pcode = :ls_pcode Order By sumdate Desc; IF sqlca.SQLCode <> 0 THEN arg_msg = '物料:'+ls_mtrlcode+'取上次附加成本失败,'+arg_msg rslt = 0 GOTO ext END IF IF IsNull(ld_otherprice) THEN ld_otherprice = 0 END IF UPDATE u_mtrlprice_sum SET price = :ld_price, cost = :ld_price * :ifprice + :ld_wfjgprice * :ifwfjgprice + :ld_wageprice * :ifjgprice + :ld_outcost * :ifoutcost + :ld_otherprice * :ifotherprice + :ld_eqprice * :ifeqprice, wfjgprice = :ld_wfjgprice, jgprice = :ld_wageprice, outcost = :ld_outcost, otherprice = :ld_otherprice, eqprice = :ld_eqprice, dscrp = :arg_msg, sumdate = :sumdate, cl_errcnt = :ll_cl_errcnt, wf_errcnt = :ll_wf_errcnt, rl_errcnt = :ll_rl_errcnt WHERE mtrlid = :ll_mtrlid AND pfcode = :ls_pfcode AND (sumdate = :sumdate OR sumdate = 0 ) AND status = :ls_status AND woodcode = :ls_woodcode And pcode = :ls_pcode; IF sqlca.SQLCode = 0 THEN IF sqlca.SQLNRows = 0 THEN INSERT INTO u_mtrlprice_sum (sumdate, pfcode, mtrlid, price, cost, wfjgprice, jgprice, eqprice, outcost, otherprice, dscrp, status, woodcode, pcode, cl_errcnt, wf_errcnt, rl_errcnt) VALUES(:sumdate, :ls_pfcode, :ll_mtrlid, :ld_price, :ld_price * :ifprice + :ld_wfjgprice * :ifwfjgprice + :ld_wageprice * :ifjgprice + :ld_outcost * :ifoutcost + :ld_otherprice * :ifotherprice + :ld_eqprice * :ifeqprice, :ld_wfjgprice, :ld_wageprice, :ld_eqprice, :ld_outcost, :ld_otherprice, :arg_msg, :ls_status, :ls_woodcode, :ls_pcode, :ll_cl_errcnt, :ll_wf_errcnt, :ll_rl_errcnt); IF sqlca.SQLCode <> 0 THEN ROLLBACK; arg_msg = '新增物料:'+ls_mtrlcode+'成本失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF END IF ELSE ROLLBACK; arg_msg = '更新物料:'+ls_mtrlcode+'成本失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF DELETE FROM u_mtrlprice_mx WHERE mtrlid = :ll_mtrlid AND pfcode = :ls_pfcode AND status = :ls_status AND woodcode = :ls_woodcode And pcode = :ls_pcode; IF sqlca.SQLCode <> 0 THEN ROLLBACK; arg_msg = '删除物料:'+ls_mtrlcode+'原成本组成明细失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF FOR ll_i = 1 To UpperBound(arg_s_mx) UPDATE u_mtrlprice_mx SET price = price + :arg_s_mx[ll_i].price, wfjgprice = wfjgprice + :arg_s_mx[ll_i].wfjgprice, jgprice = jgprice + :arg_s_mx[ll_i].jgprice, outcost = outcost + :arg_s_mx[ll_i].outcost, eqprice = eqprice + :arg_s_mx[ll_i].eqprice, qty = qty + :arg_s_mx[ll_i].qty WHERE mtrlid = :ll_mtrlid AND pfcode = :ls_pfcode AND status = :ls_status AND woodcode = :ls_woodcode AND pcode = :ls_pcode And sonmtrlid = :arg_s_mx[ll_i].sonmtrlid; IF sqlca.SQLCode = 0 THEN IF sqlca.SQLNRows = 0 THEN INSERT INTO u_mtrlprice_mx (mtrlid, pfcode, status, woodcode, pcode, sonmtrlid, price, wfjgprice, jgprice, outcost, eqprice, qty) VALUES (:ll_mtrlid, :ls_pfcode, :ls_status, :ls_woodcode, :ls_pcode, :arg_s_mx[ll_i].sonmtrlid, :arg_s_mx[ll_i].price, :arg_s_mx[ll_i].wfjgprice, :arg_s_mx[ll_i].jgprice, :arg_s_mx[ll_i].outcost, :arg_s_mx[ll_i].eqprice, :arg_s_mx[ll_i].qty); IF sqlca.SQLCode <> 0 THEN ROLLBACK; arg_msg = '物料:'+ls_mtrlcode+'插入成本组成明细失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF END IF ELSE ROLLBACK; arg_msg = '更新物料:'+ls_mtrlcode+'成本组成明细失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF NEXT COMMIT; IF uof_add_mtrlprice_mx(sumdate,ll_mtrlid,ls_status,ls_woodcode,ls_pcode,ls_pfcode,arg_s_mx,arg_msg) = 0 THEN arg_msg = '更新物料:'+ls_mtrlcode+'历史物料清单及工价表失败,'+arg_msg rslt = 0 GOTO ext END IF ext: RETURN rslt end function on uo_cmplcost.create call super::create TriggerEvent( this, "constructor" ) end on on uo_cmplcost.destroy TriggerEvent( this, "destructor" ) call super::destroy end on event constructor;String str_optionvalue,arg_msg f_get_sys_option_value('089',str_optionvalue,arg_msg) uo_option_produce_dec = Long(str_optionvalue) f_get_sys_option_value('362',str_optionvalue,arg_msg) uo_option_cost_notax = long(str_optionvalue) f_get_sys_option_value('365',str_optionvalue,arg_msg) uo_option_pfmrp_ifuse_mtrlmrparg = long(str_optionvalue) end event