Acumatica中PXDataFieldAssign无法设置逻辑字段的问题排查
问题根源与修复方案
核心问题:无过滤条件的批量更新覆盖所有记录
你的PXDatabase.Update<Customer>调用未指定要更新的具体客户,导致每次执行Update时都会修改全部Customer记录的UsrCreditHoldActive字段。即便断点命中了设置flagTrue的代码,后续循环处理其他客户时(尤其是最后一个客户)的Update操作,会把所有记录的字段值覆盖为最后一次设置的flagFalse,最终所有记录都显示为0。
修复方案
方案1:给PXDatabase.Update添加过滤条件
修改Update语句,加入当前客户的过滤规则,确保只更新循环中的目标客户:
// 非余额限制规则场景 var rslt = PXDatabase.Update<Customer>( new PXDataFieldAssign("UsrCreditHoldActive", PXDbType.Bit, flagFalse), new PXDataFieldRestriction<Customer.bAccountID>(currentCustomer.BAccountID) ); // 余额超限场景 var rslt = PXDatabase.Update<Customer>( new PXDataFieldAssign("UsrCreditHoldActive", PXDbType.Bit, flagTrue), new PXDataFieldRestriction<Customer.bAccountID>(currentCustomer.BAccountID) ); // 余额未超限场景 var rslt = PXDatabase.Update<Customer>( new PXDataFieldAssign("UsrCreditHoldActive", PXDbType.Bit, flagFalse), new PXDataFieldRestriction<Customer.bAccountID>(currentCustomer.BAccountID) );
方案2:使用Acumatica缓存更新机制(更推荐)
遵循Acumatica标准数据操作逻辑,通过图的缓存修改单条记录,避免直接操作数据库:
using (PXTransactionScope CustomerTransactionScope = new PXTransactionScope()) { foreach (var record in records) { Customer currentCustomer = record as Customer; // 从缓存获取可更新的客户记录 Customer updCustomer = PXSelect<Customer, Where<Customer.bAccountID, Equal<Required<Customer.bAccountID>>>> .SelectForUpdate(onGraph, currentCustomer.BAccountID); if (updCustomer == null) continue; var custExt = updCustomer.GetExtension<ODCLEX.DAC.CustomerCHOLDExt>(); if (currentCustomer.CreditRule != "C") { custExt.UsrCreditHoldActive = false; } else { ARBalances balance = PXSelectReadonly<ARBalances, Where<ARBalances.customerID, Equal<Required<ARBalances.customerID>>>> .Select(onGraph, currentCustomer.BAccountID); custExt.UsrCreditHoldActive = balance != null && balance.CurrentBal >= currentCustomer.CreditLimit; } // 更新缓存并提交到数据库 onGraph.Update(updCustomer); } CustomerTransactionScope.Complete(); }
验证建议
可以在每次PXDatabase.Update后打印rslt的值,会发现返回值是所有客户的总数(而非1),这能直接确认之前的Update是批量修改了全部记录。
内容的提问来源于stack exchange,提问作者MarkJoel60
相关产品推荐
相关产品推荐

