$PBExportHeader$uo_partbarcode.sru forward global type uo_partbarcode from nonvisualobject end type type s_p_barcode from structure within uo_partbarcode end type type s_p_tree from structure within uo_partbarcode end type type s_p_order_ml from structure within uo_partbarcode end type type s_p_mtrlware_mx from structure within uo_partbarcode end type type s_p_getbar from structure within uo_partbarcode end type end forward type s_p_barcode from structure long scid long orderid long printid long pid string barcode long swkpid long owkpid long sflag long oflag decimal ptqty long inflag decimal qty string relname string partname datetime ptdate datetime sdate end type type s_p_tree from structure long scid long orderid long printid long swkpid long owkpid long parentid string relname string partname long ifaccept s_p_barcode barcodes[] end type type s_p_order_ml from structure long scid long orderid long mtrlid string status_mode string woodcode string pcode end type type s_p_mtrlware_mx from structure string barcode long getbarid decimal packqty long qty long inflag long scid long orderid end type type s_p_getbar from structure long getbarid long scid long orderid long ifrel long storageid long cusid string plancode string mtrlcuscode string location end type global type uo_partbarcode from nonvisualobject end type global uo_partbarcode uo_partbarcode forward prototypes private function integer pf_getbarcodes (string arg_barcode, ref s_p_barcode arg_bars[], ref string arg_msg) private function integer pf_getchild (long arg_scid, long arg_orderid, long arg_printid, ref s_p_tree arg_trees[], ref string arg_msg) private function integer pf_checklast (long arg_scid, long arg_orderid, long arg_swkpid, long arg_owkpid) public function integer uf_swap_barcode (string arg_barcode_from, string arg_barcode_to, ref string arg_msg) private function integer pf_get_order_ml (long arg_scid, long arg_orderid, ref s_p_order_ml arg_order_ml, ref string arg_msg) public function integer pf_exclude_barcode (s_p_barcode arg_s_barcode, ref string arg_msg) public function integer pf_barcode_pt_cancel (s_p_barcode arg_s_barcode, ref string arg_msg) private function integer pf_get_canpt (long arg_scid, long arg_orderid, long arg_printid, ref s_p_barcode arg_bars[], ref string arg_msg) private function integer pf_get_haspt (long arg_scid, long arg_orderid, long arg_printid, datetime arg_ptdate, ref s_p_barcode arg_bars[], ref string arg_msg) public function integer pf_include_barcode (s_p_barcode arg_s_barcode, ref string arg_msg) private function integer pf_swap_child_internal (s_p_barcode arg_barcode_from, s_p_barcode arg_barcode_to, long arg_ex_printid, ref string arg_msg) private function integer pf_get_hasin (long arg_scid, long arg_orderid, long arg_printid, ref s_p_barcode arg_bars[], ref string arg_msg) private function integer pf_swap_barcodes_internal (s_p_barcode arg_barcode_from[], s_p_barcode arg_barcode_to[], ref string arg_msg) public function integer uf_finish_barcode (long arg_swkpid, string arg_barcode, string arg_emp, datetime arg_date, long arg_workgroupid, boolean arg_replace, ref string arg_msg, boolean arg_ifcommit) private function integer pf_try_replace (long arg_curindex, ref s_p_barcode arg_s_barcodes[], ref string arg_msg) private function integer pf_savepoint (ref string arg_tran, ref string arg_msg) public function integer pf_rollback (string arg_tran, ref string arg_msg) private function integer pf_get_canswap (s_p_barcode arg_barcode, ref s_p_barcode arg_bars[], ref string arg_msg) private function integer pf_get_canin_other (s_p_tree arg_tree, ref s_p_barcode arg_bars[], ref string arg_msg) private function integer pf_get_notin (s_p_tree arg_tree, ref s_p_barcode arg_bars[], ref string arg_msg) private function integer pf_get_canin (s_p_tree arg_tree, ref s_p_barcode arg_bars[], ref string arg_msg) public function integer uf_o_barcode (long arg_owkpid, string arg_barcode, string arg_emp, datetime arg_date, ref string arg_msg, boolean arg_ifcommit) private function integer pf_get_barcode_last (string arg_barcode, ref s_p_mtrlware_mx arg_bar, ref string arg_msg) public function integer pf_get_getbar (long arg_getbarid, ref s_p_getbar arg_s_getbar, ref string arg_msg) public function integer uf_finish_barcode_last (long arg_wrkgrpid, string arg_barcode, datetime arg_date, boolean arg_replace, ref string arg_msg, boolean arg_ifcommit) private function integer pf_try_replace_last (ref s_p_mtrlware_mx arg_barcode, ref string arg_msg) public function integer pf_get_canswap_last (s_p_mtrlware_mx arg_barcode, ref s_p_mtrlware_mx arg_mxs[], ref string arg_msg) private function integer pf_barcode_pt (s_p_barcode arg_s_barcode, ref string arg_msg) public function integer uof_workgroup_barcode_pt (long arg_scid, long arg_orderid, long arg_swkpid, ref string arg_msg, boolean arg_ifcommit) private function integer uof_add_workgroup_qty (long arg_scid, long arg_orderid, long arg_swkpid, long arg_workgroupid, datetime arg_finishdate, decimal arg_qty, ref string arg_msg, boolean arg_ifcommit) private function integer pf_getparner (long arg_scid, long arg_orderid, long arg_swkpid, ref s_p_tree arg_trees[], ref string arg_msg) end prototypes private function integer pf_getbarcodes (string arg_barcode, ref s_p_barcode arg_bars[], ref string arg_msg);// 获取一条线的部件条码 order by printid Int rslt = 1 s_p_barcode arr_bars[] Long i = 0 Long scid,orderid,printid,pid,swkpid,owkpid,sflag,oflag,inflag decimal ptqty String barcode string relname, partname datetime ptdate,sdate Decimal qty DECLARE cur1 CURSOR FOR SELECT scid, orderid, printid, pid, barcode, swkpid, owkpid, sflag, oflag, ptqty, inflag, qty, relname, partname, ptdate, sdate FROM u_ordermtrl_workgroup_barcode WHERE barcode = :arg_barcode Order By printid; OPEN cur1; FETCH cur1 Into :scid,:orderid,:printid,:pid,:barcode,:swkpid,:owkpid,:sflag,:oflag,:ptqty,:inflag,:qty,:relname,:partname,:ptdate,:sdate; DO WHILE sqlca.SQLCode = 0 i++ arr_bars[i].scid = scid arr_bars[i].orderid = orderid arr_bars[i].printid = printid arr_bars[i].pid = pid arr_bars[i].barcode = barcode arr_bars[i].swkpid = swkpid arr_bars[i].owkpid = owkpid arr_bars[i].sflag = sflag arr_bars[i].oflag = oflag arr_bars[i].ptqty = ptqty arr_bars[i].inflag = inflag arr_bars[i].qty = qty arr_bars[i].relname = relname arr_bars[i].partname = partname arr_bars[i].ptdate = ptdate arr_bars[i].sdate = sdate FETCH cur1 Into :scid,:orderid,:printid,:pid,:barcode,:swkpid,:owkpid,:sflag,:oflag,:ptqty,:inflag,:qty,:relname,:partname,:ptdate,:sdate; LOOP CLOSE cur1; arg_bars = arr_bars RETURN rslt end function private function integer pf_getchild (long arg_scid, long arg_orderid, long arg_printid, ref s_p_tree arg_trees[], ref string arg_msg);// DONE: 获取子工艺路线 Int rslt = 1 s_p_tree arr_trees[] Long i = 0 Long scid,orderid,printid,swkpid,owkpid,parentid,ifaccept String relname,partname DECLARE cur1 CURSOR FOR SELECT scid, orderid, printid, swkpid, owkpid, parentid, relname, partname, ifaccept FROM u_OrderMtrl_workgroup_tree WHERE scid = :arg_scid AND orderid = :arg_orderid AND parentid = :arg_printid AND if_barcode = 1 Order By printid; OPEN cur1; FETCH cur1 Into :scid,:orderid,:printid,:swkpid,:owkpid,:parentid,:relname,:partname,:ifaccept; DO WHILE sqlca.SQLCode = 0 i++ arr_trees[i].scid = scid arr_trees[i].orderid = orderid arr_trees[i].printid = printid arr_trees[i].swkpid = swkpid arr_trees[i].owkpid = owkpid arr_trees[i].parentid = parentid arr_trees[i].relname = relname arr_trees[i].partname = partname arr_trees[i].ifaccept = ifaccept FETCH cur1 Into :scid,:orderid,:printid,:swkpid,:owkpid,:parentid,:relname,:partname,:ifaccept; LOOP CLOSE cur1; arg_trees = arr_trees RETURN rslt end function private function integer pf_checklast (long arg_scid, long arg_orderid, long arg_swkpid, long arg_owkpid);Int rslt = 1 Long printid, arr_printid[] Long i = 0 DECLARE cur1 CURSOR FOR SELECT printid FROM u_OrderMtrl_workgroup_tree WHERE scid = :arg_scid AND orderid = :arg_orderid AND swkpid = :arg_swkpid And owkpid = :arg_owkpid; OPEN cur1; FETCH cur1 Into :printid; DO WHILE sqlca.SQLCode = 0 i++ arr_printid[i] = printid FETCH cur1 Into :printid; LOOP CLOSE cur1; Long parentid, swkpid FOR i = 1 To UpperBound(arr_printid) printid = arr_printid[i] SELECT parentid INTO :parentid FROM u_OrderMtrl_workgroup_tree WHERE scid = :arg_scid AND orderid = :arg_orderid And printid = :printid; IF sqlca.SQLCode <> 0 THEN parentid = 0 END IF DO WHILE parentid > 0 SELECT swkpid INTO :swkpid FROM u_OrderMtrl_workgroup_tree WHERE scid = :arg_scid AND orderid = :arg_orderid And printid = :parentid; IF sqlca.SQLCode <> 0 THEN swkpid = 0 END IF IF swkpid = arg_swkpid THEN rslt = 0 GOTO ext END IF SELECT parentid INTO :parentid FROM u_OrderMtrl_workgroup_tree WHERE scid = :arg_scid AND orderid = :arg_orderid And printid = :parentid; IF sqlca.SQLCode <> 0 THEN parentid = 0 END IF LOOP NEXT ext: RETURN rslt end function public function integer uf_swap_barcode (string arg_barcode_from, string arg_barcode_to, ref string arg_msg);// DONE: 交换条码的主计划 Int rslt = 1 s_p_barcode arr_barcode_from[], arr_barcode_to[] IF pf_getbarcodes(arg_barcode_from, Ref arr_barcode_from, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF pf_getbarcodes(arg_barcode_to, Ref arr_barcode_to, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF UpperBound(arr_barcode_from) <> UpperBound(arr_barcode_to) THEN rslt = 0 arg_msg = '1.工艺路线不兼容' GOTO ext END IF Long i FOR i = 1 To UpperBound(arr_barcode_from) IF arr_barcode_from[i].scid = arr_barcode_to[i].scid And arr_barcode_from[i].orderid = arr_barcode_to[i].orderid THEN rslt = 0 arg_msg = '属于同一主计划不能交换' GOTO ext END IF IF arr_barcode_from[i].swkpid <> arr_barcode_to[i].swkpid & Or arr_barcode_from[i].owkpid <> arr_barcode_to[i].owkpid & Or arr_barcode_from[i].relname <> arr_barcode_to[i].relname & Or arr_barcode_from[i].partname <> arr_barcode_to[i].partname THEN rslt = 0 arg_msg = '2.工艺流程不兼容' GOTO ext END IF NEXT s_p_order_ml s_order_from, s_order_to IF pf_get_order_ml(arr_barcode_from[1].scid, arr_barcode_from[1].orderid, Ref s_order_from, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF pf_get_order_ml(arr_barcode_to[1].scid, arr_barcode_to[1].orderid, Ref s_order_to, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF s_order_from.mtrlid <> s_order_to.mtrlid & Or s_order_from.status_mode <> s_order_to.status_mode & Or s_order_from.woodcode <> s_order_to.woodcode & Or s_order_from.pcode <> s_order_to.pcode THEN rslt = 0 arg_msg = '产品或配置不兼容' GOTO ext END IF // 条码兼容进行交换 IF pf_swap_barcodes_internal(arr_barcode_from, arr_barcode_to, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF ext: IF rslt = 1 THEN ELSE arg_msg = '条码'+arg_barcode_from+'/'+arg_barcode_to+'交换失败,' + arg_msg END IF RETURN rslt end function private function integer pf_get_order_ml (long arg_scid, long arg_orderid, ref s_p_order_ml arg_order_ml, ref string arg_msg);Int rslt = 1 s_p_order_ml s_rslt SELECT mtrlid, status_mode, woodcode, pcode INTO :s_rslt.mtrlid, :s_rslt.status_mode, :s_rslt.woodcode, :s_rslt.pcode FROM u_Order_ml WHERE scid = :arg_scid And orderid = :arg_orderid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询主计划信息失败,' + sqlca.SQLErrText GOTO ext END IF s_rslt.scid = arg_scid s_rslt.orderid = arg_orderid arg_order_ml = s_rslt ext: RETURN rslt end function public function integer pf_exclude_barcode (s_p_barcode arg_s_barcode, ref string arg_msg);// DONE: 排除主计划的条码 Int rslt = 1 Long ld_step = 100000000 DO WHILE arg_s_barcode.orderid > ld_step ld_step *= 2 LOOP UPDATE u_ordermtrl_workgroup_barcode SET scid = scid - :ld_step, orderid = orderid - :ld_step WHERE barcode = :arg_s_barcode.barcode AND printid = :arg_s_barcode.printid AND scid = :arg_s_barcode.scid And orderid = :arg_s_barcode.orderid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '从主计划去除条码失败,' + sqlca.SQLErrText GOTO ext END IF IF sqlca.SQLNRows <= 0 THEN rslt = 0 arg_msg = '条码被修改了' GOTO ext END IF IF arg_s_barcode.sflag = 1 THEN UPDATE u_OrderMtrl_workgroup_tree SET sqty = sqty - :arg_s_barcode.qty WHERE scid = :arg_s_barcode.scid AND orderid = :arg_s_barcode.orderid And printid = :arg_s_barcode.printid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '取消工艺完工数失败,' + sqlca.SQLErrText GOTO ext END IF IF arg_s_barcode.oflag = 1 THEN UPDATE u_OrderMtrl_workgroup_tree SET oqty = oqty - :arg_s_barcode.qty WHERE scid = :arg_s_barcode.scid AND orderid = :arg_s_barcode.orderid And printid = :arg_s_barcode.printid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '取消工艺接收数失败,' + sqlca.SQLErrText GOTO ext END IF END IF IF arg_s_barcode.ptqty > 0 THEN IF pf_barcode_pt_cancel(arg_s_barcode, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF END IF END IF ext: RETURN rslt end function public function integer pf_barcode_pt_cancel (s_p_barcode arg_s_barcode, ref string arg_msg);// DONE: 取消配套条码 Int rslt = 1 // 配套更新工组进度 s_p_tree arr_parners[], arr_temp1[] Long i, j String ls_tran IF pf_getparner(arg_s_barcode.scid, arg_s_barcode.orderid, arg_s_barcode.swkpid, Ref arr_parners, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF FOR i = 1 To UpperBound(arr_parners) IF arr_parners[i].printid <> arg_s_barcode.printid THEN arr_temp1[UpperBound(arr_temp1) + 1] = arr_parners[i] END IF NEXT arr_parners = arr_temp1 IF UpperBound(arr_parners) <= 0 THEN UPDATE u_ordermtrl_workgroup_barcode SET ptflag = 0, ptqty = 0, ptdate = NULL WHERE barcode = :arg_s_barcode.barcode AND printid = :arg_s_barcode.printid And ptqty = :arg_s_barcode.ptqty; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '取消部件条码配套标记失败,' + sqlca.SQLErrText GOTO ext END IF IF sqlca.SQLNRows > 0 THEN IF uof_add_workgroup_qty(arg_s_barcode.scid, arg_s_barcode.orderid, arg_s_barcode.swkpid, 0, arg_s_barcode.ptdate, -arg_s_barcode.ptqty, Ref arg_msg, False) <> 1 THEN rslt = 0 GOTO ext END IF GOTO ext END IF ELSE FOR i = 1 To UpperBound(arr_parners) IF pf_get_haspt(arr_parners[i].scid, arr_parners[i].orderid, arr_parners[i].printid, arg_s_barcode.ptdate, Ref arr_parners[i].barcodes, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF UpperBound(arr_parners[i].barcodes) <= 0 THEN GOTO ext END IF NEXT IF pf_savepoint(Ref ls_tran, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF UPDATE u_ordermtrl_workgroup_barcode SET ptflag = 0, ptqty = 0, ptdate = NULL WHERE barcode = :arg_s_barcode.barcode AND printid = :arg_s_barcode.printid And ptqty = :arg_s_barcode.ptqty; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '取消部件条码配套标记失败,' + sqlca.SQLErrText GOTO ext END IF IF sqlca.SQLNRows <= 0 THEN GOTO ext END IF Decimal ld_addqty,ld_uqty FOR i = 1 To UpperBound(arr_parners) ld_addqty = arg_s_barcode.ptqty FOR j = 1 To UpperBound(arr_parners[i].barcodes) IF ld_addqty = 0 THEN EXIT IF ld_addqty >= arr_parners[i].barcodes[j].ptqty THEN ld_uqty = arr_parners[i].barcodes[j].ptqty UPDATE u_ordermtrl_workgroup_barcode SET ptflag = 0, ptqty = 0, ptdate = NULL WHERE barcode = :arr_parners[i].barcodes[j].barcode AND printid = :arr_parners[i].barcodes[j].printid And sflag = 1 And ptqty = :arr_parners[i].barcodes[j].ptqty; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '取消部件条码配套标记失败,' + sqlca.SQLErrText GOTO ext END IF IF sqlca.SQLNRows > 0 THEN ld_addqty -= ld_uqty END IF ELSE ld_uqty = ld_addqty UPDATE u_ordermtrl_workgroup_barcode SET ptflag = 0, ptqty = ptqty - :ld_uqty WHERE barcode = :arr_parners[i].barcodes[j].barcode AND printid = :arr_parners[i].barcodes[j].printid And sflag = 1 And ptqty = :arr_parners[i].barcodes[j].ptqty; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '取消部件条码配套标记失败,' + sqlca.SQLErrText GOTO ext END IF IF sqlca.SQLNRows > 0 THEN ld_addqty -= ld_uqty END IF END IF NEXT IF ld_addqty <> 0 THEN GOTO _cancel END IF NEXT IF uof_add_workgroup_qty(arg_s_barcode.scid, arg_s_barcode.orderid, arg_s_barcode.swkpid, 0, arg_s_barcode.ptdate, -arg_s_barcode.ptqty, Ref arg_msg, False) <> 1 THEN rslt = 0 GOTO ext END IF GOTO ext _cancel: IF pf_rollback(ls_tran, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF END IF ext: RETURN rslt end function private function integer pf_get_canpt (long arg_scid, long arg_orderid, long arg_printid, ref s_p_barcode arg_bars[], ref string arg_msg);// DONE: 获取可配套的部件条码 Int rslt = 1 s_p_barcode arr_bars[] Long i = 0 Long scid,orderid,printid,pid,swkpid,owkpid,sflag,oflag,inflag decimal ptqty String barcode String relname,partname DateTime ptdate,sdate Decimal qty DECLARE cur1 CURSOR FOR SELECT scid, orderid, printid, pid, barcode, swkpid, owkpid, sflag, oflag, ptqty, inflag, qty, relname, partname, ptdate, sdate FROM u_ordermtrl_workgroup_barcode WHERE scid = :arg_scid AND orderid = :arg_orderid AND printid = :arg_printid AND sflag = 1 AND ptqty < qty AND ptflag = 0 Order By sdate; OPEN cur1; FETCH cur1 Into :scid,:orderid,:printid,:pid,:barcode,:swkpid,:owkpid,:sflag,:oflag,:ptqty,:inflag,:qty,:relname,:partname,:ptdate,:sdate; DO WHILE sqlca.SQLCode = 0 i++ arr_bars[i].scid = scid arr_bars[i].orderid = orderid arr_bars[i].printid = printid arr_bars[i].pid = pid arr_bars[i].barcode = barcode arr_bars[i].swkpid = swkpid arr_bars[i].owkpid = owkpid arr_bars[i].sflag = sflag arr_bars[i].oflag = oflag arr_bars[i].ptqty = ptqty arr_bars[i].inflag = inflag arr_bars[i].qty = qty arr_bars[i].relname = relname arr_bars[i].partname = partname arr_bars[i].ptdate = ptdate arr_bars[i].sdate = sdate FETCH cur1 Into :scid,:orderid,:printid,:pid,:barcode,:swkpid,:owkpid,:sflag,:oflag,:ptqty,:inflag,:qty,:relname,:partname,:ptdate,:sdate; LOOP CLOSE cur1; arg_bars = arr_bars RETURN rslt end function private function integer pf_get_haspt (long arg_scid, long arg_orderid, long arg_printid, datetime arg_ptdate, ref s_p_barcode arg_bars[], ref string arg_msg);// DONE: 获取已配套的部件条码 Int rslt = 1 s_p_barcode arr_bars[] Long i = 0 Long scid,orderid,printid,pid,swkpid,owkpid,sflag,oflag,inflag decimal ptqty String barcode String relname,partname DateTime ptdate,sdate Decimal qty DECLARE cur1 CURSOR FOR SELECT scid, orderid, printid, pid, barcode, swkpid, owkpid, sflag, oflag, ptqty, inflag, qty, relname, partname, ptdate, sdate FROM u_ordermtrl_workgroup_barcode WHERE scid = :arg_scid AND orderid = :arg_orderid AND printid = :arg_printid AND sflag = 1 AND ptqty > 0 AND ptdate = :arg_ptdate UNION SELECT scid, orderid, printid, pid, barcode, swkpid, owkpid, sflag, oflag, ptqty, inflag, qty, relname, partname, ptdate, sdate FROM u_ordermtrl_workgroup_barcode WHERE scid = :arg_scid AND orderid = :arg_orderid AND printid = :arg_printid AND sflag = 1 AND ptqty > 0 And ptdate > :arg_ptdate UNION SELECT scid, orderid, printid, pid, barcode, swkpid, owkpid, sflag, oflag, ptqty, inflag, qty, relname, partname, ptdate, sdate FROM u_ordermtrl_workgroup_barcode WHERE scid = :arg_scid AND orderid = :arg_orderid AND printid = :arg_printid AND sflag = 1 AND ptqty > 0 And ptdate < :arg_ptdate; OPEN cur1; FETCH cur1 Into :scid,:orderid,:printid,:pid,:barcode,:swkpid,:owkpid,:sflag,:oflag,:ptqty,:inflag,:qty,:relname,:partname,:ptdate,:sdate; DO WHILE sqlca.SQLCode = 0 i++ arr_bars[i].scid = scid arr_bars[i].orderid = orderid arr_bars[i].printid = printid arr_bars[i].pid = pid arr_bars[i].barcode = barcode arr_bars[i].swkpid = swkpid arr_bars[i].owkpid = owkpid arr_bars[i].sflag = sflag arr_bars[i].oflag = oflag arr_bars[i].ptqty = ptqty arr_bars[i].inflag = inflag arr_bars[i].qty = qty arr_bars[i].relname = relname arr_bars[i].partname = partname arr_bars[i].ptdate = ptdate arr_bars[i].sdate = sdate FETCH cur1 Into :scid,:orderid,:printid,:pid,:barcode,:swkpid,:owkpid,:sflag,:oflag,:ptqty,:inflag,:qty,:relname,:partname,:ptdate,:sdate; LOOP CLOSE cur1; arg_bars = arr_bars RETURN rslt end function public function integer pf_include_barcode (s_p_barcode arg_s_barcode, ref string arg_msg);// DONE: 添加主计划的条码 Int rslt = 1 UPDATE u_ordermtrl_workgroup_barcode SET scid = :arg_s_barcode.scid, orderid = :arg_s_barcode.orderid WHERE barcode = :arg_s_barcode.barcode And printid = :arg_s_barcode.printid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '主计划添加条码失败,' + sqlca.SQLErrText GOTO ext END IF IF arg_s_barcode.sflag = 1 THEN UPDATE u_OrderMtrl_workgroup_tree SET sqty = sqty + :arg_s_barcode.qty WHERE scid = :arg_s_barcode.scid AND orderid = :arg_s_barcode.orderid And printid = :arg_s_barcode.printid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '添加工艺完工数失败,' + sqlca.SQLErrText GOTO ext END IF IF arg_s_barcode.oflag = 1 THEN UPDATE u_OrderMtrl_workgroup_tree SET oqty = oqty + :arg_s_barcode.qty WHERE scid = :arg_s_barcode.scid AND orderid = :arg_s_barcode.orderid And printid = :arg_s_barcode.printid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '添加工艺接收数失败,' + sqlca.SQLErrText GOTO ext END IF END IF IF pf_barcode_pt(arg_s_barcode, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF END IF ext: RETURN rslt end function private function integer pf_swap_child_internal (s_p_barcode arg_barcode_from, s_p_barcode arg_barcode_to, long arg_ex_printid, ref string arg_msg);// DONE: 查找下级并替换 Int rslt = 1 IF arg_barcode_from.sflag <> 1 THEN rslt = 0 arg_msg = '第一个条码必须完成' GOTO ext END IF IF arg_barcode_to.sflag <> 0 THEN rslt = 0 arg_msg = '第二个条码必须未完成' GOTO ext END IF s_p_tree arr_tree_from[], arr_tree_to[] IF pf_getchild(arg_barcode_from.scid, arg_barcode_from.orderid, arg_barcode_from.printid, Ref arr_tree_from, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF pf_getchild(arg_barcode_to.scid, arg_barcode_to.orderid, arg_barcode_to.printid, Ref arr_tree_to, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF UpperBound(arr_tree_from) <> UpperBound(arr_tree_to) THEN rslt = 0 arg_msg = '工艺路线不兼容' GOTO ext END IF Long i, j, k String ls_tran1 FOR i = 1 To UpperBound(arr_tree_from) IF arr_tree_from[i].printid <> arr_tree_to[i].printid & Or arr_tree_from[i].swkpid <> arr_tree_to[i].swkpid & Or arr_tree_from[i].owkpid <> arr_tree_to[i].owkpid & Or arr_tree_from[i].relname <> arr_tree_to[i].relname & Or arr_tree_from[i].partname <> arr_tree_to[i].partname THEN rslt = 0 arg_msg = '工艺路线不兼容' GOTO ext END IF NEXT s_p_barcode arr_barcode_from[], arr_barcode_to[] FOR i = 1 To UpperBound(arr_tree_from) IF arr_tree_from[i].printid = arg_ex_printid THEN CONTINUE IF pf_get_hasin(arr_tree_from[i].scid, arr_tree_from[i].orderid, arr_tree_from[i].printid, Ref arr_tree_from[i].barcodes, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF UpperBound(arr_tree_from[i].barcodes) <= 0 THEN rslt = 0 arg_msg = '没有已组装部件' GOTO ext END IF IF pf_get_canin(arr_tree_to[i], Ref arr_tree_to[i].barcodes, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF UpperBound(arr_tree_to[i].barcodes) <= 0 THEN rslt = 0 arg_msg = '没有待组装部件' GOTO ext END IF FOR j = 1 To UpperBound(arr_tree_from[i].barcodes) FOR k = 1 To UpperBound(arr_tree_to[i].barcodes) IF pf_getbarcodes(arr_tree_from[i].barcodes[j].barcode, Ref arr_barcode_from, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF pf_getbarcodes(arr_tree_to[i].barcodes[k].barcode, Ref arr_barcode_to, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF pf_savepoint(Ref ls_tran1, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF pf_swap_barcodes_internal(arr_barcode_from, arr_barcode_to, Ref arg_msg) <> 1 THEN IF pf_rollback(ls_tran1, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF CONTINUE END IF EXIT NEXT IF k <= UpperBound(arr_tree_to[i].barcodes) THEN EXIT END IF NEXT IF j > UpperBound(arr_tree_from[i].barcodes) THEN rslt = 0 arg_msg = '交换已组装部件与未组装部件失败' GOTO ext END IF NEXT ext: RETURN rslt end function private function integer pf_get_hasin (long arg_scid, long arg_orderid, long arg_printid, ref s_p_barcode arg_bars[], ref string arg_msg);// DOEN: 获取已组装的部件条码 Int rslt = 1 s_p_barcode arr_bars[] Long i = 0 Long scid,orderid,printid,pid,swkpid,owkpid,sflag,oflag,inflag decimal ptqty String barcode string relname,partname datetime ptdate,sdate Decimal qty DECLARE cur1 CURSOR FOR SELECT scid, orderid, printid, pid, barcode, swkpid, owkpid, sflag, oflag, ptqty, inflag, qty, relname, partname, ptdate, sdate FROM u_ordermtrl_workgroup_barcode WHERE scid = :arg_scid AND orderid = :arg_orderid AND printid = :arg_printid AND inflag = 1; OPEN cur1; FETCH cur1 Into :scid,:orderid,:printid,:pid,:barcode,:swkpid,:owkpid,:sflag,:oflag,:ptqty,:inflag,:qty,:relname,:partname,:ptdate,:sdate; DO WHILE sqlca.SQLCode = 0 i++ arr_bars[i].scid = scid arr_bars[i].orderid = orderid arr_bars[i].printid = printid arr_bars[i].pid = pid arr_bars[i].barcode = barcode arr_bars[i].swkpid = swkpid arr_bars[i].owkpid = owkpid arr_bars[i].sflag = sflag arr_bars[i].oflag = oflag arr_bars[i].ptqty = ptqty arr_bars[i].inflag = inflag arr_bars[i].qty = qty arr_bars[i].relname = relname arr_bars[i].partname = partname arr_bars[i].ptdate = ptdate arr_bars[i].sdate = sdate FETCH cur1 Into :scid,:orderid,:printid,:pid,:barcode,:swkpid,:owkpid,:sflag,:oflag,:ptqty,:inflag,:qty,:relname,:partname,:ptdate,:sdate; LOOP CLOSE cur1; arg_bars = arr_bars RETURN rslt end function private function integer pf_swap_barcodes_internal (s_p_barcode arg_barcode_from[], s_p_barcode arg_barcode_to[], ref string arg_msg);// DONE: 交换条码 Int rslt = 1 Long i Long scid, orderid, ex_printid FOR i = UpperBound(arg_barcode_from) To 1 Step -1 IF pf_exclude_barcode(arg_barcode_from[i], Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF pf_exclude_barcode(arg_barcode_to[i], Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF ex_printid = 0 IF i < UpperBound(arg_barcode_from) THEN ex_printid = arg_barcode_from[i+1].printid END IF IF arg_barcode_from[i].sflag = 1 And arg_barcode_to[i].sflag = 0 THEN IF pf_swap_child_internal(arg_barcode_from[i], arg_barcode_to[i], ex_printid, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF ELSEIF arg_barcode_from[i].sflag = 0 And arg_barcode_to[i].sflag = 1 THEN IF pf_swap_child_internal(arg_barcode_to[i], arg_barcode_from[i], ex_printid, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF END IF scid = arg_barcode_from[i].scid orderid = arg_barcode_from[i].orderid arg_barcode_from[i].scid = arg_barcode_to[i].scid arg_barcode_from[i].orderid = arg_barcode_to[i].orderid arg_barcode_to[i].scid = scid arg_barcode_to[i].orderid = orderid IF pf_include_barcode(arg_barcode_from[i], Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF pf_include_barcode(arg_barcode_to[i], Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF NEXT ext: RETURN rslt end function public function integer uf_finish_barcode (long arg_swkpid, string arg_barcode, string arg_emp, datetime arg_date, long arg_workgroupid, boolean arg_replace, ref string arg_msg, boolean arg_ifcommit);// 部件条码完工 Int rslt = 1 s_p_barcode arr_curbars[] IF pf_getbarcodes(arg_barcode, Ref arr_curbars, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF UpperBound(arr_curbars) = 0 THEN rslt = 0 arg_msg = '条码不存在' GOTO ext END IF Long i, j, k, cur_index = 0 FOR i = UpperBound(arr_curbars) To 1 Step -1 IF arr_curbars[i].swkpid = arg_swkpid THEN cur_index = i IF arr_curbars[i].sflag = 0 THEN EXIT END IF NEXT IF cur_index = 0 THEN rslt = 0 arg_msg = '条码不经过本工组' GOTO ext END IF IF arr_curbars[cur_index].sflag = 1 THEN rslt = 0 arg_msg = '条码已经完工' GOTO ext END IF Long ifaccept = 1, parentid, cnt IF cur_index + 1 <= UpperBound(arr_curbars) THEN SELECT ifaccept,parentid INTO :ifaccept,:parentid FROM u_OrderMtrl_workgroup_tree WHERE scid = :arr_curbars[cur_index + 1].scid AND orderid = :arr_curbars[cur_index + 1].orderid And printid = :arr_curbars[cur_index + 1].printid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询条码是否需要接收失败,' + sqlca.SQLErrText GOTO ext END IF IF parentid = arr_curbars[cur_index].printid THEN IF ifaccept = 1 THEN IF arr_curbars[cur_index + 1].oflag <> 1 THEN rslt = 0 arg_msg = '条码未接收' GOTO ext END IF END IF IF arr_curbars[cur_index + 1].sflag <> 1 THEN rslt = 0 arg_msg = '条码上工组未完工' GOTO ext END IF // 更新上工艺组装标记 UPDATE u_ordermtrl_workgroup_barcode SET inflag = 1 WHERE barcode = :arr_curbars[cur_index + 1].barcode AND printid = :arr_curbars[cur_index + 1].printid And inflag = 0; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '更新组装标记失败,' + sqlca.SQLErrText GOTO ext END IF IF sqlca.SQLNRows = 0 THEN rslt = 0 arg_msg = '另一个任务更新了组装标记,本任务终止' GOTO ext END IF END IF END IF IF arg_replace THEN IF pf_try_replace(cur_index, Ref arr_curbars, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF END IF // 获取其它工艺分支 s_p_tree arr_children[], arr_temp[] IF pf_getchild(arr_curbars[cur_index].scid, arr_curbars[cur_index].orderid, arr_curbars[cur_index].printid, Ref arr_children, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF cur_index + 1 <= UpperBound(arr_curbars) THEN FOR i = 1 To UpperBound(arr_children) IF arr_children[i].printid <> arr_curbars[cur_index + 1].printid THEN arr_temp[UpperBound(arr_temp) + 1] = arr_children[i] END IF NEXT arr_children = arr_temp END IF s_p_barcode arr_lastbars[], arr_notinbars[] String ls_tran, ls_tran2 FOR i = 1 To UpperBound(arr_children) IF pf_get_canin(arr_children[i], Ref arr_lastbars, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF UpperBound(arr_lastbars) <= 0 THEN IF arg_replace THEN // DONE: 查找其它主计划的可组装部件 IF pf_get_canin_other(arr_children[i], Ref arr_lastbars, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF UpperBound(arr_lastbars) <= 0 THEN rslt = 0 arg_msg = '1.部件'+arr_children[i].relname+':'+arr_children[i].partname+'不足' GOTO ext END IF IF pf_get_notin(arr_children[i], Ref arr_notinbars, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF UpperBound(arr_notinbars) <= 0 THEN rslt = 0 arg_msg = '2.部件'+arr_children[i].relname+':'+arr_children[i].partname+'不足' GOTO ext END IF ELSE rslt = 0 arg_msg = '3.部件'+arr_children[i].relname+':'+arr_children[i].partname+'不足' GOTO ext END IF END IF FOR j = 1 To UpperBound(arr_lastbars) IF pf_savepoint(Ref ls_tran, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF // 更新上工艺组装标记 UPDATE u_ordermtrl_workgroup_barcode SET inflag = 1 WHERE barcode = :arr_lastbars[j].barcode AND printid = :arr_lastbars[j].printid And inflag = 0; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '部件'+arr_children[i].relname+':'+arr_children[i].partname+'更新组装标记失败,' + sqlca.SQLErrText GOTO ext END IF IF sqlca.SQLNRows > 0 THEN IF arr_lastbars[j].scid <> arr_children[i].scid Or arr_lastbars[j].orderid <> arr_children[i].orderid THEN // DONE: 交换条码 FOR k = 1 To UpperBound(arr_notinbars) IF pf_savepoint(Ref ls_tran2, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF uf_swap_barcode(arr_lastbars[j].barcode, arr_notinbars[k].barcode, Ref arg_msg) <> 1 THEN IF pf_rollback(ls_tran2, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF CONTINUE END IF EXIT NEXT IF k > UpperBound(arr_notinbars) THEN IF pf_rollback(ls_tran, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF CONTINUE END IF END IF EXIT END IF NEXT IF j > UpperBound(arr_lastbars) THEN rslt = 0 arg_msg = '4.部件'+arr_children[i].relname+':'+arr_children[i].partname+'不足,已被占用' GOTO ext END IF NEXT UPDATE u_ordermtrl_workgroup_barcode SET sflag = 1, sdate = :arg_date, semp = :arg_emp, workgroupid = :arg_workgroupid WHERE barcode = :arr_curbars[cur_index].barcode AND printid = :arr_curbars[cur_index].printid And sflag = 0; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '更新部件条码完工标记失败,' + sqlca.SQLErrText GOTO ext END IF IF sqlca.SQLNRows <= 0 THEN rslt = 0 arg_msg = '另一个任务更新了部件条码完工标记,本任务终止' GOTO ext END IF UPDATE u_OrderMtrl_workgroup_tree SET u_ordermtrl_workgroup_tree.sqty = case when u_ordermtrl_workgroup_tree.sqty + :arr_curbars[cur_index].qty > u_ordermtrl_workgroup_tree.orderqty then u_ordermtrl_workgroup_tree.orderqty else u_ordermtrl_workgroup_tree.sqty + :arr_curbars[cur_index].qty END, u_ordermtrl_workgroup_tree.sdate = :arg_date WHERE scid = :arr_curbars[cur_index].scid AND orderid = :arr_curbars[cur_index].orderid And printid = :arr_curbars[cur_index].printid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '更新工艺路线完成数失败,' + sqlca.SQLErrText GOTO ext END IF arr_curbars[cur_index].sdate = arg_date IF pf_barcode_pt(arr_curbars[cur_index], Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF SELECT ifaccept INTO :ifaccept FROM u_OrderMtrl_workgroup_tree WHERE scid = :arr_curbars[cur_index].scid AND orderid = :arr_curbars[cur_index].orderid And printid = :arr_curbars[cur_index].printid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询本条码是否需要接收失败,' + sqlca.SQLErrText GOTO ext END IF IF ifaccept = 0 THEN //条码不用接收,完工后自动接收 SELECT COUNT(0) INTO :cnt FROM u_order_wkp_barcode_pda WHERE barcode = :arr_curbars[cur_index].barcode AND wrkgrpid = :arr_curbars[cur_index].owkpid And Kind = 1; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询PDA已扫部件条码失败,' + sqlca.SQLErrText GOTO ext END IF IF cnt <= 0 THEN INSERT INTO u_order_wkp_barcode_pda(barcode,wrkgrpid,kind,flag,opemp,opdate) Values(:arr_curbars[cur_index].barcode,:arr_curbars[cur_index].owkpid,1,1,:arg_emp,:arg_date); IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '插入PDA已扫部件条码失败,' + sqlca.SQLErrText GOTO ext END IF ELSE UPDATE u_order_wkp_barcode_pda SET flag = 1 WHERE barcode = :arr_curbars[cur_index].barcode AND wrkgrpid = :arr_curbars[cur_index].owkpid AND Kind = 1 And flag <> 1; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '更改PDA已扫部件条码处理标记失败,' + sqlca.SQLErrText GOTO ext END IF END IF IF sqlca.SQLNRows > 0 THEN IF uf_o_barcode(arr_curbars[cur_index].owkpid, arr_curbars[cur_index].barcode, arg_emp, arg_date, Ref arg_msg, False) <> 1 THEN rslt = 0 GOTO ext END IF END IF END IF ext: IF arg_ifcommit THEN IF rslt = 1 THEN COMMIT; ELSE ROLLBACK; arg_msg = 'swkpid:'+String(arg_swkpid)+'/barcode:'+arg_barcode+':'+arg_msg END IF END IF RETURN rslt end function private function integer pf_try_replace (long arg_curindex, ref s_p_barcode arg_s_barcodes[], ref string arg_msg);// DONE: 尝试替换 Int rslt = 1 s_p_barcode arr_bars_early[] IF pf_get_canswap(arg_s_barcodes[arg_curindex], Ref arr_bars_early, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF Long i, j String ls_tran FOR i = 1 To UpperBound(arr_bars_early) IF pf_savepoint(Ref ls_tran, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF uf_swap_barcode(arr_bars_early[i].barcode, arg_s_barcodes[arg_curindex].barcode, Ref arg_msg) <> 1 THEN IF pf_rollback(ls_tran, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF CONTINUE END IF FOR j = 1 To UpperBound(arg_s_barcodes) arg_s_barcodes[j].scid = arr_bars_early[i].scid arg_s_barcodes[j].orderid = arr_bars_early[i].orderid NEXT GOTO ext NEXT ext: RETURN rslt end function private function integer pf_savepoint (ref string arg_tran, ref string arg_msg);Int rslt = 1 SELECT top 1 name INTO :arg_tran From (SELECT Replace(NEWID(), '-', '') as Name) a; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询事务唯一码失败,' + sqlca.SQLErrText GOTO ext END IF String cmd cmd = "SAVE TRANSACTION [" + arg_tran + "]" EXECUTE Immediate :cmd; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '保存事务失败,' + sqlca.SQLErrText GOTO ext END IF ext: RETURN rslt end function public function integer pf_rollback (string arg_tran, ref string arg_msg);Int rslt = 1 String cmd cmd = "ROLLBACK TRANSACTION [" + arg_tran + "]" EXECUTE Immediate :cmd; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '回滚事务失败,' + sqlca.SQLErrText GOTO ext END IF ext: RETURN rslt end function private function integer pf_get_canswap (s_p_barcode arg_barcode, ref s_p_barcode arg_bars[], ref string arg_msg);Int rslt = 1 s_p_order_ml order_ml IF pf_get_order_ml(arg_barcode.scid, arg_barcode.orderid, Ref order_ml, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF DateTime ld_rqdate SELECT top 1 requiredate INTO :ld_rqdate FROM u_OrderMtrl_workgroup WHERE scid = :arg_barcode.scid AND orderid = :arg_barcode.orderid AND wrkGrpid = :arg_barcode.swkpid Order By requiredate; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询本条码需求日期失败,' + sqlca.SQLErrText GOTO ext END IF s_p_barcode arr_bars[] Long i = 0 Long scid,orderid,printid,pid,swkpid,owkpid,sflag,oflag,inflag decimal ptqty String barcode String relname,partname DateTime ptdate,sdate Decimal qty DECLARE cur1 CURSOR FOR SELECT TOP 10 u_ordermtrl_workgroup_barcode.scid, u_ordermtrl_workgroup_barcode.orderid, u_ordermtrl_workgroup_barcode.printid, u_ordermtrl_workgroup_barcode.pid, u_ordermtrl_workgroup_barcode.barcode, u_ordermtrl_workgroup_barcode.swkpid, u_ordermtrl_workgroup_barcode.owkpid, u_ordermtrl_workgroup_barcode.sflag, u_ordermtrl_workgroup_barcode.oflag, u_ordermtrl_workgroup_barcode.ptqty, u_ordermtrl_workgroup_barcode.inflag, u_ordermtrl_workgroup_barcode.qty, u_ordermtrl_workgroup_barcode.relname, u_ordermtrl_workgroup_barcode.partname, u_ordermtrl_workgroup_barcode.ptdate, u_ordermtrl_workgroup_barcode.sdate FROM u_ordermtrl_workgroup_barcode INNER JOIN u_Order_ml ON u_ordermtrl_workgroup_barcode.scid = u_Order_ml.scid AND u_ordermtrl_workgroup_barcode.orderid = u_Order_ml.OrderID INNER JOIN u_OrderMtrl_workgroup ON u_ordermtrl_workgroup_barcode.scid = u_OrderMtrl_workgroup.scid AND u_ordermtrl_workgroup_barcode.swkpid = u_OrderMtrl_workgroup.wrkGrpid AND u_ordermtrl_workgroup_barcode.orderid = u_OrderMtrl_workgroup.orderid WHERE u_Order_ml.mtrlid = :order_ml.mtrlid AND u_Order_ml.status_mode = :order_ml.status_mode AND u_Order_ml.woodcode = :order_ml.woodcode AND u_Order_ml.pcode = :order_ml.pcode AND u_ordermtrl_workgroup_barcode.swkpid = :arg_barcode.swkpid AND u_ordermtrl_workgroup_barcode.owkpid = :arg_barcode.owkpid AND u_ordermtrl_workgroup_barcode.relname = :arg_barcode.relname AND u_ordermtrl_workgroup_barcode.partname = :arg_barcode.partname AND u_ordermtrl_workgroup_barcode.printid = :arg_barcode.printid AND u_ordermtrl_workgroup_barcode.orderid > 0 AND (u_ordermtrl_workgroup_barcode.orderid <> :arg_barcode.orderid OR u_ordermtrl_workgroup_barcode.scid <> :arg_barcode.scid) AND u_OrderMtrl_workgroup.requiredate < :ld_rqdate AND u_ordermtrl_workgroup_barcode.sflag = 0 AND u_Order_ml.status = 1 Order By u_OrderMtrl_workgroup.requiredate; OPEN cur1; FETCH cur1 Into :scid,:orderid,:printid,:pid,:barcode,:swkpid,:owkpid,:sflag,:oflag,:ptqty,:inflag,:qty,:relname,:partname,:ptdate,:sdate; DO WHILE sqlca.SQLCode = 0 i++ arr_bars[i].scid = scid arr_bars[i].orderid = orderid arr_bars[i].printid = printid arr_bars[i].pid = pid arr_bars[i].barcode = barcode arr_bars[i].swkpid = swkpid arr_bars[i].owkpid = owkpid arr_bars[i].sflag = sflag arr_bars[i].oflag = oflag arr_bars[i].ptqty = ptqty arr_bars[i].inflag = inflag arr_bars[i].qty = qty arr_bars[i].relname = relname arr_bars[i].partname = partname arr_bars[i].ptdate = ptdate arr_bars[i].sdate = sdate FETCH cur1 Into :scid,:orderid,:printid,:pid,:barcode,:swkpid,:owkpid,:sflag,:oflag,:ptqty,:inflag,:qty,:relname,:partname,:ptdate,:sdate; LOOP CLOSE cur1; arg_bars = arr_bars ext: RETURN rslt end function private function integer pf_get_canin_other (s_p_tree arg_tree, ref s_p_barcode arg_bars[], ref string arg_msg);Int rslt = 1 s_p_order_ml order_ml IF pf_get_order_ml(arg_tree.scid, arg_tree.orderid, Ref order_ml, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF s_p_barcode arr_bars[] Long i = 0 Long scid,orderid,printid,pid,swkpid,owkpid,sflag,oflag,inflag decimal ptqty String barcode String relname,partname DateTime ptdate,sdate Decimal qty DECLARE cur1 CURSOR FOR SELECT TOP 10 u_ordermtrl_workgroup_barcode.scid, u_ordermtrl_workgroup_barcode.orderid, u_ordermtrl_workgroup_barcode.printid, u_ordermtrl_workgroup_barcode.pid, u_ordermtrl_workgroup_barcode.barcode, u_ordermtrl_workgroup_barcode.swkpid, u_ordermtrl_workgroup_barcode.owkpid, u_ordermtrl_workgroup_barcode.sflag, u_ordermtrl_workgroup_barcode.oflag, u_ordermtrl_workgroup_barcode.ptqty, u_ordermtrl_workgroup_barcode.inflag, u_ordermtrl_workgroup_barcode.qty, u_ordermtrl_workgroup_barcode.relname, u_ordermtrl_workgroup_barcode.partname, u_ordermtrl_workgroup_barcode.ptdate, u_ordermtrl_workgroup_barcode.sdate FROM u_ordermtrl_workgroup_barcode INNER JOIN u_Order_ml ON u_ordermtrl_workgroup_barcode.scid = u_Order_ml.scid AND u_ordermtrl_workgroup_barcode.orderid = u_Order_ml.OrderID INNER JOIN u_OrderMtrl_workgroup_tree ON u_OrderMtrl_workgroup_tree.scid = u_ordermtrl_workgroup_barcode.scid AND u_OrderMtrl_workgroup_tree.orderid = u_ordermtrl_workgroup_barcode.orderid AND u_OrderMtrl_workgroup_tree.printid = u_ordermtrl_workgroup_barcode.printid WHERE u_Order_ml.mtrlid = :order_ml.mtrlid AND u_Order_ml.status_mode = :order_ml.status_mode AND u_Order_ml.woodcode = :order_ml.woodcode AND u_Order_ml.pcode = :order_ml.pcode AND u_ordermtrl_workgroup_barcode.swkpid = :arg_tree.swkpid AND u_ordermtrl_workgroup_barcode.owkpid = :arg_tree.owkpid AND u_ordermtrl_workgroup_barcode.relname = :arg_tree.relname AND u_ordermtrl_workgroup_barcode.partname = :arg_tree.partname AND u_ordermtrl_workgroup_barcode.printid = :arg_tree.printid AND u_ordermtrl_workgroup_barcode.orderid > 0 AND (u_ordermtrl_workgroup_barcode.orderid <> :arg_tree.orderid OR u_ordermtrl_workgroup_barcode.scid <> :arg_tree.scid) AND u_ordermtrl_workgroup_barcode.sflag = 1 AND u_OrderMtrl_workgroup_tree.ifaccept = :arg_tree.ifaccept AND (u_ordermtrl_workgroup_barcode.oflag = 1 AND :arg_tree.ifaccept = 1 OR :arg_tree.ifaccept = 0) AND u_ordermtrl_workgroup_barcode.inflag = 0 AND u_Order_ml.status = 1; OPEN cur1; FETCH cur1 Into :scid,:orderid,:printid,:pid,:barcode,:swkpid,:owkpid,:sflag,:oflag,:ptqty,:inflag,:qty,:relname,:partname,:ptdate,:sdate; DO WHILE sqlca.SQLCode = 0 i++ arr_bars[i].scid = scid arr_bars[i].orderid = orderid arr_bars[i].printid = printid arr_bars[i].pid = pid arr_bars[i].barcode = barcode arr_bars[i].swkpid = swkpid arr_bars[i].owkpid = owkpid arr_bars[i].sflag = sflag arr_bars[i].oflag = oflag arr_bars[i].ptqty = ptqty arr_bars[i].inflag = inflag arr_bars[i].qty = qty arr_bars[i].relname = relname arr_bars[i].partname = partname arr_bars[i].ptdate = ptdate arr_bars[i].sdate = sdate FETCH cur1 Into :scid,:orderid,:printid,:pid,:barcode,:swkpid,:owkpid,:sflag,:oflag,:ptqty,:inflag,:qty,:relname,:partname,:ptdate,:sdate; LOOP CLOSE cur1; arg_bars = arr_bars ext: RETURN rslt end function private function integer pf_get_notin (s_p_tree arg_tree, ref s_p_barcode arg_bars[], ref string arg_msg);// DONE: 获取可组装的部件条码 Int rslt = 1 s_p_barcode arr_bars[] Long i = 0 Long scid,orderid,printid,pid,swkpid,owkpid,sflag,oflag,inflag decimal ptqty String barcode string relname,partname datetime ptdate,sdate Decimal qty DECLARE cur1 CURSOR FOR SELECT scid, orderid, printid, pid, barcode, swkpid, owkpid, sflag, oflag, ptqty, inflag, qty, relname, partname, ptdate, sdate FROM u_ordermtrl_workgroup_barcode WHERE scid = :arg_tree.scid AND orderid = :arg_tree.orderid AND printid = :arg_tree.printid AND inflag = 0; OPEN cur1; FETCH cur1 Into :scid,:orderid,:printid,:pid,:barcode,:swkpid,:owkpid,:sflag,:oflag,:ptqty,:inflag,:qty,:relname,:partname,:ptdate,:sdate; DO WHILE sqlca.SQLCode = 0 i++ arr_bars[i].scid = scid arr_bars[i].orderid = orderid arr_bars[i].printid = printid arr_bars[i].pid = pid arr_bars[i].barcode = barcode arr_bars[i].swkpid = swkpid arr_bars[i].owkpid = owkpid arr_bars[i].sflag = sflag arr_bars[i].oflag = oflag arr_bars[i].ptqty = ptqty arr_bars[i].inflag = inflag arr_bars[i].qty = qty arr_bars[i].relname = relname arr_bars[i].partname = partname arr_bars[i].ptdate = ptdate arr_bars[i].sdate = sdate FETCH cur1 Into :scid,:orderid,:printid,:pid,:barcode,:swkpid,:owkpid,:sflag,:oflag,:ptqty,:inflag,:qty,:relname,:partname,:ptdate,:sdate; LOOP CLOSE cur1; arg_bars = arr_bars RETURN rslt end function private function integer pf_get_canin (s_p_tree arg_tree, ref s_p_barcode arg_bars[], ref string arg_msg);// DONE: 获取可组装的部件条码 Int rslt = 1 s_p_barcode arr_bars[] Long i = 0 Long scid,orderid,printid,pid,swkpid,owkpid,sflag,oflag,inflag decimal ptqty String barcode string relname,partname datetime ptdate,sdate Decimal qty DECLARE cur1 CURSOR FOR SELECT scid, orderid, printid, pid, barcode, swkpid, owkpid, sflag, oflag, ptqty, inflag, qty, relname, partname, ptdate, sdate FROM u_ordermtrl_workgroup_barcode WHERE scid = :arg_tree.scid AND orderid = :arg_tree.orderid AND printid = :arg_tree.printid AND (oflag = 1 AND :arg_tree.ifaccept = 1 OR :arg_tree.ifaccept = 0) AND inflag = 0; OPEN cur1; FETCH cur1 Into :scid,:orderid,:printid,:pid,:barcode,:swkpid,:owkpid,:sflag,:oflag,:ptqty,:inflag,:qty,:relname,:partname,:ptdate,:sdate; DO WHILE sqlca.SQLCode = 0 i++ arr_bars[i].scid = scid arr_bars[i].orderid = orderid arr_bars[i].printid = printid arr_bars[i].pid = pid arr_bars[i].barcode = barcode arr_bars[i].swkpid = swkpid arr_bars[i].owkpid = owkpid arr_bars[i].sflag = sflag arr_bars[i].oflag = oflag arr_bars[i].ptqty = ptqty arr_bars[i].inflag = inflag arr_bars[i].qty = qty arr_bars[i].relname = relname arr_bars[i].partname = partname arr_bars[i].ptdate = ptdate arr_bars[i].sdate = sdate FETCH cur1 Into :scid,:orderid,:printid,:pid,:barcode,:swkpid,:owkpid,:sflag,:oflag,:ptqty,:inflag,:qty,:relname,:partname,:ptdate,:sdate; LOOP CLOSE cur1; arg_bars = arr_bars RETURN rslt end function public function integer uf_o_barcode (long arg_owkpid, string arg_barcode, string arg_emp, datetime arg_date, ref string arg_msg, boolean arg_ifcommit);// DONE: 接收条码 Int rslt = 1 s_p_barcode arr_curbars[] IF pf_getbarcodes(arg_barcode, Ref arr_curbars, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF UpperBound(arr_curbars) = 0 THEN rslt = 0 arg_msg = '条码不存在' GOTO ext END IF Long i, j, k, cur_index = 0 FOR i = UpperBound(arr_curbars) To 1 Step -1 IF arr_curbars[i].owkpid = arg_owkpid THEN cur_index = i IF arr_curbars[i].oflag = 0 THEN EXIT END IF NEXT IF cur_index = 0 THEN rslt = 0 arg_msg = '条码不经过本工组' GOTO ext END IF IF arr_curbars[cur_index].oflag = 1 THEN rslt = 0 arg_msg = '条码已经被接收' GOTO ext END IF IF arr_curbars[cur_index].sflag = 0 THEN rslt = 0 arg_msg = '条码未完成' GOTO ext END IF UPDATE u_ordermtrl_workgroup_barcode SET oflag = 1, odate = :arg_date, oemp = :arg_emp WHERE barcode = :arr_curbars[cur_index].barcode AND printid = :arr_curbars[cur_index].printid And oflag = 0; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '更新条码接收标记失败,' + sqlca.SQLErrText GOTO ext END IF IF sqlca.SQLNRows <= 0 THEN rslt = 0 arg_msg = '另一个任务更新了条码的接收标记,本任务终止' GOTO ext END IF UPDATE u_OrderMtrl_workgroup_tree SET oqty = oqty + :arr_curbars[cur_index].qty, odate = :arg_date WHERE scid = :arr_curbars[cur_index].scid AND orderid = :arr_curbars[cur_index].orderid And printid = :arr_curbars[cur_index].printid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '更新工艺进度接收数失败,' + sqlca.SQLErrText GOTO ext END IF ext: IF arg_ifcommit THEN IF rslt = 1 THEN COMMIT; ELSE ROLLBACK; arg_msg = 'owkpid:'+String(arg_owkpid)+'/barcode:'+arg_barcode+':'+arg_msg END IF END IF RETURN rslt end function private function integer pf_get_barcode_last (string arg_barcode, ref s_p_mtrlware_mx arg_bar, ref string arg_msg); Int rslt = 1 s_p_mtrlware_mx s_bar SELECT getbarid, packqty, qty, inflag, scid, orderid INTO :s_bar.getbarid,:s_bar.packqty,:s_bar.qty,:s_bar.inflag,:s_bar.scid,:s_bar.orderid FROM u_mtrlware_mx Where barcode = :arg_barcode; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询条码信息失败,' + sqlca.SQLErrText GOTO ext END IF s_bar.barcode = arg_barcode arg_bar = s_bar ext: RETURN rslt end function public function integer pf_get_getbar (long arg_getbarid, ref s_p_getbar arg_s_getbar, ref string arg_msg);// 获取条码生成单 Int rslt = 1 s_p_getbar s_getbar SELECT scid,orderid,ifrel,storageid,cusid,plancode,mtrlcuscode,location INTO :s_getbar.scid,:s_getbar.orderid,:s_getbar.ifrel,:s_getbar.storageid,:s_getbar.cusid,:s_getbar.plancode,:s_getbar.mtrlcuscode,:s_getbar.location FROM u_getbar Where getbarid = :arg_getbarid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询条码生成单信息失败,' + sqlca.SQLErrText GOTO ext END IF s_getbar.getbarid = arg_getbarid arg_s_getbar = s_getbar ext: RETURN rslt end function public function integer uf_finish_barcode_last (long arg_wrkgrpid, string arg_barcode, datetime arg_date, boolean arg_replace, ref string arg_msg, boolean arg_ifcommit);// DONE: 最后工组完工 Int rslt = 1 s_p_mtrlware_mx ware_mx IF pf_get_barcode_last(arg_barcode, Ref ware_mx, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF arg_replace THEN // DONE: 替换条码 IF pf_try_replace_last(Ref ware_mx, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF END IF s_p_getbar getbar IF pf_get_getbar(ware_mx.getbarid, Ref getbar, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF s_p_order_ml order_ml IF pf_get_order_ml(getbar.scid, getbar.orderid, Ref order_ml, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF DateTime ld_f_requiredate Long ll_wrkgrpid String ls_wkpname SELECT top 1 requiredate, wrkgrpid, wkpname INTO :ld_f_requiredate,:ll_wrkgrpid,:ls_wkpname FROM u_OrderMtrl_workgroup WHERE scid = :order_ml.scid AND orderid = :order_ml.orderid And iflast = 1; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询最后工组需求日期失败,' + sqlca.SQLErrText GOTO ext END IF IF ll_wrkgrpid <> arg_wrkgrpid THEN rslt = 0 arg_msg = '当前完工工组不是最后完工工组' GOTO ext END IF Long printid SELECT top 1 printid INTO :printid FROM u_OrderMtrl_workgroup_tree WHERE scid = :order_ml.scid AND orderid = :order_ml.orderid AND iflast = 1 And swkpid = :arg_wrkgrpid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询最后工艺路线失败,' + sqlca.SQLErrText GOTO ext END IF Decimal ld_maxqty SELECT IsNull(Min(CASE WHEN ifaccept = 1 THEN oqty ELSE sqty END), 0) Into :ld_maxqty From u_OrderMtrl_workgroup_tree Where scid = :order_ml.scid And orderid = :order_ml.orderid And parentid = :printid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询最后工组可完成数失败,' + sqlca.SQLErrText GOTO ext END IF Decimal ld_finishqty SELECT sqty INTO :ld_finishqty FROM u_OrderMtrl_workgroup_tree WHERE scid = :order_ml.scid AND orderid = :order_ml.orderid And printid = :printid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询最后工组已完成数失败,' + sqlca.SQLErrText GOTO ext END IF Decimal ld_packqty ld_packqty = ware_mx.packqty * ware_mx.qty IF ld_finishqty + ld_packqty > ld_maxqty THEN rslt = 0 arg_msg = '上工组未配套,上工组配套数:' + String(ld_maxqty,'#,##0.#####') + ',已完成数:' + String(ld_finishqty,'#,##0.#####') + ',本次完成数:' + String(ld_packqty,'#,##0.#####') GOTO ext END IF UPDATE u_OrderMtrl_workgroup_tree SET sqty = sqty + :ld_packqty, sdate = :arg_date WHERE scid = :order_ml.scid AND orderid = :order_ml.orderid And printid = :printid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '更新最后工艺已完成数失败,' + sqlca.SQLErrText GOTO ext END IF IF uof_add_workgroup_qty(order_ml.scid, order_ml.orderid, arg_wrkgrpid, 0, arg_date, ld_packqty, Ref arg_msg, False) <> 1 THEN rslt = 0 GOTO ext END IF ext: IF arg_ifcommit THEN IF rslt = 1 THEN COMMIT; ELSE ROLLBACK; arg_msg = 'arg_wrkgrpid:'+String(arg_wrkgrpid)+'/barcode:'+arg_barcode+':'+arg_msg END IF END IF RETURN rslt end function private function integer pf_try_replace_last (ref s_p_mtrlware_mx arg_barcode, ref string arg_msg);// DONE: 替换条码 Int rslt = 1 s_p_mtrlware_mx mxs[] IF pf_get_canswap_last(arg_barcode, Ref mxs, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF Long i String ls_tran FOR i = 1 To UpperBound(mxs) IF pf_savepoint(Ref ls_tran, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF UPDATE u_mtrlware_mx SET getbarid = :mxs[i].getbarid, scid = :mxs[i].scid, orderid = :mxs[i].orderid WHERE barcode = :arg_barcode.barcode And getbarid = :arg_barcode.getbarid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '更改当前条码的条码生成单失败,'+sqlca.SQLErrText GOTO ext END IF IF sqlca.SQLNRows <= 0 THEN rslt = 0 arg_msg = '更改当前条码的条码生成单失败,当前条码已变更' GOTO ext END IF UPDATE u_mtrlware_mx SET getbarid = :arg_barcode.getbarid, scid = :arg_barcode.scid, orderid = :arg_barcode.orderid WHERE barcode = :mxs[i].barcode And getbarid = :mxs[i].getbarid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '更改被替换条码的条码生成单失败,'+sqlca.SQLErrText GOTO ext END IF IF sqlca.SQLNRows <= 0 THEN IF pf_rollback(ls_tran, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF CONTINUE END IF arg_barcode.getbarid = mxs[i].getbarid arg_barcode.scid = mxs[i].scid arg_barcode.orderid = mxs[i].orderid EXIT NEXT ext: RETURN rslt end function public function integer pf_get_canswap_last (s_p_mtrlware_mx arg_barcode, ref s_p_mtrlware_mx arg_mxs[], ref string arg_msg);// DONE: 获取可替换条码 Int rslt = 1 s_p_mtrlware_mx s_rslt[] Long i = 0 String barcode Long getbarid,qty,inflag,scid,orderid Decimal packqty s_p_getbar getbar IF pf_get_getbar(arg_barcode.getbarid, Ref getbar, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF s_p_order_ml order_ml IF pf_get_order_ml(getbar.scid, getbar.orderid, Ref order_ml, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF DateTime ld_f_requiredate Long ll_wrkgrpid String ls_wkpname SELECT top 1 requiredate, wrkgrpid, wkpname INTO :ld_f_requiredate,:ll_wrkgrpid,:ls_wkpname FROM u_OrderMtrl_workgroup WHERE scid = :order_ml.scid AND orderid = :order_ml.orderid And iflast = 1; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询最后工组需求日期失败,' + sqlca.SQLErrText GOTO ext END IF DECLARE cur1 CURSOR FOR SELECT top 10 u_mtrlware_mx.barcode, u_mtrlware_mx.getbarid, u_mtrlware_mx.packqty, u_mtrlware_mx.qty, u_mtrlware_mx.inflag, u_mtrlware_mx.scid, u_mtrlware_mx.orderid FROM u_mtrlware_mx INNER JOIN u_getbar ON u_mtrlware_mx.getbarid = u_getbar.getbarid INNER JOIN u_Order_ml ON u_getbar.scid = u_Order_ml.scid AND u_getbar.orderid = u_Order_ml.OrderID INNER JOIN u_OrderMtrl_workgroup ON u_Order_ml.scid = u_OrderMtrl_workgroup.scid AND u_Order_ml.OrderID = u_OrderMtrl_workgroup.orderid AND u_OrderMtrl_workgroup.iflast = 1 WHERE u_Order_ml.mtrlid = :order_ml.mtrlid AND u_Order_ml.status_mode = :order_ml.status_mode AND u_order_ml.woodcode = :order_ml.woodcode AND u_Order_ml.pcode = :order_ml.pcode AND (u_Order_ml.scid <> :order_ml.scid OR u_Order_ml.orderid <> :order_ml.orderid) AND u_getbar.getbarid <> :arg_barcode.getbarid AND u_mtrlware_mx.packqty * u_mtrlware_mx.qty = :arg_barcode.packqty * :arg_barcode.qty AND u_getbar.ifrel = :getbar.ifrel AND u_getbar.storageid = :getbar.storageid AND u_getbar.cusid = :getbar.cusid AND u_getbar.plancode = :getbar.plancode AND u_getbar.mtrlcuscode = :getbar.mtrlcuscode AND u_getbar.Location = :getbar.location AND u_mtrlware_mx.inflag = 0 AND u_OrderMtrl_workgroup.requiredate < :ld_f_requiredate AND u_OrderMtrl_workgroup.wrkGrpid = :ll_wrkgrpid AND u_OrderMtrl_workgroup.wkpname = :ls_wkpname AND u_mtrlware_mx.barcode NOT IN (SELECT barcode FROM u_order_wkp_barcode_pda WHERE kind = 2 AND wrkgrpid = :ll_wrkgrpid) Order By u_OrderMtrl_workgroup.requiredate; OPEN cur1; FETCH cur1 Into :barcode,:getbarid,:packqty,:qty,:inflag,:scid,:orderid; DO WHILE sqlca.SQLCode = 0 i++ s_rslt[i].barcode = barcode s_rslt[i].getbarid = getbarid s_rslt[i].packqty = packqty s_rslt[i].qty = qty s_rslt[i].inflag = inflag s_rslt[i].scid = scid s_rslt[i].orderid = orderid FETCH cur1 Into :barcode,:getbarid,:packqty,:qty,:inflag,:scid,:orderid; LOOP CLOSE cur1; arg_mxs = s_rslt ext: RETURN rslt end function private function integer pf_barcode_pt (s_p_barcode arg_s_barcode, ref string arg_msg);// DONE: 配套条码 Int rslt = 1 Long ll_jdtype SELECT jdtype INTO :ll_jdtype FROM u_sc_workgroup Where wrkgrpid = :arg_s_barcode.swkpid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询工组进度生成模式失败,' + sqlca.SQLErrText GOTO ext END IF IF ll_jdtype <> 6 THEN GOTO ext END IF // 配套更新工组进度 s_p_tree arr_parners[], arr_temp1[] Long i, j String ls_tran IF pf_getparner(arg_s_barcode.scid, arg_s_barcode.orderid, arg_s_barcode.swkpid, Ref arr_parners, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF FOR i = 1 To UpperBound(arr_parners) IF arr_parners[i].printid <> arg_s_barcode.printid THEN arr_temp1[UpperBound(arr_temp1) + 1] = arr_parners[i] END IF NEXT arr_parners = arr_temp1 IF UpperBound(arr_parners) <= 0 THEN UPDATE u_ordermtrl_workgroup_barcode SET ptflag = 1, ptqty = ptqty + :arg_s_barcode.qty, ptdate = :arg_s_barcode.sdate WHERE barcode = :arg_s_barcode.barcode AND printid = :arg_s_barcode.printid And sflag = 1 And ptflag = 0 And ptqty = :arg_s_barcode.ptqty; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '更新部件条码配套标记失败,' + sqlca.SQLErrText GOTO ext END IF IF sqlca.SQLNRows > 0 THEN IF uof_add_workgroup_qty(arg_s_barcode.scid, arg_s_barcode.orderid, arg_s_barcode.swkpid, 0, arg_s_barcode.sdate, arg_s_barcode.qty, Ref arg_msg, False) <> 1 THEN rslt = 0 GOTO ext END IF GOTO ext END IF ELSE Decimal ld_minqty, ld_totalqty ld_minqty = arg_s_barcode.qty FOR i = 1 To UpperBound(arr_parners) IF pf_get_canpt(arr_parners[i].scid, arr_parners[i].orderid, arr_parners[i].printid, Ref arr_parners[i].barcodes, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF IF UpperBound(arr_parners[i].barcodes) <= 0 THEN GOTO ext END IF ld_totalqty = 0 FOR j = 1 To UpperBound(arr_parners[i].barcodes) ld_totalqty += arr_parners[i].barcodes[j].qty - arr_parners[i].barcodes[j].ptqty NEXT IF ld_totalqty < ld_minqty THEN ld_minqty = ld_totalqty END IF NEXT IF ld_minqty <= 0 THEN GOTO ext IF pf_savepoint(Ref ls_tran, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF UPDATE u_ordermtrl_workgroup_barcode SET ptflag = case when ptqty + :ld_minqty >= qty then 1 else 0 END, ptqty = ptqty + :ld_minqty, ptdate = :arg_s_barcode.sdate WHERE barcode = :arg_s_barcode.barcode AND printid = :arg_s_barcode.printid And sflag = 1 And ptflag = 0 And ptqty = :arg_s_barcode.ptqty; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '更新部件条码配套标记失败,' + sqlca.SQLErrText GOTO ext END IF IF sqlca.SQLNRows <= 0 THEN GOTO _cancel END IF Decimal ld_addqty,ld_uqty FOR i = 1 To UpperBound(arr_parners) ld_addqty = ld_minqty FOR j = 1 To UpperBound(arr_parners[i].barcodes) IF ld_addqty = 0 THEN EXIT IF ld_addqty >= arr_parners[i].barcodes[j].qty - arr_parners[i].barcodes[j].ptqty THEN ld_uqty = arr_parners[i].barcodes[j].qty - arr_parners[i].barcodes[j].ptqty UPDATE u_ordermtrl_workgroup_barcode SET ptflag = 1, ptqty = ptqty + :ld_uqty, ptdate = :arg_s_barcode.sdate WHERE barcode = :arr_parners[i].barcodes[j].barcode AND printid = :arr_parners[i].barcodes[j].printid And sflag = 1 And ptflag = 0 And ptqty = :arr_parners[i].barcodes[j].ptqty; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '更新部件条码配套标记失败,' + sqlca.SQLErrText GOTO ext END IF IF sqlca.SQLNRows > 0 THEN ld_addqty -= ld_uqty END IF ELSE ld_uqty = ld_addqty UPDATE u_ordermtrl_workgroup_barcode SET ptqty = ptqty + :ld_uqty, ptdate = :arg_s_barcode.sdate WHERE barcode = :arr_parners[i].barcodes[j].barcode AND printid = :arr_parners[i].barcodes[j].printid And sflag = 1 And ptflag = 0 And ptqty = :arr_parners[i].barcodes[j].ptqty; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '更新部件条码配套标记失败,' + sqlca.SQLErrText GOTO ext END IF IF sqlca.SQLNRows > 0 THEN ld_addqty -= ld_uqty END IF END IF NEXT IF ld_addqty <> 0 THEN GOTO _cancel END IF NEXT IF uof_add_workgroup_qty(arg_s_barcode.scid, arg_s_barcode.orderid, arg_s_barcode.swkpid, 0, arg_s_barcode.sdate, ld_minqty, Ref arg_msg, False) <> 1 THEN rslt = 0 GOTO ext END IF GOTO ext _cancel: IF pf_rollback(ls_tran, Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF END IF ext: RETURN rslt end function public function integer uof_workgroup_barcode_pt (long arg_scid, long arg_orderid, long arg_swkpid, ref string arg_msg, boolean arg_ifcommit);Int rslt = 1 Long ll_cnt = 0 DateTime ld_sdate, arr_sdate[] Long ll_jdtype SELECT jdtype INTO :ll_jdtype FROM u_sc_workgroup Where wrkgrpid = :arg_swkpid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询工组进度生成模式失败,' + sqlca.SQLErrText GOTO ext END IF IF ll_jdtype <> 6 THEN GOTO ext END IF UPDATE u_OrderMtrl_workgroup SET finishqty = finishqty WHERE scid = :arg_scid AND orderid = :arg_orderid And wrkgrpid = :arg_swkpid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '锁住工组进度失败,' + sqlca.SQLErrText GOTO ext END IF DECLARE cur1 CURSOR FOR SELECT DISTINCT CAST(CONVERT(varchar(10), sdate, 120) AS datetime) AS sdate FROM u_ordermtrl_workgroup_barcode WHERE (scid = :arg_scid) AND (orderid = :arg_orderid) AND (swkpid = :arg_swkpid) AND (sflag = 1) AND (ptflag = 0) Order By sdate; OPEN cur1; FETCH cur1 Into :ld_sdate; DO WHILE sqlca.SQLCode = 0 ll_cnt++ arr_sdate[ll_cnt] = ld_sdate FETCH cur1 Into :ld_sdate; LOOP CLOSE cur1; Long i,j,k Decimal ld_qty1, ld_qty2, ld_addqty Long ll_printid, arr_printid[] Long ll_gycnt Long ll_pid, arr_pid[] Decimal ld_qty, arr_qty[] Long ll_ptflag, arr_ptflag[] Long ll_bcnt FOR i = 1 To ll_cnt ld_sdate = DateTime(RelativeDate(Date(arr_sdate[i]), 1)) ld_qty1 = 0 ld_qty2 = 0 SELECT ISNULL(MIN(sqty),0) INTO :ld_qty1 FROM (SELECT SUM(CASE WHEN (ptflag = 1) AND (ptdate < :ld_sdate) THEN qty ELSE 0 END) AS sqty, printid FROM u_ordermtrl_workgroup_barcode WHERE (scid = :arg_scid) AND (orderid = :arg_orderid) AND (swkpid = :arg_swkpid) Group By printid) AS vvv; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询已配套数失败,' + sqlca.SQLErrText GOTO ext END IF SELECT ISNULL(MIN(sqty),0) INTO :ld_qty2 FROM (SELECT SUM(CASE WHEN (sflag = 1) AND (sdate < :ld_sdate) THEN qty ELSE 0 END) AS sqty, printid FROM u_ordermtrl_workgroup_barcode WHERE (scid = :arg_scid) AND (orderid = :arg_orderid) AND (swkpid = :arg_swkpid) Group By printid) AS vvv; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询已配套数失败,' + sqlca.SQLErrText GOTO ext END IF IF ld_qty2 - ld_qty1 > 0 THEN ll_gycnt = 0 DECLARE cur2 CURSOR FOR SELECT printid FROM u_OrderMtrl_workgroup_tree WHERE scid = :arg_scid AND orderid = :arg_orderid And swkpid = :arg_swkpid; OPEN cur2; FETCH cur2 Into :ll_printid; DO WHILE sqlca.SQLCode = 0 ll_gycnt++ arr_printid[ll_gycnt] = ll_printid FETCH cur2 Into :ll_printid; LOOP CLOSE cur2; FOR j = 1 To ll_gycnt ld_addqty = ld_qty2 ll_bcnt = 0 DECLARE cur3 CURSOR FOR SELECT pid, qty, ptflag FROM u_ordermtrl_workgroup_barcode WHERE scid = :arg_scid AND orderid = :arg_orderid AND printid = :arr_printid[j] AND sflag = 1 AND sdate < :ld_sdate Order By ptflag Desc, sdate; OPEN cur3; FETCH cur3 Into :ll_pid, :ld_qty, :ll_ptflag; DO WHILE sqlca.SQLCode = 0 ll_bcnt++ arr_pid[ll_bcnt] = ll_pid arr_qty[ll_bcnt] = ld_qty arr_ptflag[ll_bcnt] = ll_ptflag FETCH cur3 Into :ll_pid, :ld_qty, :ll_ptflag; LOOP CLOSE cur3; FOR k = 1 To ll_bcnt IF ld_addqty <= 0 THEN EXIT END IF ld_addqty -= arr_qty[k] IF arr_ptflag[k] = 0 THEN UPDATE u_ordermtrl_workgroup_barcode SET ptflag = 1, ptdate = :arr_sdate[i] WHERE scid = :arg_scid AND orderid = :arg_orderid AND printid = :arr_printid[j] And pid = :arr_pid[k]; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '更新配套标记失败,' + sqlca.SQLErrText GOTO ext END IF END IF NEXT NEXT ld_addqty = ld_qty2 - ld_qty1 IF uof_add_workgroup_qty(arg_scid, arg_orderid, arg_swkpid, 0, arr_sdate[i], ld_addqty, arg_msg, False) <> 1 THEN rslt = 0 GOTO ext END IF END IF NEXT GOTO ext ext: IF arg_ifcommit THEN IF rslt = 1 THEN COMMIT; ELSE ROLLBACK; END IF END IF RETURN rslt end function private function integer uof_add_workgroup_qty (long arg_scid, long arg_orderid, long arg_swkpid, long arg_workgroupid, datetime arg_finishdate, decimal arg_qty, ref string arg_msg, boolean arg_ifcommit);//更新工组进度完成数 Int rslt = 1 String ls_ordercode String ls_mtrlcode Decimal ld_orderqty,ld_acmpqty,ld_trueqty DateTime null_dt SetNull(null_dt) DateTime dt_fdate IF arg_orderid <= 0 THEN rslt = 0 arg_msg = '错误的计划唯一码' GOTO ext END IF SELECT ordercode INTO :ls_ordercode FROM u_Order_ml WHERE OrderID = :arg_orderid And scid = :arg_scid; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询生产计划编号失败' rslt = 0 GOTO ext END IF SELECT u_mtrldef.mtrlcode , u_order_ml.orderqty, u_order_ml.acmpqty INTO :ls_mtrlcode, :ld_orderqty, :ld_acmpqty FROM u_mtrldef,u_order_ml WHERE u_order_ml.mtrlid = u_mtrldef.mtrlid AND u_order_ml.scid = :arg_scid And u_Order_ml.OrderID = :arg_orderid; IF sqlca.SQLCode <> 0 THEN arg_msg = '查询物料编号失败' rslt = 0 GOTO ext END IF //arg_swkpid:源工组; Decimal finishqty, totalqty SELECT isnull(sum(orderqty - stopqty),0), isnull(sum(finishqty),0) INTO :totalqty, :finishqty FROM u_OrderMtrl_workgroup WHERE scid = :arg_scid AND orderid = :arg_orderid AND wrkGrpid = :arg_swkpid Using sqlca; IF sqlca.SQLCode <> 0 THEN arg_msg = ',查询物料:'+ls_mtrlcode+'源工组未完成数量失败,原因:'+sqlca.SQLErrText rslt = 0 GOTO ext END IF IF arg_qty + finishqty > totalqty THEN arg_qty = totalqty - finishqty END IF IF arg_qty + finishqty < 0 THEN arg_qty = -finishqty END IF IF arg_qty = 0 THEN GOTO ext END IF Long ll_owrkgrpid, arr_owrkgrpid[] String ls_wkpname, arr_wkpname[] Long ll_workgroupid, arr_workgroupid[] Decimal ld_ufqty, ld_fqty, arr_ufqty[], arr_fqty[] Long ll_cnt = 0 DECLARE cur1 CURSOR FOR SELECT owrkgrpid, wkpname, workgroupid, orderqty - finishqty - stopqty, finishqty FROM u_OrderMtrl_workgroup WHERE scid = :arg_scid AND orderid = :arg_orderid AND wrkGrpid = :arg_swkpid AND workgroupid = :arg_workgroupid UNION SELECT owrkgrpid, wkpname, workgroupid, orderqty - finishqty - stopqty, finishqty FROM u_OrderMtrl_workgroup WHERE scid = :arg_scid AND orderid = :arg_orderid AND wrkGrpid = :arg_swkpid And workgroupid <> :arg_workgroupid; OPEN cur1; FETCH cur1 Into :ll_owrkgrpid, :ls_wkpname, :ll_workgroupid, :ld_ufqty, :ld_fqty; DO WHILE sqlca.SQLCode = 0 ll_cnt++ arr_owrkgrpid[ll_cnt] = ll_owrkgrpid arr_wkpname[ll_cnt] = ls_wkpname arr_workgroupid[ll_cnt] = ll_workgroupid arr_ufqty[ll_cnt] = ld_ufqty arr_fqty[ll_cnt] = ld_fqty FETCH cur1 Into :ll_owrkgrpid, :ls_wkpname, :ll_workgroupid, :ld_ufqty, :ld_fqty; LOOP CLOSE cur1; Long i Decimal ld_addqty ld_addqty = arg_qty FOR i = 1 To ll_cnt ll_owrkgrpid = arr_owrkgrpid[i] ls_wkpname = arr_wkpname[i] ll_workgroupid = arr_workgroupid[i] ld_ufqty = arr_ufqty[i] ld_fqty = arr_fqty[i] IF ld_addqty = 0 THEN EXIT END IF IF ld_addqty >= ld_ufqty THEN IF ld_ufqty = 0 THEN CONTINUE UPDATE u_OrderMtrl_workgroup SET finishqty = finishqty + :ld_ufqty, finishflag = 1, finishdate = :arg_finishdate WHERE scid = :arg_scid AND orderid = :arg_orderid AND wrkgrpid = :arg_swkpid AND owrkgrpid = :ll_owrkgrpid AND wkpname = :ls_wkpname And workgroupid = :ll_workgroupid; IF sqlca.SQLCode <> 0 THEN arg_msg = '更新物料:'+ls_mtrlcode+'源工组未完成数量失败,原因:'+sqlca.SQLErrText rslt = 0 GOTO ext END IF ld_addqty = ld_addqty - ld_ufqty ELSEIF ld_addqty <= -ld_fqty THEN UPDATE u_OrderMtrl_workgroup SET finishqty = finishqty - :ld_fqty, finishflag = 0, finishdate = NULL WHERE scid = :arg_scid AND orderid = :arg_orderid AND wrkgrpid = :arg_swkpid AND owrkgrpid = :ll_owrkgrpid AND wkpname = :ls_wkpname And workgroupid = :ll_workgroupid; IF sqlca.SQLCode <> 0 THEN arg_msg = '更新物料:'+ls_mtrlcode+'源工组未完成数量失败,原因:'+sqlca.SQLErrText rslt = 0 GOTO ext END IF ld_addqty = ld_addqty + ld_fqty ELSE UPDATE u_OrderMtrl_workgroup SET finishqty = finishqty + :ld_addqty, finishflag = 0, finishdate = NULL WHERE scid = :arg_scid AND orderid = :arg_orderid AND wrkgrpid = :arg_swkpid AND owrkgrpid = :ll_owrkgrpid AND wkpname = :ls_wkpname And workgroupid = :ll_workgroupid; IF sqlca.SQLCode <> 0 THEN arg_msg = '更新物料:'+ls_mtrlcode+'源工组未完成数量失败,原因:'+sqlca.SQLErrText rslt = 0 GOTO ext END IF ld_addqty = 0 END IF NEXT //IF pf_checklast(arg_scid, arg_orderid, arg_swkpid, arg_owkpid) = 1 THEN Decimal ld_sumorderqty SELECT isnull(sum(orderqty - stopqty),0) INTO :ld_sumorderqty FROM u_OrderMtrl_workgroup WHERE scid = :arg_scid AND orderid = :arg_orderid AND wrkGrpid = :arg_swkpid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询物料:'+ls_mtrlcode+'计划数失败,' + sqlca.SQLErrText GOTO ext END IF Decimal ld_sumfqty SELECT isnull(sum(fqty),0) INTO :ld_sumfqty FROM u_OrderMtrl_workgroup_date WHERE scid = :arg_scid AND orderid = :arg_orderid And wrkGrpid = :arg_swkpid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询物料:'+ls_mtrlcode+'已完成数失败,' + sqlca.SQLErrText GOTO ext END IF ld_addqty = arg_qty IF ld_addqty + ld_sumfqty > ld_sumorderqty THEN ld_addqty = ld_sumorderqty - ld_sumfqty END IF IF ld_addqty + ld_sumfqty < 0 THEN ld_addqty = -ld_sumfqty END IF dt_fdate = DateTime(Date(arg_finishdate), Time(0)) IF ld_addqty >= 0 THEN UPDATE u_OrderMtrl_workgroup_date SET fqty = fqty + :ld_addqty WHERE scid = :arg_scid AND orderid = :arg_orderid AND wrkgrpid = :arg_swkpid And fdate = :dt_fdate; IF sqlca.SQLCode = 0 THEN IF sqlca.SQLNRows = 0 THEN INSERT INTO u_OrderMtrl_workgroup_date (scid,orderid,wrkgrpid,fdate,fqty) VALUES (:arg_scid,:arg_orderid,:arg_swkpid,:dt_fdate,:ld_addqty); IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '插入工组当天进度失败,'+sqlca.SQLErrText GOTO ext END IF END IF ELSE rslt = 0 arg_msg = '更新工组当天进度失败,'+sqlca.SQLErrText GOTO ext END IF ELSE DateTime ld_date, arr_date[] Decimal ld_fqtyd, arr_fqtyd[] i = 0 DECLARE cur2 CURSOR FOR SELECT fdate, fqty FROM u_OrderMtrl_workgroup_date WHERE scid = :arg_scid AND orderid = :arg_orderid AND wrkgrpid = :arg_swkpid AND fdate = :dt_fdate UNION SELECT fdate, fqty FROM u_OrderMtrl_workgroup_date WHERE scid = :arg_scid AND orderid = :arg_orderid AND wrkgrpid = :arg_swkpid And fdate <> :dt_fdate; OPEN cur2; FETCH cur2 Into :ld_date,:ld_fqtyd; DO WHILE sqlca.SQLCode = 0 i++ arr_date[i] = ld_date arr_fqtyd[i] = ld_fqtyd FETCH cur2 Into :ld_date,:ld_fqtyd; LOOP CLOSE cur2; FOR i = 1 To UpperBound(arr_date) ld_date = arr_date[i] ld_fqtyd = arr_fqtyd[i] IF ld_addqty = 0 THEN EXIT END IF IF ld_addqty <= -ld_fqtyd THEN UPDATE u_OrderMtrl_workgroup_date SET fqty = fqty - :ld_fqtyd WHERE scid = :arg_scid AND orderid = :arg_orderid AND wrkgrpid = :arg_swkpid And fdate = :ld_date; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '更新工组当天进度失败,'+sqlca.SQLErrText GOTO ext END IF ld_addqty = ld_addqty + ld_fqtyd ELSE UPDATE u_OrderMtrl_workgroup_date SET fqty = fqty + :ld_addqty WHERE scid = :arg_scid AND orderid = :arg_orderid AND wrkgrpid = :arg_swkpid And fdate = :ld_date; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '更新工组当天进度失败,'+sqlca.SQLErrText GOTO ext END IF ld_addqty = 0 END IF NEXT END IF //END IF ext: IF rslt = 0 THEN ROLLBACK; ELSEIF rslt = 1 And arg_ifcommit THEN COMMIT; END IF RETURN rslt end function private function integer pf_getparner (long arg_scid, long arg_orderid, long arg_swkpid, ref s_p_tree arg_trees[], ref string arg_msg);// DONE: 获取同工组的工艺路线 Int rslt = 1 s_p_tree arr_trees[] Long i = 0 Long scid,orderid,printid,swkpid,owkpid,parentid,ifaccept String relname,partname DECLARE cur1 CURSOR FOR SELECT scid, orderid, printid, swkpid, owkpid, parentid, relname, partname, ifaccept FROM u_OrderMtrl_workgroup_tree WHERE scid = :arg_scid AND orderid = :arg_orderid AND swkpid = :arg_swkpid AND if_barcode = 1 Order By printid; OPEN cur1; FETCH cur1 Into :scid,:orderid,:printid,:swkpid,:owkpid,:parentid,:relname,:partname,:ifaccept; DO WHILE sqlca.SQLCode = 0 i++ arr_trees[i].scid = scid arr_trees[i].orderid = orderid arr_trees[i].printid = printid arr_trees[i].swkpid = swkpid arr_trees[i].owkpid = owkpid arr_trees[i].parentid = parentid arr_trees[i].relname = relname arr_trees[i].partname = partname arr_trees[i].ifaccept = ifaccept FETCH cur1 Into :scid,:orderid,:printid,:swkpid,:owkpid,:parentid,:relname,:partname,:ifaccept; LOOP CLOSE cur1; arg_trees = arr_trees RETURN rslt end function on uo_partbarcode.create call super::create TriggerEvent( this, "constructor" ) end on on uo_partbarcode.destroy TriggerEvent( this, "destructor" ) call super::destroy end on