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;