$PBExportHeader$f_reallocqty.srf global type f_reallocqty from function_object end type forward prototypes global function integer f_reallocqty (boolean arg_reallocall, boolean arg_ignorout, ref string arg_msg) end prototypes global function integer f_reallocqty (boolean arg_reallocall, boolean arg_ignorout, ref string arg_msg); //朗的代码 Int rslt = 1 Long ll_i, ll_j, ll_k, ll_cnt Boolean lb_enough Decimal ld_lake, ld_add dbauo_taskmx mx dbauo_adapter adapter uo_mtrlware_assign uo_assign_bill uo_assign_bill = Create uo_mtrlware_assign adapter = Create dbauo_adapter adapter.f_init() adapter.ins_reallocall = arg_reallocall adapter.ins_ignorout = arg_ignorout adapter.f_sort1() adapter.f_sort2() Long ll_bestIndex = 0, ll_bestCount = 0 FOR ll_i = 1 To UpperBound(adapter.ins_sorts) IF adapter.ins_sorts[ll_i].ins_taskcount > ll_bestCount THEN ll_bestIndex = ll_i ll_bestCount = adapter.ins_sorts[ll_i].ins_taskcount END IF NEXT //MessageBox('', string(adapter.ins_sorts[1].ins_taskcount) + ',' + string(adapter.ins_sorts[2].ins_taskcount)) dbauo_task task DateTime dt_serverTime SELECT TOP 1 GETDATE() INTO :dt_serverTime From u_user; String ls_logText IF ll_bestIndex > 0 THEN // 取消分配与占用库存 FOR ll_i = 1 To UpperBound(adapter.ins_sorts[ll_bestIndex].ins_sort) task = adapter.ins_sorts[ll_bestIndex].ins_sort[ll_i] If (adapter.ins_ignorout And task.ins_hasoutware) Or (Not adapter.ins_reallocall And task.ins_isOK) THEN FOR ll_j = 1 To UpperBound(task.ins_mx) mx = task.ins_mx[ll_j] FOR ll_k = 1 To UpperBound(mx.ins_assigns) IF Not IsNull(mx.ins_assigns[ll_k].ins_mtrlwaremx) THEN mx.ins_assigns[ll_k].ins_mtrlwaremx.ins_noallocqty -= mx.ins_assigns[ll_k].ins_qty mx.ins_assigns[ll_k].ins_mtrlwaremx.ins_mtrlware.ins_noallocqty -= mx.ins_assigns[ll_k].ins_qty ELSE // 没有分配库存 IF mx.ins_assigns[ll_k].ins_qty = 0 THEN CONTINUE // SELECT COUNT(0) INTO :ll_cnt FROM u_mtrlware where mtrlwareid = :mx.ins_assigns[ll_k].ins_mtrlwareid; // if sqlca.sqlcode <> 0 then // rslt = 0 // arg_msg = '已分配的库存不存在 mtrlwareid=' + string(mx.ins_assigns[ll_k].ins_mtrlwareid) // goto ext // end if // // decimal ll_noallocqty // long ll_storagetype, ll_mtrlid // string ll_mtrlcuscode, ll_status, ll_pcode, ll_woodcode // SELECT u_mtrlware.noallocqty, // u_storage.storagetype, // u_mtrlware.mtrlid, // u_mtrlware.mtrlcuscode, // u_mtrlware.status, // u_mtrlware.pcode, // u_mtrlware.woodcode // INTO : ll_noallocqty, // :ll_storagetype, // :ll_mtrlid, // :ll_mtrlcuscode, // :ll_status, // :ll_pcode, // :ll_woodcode // FROM u_mtrlware inner join u_storage on u_mtrlware.storageid = u_storage.storageid // where u_mtrlware.mtrlwareid = :mx.ins_assigns[ll_k].ins_mtrlwareid; // if sqlca.sqlcode <> 0 then // rslt = 0 // arg_msg = '查询库存信息失败' // goto ext // end if // // if ll_storagetype <> 1 then // rslt = 0 // arg_msg = '库存仓库 storagetype <> 1' // goto ext // end if // // if ll_noallocqty <= 0 then // rslt = 0 // arg_msg = '库存数为0' // goto ext // end if // // if ll_mtrlid <> mx.ins_mtrlid OR ll_mtrlcuscode <> mx.ins_mtrlcuscode & // OR ll_status <> mx.ins_status OR ll_pcode <> mx.ins_pcode & // OR ll_woodcode <> mx.ins_woodcode then // rslt = 0 // arg_msg = '分配库存与明细物料不相符' // goto ext // end if END IF NEXT NEXT ELSE FOR ll_j = 1 To UpperBound(task.ins_mx) mx = task.ins_mx[ll_j] FOR ll_k = 1 To UpperBound(mx.ins_assigns) IF uo_assign_bill.uof_assign_del(mx.ins_assigns[ll_k].ins_assignid,& mx.ins_assigns[ll_k].ins_qty,ARG_MSG,False) <> 1 THEN // rslt = 0 // goto ext // GOTO _next END IF NEXT NEXT END IF NEXT // 重新分配 FOR ll_i = 1 To UpperBound(adapter.ins_sorts[ll_bestIndex].ins_sort) task = adapter.ins_sorts[ll_bestIndex].ins_sort[ll_i] ls_logText = String(dt_serverTime, 'yyyy-MM-dd HH:mm:ss') + '--' + String(ll_i, '00000') + '--' IF task.ins_hasmoney THEN ls_logText += '足钱--' ELSE ls_logText += '差钱--' END IF IF task.ins_hasoutware THEN ls_logText += '已发货--' ELSE ls_logText += '未发货--' END IF IF task.ins_isOK THEN ls_logText += '已齐货--' ELSE ls_logText += '未齐货--' END IF If (adapter.ins_ignorout And task.ins_hasoutware) Or (Not adapter.ins_reallocall And task.ins_isOK) THEN ls_logText += '跳过' task.f_WriteLog(ls_logText) CONTINUE END IF lb_enough = True FOR ll_j = 1 To UpperBound(task.ins_mx) IF task.ins_mx[ll_j].ins_saleqty > task.ins_mx[ll_j].ins_mtrlware.ins_noallocqty THEN lb_enough = False EXIT END IF NEXT IF lb_enough THEN ls_logText += '够库存--' ELSE ls_logText += '缺库存--' END IF IF Not lb_enough THEN ls_logText += '跳过' task.f_WriteLog(ls_logText) CONTINUE END IF FOR ll_j = 1 To UpperBound(task.ins_mx) mx = task.ins_mx[ll_j] // IF Not lb_enough THEN // // 取消分配 // FOR ll_k = 1 To UpperBound(mx.ins_assigns) // IF uo_assign_bill.uof_assign_del(mx.ins_assigns[ll_k].ins_assignid,& // mx.ins_assigns[ll_k].ins_qty,ARG_MSG,False) <> 1 THEN // GOTO _next // END IF // NEXT // ELSE // // FOR ll_k = 1 To UpperBound(mx.ins_assigns) // // IF IsNull(mx.ins_assigns[ll_k].ins_mtrlwaremx) THEN // IF uo_assign_bill.uof_assign_del(mx.ins_assigns[ll_k].ins_assignid,& // mx.ins_assigns[ll_k].ins_qty,ARG_MSG,False) <> 1 THEN // GOTO _next // END IF // mx.ins_allocqty -= mx.ins_assigns[ll_k].ins_qty // // ELSE // // mx.ins_mtrlware.ins_noallocqty -= mx.ins_assigns[ll_k].ins_qty // // mx.ins_assigns[ll_k].ins_mtrlwaremx.ins_noallocqty -= mx.ins_assigns[ll_k].ins_qty // // END IF // NEXT // // // IF Not task.ins_isOK THEN ld_lake = mx.ins_saleqty - mx.ins_allocqty FOR ll_k = 1 To UpperBound(mx.ins_mtrlware.mx) IF ld_lake > mx.ins_mtrlware.mx[ll_k].ins_noallocqty THEN ld_add = mx.ins_mtrlware.mx[ll_k].ins_noallocqty ld_lake -= ld_add ELSE ld_add = ld_lake ld_lake = 0 END IF IF ld_add > 0 THEN IF ld_add = 300 THEN ld_add = ld_add END IF mx.ins_mtrlware.mx[ll_k].ins_noallocqty -= ld_add mx.ins_mtrlware.ins_noallocqty -= ld_add IF uo_assign_bill.uof_assign_add(mx.ins_task.ins_scid,& mx.ins_mtrlware.mx[ll_k].ins_mtrlwareid,1,mx.ins_task.ins_taskid,& mx.ins_printid,ld_add,0,'','','',& 0,2,publ_operator,ARG_MSG,True) <> 1 THEN // GOTO _next END IF END IF IF ld_lake = 0 THEN EXIT ls_logText += String(ld_lake,'0.00') + '--' NEXT ls_logText += '分配完成' task.f_WriteLog(ls_logText) // END IF // END IF // _next: NEXT NEXT END IF //ext: Destroy uo_assign_bill Destroy adapter IF rslt = 0 THEN ROLLBACK; ELSE COMMIT; END IF RETURN rslt end function