D365 为采购订单中的供应商发票上的自定义字段设置默认值
链接由于类PurchFormletterParmDataInvoice.createInvoiceHeaderFromTempTable()调用 .skipEvents(true)、skipDataMethods(true)、.skipDatabaseLog(true) 并调用 Query::insert_recordset(),因此不会触发任何默认事件。
前言
由于类PurchFormletterParmDataInvoice.createInvoiceHeaderFromTempTable()调用 .skipEvents(true)、skipDataMethods(true)、.skipDatabaseLog(true) 并调用 Query::insert_recordset(),因此不会触发任何默认事件。
扩展
通过扩展和 CoC 完成。
[DataEventHandler(tableStr(VendInvoiceInfoTable), DataEventType::InitializingRecord)]
public static void VendInvoiceInfoTable_onInitializingRecord(Common sender, DataEventArgs e)
{
VendInvoiceInfoTable vendInvoiceInfoTable = sender as VendInvoiceInfoTable;
vendInvoiceInfoTable.CustomField =VendParameters::find().DefaultCustomField;
}
1.将自定义字段添加到 VendInvoiceInfoTable
2.将自定义字段添加到 VendInvoiceInfoTableTmp(名称和类型需要与在 VendInvoiceInfoTable 上创建的内容匹配)我们必须将其添加到此表中,因为在 PurchFormLetterParmDataInvoice.insertParmTable() 上,它调用了一个循环遍历字段列表的 buf2buf 命令。
3.创建表 VendInvoiceInfoTable 的扩展类并应用 defaultRow 方法的 CoC,该方法会将值填充到 VendInvoiceInfoTable 的常规实例和 tmp 实例中,但是除非完成其余步骤,否则它不会保存到数据库。
[ExtensionOf(tableStr(VendInvoiceInfoTable))]
final class APInvoiceModsVendInvoiceInfoTable_Extension
{
/// <summary>
/// COC table method defaultRow which resets default valies
/// </summary>
/// <param name = "_purchTable">PurchTable</param>
/// <param name = "_ledgerJournalTrans">LedgerJournalTrans</param>
/// <param name = "_resetFieldState">Reset field state</param>
public void defaultRow(PurchTable _purchTable, LedgerJournalTrans _ledgerJournalTrans, boolean _resetFieldState)
{
CustomEDTType defaultCustomField;
next defaultRow(_purchTable,_ledgerJournalTrans,_resetFieldState);
//find the default custom field from vend parms
defaultCustomField = VendParameters::find().DefaultCustomField;
//save the default invoice type to the header which will get copied to VendInvoiceInfoTableTmp and then back to the main table due to PurchFormLetterParmDataInvoice.createInvoiceHeaderFromTempTable
this.CustomField = defaultCustomField;
}
}
创建 PurchFormLletterParmDataInvoice 的扩展类,并将 CoC 应用于 buildCreateInvoiceHeaderFromTempTableFieldQuery 和 buildCreateInvoiceHeaderFromTempTableFieldMap,因为 PurchFormletterParmDataInvoice.createInvoiceHeaderFromTempTable() 方法创建了要从临时表复制到主表的字段的动态映射
final class APInvoiceModsPurchFormletterParmDataInvoice_Extension
{
/// <summary>
/// COC method that adds our custom field to the Field Query selection from the temp table
/// </summary>
/// <param name = "_qbdsVendInvoiceInfoTableTmp">VendInvoiceInfoTableTmp</param>
protected void buildCreateInvoiceHeaderFromTempTableFieldQuery(QueryBuildDataSource _qbdsVendInvoiceInfoTableTmp)
{
next buildCreateInvoiceHeaderFromTempTableFieldQuery(_qbdsVendInvoiceInfoTableTmp);
//add custom selection field
_qbdsVendInvoiceInfoTableTmp.addSelectionField(fieldNum(VendInvoiceInfoTableTmp, CustomField));
}
/// <summary>
/// COC method thats adds our custom field to the dynamic field map against the main table. Which will get copied from the selection query
/// </summary>
/// <param name = "_qbdsVendInvoiceInfoTableTmp">VendInvoiceInfoTableTmp</param>
/// <returns>Modified dynamic map to insert into the db</returns>
protected Map buildCreateInvoiceHeaderFromTempTableFieldMap(QueryBuildDataSource _qbdsVendInvoiceInfoTableTmp)
{
var targetToSourceMap = next buildCreateInvoiceHeaderFromTempTableFieldMap(_qbdsVendInvoiceInfoTableTmp);
targetToSourceMap.insert(fieldStr(VendInvoiceInfoTable, CustomField), [_qbdsVendInvoiceInfoTableTmp.uniqueId(), fieldStr(VendInvoiceInfoTableTmp, CustomField)]);
return targetToSourceMap;
}
}
更多推荐


所有评论(0)