使用X++实现标准保存按钮 自动保存日记账释放编号规则凭证号
以下是适用于Dynamics 365 Finance / Dynamics AX 平台的两种可落地代码方案:
方案1:复用标准日记账保存逻辑(推荐)
该方案直接调用系统原生的日记账持久化能力,会自动触发编号序列的占用移除逻辑,同时不会跳过标准字段校验、关联子表校验等规则,兼容性最高。
public void runAutoSaveLogic(LedgerJournalId _journalNum) { LedgerJournalTable ledgerJournalTable; LedgerJournalCheckPost journalCheckPost; ; ttsbegin; // 获取待操作的日记账记录 ledgerJournalTable = LedgerJournalTable::find(_journalNum, true); // 先执行校验逻辑,校验通过再更新 if (ledgerJournalTable.validateWrite()) { ledgerJournalTable.update(); } // 触发标准保存逻辑,自动完成编号序列的状态更新 journalCheckPost = LedgerJournalCheckPost::newLedgerJournalTable(ledgerJournalTable, NoYes::Yes); journalCheckPost.runSave(); ttscommit; }
注:如果不需要触发过账相关逻辑,仅调用
runSave()即可,无需调用run()方法执行过账操作。
方案2:自定义绑定表单场景简化方案
如果你的自定义按钮是挂载在日记账标准表单/自定义绑定表单上,可直接调用数据源的原生保存方法,代码更精简:
[FormControlEventHandler(formControlStr(LedgerJournalTable, YourCustomButton), FormControlEventType::Clicked)] public static void YourCustomButton_OnClicked(FormControl sender, FormControlEventArgs e) { FormDataSource ledgerJournalDS = sender.formRun().dataSource(tableStr(LedgerJournalTable)); // 执行数据源校验+写入,自动同步到数据库,触发编号序列规则 if (ledgerJournalDS.validateWrite()) { ledgerJournalDS.write(); ledgerJournalDS.refresh(); } // 此处添加你的其他自定义业务逻辑 }
通用注意事项
- 两种方案执行前都需要保证日记账的所有必填字段已经填充完成,否则
validateWrite()会返回false阻止保存,符合标准业务校验规则 - 若你的自定义逻辑中提前预留了凭证号,保存时系统会自动完成编号的确认,不会出现编号重复占用、断号的问题
内容的提问来源于stack exchange,提问作者Raynon
相关产品推荐
相关产品推荐

