最近公司线材半成品需要分层成多个半成品,由一束线的半成品变成三四十多个半成品,该业务需求会带来哪些影响呢?
仓库就提出任务单能不能批量发料功能?从技术角度来说,理论上是可以实现在的。经过对业务部关键用户的需求调研和分析得出如下:
- 由于不同装配件所有用到的原材料或半成品在不同仓库不同用户有权限发料
- 部分原材料或半成品实物与系统的现有量不相符,其中原因:实物与系统操作的及时性问题所导致的。关键用户同意按照系统现有量扣帐。
- 启用批次的物料采用先进先出原则扣帐
- 采用模拟标准任务单发料直接往表mtl_material_transactions_temp和MTL_TRANSACTION_LOTS_TEMP插入数据。
本次开发借鉴标准系统标准API:
1. WIP_POPULATE_TEMP.Insert_Temp 往表mtl_material_transactions_temp
2.inv_quantity_tree_pub.query_quantities 判断现有量 API
主要代码如下,其中核心代码CUX_WIPBATTXMAT_PKG.InsertTemp
CREATE OR REPLACE Package CUX_WIPBATTXMAT_PKG As --任务单装配 Type CUX_WIPDISCRETEJOBS Is Record( TRANSACTION_HEADER_ID Number,WIP_ENTITY_ID Number,--任务单ID WIP_ENTITY_NAME Varchar2(240),--任务单编号 JOB_TYPE_MEANING Varchar2(80),--类型 ASSEMBLY_NUM Varchar2(40),--装配件 ASSEMBLY_DESC Varchar2(240),--装配件说明 CLASS_CODE Varchar2(10),--分类 STATUS_TYPE_DISP Varchar2(80),--状态 START_QUANTITY Number,--数量 DATE_RELEASED Date,--发放日期 INVENTORY_ITEM_ID Number,--装配件ID TRANSACTION_TYPE Varchar2(80),--事务处理类型 TRANSACTION_DATE Date,--事务处理日期 TRANSFER_SUBINVENTORY Varchar2(8),--子库存 TRANSFER_LOCATION_ID Number,--货位ID TRANSFER_LOCATION_CODE Varchar2(30) --货位代码 ); --提交请求 GB任务单批量发料请求 procedure SubmitRpt(ERRBUF OUT VARCHAR2,RETCODE OUT NUMBER,P_ORGANIZATION_ID NUMBER,P_GROUP_ID Number,P_USER_ID Number); --提交单个任务单组件发放 Procedure WipCmpRelRequest(P_GROUP_ID In Number,P_WIP_ENTITY_ID IN NUMBER,P_TRANSACTION_DATE IN Date,P_ORGANIZATION_ID IN NUMBER,P_SUBINVENTORY IN VARCHAR2,P_LOCATOR_ID IN NUMBER,P_TRANSACTION_HEADER_ID In NUMBER,P_USER_ID IN NUMBER,P_DEBUG_FLAG Varchar2); procedure WipCmpRel(ERRBUF OUT VARCHAR2,P_GROUP_ID In Number,P_TRANSACTION_DATE IN Varchar2,P_DEBUG_FLAG Varchar2); Procedure InsertTemp(P_TRANSACTION_MODE IN NUMBER,P_LINE_ID IN NUMBER,P_TRANSACTION_DATE IN DATE,P_TRANSACTION_TYPE_ID IN NUMBER,P_TRANSACTION_ACTION_ID IN NUMBER,P_ASSEMBLY_QUANTITY IN NUMBER,P_OPERATION_SEQ_NUM IN NUMBER,P_DEPARTMENT_ID IN NUMBER,P_CRITERIA_SUB IN VARCHAR2,P_ACCT_PERIOD_ID IN NUMBER,P_LAST_UPDATED_BY IN NUMBER,P_ENTITY_TYPE IN NUMBER,P_TRANSACTION_HEADER_ID IN NUMBER,P_DEBUG_FLAG Varchar2,X_COMMIT_COUNT In Out Number); End CUX_WIPBATTXMAT_PKG;
CREATE OR REPLACE Package Body CUX_WIPBATTXMAT_PKG As Procedure Log(p_Msg In Varchar2) Is Begin Fnd_File.Put_Line(Fnd_File.Log,p_Msg); End Log; --=============================================================== -- Output --=============================================================== Procedure Output(p_Msg In Varchar2) Is Begin Fnd_File.Put_Line(Fnd_File.Output,p_Msg); End Output; --批量发料失效的明细 procedure WipCmpRelFailure(P_ORGANIZATION_ID NUMBER,P_GROUP_ID Number) Is Cursor Cr Is Select WDJ.WIP_ENTITY_ID,WDJ.WIP_ENTITY_NAME,WDJ.STATUS_TYPE_DISP,MSI.SEGMENT1 COMP_NUM,MSI.DESCRIPTION COMP_DESC,WRO.required_QUANTITY,WRO.QUANTITY_ISSUED,WRO.SUPPLY_SUBINVENTORY From CUX.CUX_WIPBATISSUED_ALL WIPB,WIP_DISCRETE_JOBS_V WDJ,WIP_REQUIREMENT_OPERATIONS WRO,MTL_SYSTEM_ITEMS_B MSI Where WIPB.WIP_ENTITY_ID = WDJ.WIP_ENTITY_ID And WDJ.WIP_ENTITY_ID = WRO.WIP_ENTITY_ID And WRO.Inventory_Item_Id = MSI.INVENTORY_ITEM_ID And WRO.organization_id = MSI.ORGANIZATION_ID And WIPB.Group_Id = P_GROUP_ID And WIPB.ORGANIZATION_ID = P_ORGANIZATION_ID And (WRO.WIP_SUPPLY_TYPE = 1 Or WRO.WIP_SUPPLY_TYPE = 2) And WDJ.STATUS_TYPE = 3 And Nvl(WRO.QUANTITY_ISSUED,0) - WRO.required_QUANTITY < 0 Order By WDJ.WIP_ENTITY_ID; i Number :=1; Begin OUTPUT('<TR BGCOLOR="#E6E6FA"><TD COLSPAN="10">任务单未发料明细</TD></TR>'); Output('<tr BGCOLOR="#FFE66F"> <td align="center">序号</td> <td align="center">任务单</td> <td align="center">状态</td> <td align="center">任务单标识</td> <td align="center">组件</td> <td align="center">组件说明</td> <td align="center">子库存</td> <td align="center">数量</td> <td align="center">已发料</td> <td align="center">未发数</td></tr>'); For Rs In Cr Loop Output('<tr> <td align="center">'|| i ||'</td> <td>'||Rs.Wip_Entity_Name||'</td> <td>'||Rs.Status_Type_Disp||'</td> <td>'||Rs.Wip_Entity_Id||'</td> <td>'||Rs.Comp_Num||'</td> <td>'||Rs.Comp_Desc||'</td> <td>'||Rs.Supply_Subinventory||'</td> <td>'||Rs.required_Quantity||'</td> <td>'||Rs.Quantity_Issued||'</td> <td>'||(Rs.required_Quantity - Nvl(Rs.Quantity_Issued,0))||'</td></tr>'); i := i +1; End Loop; End WipCmpRelFailure; --提交请求 GB任务单批量发料请求 procedure SubmitRpt(ERRBUF OUT VARCHAR2,P_USER_ID Number) Is Cursor Cr Is Select * From CUX.CUX_WIPBATISSUED_ALL Where GROUP_ID = P_GROUP_ID And ORGANIZATION_ID = P_ORGANIZATION_ID And PROCESS_FLAG =2 ; l_TrxHdrId Number; Begin ---更新为处理中 Update CUX.CUX_WIPBATISSUED_ALL Set PROCESS_FLAG = 2 Where GROUP_ID = P_GROUP_ID And ORGANIZATION_ID = P_ORGANIZATION_ID And PROCESS_FLAG = 1; Commit; CUX_GOBAOPUBLIC_PKG.HTMLSTART('GB任务单批量发料请求'); OUTPUT('<TABLE CLASS="CONTEXT" BORDERCOLOR="#669933" WIDTH="100%" BORDER=1> <TR BGCOLOR="#E6E6FA"><TD COLSPAN="10">提交日期:' || TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') || '</TD></TR> <TR BGCOLOR="#E6E6FA"><TD COLSPAN="10">组标识:' ||P_GROUP_ID || '</TD></TR>'); Select mtl_material_transactions_s.NEXTVAL INTO l_TrxHdrId FROM SYS.dual; For Rs In Cr Loop WipCmpRelRequest(P_GROUP_ID,Rs.Wip_Entity_Id,Rs.Transaction_Date,Rs.Organization_Id,Rs.Subinventory_Code,Rs.Locator_Id,l_TrxHdrId,P_USER_ID,'Y'); End Loop; WipCmpRelFailure(P_ORGANIZATION_ID,P_GROUP_ID); OUTPUT('</TABLE></BODY></HTML>'); End SubmitRpt; --提交单个任务单组件发放 Procedure WipCmpRelRequest(P_GROUP_ID In Number,P_DEBUG_FLAG Varchar2) Is v_ReqID Number; l_phase Varchar(200); l_status Varchar(200); l_dev_phase Varchar(200); l_dev_status Varchar(200); l_message Varchar(2000); l_request_status boolean; l_TranDate Varchar2(30); Begin l_TranDate := To_Char(P_TRANSACTION_DATE,'YYYY/MM/DD HH24:MI:SS'); v_ReqID := fnd_request.submit_request('CUX','CUX_WIPBATTXMATSINGLE',null,false,P_GROUP_ID,P_WIP_ENTITY_ID,l_TranDate,P_ORGANIZATION_ID,P_SUBINVENTORY,P_LOCATOR_ID,P_TRANSACTION_HEADER_ID,P_DEBUG_FLAG); If (Nvl(v_ReqID,0) > 0) Then COMMIT; Log('请求ID:'||v_ReqID); l_request_status := Fnd_Concurrent.Wait_For_Request(v_ReqID,5,l_phase,l_status,l_dev_phase,l_dev_status,l_message); IF l_request_status THEN IF l_dev_status = 'NORMAL' THEN Log('[GB任务单组件发放:'|| P_WIP_ENTITY_ID ||']运行成功'); ELSE Log('[GB任务单组件发放:'|| P_WIP_ENTITY_ID ||']运行失败:' || l_dev_status); Return; END IF; ELSE Log('请求[GB任务单组件发放:'|| P_WIP_ENTITY_ID ||'未完成,无法查看报表内容!'); Return; END IF; End If; End WipCmpRelRequest; ---任务单装配件输出 procedure WipDiscreteJobsHtml(P_WipDiscreteJobs CUX_WIPDISCRETEJOBS) Is Begin CUX_GOBAOPUBLIC_PKG.HTMLSTART('GB任务单组件发放'); OUTPUT('<TABLE CLASS="CONTEXT" BORDERCOLOR="#669933" WIDTH="100%" BORDER=1> <TR BGCOLOR="#E6E6FA"><TD COLSPAN="13">提交日期:' || TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') || '</TD></TR>'); Output('<tr BGCOLOR="#E6E6FA"><td colspan="3">任务单:'|| P_WipDiscreteJobs.WIP_ENTITY_NAME ||'</td> <td colspan="3">装配件:'||P_WipDiscreteJobs.ASSEMBLY_NUM||'-'|| P_WipDiscreteJobs.ASSEMBLY_DESC ||'</td> <td colspan="3">状态:'||P_WipDiscreteJobs.STATUS_TYPE_DISP||'</td> <td colspan="2">类型:'||P_WipDiscreteJobs.JOB_TYPE_MEANING||'</td> <td colspan="2">分类:'||P_WipDiscreteJobs.CLASS_CODE||'</td> </tr><tr BGCOLOR="#E6E6FA"> <td colspan="2">发放日期:'||To_Char(P_WipDiscreteJobs.DATE_RELEASED,'YYYY-MM-DD')||'</td> <td colspan="3">事务处理日期:'||To_Char(P_WipDiscreteJobs.TRANSACTION_DATE,'YYYY-MM-DD HH24:MI:SS')||'</td> <td>事务处理类型:'||P_WipDiscreteJobs.TRANSACTION_TYPE||'</td> <td colspan="2">子库存:'||P_WipDiscreteJobs.TRANSFER_SUBINVENTORY||'</td> <td colspan="2">货位:'||P_WipDiscreteJobs.TRANSFER_LOCATION_CODE||'</td> <td colspan="3"></td></tr>'); Output('<tr BGCOLOR="#FFE66F"> <td align="center">事务处理题头标识</td> <td align="center">事务处理标识</td> <td align="center">任务单标识</td> <td align="center">组件标识</td> <td align="center">组件</td> <td align="center">组件说明</td> <td align="center">单位</td> <td align="center">子库存</td> <td align="center">货位</td> <td align="center">要求数量</td> <td align="center">发料数量</td> <td align="center">现有量</td> <td align="center">可用量</td></tr>'); End WipDiscreteJobsHtml; -- procedure WipCmpRel(ERRBUF OUT VARCHAR2,P_DEBUG_FLAG Varchar2) Is Cursor CrGrp Is Select Distinct WDJ.WIP_ENTITY_ID,WDJ.JOB_TYPE_MEANING,WDJ.CLASS_CODE,MSI.SEGMENT1 ASSEMBLY_NUM,MSI.DESCRIPTION ASSEMBLY_DESC,WDJ.START_QUANTITY,WDJ.PRIMARY_ITEM_ID,WDJ.DATE_RELEASED,WRO.WIP_SUPPLY_TYPE From WIP_DISCRETE_JOBS_V WDJ,MTL_SYSTEM_ITEMS_B MSI Where WDJ.WIP_ENTITY_ID = WRO.WIP_ENTITY_ID And WDJ.primary_item_id = MSI.INVENTORY_ITEM_ID And WDJ.organization_id = MSI.ORGANIZATION_ID And WDJ.WIP_ENTITY_ID = P_WIP_ENTITY_ID And (WRO.WIP_SUPPLY_TYPE = 1 Or (WRO.WIP_SUPPLY_TYPE = 2 And Length(P_SUBINVENTORY) Is Not Null)) And WDJ.STATUS_TYPE = 3 And Nvl(WRO.QUANTITY_ISSUED,0) - WRO.required_QUANTITY < 0; l_TransactionMode Number; --事务处理模式 l_TransactionTypeId Number; --事务处理类型ID l_TransactionActionId Number; --事务处理活动ID l_TransactionTypeName Varchar2(80); --事务处理类型 l_DataReleased Date; --任务单的发放日期 l_EntityType Number; --任务单类型 l_AcctPeriodId Number; --会计期ID x_OpenPast boolean := FALSE; --是否打开会计期 x_ret_status varchar2(1); x_msg_data varchar2(2000); l_WipDiscreteJobs CUX_WIPDISCRETEJOBS; l_CommitCount Number; l_ProcessFlag Number:=1; l_TransDate Date; Begin l_TransDate := To_Date(P_TRANSACTION_DATE,'YYYY/MM/DD HH24:MI:SS'); Log('P_TRANSACTION_DATE:'|| l_TransDate ); Log('P_GROUP_ID:'||P_GROUP_ID); Log('P_WIP_ENTITY_ID:'||P_WIP_ENTITY_ID); Log('P_ORGANIZATION_ID:'||P_ORGANIZATION_ID); Log('P_SUBINVENTORY:'||P_SUBINVENTORY); Log('P_LOCATOR_ID:'||P_LOCATOR_ID); Log('P_TRANSACTION_HEADER_ID:'||P_TRANSACTION_HEADER_ID); Log('P_USER_ID:'||P_USER_ID); Log('P_DEBUG_FLAG:'||P_DEBUG_FLAG); --获得任务单发放日期 Begin Select WDJ.DATE_RELEASED,WE.ENTITY_TYPE Into l_DataReleased,l_EntityType From WIP_DISCRETE_JOBS WDJ,WIP_ENTITIES WE Where WDJ.WIP_ENTITY_ID = WE.WIP_ENTITY_ID And WDJ.WIP_ENTITY_ID = P_WIP_ENTITY_ID And WDJ.STATUS_TYPE = 3; Exception When No_Data_Found Then Null; -- End; --事务处理模式 l_TransactionMode := fnd_profile.VALUE('TRANSACTION_PROCESS_MODE'); --事务处理日期验证 invttmtx.tdatechk(org_id => P_ORGANIZATION_ID,transaction_date => l_TransDate,period_id => l_AcctPeriodId,open_past_period => x_OpenPast); If (l_AcctPeriodId = -1) Then dbms_output.put_line(P_WIP_ENTITY_ID ||':会计期未打开!'); Return; End If; If (l_TransDate < l_DataReleased) Then dbms_output.put_line(P_WIP_ENTITY_ID ||':事务处理日期不能小于任务单的发放日期!'); Return; End If; /** 第一步:根据任务单的组件明细找出“供应类型”、“子库存”和“货位”等等 **/ For RsGrp In CrGrp Loop l_CommitCount := 0; /** 第二:根据供应类型、子库存和货位分开发料,产生临时数据 2.1 WIP_SUPPLY_TYPE =2 装配拉式 事务处理类型为“子库存转移” 2.2 WIP_SUPPLY_TYPE =1 推式 事务处理类型为“WIP组件发放” **/ If (RsGrp.WIP_SUPPLY_TYPE = 1) Then l_TransactionTypeId := 35; --WIP组件发放 Else l_TransactionTypeId := 2; --子库存转移 End If; --事务处理活动ID Begin Select MTT.TRANSACTION_ACTION_ID,MTT.TRANSACTION_TYPE_NAME Into l_TransactionActionId,l_TransactionTypeName From MTL_TRANSACTION_TYPES MTT Where MTT.TRANSACTION_TYPE_ID = l_TransactionTypeId; Exception When No_Data_Found Then Null; End; If (P_DEBUG_FLAG = 'Y') Then l_WipDiscreteJobs.TRANSACTION_HEADER_ID := P_TRANSACTION_HEADER_ID; l_WipDiscreteJobs.WIP_ENTITY_ID := RsGrp.Wip_Entity_Id; --任务单ID l_WipDiscreteJobs.WIP_ENTITY_NAME := RsGrp.Wip_Entity_Name; --任务单编号 l_WipDiscreteJobs.JOB_TYPE_MEANING := RsGrp.Job_Type_Meaning; --类型 l_WipDiscreteJobs.ASSEMBLY_NUM := RsGrp.Assembly_Num; --装配件 l_WipDiscreteJobs.ASSEMBLY_DESC := RsGrp.Assembly_Desc; --装配件说明 l_WipDiscreteJobs.CLASS_CODE := RsGrp.Class_Code; --分类 l_WipDiscreteJobs.STATUS_TYPE_DISP := RsGrp.Status_Type_Disp; --状态 l_WipDiscreteJobs.START_QUANTITY := RsGrp.Start_Quantity; --数量 l_WipDiscreteJobs.DATE_RELEASED := RsGrp.Date_Released; --发放日期 l_WipDiscreteJobs.INVENTORY_ITEM_ID := RsGrp.Primary_Item_Id; --装配件ID l_WipDiscreteJobs.TRANSACTION_TYPE := l_TransactionTypeName; --事务处理类型 l_WipDiscreteJobs.TRANSACTION_DATE := l_TransDate; --事务处理日期 If(l_TransactionTypeId = 2)Then l_WipDiscreteJobs.TRANSFER_SUBINVENTORY := P_SUBINVENTORY; --子库存 l_WipDiscreteJobs.TRANSFER_LOCATION_ID := P_LOCATOR_ID; --货位ID --货位代码 If (P_LOCATOR_ID Is Not Null) Then Begin Select MIL.SEGMENT1 Into l_WipDiscreteJobs.TRANSFER_LOCATION_CODE FROM MTL_ITEM_LOCATIONS MIL Where MIL.SUBINVENTORY_CODE = P_SUBINVENTORY And MIL.ORGANIZATION_ID = P_ORGANIZATION_ID; Exception When No_Data_Found Then l_WipDiscreteJobs.TRANSFER_LOCATION_CODE := Null; End; End If; Else l_WipDiscreteJobs.TRANSFER_SUBINVENTORY := Null; --子库存 l_WipDiscreteJobs.TRANSFER_LOCATION_ID := Null; --货位ID l_WipDiscreteJobs.TRANSFER_LOCATION_CODE := Null; End If; WipDiscreteJobsHtml(l_WipDiscreteJobs); Log('----------'||l_WipDiscreteJobs.WIP_ENTITY_NAME||'---------------'); Log('事务处理日期:'||l_WipDiscreteJobs.TRANSACTION_DATE); Log('事务处理类型:'||l_WipDiscreteJobs.TRANSACTION_TYPE); End If; /*dbms_output.put_line('l_TransactionTypeId:' || l_TransactionTypeId); dbms_output.put_line('l_TransactionActionId:' || l_TransactionActionId); dbms_output.put_line('l_TransactionMode:' || l_TransactionMode);*/ CUX_WIPBATTXMAT_PKG.InsertTemp(p_transaction_mode => l_TransactionMode,p_wip_entity_id => P_WIP_ENTITY_ID,p_line_id => Null,p_transaction_date => l_TransDate,p_transaction_type_id => l_TransactionTypeId,p_transaction_action_id => l_TransactionActionId,p_subinventory => P_SUBINVENTORY,p_locator_id => P_LOCATOR_ID,p_assembly_quantity => Null,p_operation_seq_num => Null,p_department_id => Null,p_criteria_sub => Null,p_organization_id => P_ORGANIZATION_ID,p_acct_period_id => l_AcctPeriodId,p_last_updated_by => P_USER_ID,p_entity_type => l_EntityType,p_transaction_header_id => P_TRANSACTION_HEADER_ID,P_DEBUG_FLAG => P_DEBUG_FLAG,X_COMMIT_COUNT =>l_CommitCount ); End Loop; log('l_CommitCount:'||l_CommitCount); If(l_CommitCount=0)Then Output('<tr><td colspan="13">None</td></tr>'); l_ProcessFlag := 3; ---更新为完成 Else -- update records to lock if concurrent request If (l_TransactionMode = WIP_CONSTANTS.IMMED_CONC) Then update mtl_material_transactions_temp set lock_flag = 'Y' where transaction_header_id = P_TRANSACTION_HEADER_ID; End If; wip_mtlTempProc_priv.processTemp(p_initMsgList => 'T',p_txnHdrID => P_TRANSACTION_HEADER_ID,p_txnMode => l_TransactionMode,x_returnStatus => x_ret_status,x_errorMsg => x_msg_data); If (x_ret_status <> 'S') Then Output('<tr BGCOLOR="red"> <td colspan="13">批量发料失败!'||x_msg_data||'</td></tr> <tr><td colspan="13">None</td></tr>'); --dbms_output.put_line('x_msg_data' || x_msg_data); Rollback; l_ProcessFlag := 1; ---更新为待定 Else Output('<tr BGCOLOR="#FFE66F"> <td colspan="13">批量发料成功!</td></tr> <tr><td colspan="13">None</td></tr>'); Commit; l_ProcessFlag := 3; ---更新为完成 End If; End If; Begin Update CUX.CUX_WIPBATISSUED_ALL Set PROCESS_FLAG = l_ProcessFlag Where WIP_ENTITY_ID = P_WIP_ENTITY_ID And GROUP_ID = P_GROUP_ID And ORGANIZATION_ID = P_ORGANIZATION_ID And PROCESS_FLAG = 2; Commit; Exception When Others Then Null; End; OUTPUT('</TABLE></BODY></HTML>'); Exception When Others Then Output('<tr BGCOLOR="#FFE66F"> <td colspan="13">批量发料失败!'|| sqlerrm||'</td></tr> <tr><td colspan="13">None</td></tr>'); OUTPUT('</TABLE></BODY></HTML>'); Rollback; Begin Update CUX.CUX_WIPBATISSUED_ALL Set PROCESS_FLAG = 1 Where WIP_ENTITY_ID = P_WIP_ENTITY_ID And GROUP_ID = P_GROUP_ID And ORGANIZATION_ID = P_ORGANIZATION_ID And PROCESS_FLAG = 2; Commit; Exception When Others Then Null; End; OUTPUT('</TABLE></BODY></HTML>'); End WipCmpRel; ---获得可用量 Procedure getAtt(P_TRANSACTION_HEADER_ID Number,P_INVENTORY_ITEM_ID Number,P_ORGANIZATION_ID Number,P_REVISION_QTY_CONTROL_CODE Number,P_LOT_CONTROL_CODE Number,P_SERIAL_NUMBER_CONTROL_CODE Number,P_REVISION Varchar2,P_LOT_NUMBER Varchar2,P_SUBINVENTORY_CODE Varchar2,P_LOCATOR_ID Number,X_QOH In Out Number,X_ATT In Out Number) Is --判断现有所用的变量 l_qty_on_hand NUMBER; l_qty_res_on_hand NUMBER; l_qty_res NUMBER; l_qty_sug NUMBER; l_qty_att NUMBER; l_qty_available_to_reserve NUMBER; l_is_revision_control BOOLEAN; l_is_lot_control BOOLEAN; l_is_serial_control BOOLEAN; l_msg_count NUMBER; l_msg_data VARCHAR2(2000); l_return_status VARCHAR2(1); l_qty_temp Number:=0; ---待等的事务数量 BEGIN X_QOH := 0; X_ATT := 0; --版本管控 If (P_REVISION_QTY_CONTROL_CODE = 2) Then l_is_revision_control := TRUE; Else l_is_revision_control := FALSE; End If; --批次管控 If (P_LOT_CONTROL_CODE = 2) Then l_is_lot_control := TRUE; Else l_is_lot_control := FALSE; End If; --序列管控 If (P_SERIAL_NUMBER_CONTROL_CODE = 2) Then l_is_serial_control := TRUE; Else l_is_serial_control := FALSE; End If; --判断现有量是否足够 inv_quantity_tree_pub.query_quantities(p_api_version_number => 1.0,p_init_msg_lst => 'F',--inv_client_globals.g_false,x_return_status => l_return_status,x_msg_count => l_msg_count,x_msg_data => l_msg_data,p_organization_id => P_ORGANIZATION_ID,p_inventory_item_id => P_INVENTORY_ITEM_ID,p_tree_mode => 2,-- Transaction Mode p_is_revision_control => l_is_revision_control,p_is_lot_control => l_is_lot_control,p_is_serial_control => l_is_serial_control,--p_demand_source_type_id => l_Rec.Transaction_Source_Type_Id,--p_demand_source_header_id => l_Rec.Transaction_Source_Id,--p_demand_source_line_id => l_Rec.Trx_Source_Line_Id,p_revision => P_REVISION,p_lot_number => P_LOT_NUMBER,p_subinventory_code => P_SUBINVENTORY_CODE,p_locator_id => P_LOCATOR_ID,p_onhand_source => 3,--inv_client_globals.g_all_subs,x_qoh => l_qty_on_hand,x_rqoh => l_qty_res_on_hand,x_qr => l_qty_res,x_qs => l_qty_sug,x_att => l_qty_att,--可用量 x_atr => l_qty_available_to_reserve); --可保留量 Log('x_qoh:'|| l_qty_on_hand ||' x_rqoh:'|| l_qty_res_on_hand || ' x_qr:'||l_qty_res ||' x_qs:' || l_qty_sug ||' x_att:'|| l_qty_att || ' x_atr:'||l_qty_available_to_reserve); IF (l_return_status = 'S') THEN X_QOH := l_qty_on_hand; If(P_LOT_NUMBER Is Not Null)Then Select Sum(TRANSACTION_QUANTITY) Into l_qty_temp From MTL_TRANSACTION_LOTS_TEMP Where TRANSACTION_TEMP_ID In (Select TRANSACTION_TEMP_ID From MTL_MATERIAL_TRANSACTIONS_TEMP Where TRANSACTION_HEADER_ID = P_TRANSACTION_HEADER_ID) And LOT_NUMBER = P_LOT_NUMBER; End If; X_ATT := l_qty_att - abs(Nvl(l_qty_temp,0)); END IF; END getAtt; --任务单组件输出 procedure WipReqOptsHtml(P_MTT mtl_material_transactions_temp%Rowtype,P_COMPONENT_NUM Varchar2,P_QOH Number,P_ATT Number,P_FLAG Number) Is l_BgColor Varchar2(200); l_TranQty Number; Begin If(P_ATT<=0)Then l_BgColor :=' bgcolor="red" '; Else l_BgColor :=''; If(Abs(P_MTT.TRANSACTION_QUANTITY)<= P_ATT)Then l_TranQty := Abs(P_MTT.TRANSACTION_QUANTITY); Else l_TranQty := P_ATT; l_BgColor :=' bgcolor="yellow" '; End If; End If; If(P_FLAG=1)Then l_BgColor :=' bgcolor="red" '; End If; Output('<tr> <td>' || P_MTT.Transaction_Header_Id || '</td> <td>' || P_MTT.Transaction_Temp_Id || '</td> <td>' || P_MTT.TRANSACTION_SOURCE_ID || '</td> <td>' || P_MTT.INVENTORY_ITEM_ID || '</td> <td'|| l_BgColor ||'>' || P_COMPONENT_NUM || '</td> <td'|| l_BgColor ||'>' || P_MTT.ITEM_DESCRIPTION || '</td> <td>' || P_MTT.Item_Primary_Uom_Code || '</td> <td>' || P_MTT.SUPPLY_SUBINVENTORY || '</td> <td></td> <td>' || Abs(P_MTT.Number_Of_Lots_Entered) || '</td> <td>' || l_TranQty || '</td> <td>' || P_QOH || '</td> <td>' || P_ATT || '</td> </tr>'); End WipReqOptsHtml; --任务单批次发料信息 Procedure WipLotsHtml(P_MTT mtl_material_transactions_temp%Rowtype,P_LOT_NUMBER Varchar2,P_EXPIRATION_DATE Date,P_TRANSACTION_QUANTITY Number,P_QOH Number,P_ATT Number) Is l_BgColor Varchar2(200); Begin If(Abs(P_TRANSACTION_QUANTITY)<=0)Then l_BgColor :=' bgcolor="red" '; Else l_BgColor :=''; End If; Output('<tr><td>' || P_MTT.Transaction_Header_Id || '</td> <td>' || P_MTT.Transaction_Temp_Id || '</td> <td '||l_BgColor||'>' || P_LOT_NUMBER || '</td> <td>' || To_Char(P_EXPIRATION_DATE,'YYYY-MM-DD') || '</td> <td>' || P_TRANSACTION_QUANTITY || '</td> <td>' || P_QOH || '</td> <td>' || P_ATT || '</td></tr>'); End WipLotsHtml; -- procedure InsertMTT(P_MTT In Out mtl_material_transactions_temp%Rowtype,P_DEBUG_FLAG Varchar2,X_COMMIT_COUNT In Out Number) Is l_Att Number := 0; l_LotTotalQty Number := 0; --批次总数量 l_LotRec MTL_TRANSACTION_LOTS_TEMP%RowType; l_PlusMinus_Flag Number; --正负标志 Cursor CrLot Is Select MOQ.Inventory_Item_Id,Sum(MOQ.Transaction_Quantity) Transaction_Quantity,MLN.LOT_NUMBER,MLN.CREATION_DATE,MLN.EXPIRATION_DATE From MTL_ONHAND_QUANTITIES_DETAIL MOQ,MTL_LOT_NUMBERS MLN Where MOQ.INVENTORY_ITEM_ID = MLN.INVENTORY_ITEM_ID And MOQ.ORGANIZATION_ID = MLN.ORGANIZATION_ID And MOQ.Lot_Number = MLN.LOT_NUMBER And MOQ.Inventory_Item_Id = P_MTT.INVENTORY_ITEM_ID And MOQ.Organization_Id = P_MTT.ORGANIZATION_ID Group By MOQ.Inventory_Item_Id,MLN.EXPIRATION_DATE Order By MLN.EXPIRATION_DATE; l_OnHand NUMBER; l_Flag Number:=0; Begin l_Flag :=0; Log('P_MTT.Item_Revision_Qty_Control_Code:'|| P_MTT.Item_Revision_Qty_Control_Code); Log('P_MTT.Revision:'||P_MTT.Revision); --首判断总数量是否够 getAtt(P_MTT.Transaction_Header_Id,P_MTT.Inventory_Item_Id,P_MTT.Organization_Id,P_MTT.Item_Revision_Qty_Control_Code,1,--l_Rec.Item_Lot_Control_Code,--l_Rec.Item_Serial_Control_Code,P_MTT.Revision,P_MTT.Lot_Number,P_MTT.Subinventory_Code,P_MTT.Locator_Id,l_OnHand,l_Att); l_Att := Nvl(l_Att,0); If ((l_Att > 0 And P_MTT.TRANSACTION_UOM <> 'PCS') Or (l_Att > 1 And P_MTT.TRANSACTION_UOM = 'PCS')) Then l_PlusMinus_Flag := P_MTT.Transaction_Quantity / abs(P_MTT.Transaction_Quantity); If(P_MTT.Item_Lot_Control_Code = 2)Then l_LotTotalQty := abs(P_MTT.Transaction_Quantity); End If; Select mtl_material_transactions_s.NEXTVAL INTO P_MTT.Transaction_Temp_Id FROM SYS.dual; If(Abs(P_MTT.TRANSACTION_QUANTITY)>l_Att)Then l_Flag := 1; P_MTT.TRANSACTION_QUANTITY :=l_PlusMinus_Flag * l_Att; P_MTT.PRIMARY_QUANTITY :=l_PlusMinus_Flag * l_Att; End If; INSERT INTO mtl_material_transactions_temp Values P_MTT; X_COMMIT_COUNT := X_COMMIT_COUNT +1; Log('物料编码:'|| P_COMPONENT_NUM ||',需求数量:'|| Abs(P_MTT.Number_Of_Lots_Entered) || ',发料数量:'|| Abs(P_MTT.TRANSACTION_QUANTITY) ||',可用量:'|| l_Att); End If; --任务单组件 If (P_DEBUG_FLAG = 'Y') Then WipReqOptsHtml(P_MTT,P_COMPONENT_NUM,l_Att,l_Flag); End If; ---批次管控 创建批次行记录 If (P_MTT.Item_Lot_Control_Code = 2 And ((l_Att > 0 And P_MTT.TRANSACTION_UOM <> 'PCS') Or (l_Att > 1 And P_MTT.TRANSACTION_UOM = 'PCS')) ) Then If(P_DEBUG_FLAG='Y')Then Output('<tr><td colspan="13" align="center"> <table CLASS="CONTEXT" BORDERCOLOR="#669933" BORDER=1> <tr><td>事务处理题标识</td> <td>事务处理标识</td> <td>批次</td> <td>到期日期</td> <td>数量</td> <td>现有量</td> <td>可用量</td></tr>'); End If; For RsLot In CrLot Loop l_LotRec.Transaction_Quantity := 0; l_LotRec.TRANSACTION_TEMP_ID := P_MTT.TRANSACTION_TEMP_ID; l_LotRec.LOT_NUMBER := RsLot.Lot_Number; l_LotRec.LOT_EXPIRATION_DATE := RsLot.Expiration_Date; l_LotRec.LAST_UPDATE_DATE := Sysdate; l_LotRec.LAST_UPDATED_BY := P_MTT.Created_By; l_LotRec.CREATION_DATE := Sysdate; l_LotRec.CREATED_BY := P_MTT.Created_By; l_LotRec.LAST_UPDATE_LOGIN := -1; l_Att := 0; l_OnHand :=0; --首判断某批次可用数量 getAtt(P_MTT.Transaction_Header_Id,P_MTT.Item_Lot_Control_Code,P_MTT.Item_Serial_Control_Code,RsLot.Lot_Number,l_Att); If (l_Att > 0) Then --单位为PCS的取整数 If (P_MTT.TRANSACTION_UOM = 'PCS') Then l_Att := floor(l_Att); End If; --计算批次总数量余额 If (l_LotTotalQty <= l_Att) Then l_LotRec.TRANSACTION_QUANTITY := l_PlusMinus_Flag * l_LotTotalQty; l_LotRec.PRIMARY_QUANTITY := l_PlusMinus_Flag * l_LotTotalQty; l_LotTotalQty := 0; Else l_LotTotalQty := l_LotTotalQty - l_Att; l_LotRec.TRANSACTION_QUANTITY := l_PlusMinus_Flag * l_Att; l_LotRec.PRIMARY_QUANTITY := l_PlusMinus_Flag * l_Att; End If; Insert Into MTL_TRANSACTION_LOTS_TEMP Values l_LotRec; Log('批次:'|| l_LotRec.Lot_Number ||',发料数量:'|| Abs(l_LotRec.TRANSACTION_QUANTITY) ||',可用量:'|| l_Att); If (P_DEBUG_FLAG = 'Y') Then WipLotsHtml(P_MTT,RsLot.Expiration_Date,l_LotRec.Transaction_Quantity,l_Att); End If; If (l_LotTotalQty = 0) Then Exit; End If; End If; End Loop; If(P_DEBUG_FLAG='Y')Then Output('</table></td></tr>'); End If; --若批次总数量与临时事务处理数量的绝对值相同,则删除临时事务处理记录,反之,更新临时事务处理的数量 If (l_LotTotalQty = abs(P_MTT.TRANSACTION_QUANTITY)) Then Delete From mtl_material_transactions_temp Where transaction_header_id = P_MTT.Transaction_Header_Id And transaction_temp_id = P_MTT.Transaction_Temp_Id; X_COMMIT_COUNT := X_COMMIT_COUNT - 1; Else Select Sum(Transaction_Quantity) Into l_LotTotalQty From MTL_TRANSACTION_LOTS_TEMP Where TRANSACTION_TEMP_ID = P_MTT.Transaction_Temp_Id; --更新临时事务处理的数量 Update mtl_material_transactions_temp Set transaction_quantity = l_LotTotalQty,primary_quantity = l_LotTotalQty Where transaction_header_id = P_MTT.Transaction_Header_Id And transaction_temp_id = P_MTT.Transaction_Temp_Id; End If; End If; End InsertMTT; /* p_transaction_mode :MMT事务处理模式:1为 p_wip_entity_id 任务单ID p_line_id ?? p_transaction_date 事务处理日期 p_transaction_type_id 事务处理类型ID p_transaction_action_id 事务处理活动ID p_subinventory 子库存 p_locator_id 货位 p_assembly_quantity 标准-装配件数量 p_operation_seq_num 标准-工序 p_department_id 标准-部门ID p_criteria_sub 标准-子库存 p_organization_id 库存组织ID p_acct_period_id 会计期ID p_last_updated_by 修改人 p_entity_type 实体类型 p_transaction_header_id 事务处理题头ID p_commit_counter 提交数量 */ Procedure InsertTemp(P_TRANSACTION_MODE IN NUMBER,P_DEBUG_FLAG VARCHAR2,X_COMMIT_COUNT In Out Number) Is x_transaction_source_type_id NUMBER; x_transaction_source_id NUMBER; x_item_segments VARCHAR2(2000); x_locator_id NUMBER; x_locator_control NUMBER; x_locator_segments VARCHAR2(2000); x_valid_locator_flag VARCHAR2(2); x_dummy BOOLEAN; x_rev VARCHAR2(5) := NULL; x_wip_commit_flag VARCHAR2(2); i NUMBER := 0; x_released_revs_type NUMBER; x_released_revs_meaning Varchar2(30); l_Rec mtl_material_transactions_temp%Rowtype; l_PlusMinus_Flag Number; --正负标志 CURSOR CDIS IS SELECT WIP_COMPONENT.Determine_Txn_Quantity(p_transaction_action_id,wro.quantity_per_assembly,wro.required_quantity,wro.quantity_issued,p_assembly_quantity) transaction_quantity,wro.inventory_item_id,msinv.secondary_inventory_name subinventory_code,bd.department_id,bd.department_code,wro.operation_seq_num,wro.wip_supply_type,wro.supply_subinventory,wro.supply_locator_id,msi.mtl_transactions_enabled_flag,msi.description,msi.location_control_code,msi.restrict_subinventories_code,msi.restrict_locators_code,msi.revision_qty_control_code,msi.primary_uom_code,mum.uom_class,msi.inventory_asset_flag,msi.allowed_units_lookup_code,msi.shelf_life_code,msi.shelf_life_days,/* decode(msi.serial_number_control_code,2,1) serial_control_code,*/ decode(msi.serial_number_control_code,/* Bug 2914137 */ msi.lot_control_code,msinv.locator_type,msi.start_auto_lot_number,msi.auto_lot_alpha_prefix,msi.start_auto_serial_number,msi.auto_serial_alpha_prefix,mil.inventory_location_id,mil.disable_date locator_disable_date,mp.stock_locator_control_code,WIP_COMPONENT.Valid_Subinventory(msinv.secondary_inventory_name,msi.inventory_item_id,p_organization_id) valid_subinventory_flag,mil.project_id,mil.task_id,wdj.project_id source_project_id,wdj.task_id source_task_id,msi.eam_item_type,MSI.SEGMENT1 COMPONENT_NUM FROM mtl_parameters mp,mtl_item_locations mil,mtl_secondary_inventories msinv,mtl_units_of_measure mum,bom_departments bd,mtl_system_items msi,wip_discrete_jobs wdj,wip_requirement_operations wro WHERE wro.wip_entity_id = p_wip_entity_id AND wro.organization_id = p_organization_id --AND WRO.INVENTORY_ITEM_ID = 1897 AND WIP_COMPONENT.is_valid(p_transaction_action_id,p_assembly_quantity,p_entity_type) = WIP_CONSTANTS.YES AND WIP_COMPONENT.meets_criteria(wro.operation_seq_num,p_operation_seq_num,wro.department_id,p_department_id,p_criteria_sub) = WIP_CONSTANTS.YES AND wdj.wip_entity_id = wro.wip_entity_id AND wdj.organization_id = wro.organization_id AND bd.department_id(+) = wro.department_id AND bd.organization_id(+) = wro.organization_id AND msi.inventory_item_id = wro.inventory_item_id AND msi.organization_id = wro.organization_id AND mum.uom_code = msi.primary_uom_code AND msinv.organization_id(+) = wro.organization_id AND msinv.secondary_inventory_name(+) = decode(p_transaction_action_id,WIP_CONSTANTS.SUBTRFR_ACTION,p_subinventory,NVL(wro.supply_subinventory,p_subinventory)) And Exists ---限制用户发料子库存 (Select 1 From CUX_MATERIAL_ISSUED MRI Where MRI.MATERIAL_ID = P_LAST_UPDATED_BY And MRI.ITEM_VALUE = decode(p_transaction_action_id,p_subinventory)) And MRI.ORGANIZATION_ID = P_ORGANIZATION_ID And MRI.MANAGER_CATEGORY = 'SUBINVENTORY') AND mil.organization_id(+) = wro.organization_id AND mil.inventory_location_id(+) = decode(p_transaction_action_id,p_locator_id,NVL(wro.supply_locator_id,p_locator_id)) AND mp.organization_id = wro.organization_id ORDER BY wro.operation_seq_num; Begin x_wip_commit_flag := 'Y'; /* Source Type and Source are set differently for Subinventory Replen */ IF p_transaction_action_id = WIP_CONSTANTS.SUBTRFR_ACTION THEN /* Bug fix 5744865 */ SELECT transaction_source_type_id into x_transaction_source_type_id from mtl_transaction_types where transaction_type_id = p_transaction_type_id; -- x_transaction_source_type_id := 13; x_transaction_source_id := NULL; ELSE x_transaction_source_type_id := 5; x_transaction_source_id := p_wip_entity_id; END IF; -- set up release type /* 2999230 */ wip_common.Get_Released_Revs_Type_Meaning(x_released_revs_type,x_released_revs_meaning); FOR C IN CDIS LOOP --Log('ddddddddddddddd'); --dbms_output.put_line('subinventory_code:' || c.subinventory_code); x_dummy := FND_FLEX_KEYVAL.validate_ccid(appl_short_name => 'INV',key_flex_code => 'MSTK',structure_number => 101,combination_id => C.inventory_item_id,data_set => p_organization_id); x_item_segments := FND_FLEX_KEYVAL.concatenated_values; x_locator_id := C.inventory_location_id; /* Fix for Bug# 2149033. Added x_locator_id condition in if condition */ IF (C.subinventory_code IS NOT NULL) and (x_locator_id IS NOT NULL) THEN x_valid_locator_flag := WIP_COMPONENT.Valid_Locator(x_locator_id,C.inventory_item_id,p_organization_id,C.stock_locator_control_code,C.locator_type,C.location_control_code,C.restrict_locators_code,C.locator_disable_date,x_locator_control); IF x_locator_control = 1 THEN x_locator_segments := NULL; ELSE x_dummy := FND_FLEX_KEYVAL.validate_ccid(appl_short_name => 'INV',key_flex_code => 'MTLL',combination_id => x_locator_id,data_set => p_organization_id); -- fix for bug 4084598 --x_locator_segments := FND_FLEX_KEYVAL.concatenated_values; END IF; ELSE x_valid_locator_flag := 'N'; x_locator_id := null; --no locator when sub is not populated x_locator_segments := NULL; END IF; IF C.revision_qty_control_code = WIP_CONSTANTS.REV THEN BOM_REVISIONS.Get_Revision(type => 'PART',eco_status => x_released_revs_meaning,examine_type => 'ALL',org_id => P_Organization_Id,item_id => C.inventory_item_id,rev_date => p_transaction_date,itm_rev => x_rev); ELSE x_rev := NULL; END IF; IF C.mtl_transactions_enabled_flag = 'N' OR (C.valid_subinventory_flag = 'N') OR (x_valid_locator_flag = 'N') OR (C.lot_control_code <> 1 AND C.transaction_quantity <> 0) OR (C.serial_control_code <> 1 AND C.transaction_quantity <> 0) OR (C.lot_control_code <> 1 AND C.serial_control_code <> 1) OR (C.transaction_quantity = 0 AND p_assembly_quantity IS NOT NULL AND p_transaction_action_id IN (WIP_CONSTANTS.RETNEGC_ACTION,WIP_CONSTANTS.RETCOMP_ACTION)) THEN x_wip_commit_flag := 'N'; ELSE x_wip_commit_flag := 'Y'; END IF; --Log('x_wip_commit_flag:'|| x_wip_commit_flag); -- bug3430508: do not insert subinv/loc if material status -- disables it if (inv_material_status_grp.is_status_applicable(NULL,-- p_wms_installed,NULL,p_transaction_type_id,-- p_trx_type_id (is this same as trx_type_id?) NULL,C.subinventory_code,'Z') = 'N') then C.subinventory_code := null; x_locator_id := null; end if; if (inv_material_status_grp.is_status_applicable(NULL,x_locator_id,'L') = 'N') then x_locator_id := null; end if; If (x_wip_commit_flag = 'N') Then l_PlusMinus_Flag := C.transaction_quantity / Abs(C.transaction_quantity); l_Rec.Transaction_Temp_Id := Null; l_Rec.item_segments := x_item_segments; l_Rec.locator_segments := x_locator_segments; l_Rec.primary_switch := i; l_Rec.transaction_header_id := p_transaction_header_id; If (p_transaction_mode = 2) Then l_Rec.transaction_mode := 2; Else l_Rec.transaction_mode := 1; End If; l_Rec.lock_flag := 'N'; l_Rec.inventory_item_id := C.inventory_item_id; l_Rec.subinventory_code := C.subinventory_code; If (C.eam_item_type = 3) Then l_Rec.primary_quantity := 1; l_Rec.transaction_quantity := 1; Else If (C.Primary_Uom_Code = 'PCS') Then --单位为PCS上向取整 l_Rec.primary_quantity := l_PlusMinus_Flag * Ceil(Abs(C.transaction_quantity)); l_Rec.transaction_quantity := l_PlusMinus_Flag * Ceil(Abs(C.transaction_quantity)); Else l_Rec.primary_quantity := C.transaction_quantity; l_Rec.transaction_quantity := C.transaction_quantity; End If; End If; l_Rec.number_of_lots_entered := C.transaction_quantity; l_Rec.transaction_date := p_transaction_date; l_Rec.organization_id := p_organization_id; l_Rec.acct_period_id := p_acct_period_id; l_Rec.last_update_date := SYSDATE; l_Rec.last_updated_by := p_last_updated_by; l_Rec.creation_date := SYSDATE; l_Rec.created_by := p_last_updated_by; l_Rec.transaction_source_id := x_transaction_source_id; l_Rec.transaction_source_type_id := x_transaction_source_type_id; l_Rec.transaction_type_id := p_transaction_type_id; l_Rec.transaction_action_id := p_transaction_action_id; l_Rec.wip_entity_type := p_entity_type; l_Rec.repetitive_line_id := p_line_id; l_Rec.department_id := C.department_id; l_Rec.department_code := C.department_code; l_Rec.locator_id := x_locator_id; l_Rec.required_flag := 1; l_Rec.operation_seq_num := C.operation_seq_num; If (p_transaction_action_id = 2) Then l_Rec.transfer_subinventory := C.supply_subinventory; l_Rec.transfer_to_location := C.supply_locator_id; Else l_Rec.transfer_subinventory := NULL; l_Rec.transfer_to_location := NULL; End If; l_Rec.wip_supply_type := C.wip_supply_type; l_Rec.supply_subinventory := C.supply_subinventory; l_Rec.supply_locator_id := C.supply_locator_id; l_Rec.item_trx_enabled_flag := C.mtl_transactions_enabled_flag; l_Rec.item_description := C.description; l_Rec.item_location_control_code := C.location_control_code; l_Rec.item_restrict_subinv_code := C.restrict_subinventories_code; l_Rec.item_restrict_locators_code := C.restrict_locators_code; l_Rec.item_revision_qty_control_code := C.revision_qty_control_code; l_Rec.revision := x_rev; l_Rec.item_primary_uom_code := C.primary_uom_code; l_Rec.transaction_uom := C.primary_uom_code; l_Rec.item_uom_class := C.uom_class; l_Rec.item_inventory_asset_flag := C.inventory_asset_flag; l_Rec.allowed_units_lookup_code := C.allowed_units_lookup_code; l_Rec.item_shelf_life_code := C.shelf_life_code; l_Rec.item_shelf_life_days := C.shelf_life_days; l_Rec.item_serial_control_code := C.serial_control_code; l_Rec.item_lot_control_code := C.lot_control_code; l_Rec.current_locator_control_code := C.locator_type; l_Rec.wip_commit_flag := x_wip_commit_flag; l_Rec.next_lot_number := C.start_auto_lot_number; l_Rec.next_serial_number := C.start_auto_serial_number; l_Rec.lot_alpha_prefix := C.auto_lot_alpha_prefix; l_Rec.serial_alpha_prefix := C.auto_serial_alpha_prefix; l_Rec.valid_subinventory_flag := C.valid_subinventory_flag; l_Rec.valid_locator_flag := x_valid_locator_flag; l_Rec.negative_req_flag := sign(C.required_quantity); l_Rec.posting_flag := 'Y'; l_Rec.process_flag := 'Y'; l_Rec.project_id := C.project_id; l_Rec.task_id := C.task_id; l_Rec.source_project_id := C.source_project_id; l_Rec.source_task_id := C.source_task_id; --dbms_output.put_line('Inventory_Item_Id:' || l_Rec.Inventory_Item_Id); InsertMTT(l_Rec,C.Component_Num,P_DEBUG_FLAG,X_COMMIT_COUNT); End If; i := i + 1; END LOOP; --dbms_output.put_line('i:' || i); End InsertTemp; End CUX_WIPBATTXMAT_PKG;注意:本案批量发料必须要一张任务单发料以后,才能发下一张任务单物料,否则,会出现误判现有量够用。