You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过代码调用文件同步操作(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:

  1. 打开定制项目编辑器
  2. 左侧导航到「Site Map」,找到目标页面
  3. 查看页面属性里的「Graph」字段,就能得到完整的类名

内容的提问来源于stack exchange,提问作者Customizer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 23:02:32