PAYATHON 2026

如何区分 invoice journal 和 payment journal?

支付阿杰

结论

可以。LedgerJournalTable 的 JournalType 字段表示日记账的业务类型,对应枚举 LedgerJournalType。

提取已过账的付款日记账时,通常需要组合以下条件:

  • Posted == NoYes::Yes
  • 客户付款:JournalType == LedgerJournalType::CustPayment
  • 供应商付款:JournalType == LedgerJournalType::VendPayment

不要只根据 JournalName、日记账编号前缀或名称文本判断类型。这些值通常由企业自行配置,并不稳定。

为什么两类日记账会存储在同一张表中

LedgerJournalTable 是总账日记账通用的表头表。普通日记账、发票日记账、客户付款日记账、供应商付款日记账等都存储在这张表中。

系统通过 JournalType 区分具体的业务类型。日记账明细通常存储在 LedgerJournalTrans 中,并通过 JournalNum 与表头关联。

两张表的用途分别是:

  • LedgerJournalTable 用于筛选日记账类型和过账状态;
  • LedgerJournalTrans 用于读取凭证、账户、金额、付款方式等明细。

X++ 查询示例

同时查询客户付款和供应商付款日记账:

LedgerJournalTable ledgerJournalTable;

while select ledgerJournalTable
    where ledgerJournalTable.Posted == NoYes::Yes
       && (ledgerJournalTable.JournalType == LedgerJournalType::CustPayment
        || ledgerJournalTable.JournalType == LedgerJournalType::VendPayment)
{
    info(strFmt(
        "JournalNum: %1, JournalType: %2",
        ledgerJournalTable.JournalNum,
        enum2Str(ledgerJournalTable.JournalType)));
}

如果只查询供应商付款日记账:

LedgerJournalTable ledgerJournalTable;

while select ledgerJournalTable
    where ledgerJournalTable.Posted      == NoYes::Yes
       && ledgerJournalTable.JournalType == LedgerJournalType::VendPayment
{
    // 处理供应商付款日记账
}

如果还需要读取付款明细,可以连接 LedgerJournalTrans:

LedgerJournalTable ledgerJournalTable;
LedgerJournalTrans ledgerJournalTrans;

while select ledgerJournalTable
    where ledgerJournalTable.Posted == NoYes::Yes
       && (ledgerJournalTable.JournalType == LedgerJournalType::CustPayment
        || ledgerJournalTable.JournalType == LedgerJournalType::VendPayment)
    join ledgerJournalTrans
        where ledgerJournalTrans.JournalNum == ledgerJournalTable.JournalNum
{
    // 使用 ledgerJournalTable 获取表头信息
    // 使用 ledgerJournalTrans 获取账户、金额、凭证等明细
}

发票日记账的判断

发票日记账同样通过 JournalType 判断。具体的枚举值取决于业务场景,例如客户发票、供应商发票登记和供应商发票审批可能对应不同的 LedgerJournalType 值。

如果只是要排除发票日记账,建议直接使用付款类型白名单:

JournalType == LedgerJournalType::CustPayment
|| JournalType == LedgerJournalType::VendPayment

这种写法比逐一列出并排除所有发票类型更可靠,因为系统中还可能有普通、定期、分配等其他日记账类型。

注意事项

  1. Posted 只能表明日记账已经过账,不能证明它是付款日记账,因此还必须检查 JournalType。
  2. 客户付款和供应商付款对应两个不同的枚举值,需要根据提取范围决定是否同时包含。
  3. 如果需要查询最终生成的总账分录,而非原始日记账数据,还要根据系统版本和查询目的考虑 GeneralJournalEntry、GeneralJournalAccountEntry 等过账结果表。
  4. 不同 Dynamics AX 或 Dynamics 365 Finance 版本的枚举成员可能不同。实施前应在当前环境的 LedgerJournalType 枚举中确认实际成员名称。
  5. 查询跨公司数据时,需要显式处理 DataAreaId,或使用合适的 crossCompany 查询,以免遗漏记录或混合不同法人的数据。

备注:内容仅供参考。