$PBExportHeader$uo_func_mtrlcfg.sru forward global type uo_func_mtrlcfg from nonvisualobject end type end forward global type uo_func_mtrlcfg from nonvisualobject end type global uo_func_mtrlcfg uo_func_mtrlcfg type variables int uo_option_bom_affirm end variables forward prototypes public function integer check_mtrlcfg_str (long arg_mtrlid, ref string arg_str, integer arg_cfgtype, ref string arg_msg) public function integer save (s_mtrl_pz arg_s_mtrlpz, ref string arg_msg, boolean if_commit) public function integer check_mtrlcfg_exist (long arg_mtrlid, string arg_str, ref string arg_msg) end prototypes public function integer check_mtrlcfg_str (long arg_mtrlid, ref string arg_str, integer arg_cfgtype, ref string arg_msg);//==================================================================== // Function: check_mtrlcfg_str() //-------------------------------------------------------------------- // Description:检查并合并配置串 //-------------------------------------------------------------------- // Arguments: // value long arg_mtrlid // reference string arg_str // value integer arg_cfgtype // reference string arg_msg //-------------------------------------------------------------------- // Returns: integer //-------------------------------------------------------------------- // Author: Date: 2006.08.31 //-------------------------------------------------------------------- // Modify History: // //==================================================================== Int rslt = 1 , i , j , k, li_pos Long count Boolean flag String str[] s_mtrlcfg_expr s_mtrl_config_expr[] , s_mtrl_config_expr_1[] arg_str = Trim(arg_str) IF arg_str = '' THEN rslt = 0 arg_msg = '配置说明不能为空!' GOTO ext END IF IF arg_cfgtype = 1 THEN //子件 IF Pos(arg_str , '+') > 0 Or Pos(arg_str , '*') > 0 THEN //检查配置名称合法性 rslt = 0 arg_msg = "配置名称输入错误,配置类型为子件,不是组合!" GOTO ext END IF SELECT count(*) //检查配置名称是否存在 INTO :count FROM u_mtrl_configure WHERE mtrlid = :arg_mtrlid AND name = :arg_str AND type = 1 And ifzj = :arg_cfgtype; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '因网络或者其他原因导致查询配置说明失败!>>'+sqlca.SQLErrText GOTO ext END IF IF count <> 0 THEN rslt = 0 arg_msg = '产品已经存在该配置说明,请重新输入!' GOTO ext END IF END IF IF arg_cfgtype = 0 THEN //组合配置 IF Pos(arg_str,'+') <= 0 And Pos(arg_str,'*') <= 0 THEN rslt = 0 arg_msg = '配置名称输入错误,配置类型为组合,不是子件!' GOTO ext END IF i = 0 li_pos = 1 flag = True DO WHILE flag //利用'+'号分割字符串 IF Pos(arg_str , '+') > 0 THEN i++ str[i] = Mid(arg_str , li_pos , Pos(arg_str , '+') - 1 ) arg_str = Mid(arg_str , Pos(arg_str , '+') + 1) ELSE flag = False str[i+1] = arg_str END IF LOOP FOR i = 1 To UpperBound(str[]) //利用'*'号分割出配置名和数量 IF Pos(str[i] , '*') > 0 THEN s_mtrl_config_expr[i].cfgname = Trim(Mid(str[i] , 1 , Pos(str[i] , '*') - 1)) s_mtrl_config_expr[i].qty = Trim(Mid(str[i] , (Pos(str[i] , '*') + 1), Len(str[i]) - (Pos(str[i] , '*') + 1) + 1)) s_mtrl_config_expr[i].Sign = '*' ELSE s_mtrl_config_expr[i].cfgname = Trim(str[i]) s_mtrl_config_expr[i].Sign = '*' s_mtrl_config_expr[i].qty = '1' END IF NEXT FOR i = 1 To UpperBound(s_mtrl_config_expr[]) //检查配置名称合法性 IF s_mtrl_config_expr[i].cfgname = '' THEN rslt = 0 arg_msg = '该产品配置说明输入格式错误,请重新输入!' GOTO ext END IF s_mtrl_config_expr[i].if_chinese = False // FOR k = 1 TO Len(s_mtrl_config_expr[i].cfgname) //利用asc码值判断配置串中是否存在中文字 // IF (asc(MID(s_mtrl_config_expr[i].cfgname,k,1)) >= 128) or & // (asc(MID(s_mtrl_config_expr[i].cfgname,k,1)) >= 65 and asc(MID(s_mtrl_config_expr[i].cfgname,k,1)) <= 90) or & // (asc(MID(s_mtrl_config_expr[i].cfgname,k,1)) >= 97 and asc(MID(s_mtrl_config_expr[i].cfgname,k,1)) <= 122)THEN // s_mtrl_config_expr[i].if_chinese = TRUE // EXIT; // END IF // NEXT If (Asc(Mid(s_mtrl_config_expr[i].cfgname,1,1)) >= 128) Or & (Asc(Mid(s_mtrl_config_expr[i].cfgname,1,1)) >= 65 And Asc(Mid(s_mtrl_config_expr[i].cfgname,1,1)) <= 90) Or & (Asc(Mid(s_mtrl_config_expr[i].cfgname,1,1)) >= 97 And Asc(Mid(s_mtrl_config_expr[i].cfgname,1,1)) <= 122)THEN s_mtrl_config_expr[i].if_chinese = True END IF IF Not s_mtrl_config_expr[i].if_chinese And Dec(s_mtrl_config_expr[i].qty) > 1 THEN rslt = 0 arg_msg = '该产品配置说明输入格式错误,请重新输入!' GOTO ext END IF String ls_cfgname //检查配置是否在子件中 ls_cfgname = s_mtrl_config_expr[i].cfgname SELECT count(*) INTO :count FROM u_mtrl_configure WHERE mtrlid = :arg_mtrlid AND name = :ls_cfgname AND type = 1 And ifzj = 1; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '因网络或者其它原因导致查询配置说明失败!>>'+sqlca.SQLErrText GOTO ext END IF IF count = 0 THEN rslt = 0 arg_msg = '['+ls_cfgname+']不是该产品配置说明的子件,请先添加子件' GOTO ext END IF NEXT Boolean lb_f //当为汉字时,合并数量 Long ch = 0 FOR i = 1 To UpperBound(s_mtrl_config_expr[]) FOR j = 1 To UpperBound(s_mtrl_config_expr_1[]) IF s_mtrl_config_expr_1[j].cfgname = s_mtrl_config_expr[i].cfgname And & s_mtrl_config_expr[i].if_chinese THEN s_mtrl_config_expr_1[j].qty = String(Dec(s_mtrl_config_expr_1[j].qty)+1,'##') lb_f = True END IF NEXT IF lb_f = False THEN ch++ s_mtrl_config_expr_1[ch].cfgname = s_mtrl_config_expr[i].cfgname s_mtrl_config_expr_1[ch].qty = s_mtrl_config_expr[i].qty s_mtrl_config_expr_1[ch].if_chinese = s_mtrl_config_expr[i].if_chinese END IF lb_f = False NEXT s_mtrl_config_expr = s_mtrl_config_expr_1 //FOR i = 1 To UpperBound(s_mtrl_config_expr[]) //按照配置名称排序 // FOR j = 1 To UpperBound(s_mtrl_config_expr[]) - i // IF Asc(s_mtrl_config_expr[j].cfgname) > Asc(s_mtrl_config_expr[j+1].cfgname) THEN // s_mtrl_config_expr_1[1] = s_mtrl_config_expr[j+1] // s_mtrl_config_expr[j+1] = s_mtrl_config_expr[j] // s_mtrl_config_expr[j] = s_mtrl_config_expr_1[1] // END IF // NEXT //NEXT arg_str = '' FOR i = 1 To UpperBound(s_mtrl_config_expr[]) //连接配置串 IF s_mtrl_config_expr[i].cfgname <> '' THEN IF Dec(s_mtrl_config_expr[i].qty) <> 1 THEN arg_str = arg_str + s_mtrl_config_expr[i].cfgname + '*' + s_mtrl_config_expr[i].qty + '+' ELSE arg_str = arg_str + s_mtrl_config_expr[i].cfgname + '+' END IF END IF NEXT arg_str = Mid(arg_str , 1, Len(arg_str) - 1 ) SELECT count(*) INTO :count FROM u_mtrl_configure //检查配置名称是否存在 WHERE mtrlid = :arg_mtrlid AND name = :arg_str AND type = 1 And ifzj = :arg_cfgtype; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '因网络或者其它原因导致查询该产品的配置说明失败!>>'+sqlca.SQLErrText GOTO ext END IF IF count <> 0 THEN rslt = 0 arg_msg = '产品已经存在该配置说明,请重新输入!' GOTO ext END IF END IF ext: RETURN rslt end function public function integer save (s_mtrl_pz arg_s_mtrlpz, ref string arg_msg, boolean if_commit);String ls_pzname,ls_pzename,ls_dscrp Long ll_pztype,rslt = 1,li_colorprp Long ll_mtrlid,ll_pzid,ll_newid,ll_pfid,ll_newpzflag,ll_ifzj Decimal ld_capacity,ld_capaparm Long cnt Int li_ifgeneral Decimal ld_net_weight,ld_gross_weight,ld_cubage String ls_unit Decimal ld_packqty,ld_wprate Long ll_dftwrkgrpid If uo_option_bom_affirm = -1000 Then rslt = 0 arg_msg = '选项:[085]物料清单使用确认功能,读取初始默认值失败,操作取消!' Goto ext End If ll_mtrlid = arg_s_mtrlpz.mtrlid ll_pzid = arg_s_mtrlpz.cid ls_pzname = arg_s_mtrlpz.Name ls_pzename = arg_s_mtrlpz.ename ls_dscrp = arg_s_mtrlpz.dscrp ll_pztype = arg_s_mtrlpz.ctype ll_newpzflag = arg_s_mtrlpz.newpzflag ll_ifzj = arg_s_mtrlpz.ifzj ld_capacity = arg_s_mtrlpz.capacity ld_capaparm = arg_s_mtrlpz.capaparm ld_net_weight = arg_s_mtrlpz.net_weight ld_gross_weight = arg_s_mtrlpz.gross_weight ld_cubage = arg_s_mtrlpz.cubage li_ifgeneral = arg_s_mtrlpz.ifgeneral ls_unit = arg_s_mtrlpz.unit ld_packqty = arg_s_mtrlpz.packqty ld_wprate = arg_s_mtrlpz.wprate If IsNull(ll_mtrlid) Then ll_mtrlid = 0 If IsNull(ll_pzid) Then ll_pzid = 0 If IsNull(ls_pzname) Then ls_pzname = '' If IsNull(ls_pzename) Then ls_pzename = '' If IsNull(ls_dscrp) Then ls_dscrp = '' If IsNull(ll_pztype) Then ll_pztype = 0 If IsNull(ld_capacity) Then ld_capacity = 0 If IsNull(ll_ifzj) Then ll_ifzj = 0 If IsNull(ld_net_weight) Then ld_net_weight = 0 If IsNull(ld_gross_weight) Then ld_gross_weight = 0 If IsNull(ld_cubage) Then ld_cubage = 0 If IsNull(li_ifgeneral) Then li_ifgeneral = 0 If IsNull(ls_unit) Then ls_unit = '' If IsNull(ld_packqty) Then ld_packqty = 0 If IsNull(ld_wprate) Then ld_wprate = 0 If ll_mtrlid = 0 Then rslt = 0 arg_msg = '查询产品资料失败!' Goto ext End If If ll_ifzj = 0 Then ld_capacity = 0 ld_capaparm = 1 ld_net_weight = 0 ld_gross_weight = 0 ld_cubage = 0 Else li_ifgeneral = 0 End If //新建配置 If ll_newpzflag = 1 Then ll_newid = f_sys_scidentity(0,"u_mtrl_configure","cid",arg_msg,True,id_sqlca) If ll_newid <= 0 Then rslt = 0 Goto ext End If Insert Into u_mtrl_configure( cid, mtrlid, code, name, ename, type, dscrp, ifzj, capacity, capaparm, net_weight, gross_weight, cubage, ifgeneral, unit, packqty, wprate) Values( :ll_newid, :ll_mtrlid, :ls_pzname, :ls_pzname, :ls_pzename, :ll_pztype, :ls_dscrp, :ll_ifzj, :ld_capacity, :ld_capaparm, :ld_net_weight, :ld_gross_weight, :ld_cubage, :li_ifgeneral, :ls_unit, :ld_packqty, :ld_wprate); If sqlca.SQLCode <> 0 Then rslt = 0 arg_msg = '因网络或者其他原因导致插入纪录失败!>>'+sqlca.SQLErrText Goto ext End If Else //更新 Update u_mtrl_configure Set code = :ls_pzname, name = :ls_pzname, ename = :ls_pzename, type = :ll_pztype, dscrp = :ls_dscrp, ifzj = :ll_ifzj, capacity = :ld_capacity, capaparm = :ld_capaparm, net_weight = :ld_net_weight, gross_weight = :ld_gross_weight, cubage = :ld_cubage, ifgeneral = :li_ifgeneral, unit = :ls_unit, packqty = :ld_packqty, wprate = :ld_wprate Where u_mtrl_configure.cid = :ll_pzid; If sqlca.SQLCode <> 0 Then rslt = 0 arg_msg = '由于网络或者其他原因导致更新操作失败!>>'+sqlca.SQLErrText Goto ext End If End If ////// // Select count(*) Into :cnt From u_mtrldef_planprice Where mtrlid = :ll_mtrlid And status = :ls_pzname And woodcode = '' And pcode = ''; If sqlca.SQLCode <> 0 Then rslt = 0 arg_msg = '查询配置是否已有计划成本价资料失败!>>'+sqlca.SQLErrText Goto ext End If If cnt = 0 Then Insert Into u_mtrldef_planprice (mtrlid, status) Values (:ll_mtrlid,:ls_pzname); If sqlca.SQLCode <> 0 Then rslt = 0 arg_msg = '插入产品配置计划成本价资料失败!>>'+sqlca.SQLErrText Goto ext End If End If If ll_ifzj = 0 And li_ifgeneral = 0 Then rslt = 1 Goto ext End If //查询是否已有清单存在 cnt = 0 Select count(*) Into :cnt From u_mtrl_pf Where mtrlid = :ll_mtrlid And pfcode = :ls_pzname; If sqlca.SQLCode <> 0 Then rslt = 0 arg_msg = '由于网络或者其他原因导致查询操作失败!>>'+sqlca.SQLErrText Goto ext End If If cnt > 0 Then //存在时不插入 rslt = 1 Goto ext End If Select dftwrkgrpid Into :ll_dftwrkgrpid From u_mtrldef Where mtrlid = :ll_mtrlid; If sqlca.SQLCode <> 0 Then rslt = 0 arg_msg = '查询物料默认制造车间失败!>>'+sqlca.SQLErrText Goto ext End If uo_mtrl_pf uo_pf uo_pf = Create uo_mtrl_pf If uo_pf.uof_addpflist(ll_mtrlid,ls_pzname,ll_dftwrkgrpid,'',0,0,0,False,arg_msg) = 0 Then rslt = 0 Goto ext End If //确认并审核该清单 If uo_option_bom_affirm = 1 Then If uo_pf.uof_affirm(ll_mtrlid,ls_pzname,1,arg_msg,False) = 0 Then rslt = 0 Goto ext End If End If If uo_pf.uof_audit(ll_mtrlid,ls_pzname,1,arg_msg,False) = 0 Then rslt = 0 Goto ext End If Destroy uo_pf ext: If rslt = 0 Then Rollback; ElseIf rslt = 1 And if_commit Then Commit; End If Return rslt end function public function integer check_mtrlcfg_exist (long arg_mtrlid, string arg_str, ref string arg_msg);//==================================================================== // Function: check_mtrlcfg_exist() //-------------------------------------------------------------------- // Description: 判断子件是否已用于组合配置中 //-------------------------------------------------------------------- // Arguments: // value long arg_mtrlid // value string ls_name // reference string arg_msg //-------------------------------------------------------------------- // Returns: integer //-------------------------------------------------------------------- // Author: Date: 2006.09.14 //-------------------------------------------------------------------- // Modify History: // //==================================================================== Long cnt,rslt = 1,i,j,li_pos String ls_pzname[],str[],ls_name s_mtrlcfg_expr s_mtrl_config_expr[] Boolean flag DECLARE cur_mtrlcfg CURSOR FOR SELECT name FROM u_mtrl_configure Where mtrlid = :arg_mtrlid ANd TYPE = 1 AND ifzj = 0; OPEN cur_mtrlcfg; cnt = 1 FETCH cur_mtrlcfg INTO :ls_pzname[cnt]; DO WHILE sqlca.SQLCode = 0 cnt++ FETCH cur_mtrlcfg INTO :ls_pzname[cnt]; LOOP CLOSE cur_mtrlcfg; cnt = cnt - 1 FOR j = 1 to cnt ls_name = ls_pzname[j] i = 0 li_pos = 1 flag = TRUE DO WHILE flag //利用'+'号分割字符串 IF Pos(ls_name , '+') > 0 THEN i++ str[i] = Mid(ls_name , li_pos , Pos(ls_name , '+') - 1 ) ls_name = Mid(ls_name , Pos(ls_name , '+') + 1) ELSE flag = FALSE str[i+1] = ls_name END IF LOOP FOR i = 1 TO UpperBound(str[]) //利用'*'号分割出配置名和数量 IF Pos(str[i] , '*') > 0 THEN s_mtrl_config_expr[i].cfgname = Trim(Mid(str[i] , 1 , Pos(str[i] , '*') - 1)) s_mtrl_config_expr[i].Sign = Trim(Mid(str[i] , Pos(str[i] , '*'), 1)) s_mtrl_config_expr[i].qty = Trim(Mid(str[i] , (Pos(str[i] , '*') + 1), Len(str[i]) - (Pos(str[i] , '*') + 1) + 1)) ELSE s_mtrl_config_expr[i].cfgname = Trim(str[i]) s_mtrl_config_expr[i].Sign = '*' s_mtrl_config_expr[i].qty = '1' END IF IF s_mtrl_config_expr[i].cfgname = arg_str THEN rslt = 0 arg_msg = '子件['+arg_str+']'+'已用于组合配置中!' goto ext ENd IF NEXT NEXT ext: RETURN rslt end function on uo_func_mtrlcfg.create call super::create TriggerEvent( this, "constructor" ) end on on uo_func_mtrlcfg.destroy TriggerEvent( this, "destructor" ) call super::destroy end on event constructor;String str_optionvalue,arg_msg f_get_sys_option_value('085',str_optionvalue,arg_msg) uo_option_bom_affirm = Long(str_optionvalue) end event