您的应付账款付款处理数据模板
您的应付账款付款处理数据模板
- 用于财务分析的流程专属属性
- 用于付款跟踪的关键活动里程碑
- 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 | 已发生的具体任务或状态变更。 | ||
| 说明 此属性描述流程中执行的事件或步骤,例如“Invoice Created”“Invoice Approved”或“Payment Posted”。它将技术交易类型和工作流状态变更转化为易读的业务事件。 在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关联),字段:Name 示例 Contoso Office SupplyFabrikam ElectronicsLitware Inc. | |||
| 供应商账户 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 示例 jdoeadminworkflow_sys | |||
| 部门 Department | 负责相关成本的部门。 | ||
| 说明 表示内部部门的财务维度。在Dynamics 365中,维度以动态方式存储,通常位于 此属性用于“供应商关系复杂度视图”,查看哪些内部部门产生的应付账款业务量最大。 为什么重要 支持按组织层级深入分析并明确责任。 获取位置 表:VendInvoiceJour,字段:DefaultDimension(需要使用DimensionAttributeLevelValue视图) 示例 IT部门财务部运营部 | |||
| 采购订单编号 PurchaseOrderNumber | 关联采购订单的参考编号。 | ||
| 说明 将发票与原始采购单据关联。在Dynamics 365中,该信息对应 此属性支持“采购订单匹配和差异趋势”仪表板,用于区分有采购订单支持的发票和无采购订单发票。 为什么重要 对于分析采购到付款的匹配率至关重要。 获取位置 表:VendInvoiceJour,字段:PurchId 示例 PO-000455000342PO-22-998 | |||
| 付款方式 PaymentMethod | 用于支付发票的方式,例如支票、电汇、EFT。 | ||
| 说明 定义向供应商转移资金的方式。在Dynamics 365中,该字段为 此属性用于“付款执行周期分析”仪表板,以评估不同付款批次类型的效率。 为什么重要 用于解释付款执行阶段的差异。 获取位置 表:VendInvoiceJour(与PaymMode信息关联)或VendTrans 示例 支票ACH电汇 | |||
| 付款条件 PaymentTerms | 表示约定付款条件的代码。 | ||
| 说明 规定到期日和折扣的配置代码,例如Net30。在Dynamics 365中,该字段为 结合“周期时间”进行分析,以判断流程延迟是否违反约定条件。 为什么重要 为到期日计算提供上下文。 获取位置 表:VendInvoiceJour,字段:PaymTermId 示例 Net302%10Net30COD | |||
| 凭证编号 VoucherNumber | 与交易关联的总账凭证编号。 | ||
| 说明 会计分录的内部总账标识符。在Dynamics 365中, 虽然属于技术字段,但可用于“流程路径与合规审计”,将分录追溯至GL以完成对账。 为什么重要 财务审计和对账的关键字段。 获取位置 表:VendInvoiceJour,字段:LedgerVoucher 示例 VOU-10023INV-ACC-992 | |||
| 币种 Currency | 发票的币种代码。 | ||
| 说明 开具发票所用币种的ISO代码。在Dynamics 365中,该字段为 如果需要进行多币种标准化,此字段对于“活动金额”映射中的金额统一至关重要。 为什么重要 解读财务数值所需的关键上下文。 获取位置 表:VendInvoiceJour,字段:CurrencyCode 示例 USDEURGBP | |||
| 是否冻结付款 IsPaymentBlocked | 指示发票当前是否被阻止付款的标志。 | ||
| 说明 用于标识发票是否处于挂起状态的布尔指标。在Dynamics 365中,通常根据VendTrans或VendInvoiceInfoTable中的 这是“付款冻结与流程阻滞分析”的核心驱动因素,可突出显示流程中断。 为什么重要 用于识别即时阻滞点和人工干预。 获取位置 表:VendTrans,字段:Approved(反向取值)或专用冻结字段 示例 truefalse | |||
| 现金折扣日期 CashDiscountDate | 为获得折扣而必须完成付款的日期。 | ||
| 说明 获取提前付款优惠的截止日期。在Dynamics 365中,该字段为 此属性用于“现金折扣获取绩效”仪表板,帮助组织量化错失的节省机会。 为什么重要 直接影响流程的财务效率KPI。 获取位置 表:VendInvoiceJour或VendTrans,字段:CashDiscDate 示例 2023-10-102023-10-20 | |||
应付账款付款处理活动
| 活动 | 说明 | ||
|---|---|---|---|
| 付款过账 | 付款日记账过账至总账,完成发票结算并清除供应商余额,财务流程至此完成。 | ||
| 为什么重要 这是平均发票到付款周期时间的最后一个活动,确认现金减少相关的会计分录已完成。 获取位置 LedgerJournalTrans已过账,VendTrans更新为已结算。实际事件是日记账过账。 采集 交易X执行时记录 事件类型 explicit | |||
| 创建付款日记账 | 发票被选中并添加至付款日记账行,表示付款意图,通常也会启动付款审核工作流。 | ||
| 为什么重要 标志着流程从负债处理转入现金支付处理,用于衡量付款执行周期时间。 获取位置 LedgerJournalTrans.CreatedDateTime。发票通过MarkedInvoice字段或结算表关联。 采集 在LedgerJournalTrans中创建记录时记录 事件类型 explicit | |||
| 发票与采购订单匹配 | 系统成功将发票行与Purchase Order或Product Receipt关联。此活动表示已根据采购订单完成发票验证。 | ||
| 为什么重要 这是一次采购订单匹配率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 | |||
| 生成付款 | 系统生成付款文件(EFT、ISO20022)或打印支票。日记账行上的付款状态更新为Sent或Generated。 | ||
| 为什么重要 支持审批到执行延迟时间KPI,确认付款指令已生成。 获取位置 LedgerJournalTrans.PaymentStatus变更为Sent或Recieved,通常根据该行的更新推断。 采集 比较前后PaymentStatus字段 事件类型 inferred | |||
| 付款日记账审批通过 | 付款日记账工作流获批,授权生成付款。这是准备资金转账前的最后检查。 | ||
| 为什么重要 将付款的行政准备阶段与授权瓶颈区分开来。 获取位置 关联LedgerJournalTable(抬头)ID的WorkflowTrackingStatusTable,Status为Completed。 采集 工作流实例完成时记录 事件类型 explicit | |||
| 发票匹配失败 | 匹配流程发现发票与PO或收货单之间存在差异,例如价格或数量差异。问题解决前,流程通常会因此暂停。 | ||
| 为什么重要 识别匹配流程中的具体摩擦点,为采购订单匹配和差异趋势仪表板提供支持。 获取位置 VendInvoiceInfoTable.MatchStatus变更为Failed或Discrepancy,也可在VendInvoiceInfoLine的匹配差异中查看。 采集 比较前后MatchStatus字段 事件类型 inferred | |||
| 发票提交审批 | 待处理发票提交至工作流引擎进行审核,标志着流程从数据录入或匹配阶段转入授权阶段。 | ||
| 为什么重要 标记审批周期时间的起点,是分析内部层级审批效率的基础。 获取位置 WorkflowTrackingStatusTable.CreatedDateTime,其中ContextTableId等于VendInvoiceInfoTableID,且Status为Submitted。 采集 工作流实例启动时记录 事件类型 explicit | |||
| 发票更新 | 记录过账前对发票抬头或行所做的变更。频繁更新可能表明数据提取问题,或验证过程中需要人工修正。 | ||
| 为什么重要 高频更新表明可能存在返工循环,或源数据质量较差,例如OCR错误。这为返工和数据准确性监控提供支持。 获取位置 如果已启用,则使用VendInvoiceInfoTable上的数据库日志(SysDatabaseLog);否则,在轮询频率较高时,根据ModifiedDateTime变更推断。 采集 比较后续提取中的ModifiedDateTime 事件类型 inferred | |||
| 应用付款冻结 | 对供应商交易设置冻结,使其无法被付款建议选中。争议发票通常会被人工冻结。 | ||
| 为什么重要 支持付款冻结和摩擦分析,揭示导致现金流出的人工干预。 获取位置 VendTrans.Approved标志设为No,或填充特定的OnHold状态字段。需要跟踪VendTrans的更新。 采集 比较前后状态字段 事件类型 inferred | |||
提取指南
步骤
访问数据管理工作区:登录Microsoft Dynamics 365 Finance环境。进入Workspaces并选择Data Management。这是配置数据导出项目的中心位置。
创建导出项目:点击Export磁贴创建新的数据项目。清晰命名项目,例如ProcessMining_AP_Export。在Target data format字段中选择目标格式,例如用于BYOD的Azure SQL DB或基于文件导出的CSV。
添加数据实体:依次将以下标准数据实体添加到项目中:VendorInvoiceHeaderEntity(待处理发票)、VendorInvoiceLineEntity(发票行)、VendorInvoiceJournalHeaderEntity(已过账发票)、VendorPaymentJournalLineEntity(付款)和WorkflowHistoryEntity(审批日志)。如果默认没有WorkflowHistoryEntity,您可能需要启用自定义实体或专用于导出的系统实体。
配置实体筛选器:对每个实体点击Filter图标。按相关CompanyInfo(DataAreaId)限制数据范围,并在CreatedDateTime或InvoiceDate字段上设置日期范围,仅提取所需分析期间的数据,例如最近12个月。
设置定期导出:为确保事件日志保持最新,创建定期数据作业。设置执行频率,例如每天或每小时,并在支持时启用Incremental push。这样只导出发生变化的记录,可降低系统负载。
执行初始导出:首次点击Export now手动运行项目。查看Execution summary,确保所有记录均已成功导出且没有错误。
转换数据:数据导出到目标位置(Azure SQL或文件)后,使用Query部分提供的SQL脚本连接这些表。该转换逻辑会将分散的实体记录转换为单一的按时间排序的事件日志。
映射属性:根据流程挖掘工具的要求,确保结果数据集将InvoiceNumber映射为Case ID,将EventTime映射为Timestamp,将Activity映射为Activity Name。
验证并上传:运行下方列出的验证检查,确认数据准确无误。验证完成后,将最终结果导出为CSV或Parquet文件,并上传到ProcessMind。
配置
- 实体选择:对于过账前的流程步骤,使用VendorInvoiceHeaderEntity和VendorInvoiceLineEntity。对于法定的已过账单据,使用VendorInvoiceJournalHeaderEntity。使用VendorPaymentJournalLineEntity跟踪付款。
- 增量推送:在Data Management项目中启用此设置,初始完整加载后仅导出新增或修改的记录。这对性能至关重要。
- 日期范围:按InvoiceDate >= [Start Date]筛选。避免无范围导出,以免作业超时。
- 公司筛选:D365是多实体系统。除非计划进行跨公司分析,否则始终按DataAreaId筛选,避免混合不同法定实体的数据。
- 工作流历史:工作流历史的标准实体可能数据量较大。请确保仅导出与VendInvoice类型相关的历史记录,以控制数据量。
a 示例查询 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,该数据库作为Bring Your Own 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,确认日期格式符合ISO 8601(YYYY-MM-DD HH:MM:SS),如ProcessMind有此要求。脚本成功运行后通常无需进一步转换。
上传到ProcessMind:将CSV文件导入ProcessMind,并将
InvoiceNumber映射为案例ID,将活动映射为活动名称,将EventTime映射为时间戳。
配置
- 导出策略:对
LedgerJournalTrans和VendTrans等大数据量表使用Incremental Push,尽量降低BYOD负载。只有怀疑数据不一致时才使用Full Push。 - 时区处理:Dynamics 365以UTC存储数据。脚本默认使用UTC。如果分析需要本地时间,请在脚本中或ProcessMind导入期间应用
DATEADD调整。 - 公司筛选:
DataAreaId列代表法定实体。脚本默认提取所有实体的数据。添加WHERE DataAreaId = 'usmf'(示例)即可筛选特定子公司。 - 工作流历史:
WorkflowTrackingStatusTable对审批时间戳至关重要。请确保在BYOD导出配置中包含此表,因为它通常默认不导出。 - 数据保留:请注意D365中的清理程序可能会删除已完成的工作流历史或已过账日记账行,这会限制流程挖掘分析的历史深度。
a 示例查询 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分钟完成设置。