D365 FO创建总账日记账

AX在D365 FO之前的版本创建总账日记账每个人都有自己的做法,最终的目的都是写入表LedgerJournalTable和LedgerJournalTrans,AX2012之前相对简单,AX2012的财务维度变得很复杂,处理起来相对麻烦一些,AX也尝试用Ax*类来处理与第三方系统的交互。
到了D365 FO引入了DataEntity的概念,具体DataEntity的概念和使用方法可以参见下文。
https://docs.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/data-entities/data-entities
按照文中的介绍,DataEntity主要用来做数据导入导出或者通过oData对外提供Restful接口,把D365 FO层次化的表结构变成扁平的Entity,以更自然的方式提供给用户,用DataEntity框架处理后台复杂的数据表关系。
既然外部可以用,内部调用应该更没问题了。

这里介绍一下如何通过LedgerJournalEntity创建日记账,代码如下:

 1 //Ledger           
 2             journalEntity.initValue();
 3             journalEntity.JournalBatchNumber = "CNMF-10002";
 4             journalEntity.JournalName = "Allocation";            
 5             journalEntity.TransDate = systemDateGet();            
 6             journalEntity.CurrencyCode = "CNY";
 7             journalEntity.AccountType = LedgerJournalACType::Ledger;
 8             journalEntity.AccountDisplayValue = "530198--001-1010-080";
 9             journalEntity.DebitAmount = 100;
10             journalEntity.Text = "Hello Text";
11             journalEntity.ChineseVoucherType = "Pay";            
12             journalEntity.LineNumber++;       
13             journalEntity.defaultRow();
14             journalEntity.insert();
15             
16             //Cust
17             journalEntity.initValue();
18             journalEntity.JournalBatchNumber = "CNMF-10002";
19             journalEntity.JournalName = "Allocation";
20             journalEntity.TransDate = systemDateGet();
21             journalEntity.CurrencyCode = "CNY";
22             journalEntity.AccountType = LedgerJournalACType::Cust;
23             journalEntity.AccountDisplayValue = strReplace("CNMF-000001", "-", "\-");
24             journalEntity.DefaultDimensionDisplayValue = "-001-1010-080";
25 ;           journalEntity.CreditAmount = 100;
26             journalEntity.Text = "Hello Text";
27             journalEntity.ChineseVoucherType = "Pay";            
28             journalEntity.LineNumber++;                       
29             journalEntity.defaultRow();
30             journalEntity.insert();

其他字段赋值都很简单,没什么好说的,主要说一下AccountDisplayValue和DefaultDimensionDisplayValue,在AX2012里创建过,特别是用代码创建过总账日记账的都很清楚,AX2012做账的时候其实分两大类
1.分类账类型
2.其他类型,其他类型包括客户,供应商,项目,固定资产和银行。
这两大类日记账,无论是界面操作还是代码创建都是截然不同的。
界面操作来说,分类账类型的日记账,是在一个输入框里输入科目和维度的,而其他类型,是先选客户,供应商,项目,固定资产和银行,再设置默认维度。

 其他类型的输入界面

对应数据库表的字段:
分类账类型的,会计科目和财务维度组成一个字段,写入LedgerDimension字段
其他类型的是把客户,供应商,项目,固定资产和银行主表里的记录对应的RecId写入LedgerDimension字段,财务维度的组合写入DefaultDimension字段。
了解了这个背景以后,就知道为什么Ledger的那一行只需要赋值AccountDisplayValue,而Cust那一行要赋值AccountDisplayValue字段和DefaultDimensionDisplayValue两个字段了。
接下来一个问题就是,AccountDisplayValue和DefaultDimensionDisplayValue的值是用-分割的,DataEntity框架怎么知道每个-对应的是什么维度?
这个需要在总账模块设置,路径:总账->会计科目表->维度->用于集成应用程序的财务维度配置

 其中默认维度格式对应DefaultDimension,分类账维度格式对应LedgerDimension,分类账维度格式必须选MainAccount。
对于第三方集成,以上两种维度格式只能分别生效一个,分别用于生成DefaultDimension和LedgerDimension。
所以这个维度格式要好好规划,要包含所有要用到的维度,要不然有些维度就导入不进来了。
给AccountDisplayValue和DefaultDimensionDefaultValue赋值的时候,一定要按照上面格式定义的顺序来,要不然会报错,或者导入的数值不对。
最后一个问题

journalEntity.AccountDisplayValue = strReplace("CNMF-000001", "-", "\-");

为什么要把-,加上一个转义符,因为 - 默认是维度段落的分隔符,而客户编码里包含了 - ,会导致框架在分析段落数的时候产生错误,所以要转义一下。
当然也可以用其他段落的分隔符,在总账参数里可以设置。

原文地址:https://www.cnblogs.com/Farseer1215/p/12810071.html