(一)销售订单概述
1.1 与车间模块关系
当使用ATO类型订单时,订单管理模块会直接在车间模块中产生任务
1.2 与库存模块关系
在销售订单中使用的物料,单位等信息均来自库存模块,在订单执行过程中,按订单保留及销售发运等功能也会对库存模块起作用
1.3 与应收模块关系
销售完成后,订单管理模块会在应收接口中产生INVOICE信息,影响应收模块中销售订单对应的应收INVOICE处理操作
1.4 与采购模块关系
在直发流程,背对背等销售流程中,订单模块会在采购模块中产生对应的采购需求和请购信息,供采购模块导入,影响后续采购操作
1.5 与CRM模块关系
在CRM中,如sale online等许多模块,营销流程执行结束后都会在订单管理模块接口中产生销售订单信息,供订单管理模块导入
1.5 与物料清单模块关系
在ATO类型和PTO类型的销售订单中,进行配置时销售模块都将引用物料设置于物料清单模块的物料清单信息进行配置
1.6 与主计划/MRP模块关系
当对销售订单进行计划后,订单管理模块会将需求信息传递给MRP模块
1.7 与外部系统关系
订单管理模块通过调用高级定价模块产生销售订单中的销售价格信息
1.8 与发运模块的关系
对于需要从库存发运物品的销售订单,订单会将需要发运的信息传递给发运模块,在发运模块中完成对此物品的挑库,发货等操作。完成后发运模块会将发运状态回写到订单管理模块中。
1.9 销售订单模块主要功能
创建客户,维护客户信息及客户关系,进行客户合并操作
销售及退货单的录入,登记
对于销售和退货单的复制,修改,取消,暂挂,释放等操作
查询销售订单执行状况及与之关联的价格调整,库存,交货,发运,INVOICE信息、
根据客户的信用额度进行控制销售订单的挑库及发货
对销售价格的记录和使用控制
与高级定价模块集成,调用高级定价功能结合价目表产生销售价格
与发运模块集成,通过发运模块进行库存类物品的挑库,发货操作
自动产生应收INVOICE/贷项通知单接口记录,供应收模块导入
处理复杂公司销售业务流程,如直发,内部销售,公司间交易,ATO订单,PTO订单
(二)标准销售订单流程
2.1 基本流程
Ebs标准销售流程比较简单清晰,如图,但是过程中夹杂着许多东西,例如信用控制等,相对来说还是比较复杂的
2.2 创建订单(界面)
1.填写订单头信息
2.填写订单行信息
2.3 创建订单(API)
DECLARE
x_Header_Rec Oe_Order_Pub.Header_Rec_Type;
x_Header_Val_Rec Oe_Order_Pub.Header_Val_Rec_Type;
x_Header_Adj_Tbl Oe_Order_Pub.Header_Adj_Tbl_Type;
x_Header_Adj_Val_Tbl Oe_Order_Pub.Header_Adj_Val_Tbl_Type;
x_Header_Price_Att_Tbl Oe_Order_Pub.Header_Price_Att_Tbl_Type;
x_Header_Adj_Att_Tbl Oe_Order_Pub.Header_Adj_Att_Tbl_Type;
x_Header_Adj_Assoc_Tbl Oe_Order_Pub.Header_Adj_Assoc_Tbl_Type;
x_Header_Scredit_Tbl Oe_Order_Pub.Header_Scredit_Tbl_Type;
x_Header_Scredit_Val_Tbl Oe_Order_Pub.Header_Scredit_Val_Tbl_Type;
x_Line_Tbl Oe_Order_Pub.Line_Tbl_Type;
x_Line_Val_Tbl Oe_Order_Pub.Line_Val_Tbl_Type;
x_Line_Adj_Tbl Oe_Order_Pub.Line_Adj_Tbl_Type;
x_Line_Adj_Val_Tbl Oe_Order_Pub.Line_Adj_Val_Tbl_Type;
x_Line_Price_Att_Tbl Oe_Order_Pub.Line_Price_Att_Tbl_Type;
x_Line_Adj_Att_Tbl Oe_Order_Pub.Line_Adj_Att_Tbl_Type;
x_Line_Adj_Assoc_Tbl Oe_Order_Pub.Line_Adj_Assoc_Tbl_Type;
x_Line_Scredit_Tbl Oe_Order_Pub.Line_Scredit_Tbl_Type;
x_Line_Scredit_Val_Tbl Oe_Order_Pub.Line_Scredit_Val_Tbl_Type;
x_Lot_Serial_Tbl Oe_Order_Pub.Lot_Serial_Tbl_Type;
x_Lot_Serial_Val_Tbl Oe_Order_Pub.Lot_Serial_Val_Tbl_Type;
x_Action_Request_Tbl Oe_Order_Pub.Request_Tbl_Type;
i NUMBER := 1;
l_header_rec oe_order_pub.header_rec_type;
l_line_tbl oe_order_pub.line_tbl_type;
l_action_request_tbl oe_order_pub.request_tbl_type;
x_Return_Status VARCHAR2(1);
x_Msg_Count NUMBER;
x_Msg_Data VARCHAR2(255);
BEGIN
fnd_global.APPS_INITIALIZE(user_id => 1143,resp_id => 50877,resp_appl_id => 20004);
Mo_Global.init('CUX');
oe_msg_pub.initialize;
l_Header_Rec := Oe_Order_Pub.g_Miss_Header_Rec;
l_Header_Rec.Operation := Oe_Globals.g_Opr_Create;
l_Header_Rec.Org_Id := &Org_Id;
l_Header_Rec.Sold_To_Org_Id := &Customer_Id;
l_header_rec.order_type_id := &order_type_id;
l_Line_Tbl.Delete;
l_Line_Tbl(i) := Oe_Order_Pub.g_Miss_Line_Rec;
l_Line_Tbl(i).Operation := Oe_Globals.g_Opr_Create;
l_Line_Tbl(i).Inventory_Item_Id := &Inventory_Item_Id;
l_Line_Tbl(i).Ordered_Quantity := &Quantity;
l_Line_Tbl(i).Unit_Selling_Price := &unit_price;
l_Line_Tbl(i).Unit_List_Price := &unit_price;
l_Line_Tbl(i).Calculate_Price_Flag := 'N';
--如果没使用修改量或者运费作为价格,通过API导入价格必须导入冻结的价格
Oe_Order_Pub.Process_Order(p_Org_Id => &org_id,
p_Api_Version_Number => 1.0,
p_Init_Msg_List => NULL,
p_Return_Values => NULL,
p_Header_Rec => l_Header_Rec,
p_Action_Request_Tbl => l_Action_Request_Tbl,
p_Line_Tbl => l_Line_Tbl,
x_Header_Rec => x_Header_Rec,
x_Header_Val_Rec => x_Header_Val_Rec,
x_Header_Adj_Tbl => x_Header_Adj_Tbl,
x_Header_Adj_Val_Tbl => x_Header_Adj_Val_Tbl,
x_Header_Price_Att_Tbl => x_Header_Price_Att_Tbl,
x_Header_Adj_Att_Tbl => x_Header_Adj_Att_Tbl,
x_Header_Adj_Assoc_Tbl => x_Header_Adj_Assoc_Tbl,
x_Header_Scredit_Tbl => x_Header_Scredit_Tbl,
x_Header_Scredit_Val_Tbl => x_Header_Scredit_Val_Tbl,
x_Line_Tbl => x_Line_Tbl,
x_Line_Val_Tbl => x_Line_Val_Tbl,
x_Line_Adj_Tbl => x_Line_Adj_Tbl,
x_Line_Adj_Val_Tbl => x_Line_Adj_Val_Tbl,
x_Line_Price_Att_Tbl => x_Line_Price_Att_Tbl,
x_Line_Adj_Att_Tbl => x_Line_Adj_Att_Tbl,
x_Line_Adj_Assoc_Tbl => x_Line_Adj_Assoc_Tbl,
x_Line_Scredit_Tbl => x_Line_Scredit_Tbl,
x_Line_Scredit_Val_Tbl => x_Line_Scredit_Val_Tbl,
x_Lot_Serial_Tbl => x_Lot_Serial_Tbl,
x_Lot_Serial_Val_Tbl => x_Lot_Serial_Val_Tbl,
x_Action_Request_Tbl => x_Action_Request_Tbl,
-- Return msg
x_Return_Status => x_Return_Status,
x_Msg_Count => x_Msg_Count,
x_Msg_Data => x_Msg_Data);
IF x_Return_Status = Fnd_Api.g_Ret_Sts_Success THEN
Dbms_Output.Put_Line('订单导入成功!');
Dbms_Output.Put_Line('订单编号:'||x_Header_Rec.order_number);
ELSE
FOR l_index IN 1 .. x_Msg_Count LOOP
Dbms_Output.Put_Line(oe_msg_pub.get(p_msg_index => l_index, p_encoded => 'F'));
END LOOP;
END IF;
END;
² 说明:导入已登记订单,一般不建议通过头的booked_flag的标记去导入,结果会只是行状态为已登记状态,但是头的状态为已输入状态。
² 如果需要导入期初价格的订单,且无修改量及运费计算的,则设置行上的Calculate_Price_Flag='N'
2.4 登记订单
DECLARE
x_Header_Rec Oe_Order_Pub.Header_Rec_Type;
x_Header_Val_Rec Oe_Order_Pub.Header_Val_Rec_Type;
x_Header_Adj_Tbl Oe_Order_Pub.Header_Adj_Tbl_Type;
x_Header_Adj_Val_Tbl Oe_Order_Pub.Header_Adj_Val_Tbl_Type;
x_Header_Price_Att_Tbl Oe_Order_Pub.Header_Price_Att_Tbl_Type;
x_Header_Adj_Att_Tbl Oe_Order_Pub.Header_Adj_Att_Tbl_Type;
x_Header_Adj_Assoc_Tbl Oe_Order_Pub.Header_Adj_Assoc_Tbl_Type;
x_Header_Scredit_Tbl Oe_Order_Pub.Header_Scredit_Tbl_Type;
x_Header_Scredit_Val_Tbl Oe_Order_Pub.Header_Scredit_Val_Tbl_Type;
x_Line_Tbl Oe_Order_Pub.Line_Tbl_Type;
x_Line_Val_Tbl Oe_Order_Pub.Line_Val_Tbl_Type;
x_Line_Adj_Tbl Oe_Order_Pub.Line_Adj_Tbl_Type;
x_Line_Adj_Val_Tbl Oe_Order_Pub.Line_Adj_Val_Tbl_Type;
x_Line_Price_Att_Tbl Oe_Order_Pub.Line_Price_Att_Tbl_Type;
x_Line_Adj_Att_Tbl Oe_Order_Pub.Line_Adj_Att_Tbl_Type;
x_Line_Adj_Assoc_Tbl Oe_Order_Pub.Line_Adj_Assoc_Tbl_Type;
x_Line_Scredit_Tbl Oe_Order_Pub.Line_Scredit_Tbl_Type;
x_Line_Scredit_Val_Tbl Oe_Order_Pub.Line_Scredit_Val_Tbl_Type;
x_Lot_Serial_Tbl Oe_Order_Pub.Lot_Serial_Tbl_Type;
x_Lot_Serial_Val_Tbl Oe_Order_Pub.Lot_Serial_Val_Tbl_Type;
x_Action_Request_Tbl Oe_Order_Pub.Request_Tbl_Type;
i NUMBER := 1;
l_Header_Rec Oe_Order_Pub.Header_Rec_Type;
l_Line_Tbl Oe_Order_Pub.Line_Tbl_Type;
l_Action_Request_Tbl Oe_Order_Pub.Request_Tbl_Type;
x_Return_Status VARCHAR2(1);
x_Msg_Count NUMBER;
x_Msg_Data VARCHAR2(255);
BEGIN
Fnd_Global.Apps_Initialize(User_Id => 1143,Resp_Id => 50877,Resp_Appl_Id => 20004);
Mo_Global.init('CUX');--必须初始化MOAC,否则无法完成OU验证
mo_global.set_policy_context('S',88);
Oe_Msg_Pub.Initialize;
i := 1;
l_action_request_tbl(i).request_type := oe_globals.g_book_order;
l_action_request_tbl(i).entity_code := oe_globals.g_entity_header;
l_action_request_tbl(i).entity_id := &header_id;
/*如果有多个订单增加record记录
i := i+1;
l_action_request_tbl(i).request_type := oe_globals.g_book_order;
l_action_request_tbl(i).entity_code := oe_globals.g_entity_header;
l_action_request_tbl(i).entity_id := &header_id1;*/
Oe_Order_Pub.Process_Order(p_Api_Version_Number => 1.0,
p_Init_Msg_List => NULL,
p_Return_Values => NULL,
p_Action_Request_Tbl => l_Action_Request_Tbl,
--out
x_Header_Rec => x_Header_Rec,
x_Header_Val_Rec => x_Header_Val_Rec,
x_Header_Adj_Tbl => x_Header_Adj_Tbl,
x_Header_Adj_Val_Tbl => x_Header_Adj_Val_Tbl,
x_Header_Price_Att_Tbl => x_Header_Price_Att_Tbl,
x_Header_Adj_Att_Tbl => x_Header_Adj_Att_Tbl,
x_Header_Adj_Assoc_Tbl => x_Header_Adj_Assoc_Tbl,
x_Header_Scredit_Tbl => x_Header_Scredit_Tbl,
x_Header_Scredit_Val_Tbl => x_Header_Scredit_Val_Tbl,
x_Line_Tbl => x_Line_Tbl,
x_Line_Val_Tbl => x_Line_Val_Tbl,
x_Line_Adj_Tbl => x_Line_Adj_Tbl,
x_Line_Adj_Val_Tbl => x_Line_Adj_Val_Tbl,
x_Line_Price_Att_Tbl => x_Line_Price_Att_Tbl,
x_Line_Adj_Att_Tbl => x_Line_Adj_Att_Tbl,
x_Line_Adj_Assoc_Tbl => x_Line_Adj_Assoc_Tbl,
x_Line_Scredit_Tbl => x_Line_Scredit_Tbl,
x_Line_Scredit_Val_Tbl => x_Line_Scredit_Val_Tbl,
x_Lot_Serial_Tbl => x_Lot_Serial_Tbl,
x_Lot_Serial_Val_Tbl => x_Lot_Serial_Val_Tbl,
x_Action_Request_Tbl => x_Action_Request_Tbl,
-- Return msg
x_Return_Status => x_Return_Status,
x_Msg_Count => x_Msg_Count,
x_Msg_Data => x_Msg_Data);
IF (x_Msg_Count>0) THEN--这里不能按x_return_status的状态判断
FOR l_Index IN 1 .. x_Msg_Count LOOP
Dbms_Output.Put_Line(Oe_Msg_Pub.Get(p_Msg_Index => l_Index,p_Encoded