“运行项目结算”屏幕上的拦截流程

时间:2017-02-08 22:06:36

标签: acumatica

我们正在使用“运行项目结算”屏幕在AR /发票和备忘录中创建记录。

发票&备忘录屏幕,我们需要填充标题Customer Ord的过程。 number,以及已添加到'文档详细信息'文档详细信息中的网格部分的用户字段。标签。目前,这个过程并没有这样做。

我希望使用我熟悉的技术拦截屏幕上的处理操作,即使用' AddHandler':

[PXOverride]
protected virtual IEnumerable Items (PXAdapter adapter)
{
   PXGraph.InstanceCreated.AddHandler<BillingProcess>((graph) =>
   {
       graph.RowInserting.AddHandler<BillingProcess.ProjectsList>((sender, e) =>
       {

           //Custom logic goes here

       });
   });
   return Base.action.Press(adapter);
}

我认为没有Base.Actions远远类似于比尔&#39;或者&#39; Bill All&#39;。

这显然不是我需要的代码,但我认为这是一般的起点。

在审核了源业务逻辑后,我没有看到任何&#39; Bill&#39;或者&#39; Bill All&#39;行动 - 或任何行动&#39;一点儿(莫名其妙)。我看到一个名为&#39; items&#39;的IEnumerable方法,这就是我上面开始的内容。

这是正确的方法吗?

更新:2017年2月14日

使用提供的答案re:重写的方法InsertTransaction(...)我尝试使用以下逻辑设置我们的ARTran用户字段(这是必需的):

        PMProject pmproj = PXSelect<PMProject, Where<PMProject.contractID, Equal<Required<PMProject.contractID>>>>.Select(Base, tran.ProjectID);
        if (pmproj == null) return;

        PMProjectExt pmprojext = PXCache<PMProject>.GetExtension<PMProjectExt>(pmproj);
        if (pmprojext == null) return;

        ARTranExt tranext = PXCache<ARTran>.GetExtension<ARTranExt>(tran);
        if (tranext == null) return;

        tranext.UsrContractID = pmprojext.UsrContractID;

即使这会将用户字段设置为正确的值,但仍会在进程完成时向我提供必填字段为空的错误。我有限的知识使我无法理解为什么。

1 个答案:

答案 0 :(得分:0)

在“运行项目结算”屏幕上,处理处理所有按钮的标题已更改为帐单全部帐单分别在BLC构造函数中。 在BillingFilter_RowSelected处理程序中为 Items 数据视图设置了进程委托:

public class BillingProcess : PXGraph<BillingProcess>
{
    ...

    public BillingProcess()
    {
        Items.SetProcessCaption(PM.Messages.ProcBill);
        Items.SetProcessAllCaption(PM.Messages.ProcBillAll);
    }

    ...

    protected virtual void BillingFilter_RowSelected(PXCache cache, PXRowSelectedEventArgs e)
    {
        BillingFilter filter = Filter.Current;

        Items.SetProcessDelegate<PMBillEngine>(
            delegate (PMBillEngine engine, ProjectsList item)
            {
                if (!engine.Bill(item.ProjectID, filter.InvoiceDate, filter.InvFinPeriodID))
                {
                    throw new PXSetPropertyException(Warnings.NothingToBill, PXErrorLevel.RowWarning);
                }
            });
    }

    ...
}

如上面的代码段所示, AR Invoice and Memos 屏幕中的所有记录都是由PMBillEngine类的实例创建的。以下是显示如何在PMBillEngine BLC扩展程序中覆盖InsertNewInvoiceDocumentInsertTransaction方法的代码段:

public class PMBillEngineExt : PXGraphExtension<PMBillEngine>
{
    public delegate ARInvoice InsertNewInvoiceDocumentDel(string finPeriod, string docType, Customer customer,
        PMProject project, DateTime billingDate, string docDesc);

    [PXOverride]
    public ARInvoice InsertNewInvoiceDocument(string finPeriod, string docType, Customer customer, PMProject project,
        DateTime billingDate, string docDesc, InsertNewInvoiceDocumentDel del)
    {
        var result = del(finPeriod, docType, customer, project, billingDate, docDesc);
        // custom logic goes here
        return result;
    }

    [PXOverride]
    public void InsertTransaction(ARTran tran, string subCD, string note, Guid[] files)
    {
        // the system will automatically invoke base method prior to the customized one
        // custom logic goes here
    }
}

运行项目结算流程调用InsertNewInvoiceDocument方法在 AR发票和备忘录屏幕上创建新记录,并使用InsertTransaction方法添加新发票事务。

需要提及的一件重要事情:当用户启动“运行项目结算”操作时,将调用 重写的InsertNewInvoiceDocumentInsertTransaction方法处理运行项目结算屏幕或从数据条目项目屏幕。

有关如何覆盖虚拟BLC方法的详细信息,请参阅帮助 - &gt; 自定义 - &gt; 自定义业务逻辑 - &gt; 图表 - &gt;每个Acumatica ERP 6.1网站都提供覆盖虚拟方法