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