如何在Acumatica中更新库存项目的FS制造商及型号信息
如何查找Acumatica中字段对应的Graph扩展并访问服务管理标签页的制造商字段
问题背景
在库存项目(IN202500)的「服务管理」标签页更新制造商及制造商型号信息时,确认这些字段属于Graph Extension,但Schema Browser仅显示字段存在于DLL中,未提供扩展类名称。核心需求:
- 定位字段所属的扩展类
- 枚举Graph Cache中所有已加载的扩展
无效代码示例
InventoryItem row = Base.ItemSettings.Current; // 无效:InventoryItemFSxEquipmentModel并非正确的扩展类名,无法确定实际名称 InventoryItemFSxEquipmentModel rowExt2 = PXCache<InventoryItem>.GetExtension<InventoryItemFSxEquipmentModel>(row); // 无效:目标字段不在基础InventoryItem模型中 throw new PXException(row.ManufacturerID.ToString());
解决方案
1. 定位字段对应的扩展类
- 数据库表查询:查询
CSAttribute表,通过目标字段(如ManufacturerID)的EntityType关联到ExtensionName;或直接查看InventoryItem相关的扩展表(通常命名带模块前缀,如FS模块的扩展表)。 - Runtime调试枚举:添加代码打印
InventoryItem缓存的所有扩展类型,查看Trace日志获取目标类名:
var cache = Base.ItemSettings.Cache; foreach (var ext in cache.GetExtensions<InventoryItem>()) { PXTrace.WriteInformation($"扩展类全称: {ext.GetType().FullName}"); }
- DLL反编译:针对Schema Browser显示的DLL(如
PX.FieldService.dll),用反编译工具打开,搜索InventoryItem的扩展类,筛选包含目标字段的类。
2. 枚举Graph Cache中所有扩展
使用GetExtensions<T>方法直接枚举指定缓存的所有扩展:
// 遍历InventoryItem缓存的所有扩展 foreach (var extension in Base.ItemSettings.Cache.GetExtensions<InventoryItem>()) { PXTrace.WriteInformation($"扩展类名: {extension.GetType().Name}, 命名空间: {extension.GetType().Namespace}"); }
3. 正确访问服务管理标签页字段
找到正确的扩展类后,通过GetExtension获取实例并操作字段:
InventoryItem row = Base.ItemSettings.Current; // 替换为实际找到的扩展类(示例为FS模块的扩展类) var fsExtension = PXCache<InventoryItem>.GetExtension<InventoryItemFSEquipmentExtension>(row); if (fsExtension != null) { // 读取或更新字段 var currentManufacturer = fsExtension.ManufacturerID; fsExtension.ManufacturerID = newManufacturerID; fsExtension.ModelNumber = newModelNumber; // 提交缓存更新 Base.ItemSettings.Cache.Update(row); }
内容的提问来源于stack exchange,提问作者T-Rav
相关产品推荐
相关产品推荐

