如何区分 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
这种写法比逐一列出并排除所有发票类型更可靠,因为系统中还可能有普通、定期、分配等其他日记账类型。
注意事项
Posted只能表明日记账已经过账,不能证明它是付款日记账,因此还必须检查JournalType。- 客户付款和供应商付款对应两个不同的枚举值,需要根据提取范围决定是否同时包含。
- 如果需要查询最终生成的总账分录,而非原始日记账数据,还要根据系统版本和查询目的考虑
GeneralJournalEntry、GeneralJournalAccountEntry等过账结果表。 - 不同 Dynamics AX 或 Dynamics 365 Finance 版本的枚举成员可能不同。实施前应在当前环境的
LedgerJournalType枚举中确认实际成员名称。 - 查询跨公司数据时,需要显式处理
DataAreaId,或使用合适的crossCompany查询,以免遗漏记录或混合不同法人的数据。
备注:内容仅供参考。
