PAYATHON 2026

查询 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。

备注:内容仅供参考。