如何通过代码调用文件同步操作(SM202530)?批量付款导出按钮重写实现文件版本同步的技术疑问
解决Acumatica批量付款导出后调用文件同步的Graph实例化问题
我明白你现在的需求:重写批量付款页面(AP305000)的导出按钮,在完成付款批文件导出后,自动触发文件同步页面(SM202530)的「处理所有文件」操作,但卡在了找不到对应Graph类名的环节。
首先要纠正一个关键错误:你代码里用的SynchronizationProcess并不是SM202530页面对应的Graph类,正确的类名是**SynchronizationMaint**。这是Acumatica官方定义的文件同步页面Graph,我帮你修正了代码,同时优化了操作调用的逻辑,让它更稳定可靠:
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using PX.Api; using PX.Data; using PX.Data.WorkflowAPI; using PX.Objects.AP; using PX.Objects.AR; using PX.Objects.CM; using PX.Objects.Common.Extensions; using PX.Objects.CR; using PX.Objects.CS; using PX.Objects.GL; using PX.Objects.AP.MigrationMode; using PX.Objects; using PX.Objects.CA; using PX.Objects.SM; namespace PX.Objects.CA { public class CABatchEntry_Extension : PXGraphExtension<CABatchEntry> { [PXOverride] public virtual IEnumerable Export(PXAdapter adapter) { // 先执行原生的导出逻辑,确保付款批文件正常生成 var exportResult = Base.export.Press(adapter); // 实例化文件同步页面的正确Graph SynchronizationMaint syncGraph = PXGraph.CreateInstance<SynchronizationMaint>(); // 直接调用「处理所有文件」对应的内部命令,避免依赖界面文本(更稳定) PXAdapter syncAdapter = new PXAdapter(syncGraph.Synchronization); syncAdapter.Menu = "processAll"; // 触发同步操作 syncGraph.action.PressButton(syncAdapter); // 等待长运行任务完成,避免后续逻辑提前执行 TimeSpan timespan; Exception ex; while (PXLongOperation.GetStatus(syncGraph.UID, out timespan, out ex) == PXLongRunStatus.InProcess) { // 加入短暂延迟,降低CPU占用 System.Threading.Thread.Sleep(500); } return exportResult; } internal class DummyView : PXView { List<object> _Records; internal DummyView(PXGraph graph, BqlCommand command, List<object> records) : base(graph, true, command) { _Records = records; } public override List<object> Select(object[] currents, object[] parameters, object[] searches, string[] sortcolumns, bool[] descendings, PXFilterRow[] filters, ref int startRow, int maximumRows, ref int totalRows) { return _Records; } } } }
几个重要的修正和优化点:
- Graph类名修正:替换
SynchronizationProcess为SynchronizationMaint,这是SM202530页面的官方绑定Graph,你可以在Acumatica的定制编辑器里验证:打开Site Map找到SM202530,查看其Graph属性即可确认。 - Action命令优化:直接使用内部命令
processAll,而不是遍历菜单查找显示文本"Process All Files"——这样可以避免多语言环境或界面文本更新导致的代码失效。 - CPU占用优化:在等待长运行任务的循环中加入
Thread.Sleep(500),避免程序一直空循环占用过高CPU。
如果之后你需要查找其他页面的Graph类名,最可靠的方式就是通过Acumatica的Customization Project Editor:
- 打开定制项目编辑器
- 左侧导航到「Site Map」,找到目标页面
- 查看页面属性里的「Graph」字段,就能得到完整的类名
内容的提问来源于stack exchange,提问作者Customizer
相关产品推荐
相关产品推荐

