EBS:OM Sales Order銷售訂單【Open Interface、Open API】

samrv發表於2024-09-17

21. OM Sales Order銷售訂單【Open Interface、Open API】
21.1. 快速參考

參考點
內容
功能導航
N: OM/Orders, Returns/Sales Order
併發請求
N: OM/View/Request/Order Import
介面表
oe_headers_iface_all/oe_lines_iface_all/oe_actions_iface_all/….
API
oe_order_pub.process_order
錯誤資訊表
介面Form
N/A
介面Report
N/A
Debug Profile
OM: Debug Level
詳細例子
oracle_iface_scripts_pkg.oe_so_iface
官方文件
115mfgapi.pdf:Oracle Manufacturing APIs and Open Interfaces Manual 115omapi.pdf:Oracle Order Management Open Interfaces, API, & Electronic Messaging Guide
資料驗證包
21.2.
介面表、錯誤資訊表
開發參考
Table List:
介面表
資料表
說明
oe_headers_iface_all
oe_order_headers_all
訂單頭
oe_lines_iface_all
oe_order_lines_all
訂單行
oe_actions_iface_all
訂單操作控制
錯誤資訊表
Table Relation: 頭和行關聯:OU、訂單來源、頭參考 頭和Action關聯:OU、訂單來源、頭參考 如果Action的行參考為空,說明控制整個訂單,否則控制單行
併發程式
N: OM/View/Requst/Order Import
引數
說明
Order Source
訂單來源
Order Reference
訂單參考
Validate Only
是否僅驗證
Instance
併發數
Interface Form
N: 無
21.3.
訂單頭和訂單行,大部分欄位都可以根據Default Rule自定給出;不過,為精確控制,確定的欄位我們還是儘可能給出為好。
關鍵欄位(引數)+最簡單例子
關鍵欄位
oe_headers_iface_all
欄位
說明
org_id
OU
order_number
訂單號,自動編號的,給空
order_source_id
訂單來源,手工輸入是0,即Online
orig_sys_document_ref
訂單參考,和訂單來源構成唯一性,一般用來標誌源系統ID
operation_code
INSERT或者UPDATE,當訂單來源和參考組合存在時用更新,當訂單為Enter狀態時,可以DELETE
ready_flag
Y
ordered_date
訂單日期
order_type_id
訂單型別
price_list_id
價目表
conversion_type_code
貨幣轉換型別,可由訂單型別預設
transactional_curr_code
貨幣單位
欄位
說明
tax_exempt_flag
S,稅務免除標誌
payment_term_id
付款條件,也可以預設
salesrep_id
銷售員ID
sold_from_org_id
銷售OU
sold_to_org_id
客戶ID,來自hz_cust_accounts
ship_from_org_id
發運庫存
ship_to_org_id
發運地址,來自hz_cust_site_uses_all
invoice_to_org_id
開票地址,來自hz_cust_site_uses_all
booked_flag
Y或者N
closed_flag
Y或者N
5個who欄位
習慣上都給
oe_headers_iface_all
欄位
說明
org_id
OU
order_source_id
訂單來源,手工輸入是0,即Online
orig_sys_document_ref
訂單參考,一般用來標誌源系統ID
orig_sys_line_ref
行參考,與上面兩個構成唯一性,一般用來標誌源系統ID
operation_code
INSERT或者UPDATE,當上述3個組合存在時用更新,當訂單為Enter狀態時,可以DELETE
split_from_line_ref
拆行時,標誌來源行參考
line_number
行號,非Close的訂單行號不能重複。介面表我們可以給空由系統自動編號;如果有需要待匯入後Update Line表即可
shipment_number
發執行號
line_type_id
行型別
item_type_code
物料類別,預設由ITEM型別決定,通常是STANDARD
inventory_item_id
Item ID
source_type_code
EXTERNAL或者INTERNAL,可由預設規則確定
ordered_quantity
訂單數量,正負要與Line Type一致,正的對Order,負的對Return,否則介面報Inventory Item錯誤
order_quantity_uom
單位
pricing_quantity
計價數量
pricing_quantity_uom
單位
unit_list_price
價目表價格
unit_selling_price
實際銷售價格
calculate_price_flag
N或者Y,是否自動計算價格
5個who欄位
習慣上都給
oe_actions_iface_all
欄位
說明
org_id
OU
order_source_id
訂單來源,手工輸入是0,即Online
orig_sys_document_ref
訂單參考,一般用來標誌源系統ID
orig_sys_line_ref
行參考,與上面兩個構成唯一性,一般用來標誌源系統ID
operation_code
CLOSE_ORDER,用於關閉訂單或行或行 BOOK_ORDER,使用者預定訂單
Open Inerface最簡單例子(新建Book的訂單)

(11.5.10.2 Prod環境測試透過)
指令碼如下:
DECLARE l_iface_rec ont.oe_headers_iface_all%ROWTYPE; 
l_iface_lines_rec ont.oe_lines_iface_all%ROWTYPE;
l_iface_action_rec ont.oe_actions_iface_all%ROWTYPE; 
l_org_id NUMBER := 102; --OU ID 
l_user_id NUMBER := 0; --User ID?Sysadmin 
BEGIN --Header 
l_iface_rec.last_update_date := SYSDATE; 
l_iface_rec.last_updated_by := 0; 
l_iface_rec.creation_date := SYSDATE; 
l_iface_rec.created_by := 0; 
l_iface_rec.last_update_login := -1; 
l_iface_rec.org_id := l_org_id; 
l_iface_rec.order_number := NULL; --Null 
if Autonumber l_iface_rec.order_source_id := 0; 
--Online, see ont.oe_order_sources 
l_iface_rec.orig_sys_document_ref := 'HEADER0001'; 
--'UPDATE' when order_source_id/orig_sys_document_ref exists 
l_iface_rec.operation_code := 'INSERT'; 
l_iface_rec.ready_flag := 'Y'; 
l_iface_rec.ordered_date := SYSDATE; 
l_iface_rec.order_type_id := 1006; 
l_iface_rec.price_list_id := 6007; 
--Derive from order type or customer 
l_iface_rec.conversion_type_code := 'Corporate'; 
--Derive from order type 
l_iface_rec.transactional_curr_code := 'CNY'; 
l_iface_rec.tax_exempt_flag := 'S'; 
l_iface_rec.payment_term_id := 5; --Derive from order type or customer 
l_iface_rec.salesrep_id := 100000040; 
l_iface_rec.sold_from_org_id := 102; l_iface_rec.sold_to_org_id := 1040; 
l_iface_rec.ship_from_org_id := 104; l_iface_rec.ship_to_org_id := 1042; 
l_iface_rec.invoice_to_org_id := 1040; 
l_iface_rec.booked_flag := 'Y'; 
l_iface_rec.closed_flag := 'N'; --'Y' for closed order INSERT INTO 
ont.oe_headers_iface_all VALUES l_iface_rec; 
--Line 
l_iface_lines_rec.last_update_date := SYSDATE; 
l_iface_lines_rec.last_updated_by := 0; 
l_iface_lines_rec.creation_date := SYSDATE; 
l_iface_lines_rec.created_by := 0; 
l_iface_lines_rec.last_update_login := -1; 
l_iface_lines_rec.org_id := l_iface_rec.org_id; 
l_iface_lines_rec.order_source_id := l_iface_rec.order_source_id; 
l_iface_lines_rec.orig_sys_document_ref := l_iface_rec.orig_sys_document_ref; 
l_iface_lines_rec.orig_sys_line_ref := 'LINE0001'; 
l_iface_lines_rec.split_from_line_ref := NULL; 
--Used for split line 
--'UPDATE' when order_source_id/orig_sys_document_ref/orig_sys_line_ref exists 
l_iface_lines_rec.operation_code := 'INSERT'; 
l_iface_lines_rec.line_number := 1; l_iface_lines_rec.shipment_number := 1; 
l_iface_lines_rec.line_type_id := 1001; 
--can derive from header type 
l_iface_lines_rec.item_type_code := NULL; 
--default 'STANDARD' 
l_iface_lines_rec.inventory_item_id := 5; 
l_iface_lines_rec.source_type_code := NULL; 
--'EXTERNAl' or 'INTERNAL', derive using default rule
l_iface_lines_rec.ordered_quantity := 100; 
l_iface_lines_rec.order_quantity_uom := 'PCS'; 
l_iface_lines_rec.pricing_quantity := l_iface_lines_rec.ordered_quantity; 
l_iface_lines_rec.pricing_quantity_uom := l_iface_lines_rec.order_quantity_uom; 
l_iface_lines_rec.unit_list_price := 9; 
l_iface_lines_rec.unit_selling_price := 9.9; 
l_iface_lines_rec.calculate_price_flag := 'N'; 
INSERT INTO ont.oe_lines_iface_all VALUES l_iface_lines_rec; 
END;
Open API最簡單例子(Book訂單)(11.5.9..10環境測試透過) 胡俊奇提供
只需要提供訂單頭ID即可。

153368796 2024/9/15 9:23:15
21.4.
匯入Close的SO
已知問題
整張Close的訂單可以透過介面表;Close的訂單,Oracle幾乎是直接插表;其他的要做很多驗證。 部分行Close的訂單,可以給行Assign一個僅負責Close(Enter/Fulfill/Close/End)的工作流,這樣Workflow Back Ground Process起來之後就會Close。
訂單行號
非Close的訂單行號不能重複,所以介面表我們給空;如果有需要待匯入後Update Line表即可。
數量正負
數量正負要與Line Type的型別一致,正的對Order,負的對Return,否則介面報Inventory Item錯誤。
直接更新訂單號
需要更新幾個表:oe_order_headers_all/wsh_delivery_details/mtl_sales_orders 
UPDATE apps.mtl_sales_orders SET segment1 = l_copy_to_order_number 
WHERE segment1 = l_order_number AND segment2 = l_order_type 
AND segment3 = 'ORDER ENTRY';
直接Close
更新行Close資訊程式碼如下: UPDATE oe_order_lines_all oel
SET oel.invoice_interface_status_code = 'YES', oel.shippable_flag = 'Y',
oel.fulfilled_flag = 'Y', 
oel.shipping_quantity_uom = oel.order_quantity_uom,
oel.shipping_interfaced_flag = decode(oel.source_type_code, 'EXTERNAL', 'N', 'Y'),
oel.open_flag = 'N', oel.calculate_price_flag = 'N',
oel.flow_status_code = 'CLOSED',
oel.fulfillment_date = a_rec.fulfillment_date, 
oel.actual_shipment_date = a_rec.actual_shipment_date, 
oel.shipped_quantity = oel.ordered_quantity, 
oel.shipping_quantity = oel.ordered_quantity, 
oel.invoiced_quantity = oel.ordered_quantity, 
oel.fulfilled_quantity = oel.ordered_quantity, 
oel.visible_demand_flag = decode(oel.flow_status_code, 'AWAITING_SHIPPING', 'N', NULL) 
WHERE oel.line_id = l_copy_to_order_line_id
自動拆行
訂單行在收貨或者發貨不足的情況下會拆行,拆行的時候系統幾乎是複製所有的欄位,
如果碰到Unique的欄位會失敗。我碰到的問題是把源系統的line_id記錄在彈性域上,
並給這個彈性域建了Unique索引,導致Dropship的訂單不分收貨老是報錯。

153368796 2024/9/15 9:24:07
來源: https://www.itpub.net/thread-1812919-1-1.html

153368796 2024/9/15 9:23:03
指令碼如下:
DECLARE x_debug_file VARCHAR2(100); 
x_return_status VARCHAR2(1000);
x_msg_count NUMBER;
x_msg_data VARCHAR2(1000);
l_msg_data VARCHAR2(1000);
l_msg_index_out NUMBER;
l_action_request_tbl oe_order_pub.request_tbl_type;
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;
BEGIN dbms_output.enable(1000000);
fnd_global.apps_initialize(user_id => 0, resp_id => 52459, resp_appl_id => 660);
oe_msg_pub.initialize; oe_debug_pub.initialize;
x_debug_file := oe_debug_pub.set_debug_mode('FILE');
oe_debug_pub.setdebuglevel(5); -- 5 For Most Debuging Output!!
--Action Request l_action_request_tbl(1).request_type := oe_globals.g_book_order;
l_action_request_tbl(1).entity_code := oe_globals.g_entity_header;
l_action_request_tbl(1).entity_id := 1615855;
-- SO's Header_Id 
oe_order_pub.process_order(p_api_version_number => 1.0,
p_init_msg_list => fnd_api.g_false,
p_return_values => fnd_api.g_false,
p_action_commit => fnd_api.g_false,
x_return_status => x_return_status,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data,
p_action_request_tbl => l_action_request_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 => l_action_request_tbl);
--Check Return Status 
IF x_return_status = fnd_api.g_ret_sts_success THEN
dbms_output.put_line('Successfull.');
ELSE dbms_output.put_line('Failure.');
END IF;
--Process Message
dbms_output.put_line('Process Message');
FOR i IN 1 .. x_msg_count LOOP
oe_msg_pub.get(p_msg_index => i,
p_encoded => fnd_api.g_false,
p_data => l_msg_data,
p_msg_index_out => l_msg_index_out);
dbms_output.put_line('Messge: ' || l_msg_data);
--dbms_output.put_line('Message Index: ' || l_msg_index_out);
END LOOP;
--Debug Message
dbms_output.put_line('Debug Message');
dbms_output.put_line('Debug File: ' || oe_debug_pub.g_dir || '/' || oe_debug_pub.g_file);
FOR i IN 1 .. oe_debug_pub.g_debug_count LOOP
dbms_output.put_line(oe_debug_pub.g_debug_tbl(i)); 
END LOOP;
END;

  

相關文章