查询 Sales Order 的 Shipping Method 和 Payment Terms
结论
在 Oracle Fusion Cloud Order Management R13 中,Shipping Method 和 Payment Terms 通常应从订单履行行表 DOO_FULFILL_LINES_ALL 获取:
- Shipping Method:
SHIP_METHOD_CODE - Payment Terms:
PAYMENT_TERM_ID
如需显示付款条件名称,可通过 PAYMENT_TERM_ID 关联 Receivables 付款条件表 RA_TERMS_TL。不要只查订单头,因为同一 Sales Order 的不同履行行可能采用不同的运输方式或付款条件。
查询示例
以下查询按订单号返回订单行、履行行、Shipping Method 和 Payment Terms:
SELECT
dha.order_number,
dla.display_line_number,
dfla.fulfill_line_number,
dfla.ship_method_code AS shipping_method,
dfla.payment_term_id,
rtt.name AS payment_terms
FROM doo_headers_all dha
JOIN doo_lines_all dla
ON dla.header_id = dha.header_id
JOIN doo_fulfill_lines_all dfla
ON dfla.line_id = dla.line_id
AND dfla.header_id = dha.header_id
LEFT JOIN ra_terms_tl rtt
ON rtt.term_id = dfla.payment_term_id
AND rtt.language = USERENV('LANG')
WHERE dha.order_number = :P_ORDER_NUMBER
ORDER BY
dla.display_line_number,
dfla.fulfill_line_number;
如果 BI Publisher 数据模型的语言环境与 RA_TERMS_TL 中的数据不匹配,可以明确指定语言,例如:
AND rtt.language = 'US'
这样会固定返回英文名称。如果需要支持多语言,优先使用:
rtt.language = USERENV('LANG')
为什么要查询履行行
Sales Order 在 Fusion Order Management 中可能发生行拆分。一个订单行可能因仓库、发货日期或运输服务不同而生成多个 fulfillment line。相关数据分别保存在以下表中:
DOO_HEADERS_ALL保存订单头信息。DOO_LINES_ALL保存订单行信息。DOO_FULFILL_LINES_ALL保存实际履行和发运相关属性。RA_TERMS_TL保存付款条件的多语言名称。
如果报表要求每个订单只返回一条结果,需要先确定具体的业务规则。只有当所有履行行的 Shipping Method 和 Payment Terms 都相同时,才能安全地聚合到订单头级别。
可以使用以下查询检查一个订单是否包含多个值:
SELECT
dha.order_number,
COUNT(DISTINCT dfla.ship_method_code) AS shipping_method_count,
COUNT(DISTINCT dfla.payment_term_id) AS payment_term_count
FROM doo_headers_all dha
JOIN doo_fulfill_lines_all dfla
ON dfla.header_id = dha.header_id
WHERE dha.order_number = :P_ORDER_NUMBER
GROUP BY dha.order_number;
如果任一计数大于 1,报表不应随意选取某条履行行的数据。此时应按履行行展示,或制定明确的取值规则。
Shipping Method 名称的处理
SHIP_METHOD_CODE 通常保存运输方式代码。如果报表必须显示用户界面中的完整描述,可能还需要关联 Shipping Execution 中与承运服务或运输方式相关的视图。
不同 Fusion Cloud 更新版本以及不同 BI Publisher 数据源可访问的对象可能不一致,因此在核对当前环境的数据字典之前,不建议直接写死表名。可以先检查代码本身是否满足报表要求:
SELECT DISTINCT
ship_method_code
FROM doo_fulfill_lines_all
WHERE header_id = (
SELECT header_id
FROM doo_headers_all
WHERE order_number = :P_ORDER_NUMBER
);
如果返回的是类似 UPS-GROUND 的可读值,通常可以直接显示。如果返回的只是内部代码,再根据当前环境中可访问的 Shipping Method 视图补充名称。
注意事项
- 在跨业务单位场景中,同一个
order_number未必能唯一定位订单。必要时还应增加ORG_ID、业务单位或订单来源条件。 - 一个订单行可以对应多个 fulfillment line,连接后出现多行通常不代表数据重复。
RA_TERMS_TL是多语言表,关联时必须限制LANGUAGE,否则同一个付款条件可能返回多条记录。- Fusion Cloud SaaS 环境不保证 BI Publisher 数据源可以直接访问所有底层表。如果上述表不可见,应在当前 Pod 中查找对应的 secured view、BI View Object 或 Subject Area。
- 字段是否可以为空取决于订单类型、默认规则和订单当前的处理阶段。获取付款条件名称时,建议使用
LEFT JOIN。
备注:内容仅供参考。
