Acumatica卸载自定义包时执行代码的事件或方法咨询
在Acumatica中实现包卸载时触发工作区更新的方案
方法1:使用PackageUninstalling事件
Acumatica包管理系统提供了PackageUninstalling事件,可在自定义包的Package类中重写对应方法触发工作区更新逻辑:
- 打开自定义包的
Package类(通常为[你的包名].cs文件) - 重写
OnPackageUninstalling方法,嵌入你的工作区更新代码:
public override void OnPackageUninstalling(PackageUninstallingEventArgs e) { base.OnPackageUninstalling(e); // 调用你已有的工作区更新代码 RestoreScreensToOriginalWorkspaces(); }
该方法会在包卸载流程启动时触发,确保工作区调整逻辑在包卸载完成前执行。
方法2:利用PackageUninstalled事件(卸载完成后触发)
若需等包完全卸载后再调整工作区,可重写OnPackageUninstalled方法:
public override void OnPackageUninstalled(PackageUninstalledEventArgs e) { base.OnPackageUninstalled(e); // 调用工作区更新代码 RestoreScreensToOriginalWorkspaces(); }
这个时机适合需要确认包内所有组件已移除后再恢复工作区的场景。
关键注意事项
- 确保你的工作区更新代码能准确识别原本被移至自定义工作区的屏幕,将它们恢复到系统默认的对应工作区(例如把销售类屏幕放回"Sales Order Processing"工作区)
- 修改工作区时需使用Acumatica官方API,避免直接操作数据库导致数据不一致,示例代码如下:
private void RestoreScreensToOriginalWorkspaces() { using (var graph = PXGraph.CreateInstance<SiteMapMaint>()) { // 示例:将销售订单屏幕恢复到Sales工作区 var screen = graph.SiteMap.Search<SiteMap.screenID>("SO301000"); if (screen != null) { screen.WorkspaceID = "SO"; // 对应Sales工作区的系统ID graph.SiteMap.Update(screen); graph.Actions.PressSave(); } // 重复上述逻辑处理其他需要恢复的屏幕 } }
- 测试时需先在Acumatica开发环境打包,再卸载包,验证工作区是否正确恢复。
内容的提问来源于stack exchange,提问作者Bajrang Patidar
相关产品推荐
相关产品推荐

