多租户环境下自定义Selector字段部分租户保存报错问题
问题分析与解决方案
可能原因
- 多租户元数据同步不完整:尽管通过「发布至多租户」操作同步了定制,但租户2的系统元数据表(如
CSysColumn、CSysTable)未正确添加POOrder.CustomField的字段定义,导致保存时系统无法识别该字段。 - 自定义常量类的多租户上下文隐患:代码中
customfieldItemClassIdConstant类的FindCustomFieldItemClassID方法使用new PXGraph()查询物料分类,在多租户环境下存在上下文切换风险,但此点与你描述的「租户2选择器能正确显示对应物料」矛盾,优先级低于元数据问题。
解决方案
方案1:重新同步元数据到租户2
- 进入Acumatica定制发布界面,重新选择租户2执行发布操作,确保发布过程无报错。
- 发布完成后,检查租户2的
CSysColumn表,确认存在POOrder对应的CustomField字段记录。
方案2:优化DAC扩展代码,规避常量类风险
原代码中自定义常量类的实现存在多租户环境下的潜在问题,建议直接在BQL中关联物料分类编码,避免依赖静态常量:
public class POOrderExt : PXCacheExtension<PX.Objects.PO.POOrder> { #region CustomField [PXDBString(50)] [PXUIField(DisplayName="Custom Field")] [PXSelector( typeof(Search<IN.InventoryItem.inventoryCD, Where<IN.InventoryItem.itemClassID, Equal<INItemClass.itemClassID, Where<INItemClass.itemClassCD, Equal<Constant<string, "CUSTOMCLASS">>>>>), typeof(IN.InventoryItem.inventoryCD), typeof(IN.InventoryItem.descr), DescriptionField = typeof(IN.InventoryItem.descr))] public string CustomField { get; set; } public abstract class customField : IBqlField { } #endregion }
方案3:手动修复数据库字段(仅元数据同步失败时使用)
若重新发布后问题仍存在,可手动检查租户2的POOrder表:
- 若不存在
CustomField列,执行SQL语句添加:ALTER TABLE POOrder ADD CustomField VARCHAR(50); - 执行完成后重启Acumatica应用池,确保系统识别新字段。
内容的提问来源于stack exchange,提问作者Graeme LM
相关产品推荐
相关产品推荐

