Acumatica:自动化定制屏幕供应商字段时出错
解决从SO30300触发自动化时获取Bills and Adjustments供应商字段的报错问题
我之前也碰到过类似的上下文权限问题,结合你的描述——只有从发票界面(SO30300)触发操作时才会抛出“Vendor cannot be found in the system...”的错误,大概率是权限上下文、数据源引用或者界面会话冲突导致的,给你几个具体的排查和解决方向:
1. 确认权限的上下文一致性
当你从SO30300触发自动化时,系统默认会沿用当前发票界面的会话权限,而不是自动切换到Bills and Adjustments模块的权限。你需要:
- 检查执行自动化的用户,是否同时拥有**SO30300(发票管理)和AP301000(账单与调整)**的模块访问权限,特别是供应商记录的
查看权限(比如角色里要包含AP Vendor Inquiry权限)。 - 如果是用自定义角色,确保角色权限里没有遗漏AP供应商的访问权限,有时候单独给了发票权限,但忘了关联AP模块的权限。
2. 检查供应商字段的引用逻辑
很多时候自动化脚本里的字段引用在不同界面上下文下会失效:
- 别直接引用界面控件的ID,要通过DAC(数据访问类)来获取,比如用
APInvoice.VendorID这种方式,而不是硬编码界面上的控件名称。 - 如果是自定义屏幕,确认数据源绑定的是
APInvoice的完整数据集,而不是依赖SO30300里的临时关联数据——毕竟发票界面的供应商数据和账单模块的可能不是同一个数据源。
3. 排查触发时的数据源传递问题
从SO30300触发时,可能没有正确传递或加载对应的账单数据:
- 在自动化操作的开头,显式用PX查询加载对应的AP账单记录,比如:
确保能获取到完整的供应商关联信息,而不是依赖界面的临时数据。var apInvoice = PXSelect<APInvoice, Where<APInvoice.refNbr, Equal<Current<SOOrder.refNbr>>>>.Select(Base); - 检查传递的关联参数(比如发票对应的账单编号)是否正确,有没有出现参数为空或者匹配错误的情况——如果参数错了,自然找不到对应的供应商。
4. 避免界面会话的上下文冲突
有时候SO30300的图表上下文会影响AP模块的数据加载:
- 在自动化代码里,创建独立的AP图表实例,而不是复用当前SO界面的上下文,比如:
这样能确保用AP模块的独立会话来获取数据,避免权限或缓存冲突。var apGraph = PXGraph.CreateInstance<APInvoiceEntry>(); var apDoc = apGraph.Document.Search<APInvoice.refNbr>(yourRefNbr); - 尝试在操作前清除会话缓存,比如调用
PXCache<APInvoice>.Clear(),有时候缓存的旧数据会导致权限判断异常。
5. 做个简单的权限验证测试
快速定位问题的方法:
- 用同一个用户直接打开AP301000界面,找到对应的账单,查看供应商字段是否能正常显示。如果直接访问没问题,那肯定是自动化操作的上下文权限问题。
- 在自动化代码里加个权限检查的逻辑,提前捕获问题:
if (!PXAccess.HasPermission(typeof(APVendor), PXAccessRights.Select)) { throw new PXException("当前用户没有供应商访问权限"); }
内容的提问来源于stack exchange,提问作者joemar villaluna
相关产品推荐
相关产品推荐

