应付账款付款处理数据模板
应付账款付款处理数据模板
- 财务分析所需的流程属性
- 付款跟踪的关键活动节点
- Dynamics 365详细数据提取指南
应付账款付款处理属性
| 名称 | 说明 | ||
|---|---|---|---|
| 事件时间 EventTime | 活动发生时的时间戳。 | ||
| 说明 此属性记录特定活动发生的准确日期和时间,用于按时间顺序排列事件并计算各步骤之间的时长。 在Dynamics 365中,数据通常来自 重要性 对于计算周期时间和处理时长,以及识别瓶颈至关重要。 获取途径 交易表中的系统字段CreatedDateTime或ModifiedDateTime 示例 2023-10-01T08:30:00Z2023-10-01T14:15:22Z2023-10-05T09:00:00Z | |||
| 发票编号 InvoiceNumber | 分配给供应商发票的唯一标识符。 | ||
| 说明 发票编号是此流程视图的唯一案例标识符,可将属于同一张供应商发票的所有事件归为一组,全面分析发票从接收到结算的整个过程。 在Microsoft Dynamics 365中,它通常对应VendInvoiceJour或VendInvoiceInfoTable等表中的 重要性 这是将彼此分散的应付账款活动关联为同一流程实例的基础标识符。 获取途径 表:VendInvoiceJour,字段:InvoiceId 示例 INV-2023-00198223344ACME-OCT-22 | |||
| 活动 Activity | 发生的具体任务或状态变更。 | ||
| 说明 此属性描述流程中执行的事件或步骤,例如“发票已创建”“发票已批准”或“付款已过账”。它将技术交易类型和工作流状态变更转化为易于理解的业务事件。 在Dynamics 365中,这些活动通常根据表记录插入(例如在 重要性 用于定义流程图中的流程路径和事件顺序。 获取途径 根据各类交易表和工作流历史日志得出 示例 发票已创建发票已批准付款已生成 | |||
| 上次数据更新 LastDataUpdate | 数据提取或刷新的时间戳。 | ||
| 说明 表示分析所用数据的新鲜度,帮助用户判断当前查看的是实时数据,还是之前某个时段的数据快照。 此属性通常由ETL(提取、转换、加载)流程生成,而非Dynamics 365本身的字段。 重要性 对于建立对仪表板和KPI的信任至关重要。 获取途径 由提取脚本生成 示例 2023-10-25T12:00:00Z2023-11-01T06:00:00Z | |||
| 源系统 SourceSystem | 数据来源系统的名称。 | ||
| 说明 标识提取流程数据的源软件或环境。在此场景中,该属性始终表示Microsoft Dynamics 365实例。 如果数据来自多个系统(如ERP和外部扫描解决方案),此属性尤其有用。 重要性 确保多系统分析中的数据沿袭清晰且可追溯。 获取途径 在提取过程中硬编码或配置 示例 Dynamics 365 F&OD365 PRODMicrosoft Dynamics | |||
| 供应商名称 VendorName | 供应商组织的名称。 | ||
| 说明 供应商的易读名称。在D365中,供应商账户作为外键关联到全局通讯录( 使用易读名称有助于呈现“供应商关系复杂度视图”,也让业务用户更容易使用仪表板。 重要性 为供应商账户编号提供背景信息。 获取途径 表:DirPartyTable(通过VendTable关联),字段:名称 示例 Contoso办公用品Fabrikam电子产品Litware公司 | |||
| 供应商账户 VendorAccount | 供应商的唯一账户编号。 | ||
| 说明 交易中供应商的唯一标识符。在Dynamics 365中,对应VendTable表中的 此属性是“供应商关系复杂度视图”的核心,可按具体供应商关系分析绩效和阻碍因素。 重要性 支持按供应商细分流程绩效。 获取途径 表:VendInvoiceJour,字段:InvoiceAccount或OrderAccount 示例 US-101V000452001 | |||
| 公司代码 CompanyCode | 法人实体或子公司的标识符。 | ||
| 说明 表示组织中处理发票的法人实体。在Microsoft Dynamics 365中,此属性由系统字段 此属性对于“端到端处理时长分析”至关重要,可用于比较不同子公司或地区的数据。 重要性 支持跨不同业务单元或国家进行对比分析。 获取途径 表:VendInvoiceJour,字段:DataAreaId 示例 USMFDEMFGBSI | |||
| 到期日 DueDate | 发票应付清的日期。 | ||
| 说明 为避免罚款,必须结清付款的合同约定日期。在Dynamics 365中,该日期存储在发票抬头或交易记录的 这是“按时付款率”KPI的主要基准,也有助于在“应付账款流程吞吐量与业务量”视图中确定工作优先级。 重要性 衡量按时付款表现的基准。 获取途径 表:VendInvoiceJour或VendTrans,字段:DueDate 示例 2023-11-302023-12-15 | |||
| 发票日期 InvoiceDate | 发票上注明的单据日期。 | ||
| 说明 供应商发票上列出的日期。在Dynamics 365中,对应 “端到端周期时间分析”使用此日期,从供应商的角度衡量整个生命周期。 重要性 确定发票账龄的起始日期。 获取途径 表:VendInvoiceJour,字段:InvoiceDate 示例 2023-10-012023-10-15 | |||
| 发票金额 InvoiceAmount | 发票的总金额。 | ||
| 说明 发票按交易货币计算的总金额。在Dynamics 365中,可在发票日记账表的 此属性用于“重复付款风险检测”仪表板,可结合供应商信息分析发票金额。 重要性 对于分析支出规模和财务风险至关重要。 获取途径 表:VendInvoiceJour,字段:InvoiceAmount 示例 1500.00245.5010000.00 | |||
| 用户ID UserId | 执行该活动的用户标识。 | ||
| 说明 用于识别负责特定活动的系统用户,例如审批发票或登记付款的用户。数据来自D365中的 在“付款冻结与流程阻力分析”中,可据此查看哪些处理人员更容易触发冻结。 重要性 支持分析资源行为和职责分离情况。 获取途径 交易/历史记录表中的系统字段CreatedBy/ModifiedBy 示例 jdoe管理员工作流系统 | |||
| 部门 Department | 承担相关成本的部门。 | ||
| 说明 用于标识内部部门的财务维度。在Dynamics 365中,维度以动态方式存储(通常位于 “供应商关系复杂度视图”使用此属性查看哪些内部部门产生的应付账款业务量最大。 重要性 支持按组织层级下钻分析和责任归属分析。 获取途径 表:VendInvoiceJour,字段:DefaultDimension(需要使用DimensionAttributeLevelValue视图) 示例 IT财务运营 | |||
| 采购订单编号 PurchaseOrderNumber | 关联采购订单的编号。 | ||
| 说明 将发票与原始采购单据关联起来。在Dynamics 365中,对应 此属性可用于“采购订单匹配与差异趋势”仪表板,区分有采购订单支持的发票和无采购订单发票。 重要性 分析采购到付款匹配率的关键依据。 获取途径 表:VendInvoiceJour,字段:PurchId 示例 PO-000455000342PO-22-998 | |||
| 付款方式 PaymentMethod | 用于支付发票的方式,例如支票、电汇或电子资金转账。 | ||
| 说明 定义向供应商转账的方式。在Dynamics 365中,对应 “付款执行周期”仪表板使用此属性评估不同付款批次类型的效率。 重要性 说明付款执行阶段的差异。 获取途径 表:VendInvoiceJour(关联PaymMode信息)或VendTrans 示例 支票ACH电汇 | |||
| 付款条款 PaymentTerms | 表示约定付款条款的代码。 | ||
| 说明 用于设定到期日和折扣的配置代码,例如Net30。在Dynamics 365中,对应 结合“周期时间”分析,可判断流程延误是否违反约定条款。 重要性 为到期日计算提供背景信息。 获取途径 表:VendInvoiceJour,字段:PaymTermId 示例 Net302%10Net30COD | |||
| 凭证编号 VoucherNumber | 与该交易关联的总账凭证编号。 | ||
| 说明 会计分录在总账中的内部标识。在Dynamics 365中, 虽然这是技术字段,但在“流程路径与合规审计”中,可用于追溯总账分录并进行对账。 重要性 财务审计和对账的关键依据。 获取途径 表:VendInvoiceJour,字段:LedgerVoucher 示例 VOU-10023INV-ACC-992 | |||
| 币种 Currency | 发票的币种代码。 | ||
| 说明 开具发票所用币种的ISO代码。在Dynamics 365中,对应 如果需要统一多币种金额,此属性对于“活动金额”映射至关重要。 重要性 解读财务数值所需的背景信息。 获取途径 表:VendInvoiceJour,字段:CurrencyCode 示例 USDEURGBP | |||
| 是否冻结付款 IsPaymentBlocked | 标记发票当前是否被冻结付款。 | ||
| 说明 用于判断发票是否处于挂起状态的布尔标记。在Dynamics 365中,通常根据 这是“付款冻结与流程阻力分析”的核心依据,可显示流程中断情况。 重要性 识别即时阻力点和人工干预。 获取途径 表:VendTrans,字段:Approved(反向判断)或专用挂起字段 示例 truefalse | |||
| 现金折扣日期 CashDiscountDate | 为获得折扣而必须完成付款的日期。 | ||
| 说明 享受提前付款优惠的截止日期。在Dynamics 365中,对应 此属性用于“现金折扣获取表现”仪表板,帮助组织量化错失的节省机会。 重要性 直接影响流程的财务效率KPI。 获取途径 表:VendInvoiceJour或VendTrans,字段:CashDiscDate 示例 2023-10-102023-10-20 | |||
应付账款付款处理活动
| 活动 | 说明 | ||
|---|---|---|---|
| 付款已生成 | 系统生成付款文件(EFT、ISO20022)或打印支票。日记账明细行的付款状态更新为Sent或Generated。 | ||
| 重要性 用于支持“批准至执行延迟时间”KPI,确认付款指令已生成。 获取途径 LedgerJournalTrans.PaymentStatus变为Sent/Recieved,通常可根据明细行更新推断。 采集 比较PaymentStatus字段变更前后的值 事件类型 inferred | |||
| 付款已过账 | 付款日记账已过账至总账,完成发票结算并清除供应商余额,至此财务流程完成。 | ||
| 重要性 这是发票至付款平均周期时间的最后一项活动,确认现金减少的会计分录已完成。 获取途径 LedgerJournalTrans已过账,并更新VendTrans以显示结算情况。实际事件为日记账过账。 采集 交易X执行时记录 事件类型 explicit | |||
| 付款日记账已创建 | 发票已选中并添加到付款日记账明细行,表示计划付款,通常也会启动付款审核工作流。 | ||
| 重要性 标志着流程从负债处理转入现金支付处理,可用于衡量付款执行周期时间。 获取途径 LedgerJournalTrans.CreatedDateTime。发票通过MarkedInvoice字段或结算表关联。 采集 在LedgerJournalTrans中创建记录时记录 事件类型 explicit | |||
| 发票已与采购订单匹配 | 系统成功将发票明细与采购订单或产品收货记录关联。此活动表示发票已根据采购订单完成验证。 | ||
| 重要性 这是首次采购订单匹配率KPI的关键指标,可区分无人工干预处理的发票与需要人工介入的发票。 获取途径 VendInvoiceInfoLine.PurchId和VendInvoiceInfoTable.MatchStatus。MatchStatus变为Passed时可推断此事件。 采集 比较MatchStatus字段变更前后的值 事件类型 inferred | |||
| 发票已创建 | 系统中创建待处理供应商发票记录。此事件表示发票已进入Dynamics 365工作流,可能由人工创建,也可能通过数据实体导入。 | ||
| 重要性 用于确定流程周期时间的起点,帮助组织衡量发票在处理或过账前在系统中的停留时间。 获取途径 VendInvoiceInfoTable.CreatedDateTime或VendInvoiceInfoTable.RecId的创建时间戳,表示待处理供应商发票的表头记录。 采集 在VendInvoiceInfoTable中创建记录时记录 事件类型 explicit | |||
| 发票已批准 | 待处理发票的工作流实例已完成或达到已批准状态,发票现已可以过账至总账。 | ||
| 重要性 用于计算平均审批周期时间。此处的延误会直接影响争取提前付款折扣的机会。 获取途径 WorkflowTrackingStatusTable.CreatedDateTime,其中TrackingStatus为Completed。或者,VendInvoiceInfoTable.RequestStatus等于Approved。 采集 工作流实例完成时记录 事件类型 explicit | |||
| 发票已过账 | 发票已过账至总账,在系统中形成负债。记录从待处理表转入已过账交易表。 | ||
| 重要性 这是确认财务负债的重要节点。完成此活动后,发票即可纳入付款选择。 获取途径 在VendInvoiceJour和VendTrans中创建记录。TransDate表示过账日期。 采集 交易X执行时记录 事件类型 explicit | |||
| 付款日记账已批准 | 付款日记账工作流已获批准,可以生成付款。这是准备转账资金前的最后一项检查。 | ||
| 重要性 将付款的行政准备工作与授权环节的瓶颈区分开来。 获取途径 WorkflowTrackingStatusTable关联至LedgerJournalTable(表头)ID,状态为Completed。 采集 工作流实例完成时记录 事件类型 explicit | |||
| 发票匹配失败 | 匹配过程中发现发票与采购订单或收货记录不一致(价格或数量差异),通常需要解决问题后流程才能继续。 | ||
| 重要性 用于识别匹配流程中的具体阻碍因素,可支持采购订单匹配与差异趋势仪表板。 获取途径 VendInvoiceInfoTable.MatchStatus变为Failed或Discrepancy,也可通过VendInvoiceInfoLine中的匹配差异查看。 采集 比较MatchStatus字段变更前后的值 事件类型 inferred | |||
| 发票已提交审批 | 待处理发票已提交至工作流引擎审核,标志着流程从数据录入和匹配阶段转入授权阶段。 | ||
| 重要性 标记审批周期时间的起点,是分析内部审批层级效率的重要依据。 获取途径 WorkflowTrackingStatusTable.CreatedDateTime,其中ContextTableId等于VendInvoiceInfoTable ID,且Status为Submitted。 采集 工作流实例启动时记录 事件类型 explicit | |||
| 发票已更新 | 记录过账前对发票表头或明细所做的更改。频繁更新可能表明数据提取存在问题,或验证过程中需要人工更正。 | ||
| 重要性 更新频繁可能意味着返工循环,或源数据质量较差(例如OCR识别错误)。此事件可用于支持返工与数据准确性监控。 获取途径 如果已启用,可使用VendInvoiceInfoTable上的数据库日志(SysDatabaseLog);如果轮询频率较高,也可根据ModifiedDateTime的变化推断。 采集 比较后续提取数据中的ModifiedDateTime 事件类型 inferred | |||
| 已设置付款冻结 | 供应商交易被暂停,无法纳入付款建议。发生争议时通常会由人工设置冻结。 | ||
| 重要性 用于支持付款冻结与阻碍因素分析,揭示导致现金流出延迟的人工干预。 获取途径 VendTrans.Approved标志设为No,或特定的OnHold状态字段已填入数据。需要追踪VendTrans的更新。 采集 比较状态字段变更前后的值 事件类型 inferred | |||
数据提取指南
步骤
进入数据管理工作区:登录Microsoft Dynamics 365 Finance环境。前往“工作区”,选择“数据管理”。这里是配置数据导出项目的中心位置。
创建导出项目:点击“导出”磁贴,创建新的数据项目。为项目设置清晰的名称,例如ProcessMining_AP_Export。在“目标数据格式”字段中,选择目标格式(例如,用于BYOD的Azure SQL DB,或基于文件导出的CSV)。
添加数据实体:依次将以下标准数据实体添加到项目中:VendorInvoiceHeaderEntity(待处理发票)、VendorInvoiceLineEntity(发票行)、VendorInvoiceJournalHeaderEntity(已过账发票)、VendorPaymentJournalLineEntity(付款)和WorkflowHistoryEntity(审批日志)。如果默认情况下没有WorkflowHistoryEntity,您可能需要启用自定义实体或可供导出的特定系统实体。
配置实体筛选器:对每个实体,点击“筛选器”图标。应用筛选条件,将数据限定为相关的CompanyInfo(DataAreaId),并在CreatedDateTime或InvoiceDate字段中设置日期范围,仅提取所需分析期间的数据(例如,最近12个月)。
设置定期导出:为确保事件日志保持最新,请创建定期数据作业。设置执行频率(例如,每天或每小时),并在支持的情况下启用增量推送。这样只导出发生变化的记录,可减少系统负载。
执行首次导出:首次运行时,手动点击“立即导出”运行项目。查看“执行摘要”,确认所有记录均已成功导出且没有错误。
转换数据:数据导出到目标位置(Azure SQL或文件)后,使用“查询”部分提供的SQL脚本连接这些表。此转换逻辑会将分散的实体记录整理为单一的按时间排序的事件日志。
映射属性:根据流程挖掘工具的要求,确保将结果数据集中的InvoiceNumber映射到案例ID、EventTime映射到时间戳,并将Activity映射到活动名称。
验证并上传:运行下方列出的验证检查,确认数据准确无误。验证后,将最终结果导出为CSV或Parquet文件,并上传至ProcessMind。
配置
- 选择实体:过账前的流程步骤使用VendorInvoiceHeaderEntity和VendorInvoiceLineEntity。法定已过账单据使用VendorInvoiceJournalHeaderEntity。付款跟踪使用VendorPaymentJournalLineEntity。
- 增量推送:在数据管理项目中启用此设置,首次完整加载后仅导出新增或修改的记录。这对提升性能至关重要。
- 日期范围:按InvoiceDate >= [Start Date]筛选。避免不设范围地导出数据,以免超时。
- 公司筛选器:D365是多实体系统。除非要进行跨公司分析,否则请始终按DataAreaId筛选,以免混合不同法定实体的数据。
- 工作流历史记录:工作流历史记录的标准实体可能包含大量数据。请确保仅导出与VendInvoice类型相关的历史记录,以控制数据量。
查询示例 sql
/*
SQL Transformation Script for D365 Finance AP Process
Assumes data is loaded into Staging tables in a SQL environment (BYOD/Data Lake)
*/
SELECT
I.InvoiceNumber AS [InvoiceNumber],
'Invoice Created' AS [Activity],
I.CreatedDateTime AS [EventTime],
I.DataAreaId AS [CompanyCode],
I.InvoiceAccount AS [VendorAccount],
I.InvoiceAmount AS [InvoiceAmount],
I.CurrencyCode AS [Currency],
'D365 FO' AS [SourceSystem],
GETDATE() AS [LastDataUpdate]
FROM Staging_VendorInvoiceHeaderEntity I
UNION ALL
/* Capture updates to invoice headers */
SELECT
I.InvoiceNumber,
'Invoice Updated',
I.ModifiedDateTime,
I.DataAreaId,
I.InvoiceAccount,
I.InvoiceAmount,
I.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorInvoiceHeaderEntity I
WHERE I.ModifiedDateTime > I.CreatedDateTime
UNION ALL
/* Invoice Matching Activities */
SELECT
I.InvoiceNumber,
'Invoice Matched to PO',
I.ModifiedDateTime,
I.DataAreaId,
I.InvoiceAccount,
I.InvoiceAmount,
I.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorInvoiceHeaderEntity I
WHERE I.MatchStatus = 'Matched' -- Adjust value based on system config
UNION ALL
SELECT
I.InvoiceNumber,
'Invoice Match Failed',
I.ModifiedDateTime,
I.DataAreaId,
I.InvoiceAccount,
I.InvoiceAmount,
I.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorInvoiceHeaderEntity I
WHERE I.MatchStatus = 'Failed'
UNION ALL
/* Workflow Activities */
SELECT
RelatedContext AS InvoiceNumber,
CASE
WHEN Status = 'Submitted' THEN 'Invoice Submitted for Approval'
WHEN Status = 'Approved' THEN 'Invoice Approved'
ELSE 'Workflow Activity'
END AS [Activity],
CreatedDateTime AS [EventTime],
DataAreaId,
NULL AS [VendorAccount],
NULL AS [InvoiceAmount],
NULL AS [Currency],
'D365 FO',
GETDATE()
FROM Staging_WorkflowHistoryEntity
WHERE ContextTableId = 12345 -- Replace with TableId for VendInvoiceInfoTable
AND Status IN ('Submitted', 'Approved')
UNION ALL
/* Invoice Posted */
SELECT
J.InvoiceNumber,
'Invoice Posted',
J.PostedDateTime,
J.DataAreaId,
J.InvoiceAccount,
J.InvoiceAmount,
J.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorInvoiceJournalHeaderEntity J
UNION ALL
/* Payment Block */
SELECT
I.InvoiceNumber,
'Payment Block Applied',
I.ModifiedDateTime,
I.DataAreaId,
I.InvoiceAccount,
I.InvoiceAmount,
I.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorInvoiceJournalHeaderEntity I
WHERE I.OnHold = 'Yes'
UNION ALL
/* Payment Activities */
SELECT
J.InvoiceId AS [InvoiceNumber],
'Payment Journal Created' AS [Activity],
P.CreatedDateTime AS [EventTime],
P.DataAreaId,
P.AccountDisplayValue AS [VendorAccount],
P.DebitAmount AS [InvoiceAmount],
P.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorPaymentJournalLineEntity P
JOIN Staging_VendorInvoiceJournalHeaderEntity J ON P.InvoiceId = J.InvoiceNumber AND P.DataAreaId = J.DataAreaId
UNION ALL
SELECT
J.InvoiceId AS [InvoiceNumber],
'Payment Journal Approved' AS [Activity],
P.ModifiedDateTime AS [EventTime],
P.DataAreaId,
P.AccountDisplayValue,
P.DebitAmount,
P.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorPaymentJournalLineEntity P
JOIN Staging_VendorInvoiceJournalHeaderEntity J ON P.InvoiceId = J.InvoiceNumber AND P.DataAreaId = J.DataAreaId
WHERE P.PaymentStatus = 'Approved'
UNION ALL
SELECT
J.InvoiceId AS [InvoiceNumber],
'Payment Generated' AS [Activity],
P.ModifiedDateTime AS [EventTime],
P.DataAreaId,
P.AccountDisplayValue,
P.DebitAmount,
P.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorPaymentJournalLineEntity P
JOIN Staging_VendorInvoiceJournalHeaderEntity J ON P.InvoiceId = J.InvoiceNumber AND P.DataAreaId = J.DataAreaId
WHERE P.PaymentStatus = 'Sent'
UNION ALL
SELECT
J.InvoiceId AS [InvoiceNumber],
'Payment Posted' AS [Activity],
P.PostedDate AS [EventTime],
P.DataAreaId,
P.AccountDisplayValue,
P.DebitAmount,
P.CurrencyCode,
'D365 FO',
GETDATE()
FROM Staging_VendorPaymentJournalLineEntity P
JOIN Staging_VendorInvoiceJournalHeaderEntity J ON P.InvoiceId = J.InvoiceNumber AND P.DataAreaId = J.DataAreaId
WHERE P.IsPosted = 'Yes' 步骤
验证 BYOD 连接:确保已安装 SQL Server Management Studio(SSMS)或类似工具,并能连接到为 Dynamics 365 Finance & Operations 环境配置的 Azure SQL Database,即自带数据库(BYOD)目标数据库。
确认实体导出:在 Dynamics 365 中前往“数据管理”工作空间。确认以下实体(或其底层表)已配置为导出到 BYOD 数据库:
VendInvoiceInfoTable(待处理发票)、VendInvoiceInfoLine(待处理发票行)、VendInvoiceJour(已过账发票)、VendTrans(供应商交易)、LedgerJournalTrans(日记账行)、LedgerJournalTable(日记账表头)和WorkflowTrackingStatusTable(工作流历史记录)。配置导出作业:如果这些表尚未导出,请创建新的导出作业。将“目标数据格式”设为您的 BYOD SQL 数据库。选择“增量推送”,以保持数据同步,避免每次都完整重新导出。运行作业以填充这些表。
准备 SQL 环境:打开 SSMS 并连接到 BYOD Azure SQL 数据库。新建查询窗口。
设置参数:在下方提供的脚本中找到顶部的变量声明部分。将
@StartDate和@EndDate变量更新为您要分析的时间段。如需按特定法人实体筛选,请更新DATAAREAID筛选条件。运行脚本:运行完整的 T-SQL 脚本。脚本使用
UNION ALL将多个表中的数据合并为统一的事件日志格式。验证数据:检查
InvoiceNumber或EventTime列是否存在空值。确认已过账发票(来自VendInvoiceJour)和待处理发票(来自VendInvoiceInfoTable)均已显示。导出结果:在 SSMS 的结果网格中右键单击,选择“另存结果为...”。将文件保存为 CSV(逗号分隔)格式。
整理上传文件:在 Excel 或文本编辑器中打开 CSV,确认日期格式符合 ProcessMind 的要求(如有要求),并采用 ISO 8601 格式(YYYY-MM-DD HH:MM:SS)。如果脚本运行成功,无需进一步转换。
上传到 ProcessMind:将 CSV 文件导入 ProcessMind,并将
InvoiceNumber映射为案例ID、活动映射为活动名称、EventTime映射为时间戳。
配置
- 导出策略:对于
LedgerJournalTrans和VendTrans等大容量表,使用增量推送以降低BYOD负载。只有在怀疑数据不一致时才使用完整推送。 - 时区处理:Dynamics 365以UTC存储数据。脚本按UTC处理。如果分析需要本地时间,请在脚本中或ProcessMind导入时使用
DATEADD进行调整。 - 公司筛选:
DataAreaId列代表法定实体。脚本默认提取所有实体的数据。如需筛选特定子公司,可添加WHERE DataAreaId = 'usmf'(示例)。 - 工作流历史记录:
WorkflowTrackingStatusTable表对获取审批时间戳至关重要。请确保在BYOD导出配置中包含此表,因为它通常不会默认导出。 - 数据保留:请留意D365中的清理程序是否会删除已完成的工作流历史记录或已过账的日记账行,否则流程挖掘分析可覆盖的历史期间将受到限制。
查询示例 sql
/* T-SQL Extraction Script for D365 AP Payment Processing */
/* Tables required: VendInvoiceInfoTable, VendInvoiceInfoLine, VendInvoiceJour, VendTrans, LedgerJournalTrans, LedgerJournalTable, WorkflowTrackingStatusTable */
DECLARE @StartDate DATETIME = '2023-01-01 00:00:00';
DECLARE @EndDate DATETIME = GETDATE();
WITH RawData AS (
/* 1. Invoice Created: Pending Invoice Header Creation */
SELECT
T1.Num AS InvoiceNumber,
'Invoice Created' AS Activity,
T1.CreatedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
T1.InvoiceAccount AS VendorAccount,
T1.DataAreaId AS CompanyCode,
CAST(T1.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
T1.DueDate AS DueDate,
T1.PurchId AS PurchaseOrderNumber,
T1.CreatedBy AS UserId,
T1.VendorName AS VendorName,
T1.DocumentDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.VendInvoiceInfoTable T1
WHERE T1.CreatedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 2. Invoice Updated: Modifications to Pending Invoice */
SELECT
T1.Num AS InvoiceNumber,
'Invoice Updated' AS Activity,
T1.ModifiedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
T1.InvoiceAccount AS VendorAccount,
T1.DataAreaId AS CompanyCode,
CAST(T1.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
T1.DueDate AS DueDate,
T1.PurchId AS PurchaseOrderNumber,
T1.ModifiedBy AS UserId,
T1.VendorName AS VendorName,
T1.DocumentDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.VendInvoiceInfoTable T1
WHERE T1.ModifiedDateTime BETWEEN @StartDate AND @EndDate
AND T1.ModifiedDateTime > T1.CreatedDateTime
UNION ALL
/* 3. Invoice Matched to PO: Line Matching Success */
SELECT
H.Num AS InvoiceNumber,
'Invoice Matched to PO' AS Activity,
L.ModifiedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
H.InvoiceAccount AS VendorAccount,
H.DataAreaId AS CompanyCode,
CAST(H.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
H.DueDate AS DueDate,
H.PurchId AS PurchaseOrderNumber,
L.ModifiedBy AS UserId,
H.VendorName AS VendorName,
H.DocumentDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.VendInvoiceInfoLine L
JOIN dbo.VendInvoiceInfoTable H ON L.TableRefId = H.TableRefId AND L.DataAreaId = H.DataAreaId
WHERE L.MatchStatus = 1 /* 1 usually denotes Matched/Passed in enum */
AND L.ModifiedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 4. Invoice Match Failed: Line Matching Discrepancy */
SELECT
H.Num AS InvoiceNumber,
'Invoice Match Failed' AS Activity,
L.ModifiedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
H.InvoiceAccount AS VendorAccount,
H.DataAreaId AS CompanyCode,
CAST(H.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
H.DueDate AS DueDate,
H.PurchId AS PurchaseOrderNumber,
L.ModifiedBy AS UserId,
H.VendorName AS VendorName,
H.DocumentDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.VendInvoiceInfoLine L
JOIN dbo.VendInvoiceInfoTable H ON L.TableRefId = H.TableRefId AND L.DataAreaId = H.DataAreaId
WHERE L.MatchStatus = 2 /* 2 usually denotes Failed in enum */
AND L.ModifiedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 5. Invoice Submitted for Approval: Workflow Submission */
SELECT
T1.Num AS InvoiceNumber,
'Invoice Submitted for Approval' AS Activity,
W.CreatedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
T1.InvoiceAccount AS VendorAccount,
T1.DataAreaId AS CompanyCode,
CAST(T1.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
T1.DueDate AS DueDate,
T1.PurchId AS PurchaseOrderNumber,
W.User AS UserId,
T1.VendorName AS VendorName,
T1.DocumentDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.WorkflowTrackingStatusTable W
JOIN dbo.VendInvoiceInfoTable T1 ON W.ContextRecId = T1.RecId
WHERE W.TrackingStatus = 1 /* Submitted */
AND W.ContextTableId = 1425 /* TableId for VendInvoiceInfoTable, adjust if different in version */
AND W.CreatedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 6. Invoice Approved: Workflow Completion */
SELECT
T1.Num AS InvoiceNumber,
'Invoice Approved' AS Activity,
W.CreatedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
T1.InvoiceAccount AS VendorAccount,
T1.DataAreaId AS CompanyCode,
CAST(T1.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
T1.DueDate AS DueDate,
T1.PurchId AS PurchaseOrderNumber,
W.User AS UserId,
T1.VendorName AS VendorName,
T1.DocumentDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.WorkflowTrackingStatusTable W
JOIN dbo.VendInvoiceInfoTable T1 ON W.ContextRecId = T1.RecId
WHERE W.TrackingStatus = 2 /* Completed/Approved */
AND W.ContextTableId = 1425
AND W.CreatedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 7. Invoice Posted: Creation of VendInvoiceJour */
SELECT
J.InvoiceId AS InvoiceNumber,
'Invoice Posted' AS Activity,
J.CreatedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
J.InvoiceAccount AS VendorAccount,
J.DataAreaId AS CompanyCode,
CAST(J.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
J.DueDate AS DueDate,
J.PurchId AS PurchaseOrderNumber,
J.CreatedBy AS UserId,
J.InvoicingName AS VendorName,
J.InvoiceDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.VendInvoiceJour J
WHERE J.CreatedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 8. Payment Block Applied: Updated on VendTrans */
SELECT
J.InvoiceId AS InvoiceNumber,
'Payment Block Applied' AS Activity,
VT.ModifiedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
J.InvoiceAccount AS VendorAccount,
J.DataAreaId AS CompanyCode,
CAST(J.InvoiceAmount AS DECIMAL(18,2)) AS InvoiceAmount,
J.DueDate AS DueDate,
J.PurchId AS PurchaseOrderNumber,
VT.ModifiedBy AS UserId,
J.InvoicingName AS VendorName,
J.InvoiceDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.VendTrans VT
JOIN dbo.VendInvoiceJour J ON VT.Invoice = J.InvoiceId AND VT.AccountNum = J.InvoiceAccount AND VT.DataAreaId = J.DataAreaId
WHERE VT.Approved = 0 /* 0 indicates Not Approved/Blocked */
AND VT.ModifiedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 9. Payment Journal Created: Line added to Journal */
SELECT
LJT.Invoice AS InvoiceNumber,
'Payment Journal Created' AS Activity,
LJT.CreatedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
LJT.AccountNum AS VendorAccount,
LJT.DataAreaId AS CompanyCode,
CAST(LJT.AmountCurCredit AS DECIMAL(18,2)) AS InvoiceAmount,
NULL AS DueDate,
NULL AS PurchaseOrderNumber,
LJT.CreatedBy AS UserId,
NULL AS VendorName,
LJT.TransDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.LedgerJournalTrans LJT
WHERE LJT.AccountType = 2 /* Vendor */
AND LJT.Invoice IS NOT NULL AND LJT.Invoice <> ''
AND LJT.CreatedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 10. Payment Journal Approved: Workflow on Journal Header */
SELECT
LJT.Invoice AS InvoiceNumber,
'Payment Journal Approved' AS Activity,
LJH.ModifiedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
LJT.AccountNum AS VendorAccount,
LJT.DataAreaId AS CompanyCode,
CAST(LJT.AmountCurCredit AS DECIMAL(18,2)) AS InvoiceAmount,
NULL AS DueDate,
NULL AS PurchaseOrderNumber,
LJH.ModifiedBy AS UserId,
NULL AS VendorName,
LJT.TransDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.LedgerJournalTable LJH
JOIN dbo.LedgerJournalTrans LJT ON LJH.JournalNum = LJT.JournalNum AND LJH.DataAreaId = LJT.DataAreaId
WHERE LJH.WorkflowApprovalStatus = 2 /* Approved */
AND LJT.AccountType = 2
AND LJT.Invoice IS NOT NULL AND LJT.Invoice <> ''
AND LJH.ModifiedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 11. Payment Generated: Payment Status Changed to Sent */
SELECT
LJT.Invoice AS InvoiceNumber,
'Payment Generated' AS Activity,
LJT.ModifiedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
LJT.AccountNum AS VendorAccount,
LJT.DataAreaId AS CompanyCode,
CAST(LJT.AmountCurCredit AS DECIMAL(18,2)) AS InvoiceAmount,
NULL AS DueDate,
NULL AS PurchaseOrderNumber,
LJT.ModifiedBy AS UserId,
NULL AS VendorName,
LJT.TransDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.LedgerJournalTrans LJT
WHERE LJT.PaymentStatus = 2 /* Sent/Generated */
AND LJT.AccountType = 2
AND LJT.Invoice IS NOT NULL AND LJT.Invoice <> ''
AND LJT.ModifiedDateTime BETWEEN @StartDate AND @EndDate
UNION ALL
/* 12. Payment Posted: Journal Line Posted */
SELECT
LJT.Invoice AS InvoiceNumber,
'Payment Posted' AS Activity,
LJT.ModifiedDateTime AS EventTime,
'D365 FO' AS SourceSystem,
GETDATE() AS LastDataUpdate,
LJT.AccountNum AS VendorAccount,
LJT.DataAreaId AS CompanyCode,
CAST(LJT.AmountCurCredit AS DECIMAL(18,2)) AS InvoiceAmount,
NULL AS DueDate,
NULL AS PurchaseOrderNumber,
LJT.ModifiedBy AS UserId,
NULL AS VendorName,
LJT.TransDate AS InvoiceDate,
'Unknown' AS Department
FROM dbo.LedgerJournalTrans LJT
WHERE LJT.Posted = 1 /* Posted */
AND LJT.AccountType = 2
AND LJT.Invoice IS NOT NULL AND LJT.Invoice <> ''
AND LJT.ModifiedDateTime BETWEEN @StartDate AND @EndDate
)
SELECT *
FROM RawData
WHERE InvoiceNumber IS NOT NULL AND InvoiceNumber <> ''
ORDER BY InvoiceNumber, EventTime; 立即优化应付账款付款处理
将周期时间缩短30%,消除D365延迟。
无需信用卡,5分钟即可完成设置。