Acumatica 安排一个动作

Acumatica scheduling an action

我正在尝试创建一个例程,将订单从我们的 EDI 服务导入到 Acumatica。我创建了骨架动作:

public PXAction<EDOrderReviewFilter> GetOrders;
    [PXProcessButton()]
    [PXUIField(DisplayName = "Get Orders")]
    protected virtual void getOrders()
    {
        EDOrderReview graph = PXGraph.CreateInstance<EDOrderReview>();
        graph.Filter.Current.ReviewType = "A";
        throw new PXRedirectRequiredException(graph, false, "Review");
    }

我可以完成检索订单和插入销售订单的代码,但我无法安排它。订单审查图表显示不会包含在自动检索中。该计划似乎只允许安排 Process All,即使文档说它应该是图中操作的选择列表。谁能帮忙?有没有更好的方法来安排订单检索?目前的想法是每15分钟检查一次并导入所有新订单。

=============新信息============================ ==============

我现在无法让调用图在检索订单时显示旋转计时器。在下面的代码中,EDGetOrders.cs 是仅检索订单的新处理页面。这最终将被隐藏和安排。 EDOrderReview.cs 是允许查看和调整导入订单的原始图表,我希望有一个按钮可以启动订单检索并显示一些反馈,该过程是 运行,然后显示一些指示它完成了。使用 PressButton 方法同步处理检索,然后通过最后三行刷新屏幕。 LongOperation 方法异步启动进程并立即重绘屏幕。我是否正确使用了 LongOperation?

// EDGetOrders.cs  Separate graph to simply retrieve the orders
    // Action to retrieve orders
    public PXAction<EDGetOrderFilter> GetOrders;
    [PXProcessButton()]
    [PXUIField(DisplayName = "")]
    protected virtual void getOrders()
    {
        getEDIOrders();
    }
    // This function performs all the work and works fine
    public void getEDIOrders()
    {
        ...
    }
    // This function is called on Process All and works fine and shows the spinning timer
    public void ProcessOrder(List<EDIGetOrder> list, string type)
    {
        SOOrderEntry soOrderGraph = PXGraph.CreateInstance<SOOrderEntry>();
        bool errorOccured = false;
        string statusText = "";
        foreach (EDIGetOrder ediOrder in list)
        {
            PXProcessing<EDIGetOrder>.SetCurrentItem(ediOrder);
            getOrders();
            statusText = "Orders Retrieved";
        }
        if (errorOccured)
            throw new PXOperationCompletedWithErrorException(statusText);
        else
            throw new PXOperationCompletedException(statusText);

}

//EDOrderReview.cs Original graph I want to call getOrders from and show the spinning timer
    //Action to create button
    public PXAction<EDOrderReviewFilter> GetOrders;
    [PXProcessButton()]
    [PXUIField(DisplayName = "Get Orders")]
    protected virtual void getOrders()
    {
        EDGetOrders getOrders = PXGraph.CreateInstance<EDGetOrders>();
        //getOrders.GetOrders.PressButton();
        PXLongOperation.StartOperation(this, delegate () { goGetOrders(); });
        //Redraw the screen with the new orders
        EDOrderReview graph = PXGraph.CreateInstance<EDOrderReview>();
        graph.Filter.Current.ReviewType = "A";
        throw new PXRedirectRequiredException(graph, false, "Review");
    }

    public static void goGetOrders()
    {
        EDGetOrders getOrders = PXGraph.CreateInstance<EDGetOrders>();
        getOrders.getEDIOrders();
    }

遗憾的是,当前文档与“自动化计划”屏幕的实际行为不符。实际上,Action Name 字段始终处于禁用状态,只能显示 Process All 选项。希望这能解释为什么无法从您当前的处理页面安排订单检索。

另一种解决方案是创建一个独立的处理屏幕,仅用于从外部 EDI 服务检索订单,您可以安排 运行 每 15 分钟处理一次所有操作。您可以通过将其放置在 SiteMap 的隐藏文件夹中来向用户隐藏这个新的处理屏幕。

当然,您仍然可以将“获取订单”按钮保留在当前处理屏幕上,并且,如果您实现从外部 EDI 服务检索订单的静态方法,则应该可以从您的两个调用相同的方法当前和新的处理屏幕。

更新以回答新信息部分:

您应该抛出 PXRedirectRequiredException 以显示 EDOrderReview GetEDIOrders 操作结束后:

public PXAction<EDOrderReviewFilter> GetOrders;
[PXProcessButton()]
[PXUIField(DisplayName = "Get Orders")]
protected virtual void getOrders()
{
    EDGetOrders getOrders = PXGraph.CreateInstance<EDGetOrders>();
    //getOrders.GetOrders.PressButton();
    PXLongOperation.StartOperation(this, delegate () 
    { 
        goGetOrders(); 

        //Redraw the screen with the new orders
        EDOrderReview graph = PXGraph.CreateInstance<EDOrderReview>();
        graph.Filter.Current.ReviewType = "A";
        throw new PXRedirectRequiredException(graph, false, "Review");
    });
}

public static void goGetOrders()
{
    EDGetOrders getOrders = PXGraph.CreateInstance<EDGetOrders>();
    getOrders.getEDIOrders();
}