如何在PXProcessingJoin处理委托中获取多关联DAC字段?
问题描述
我开发了一个自定义处理屏幕,数据视图使用PXProcessingJoin关联多个DAC,代码如下:
public PXProcessingJoin<GLHistoryByPeriod, InnerJoin<Account, On<GLHistoryByPeriod.accountID, Equal<Account.accountID>>, InnerJoin<Sub, On<GLHistoryByPeriod.subID, Equal<Sub.subID>>, InnerJoin<Branch, On<GLHistoryByPeriod.branchID, Equal<Branch.branchID>>, LeftJoin<GLHistory, On<GLHistoryByPeriod.ledgerID, Equal<GLHistory.ledgerID>, And<GLHistoryByPeriod.accountID, Equal<GLHistory.accountID>, And<GLHistoryByPeriod.subID, Equal<GLHistory.subID>, And<GLHistoryByPeriod.finPeriodID, Equal<GLHistory.finPeriodID>, And<GLHistoryByPeriod.branchID, Equal<GLHistory.branchID>>>>>>, InnerJoin<MasterFinPeriod, On<GLHistoryByPeriod.finPeriodID, Equal<MasterFinPeriod.finPeriodID>>>>>>> Where<GLHistoryByPeriod.finPeriodID, Equal<Constants.finPeriod>, And<GLHistory.finYtdBalance, Equal<Constants.finYTDBalance>>>> FileData;
构造函数代码:
public BlackLineFileMaint() { FileData.SetProcessCaption("Process"); FileData.SetProcessVisible(true); FileData.SetProcessAllCaption("Process All"); FileData.SetProcessAllVisible(true); FileData.SetSelected<BlackLineFileData.selected>(); FileData.SetProcessDelegate(GenerateFiles); }
当前问题是,处理委托GenerateFiles中只能拿到GLHistoryByPeriod的记录,无法获取关联的Account、Sub、Branch等DAC的字段值:
public static void GenerateFiles(List<GLHistoryByPeriod> records) { //...业务代码 - 但需要GLHistoryByPeriod之外的其他DAC字段.. }
请问如何获取PXProcessingJoin查询中其他关联DAC的字段值?是否有其他方式创建委托以包含这些DAC?
解决方案
方法1:使用PXResult作为委托参数类型
直接修改处理委托的参数类型为List<PXResult<主DAC, 关联DAC1, 关联DAC2, ...>>,这样就能从每个PXResult实例中提取所有关联DAC的数据,无需额外查询。
修改示例:
public static void GenerateFiles(List<PXResult<GLHistoryByPeriod, Account, Sub, Branch, GLHistory, MasterFinPeriod>> records) { foreach (var result in records) { // 提取各DAC实例 GLHistoryByPeriod glHistory = result.GetItem<GLHistoryByPeriod>(); Account account = result.GetItem<Account>(); Sub sub = result.GetItem<Sub>(); Branch branch = result.GetItem<Branch>(); GLHistory glHistoryDetail = result.GetItem<GLHistory>(); MasterFinPeriod period = result.GetItem<MasterFinPeriod>(); // 直接使用各DAC的字段,例如: string accountCode = account?.AccountCD; string subCode = sub?.SubCD; // ...其他业务逻辑 } }
构造函数中的SetProcessDelegate调用无需修改,Acumatica会自动适配新的委托签名。
方法2:通过主键重新查询关联DAC
如果无法修改委托参数类型,可以利用GLHistoryByPeriod的主键字段,通过PXSelectReadonly查询对应关联DAC的数据。
示例代码:
public static void GenerateFiles(List<GLHistoryByPeriod> records) { foreach (GLHistoryByPeriod glHistory in records) { // 查询Account Account account = PXSelectReadonly<Account, Where<Account.accountID, Equal<Required<Account.accountID>>>> .Select(PXGraph.CreateInstance<BlackLineFileMaint>(), glHistory.AccountID); // 查询Sub Sub sub = PXSelectReadonly<Sub, Where<Sub.subID, Equal<Required<Sub.subID>>>> .Select(PXGraph.CreateInstance<BlackLineFileMaint>(), glHistory.SubID); // 同理查询Branch、GLHistory等关联DAC Branch branch = PXSelectReadonly<Branch, Where<Branch.branchID, Equal<Required<Branch.branchID>>>> .Select(PXGraph.CreateInstance<BlackLineFileMaint>(), glHistory.BranchID); // 使用查询到的字段进行业务处理 } }
两种方法对比:
- 方法1效率更高,直接复用原查询的结果集,避免额外数据库请求。
- 方法2适配性更强,适合无法调整委托签名的场景,但会增加数据库查询次数,性能略低。
内容的提问来源于stack exchange,提问作者pmfith
相关产品推荐
相关产品推荐

