【问题标题】:Issues While Adding a DAC and its New Extension to Graph将 DAC 及其新扩展添加到图形时的问题
【发布时间】:2017-10-25 06:24:51
【问题描述】:

我正在尝试将 Contract DAC 及其新扩展添加到我的 APInvoiceEntry Graph 扩展中,以便进行一些验证,但我确实做错了,但我不知道我到底在搞什么up,也许是合约 DAC 的初始化以及评估逻辑?它正在尝试将某些合同逻辑转换为 APTran,并发送“无法转换”错误。

最终目标是查看账单和付款每一行中选定的项目和分支,并根据项目 ID 和在 ContractExt DAC 扩展中创建的新 BranchID 字段对其进行评估。

我得到的当前错误的跟踪是:

Unable to cast object of type 'PX.Objects.AP.APTran' to type 'PX.Objects.CT.Contract'. 

at PX.Objects.AP.APInvoiceEntry_Extension.APTran_RowUpdating(PXCache cache, PXRowUpdatingEventArgs e, PXRowUpdating InvokeBaseHandler) 
at PX.Data.PXCache.OnRowUpdating(Object item, Object newitem, Boolean externalCall) 
at PX.Data.PXCache`1.Update(IDictionary keys, IDictionary values) 
at PX.Data.PXGraph.ExecuteUpdate(String viewName, IDictionary keys, IDictionary values, Object[] parameters) 

这让我相信我可能没有正确引入合同 DAC。

代码如下:

图表:

namespace PX.Objects.AP
{
public class APInvoiceEntry_Extension : PXGraphExtension<APInvoiceEntry>
{
    public PXSelect<Contract, Where<Contract.contractID, Equal<Current<APTran.projectID>>>> Contract;
    protected void APTran_RowUpdating(PXCache cache, PXRowUpdatingEventArgs e, PXRowUpdating InvokeBaseHandler)
    {
        Contract conRow = (Contract)e.NewRow as Contract;
        ContractExt conRowE = PXCache<Contract>.GetExtension<ContractExt>(conRow);
        APTran row = e.NewRow as APTran;
        int? projectid = conRow.ContractID;
        int? baseprojectid = row.ProjectID;
        int? basebranchid = row.BranchID;
        int? branchid = conRowE.UsrBranch;
        if (
            //Check to make sure that selected Branch and Project match
            baseprojectid == projectid &&
            basebranchid != branchid
            )
        {
            throw new PXSetPropertyException("Branch and  project must match", PXErrorLevel.RowError);
        }
    }
}
}

DAC:

namespace PX.Objects.CT
{
public class ContractExt : PXCacheExtension<PX.Objects.CT.Contract>
{
    [Branch]
    public virtual int? UsrBranch { get; set; }
    public abstract class usrBranch : IBqlField { }
}}

这一切都正确编译。如您所料,错误会弹出,如下所示: APTran Unable to Cast Error

【问题讨论】:

    标签: acumatica


    【解决方案1】:

    您在使用(Contract)e.NewRow 时尝试将APTran 行转换为Contract,这就是您遇到错误的原因。如下所示进行选择应该可以满足您的需求。

    public class APInvoiceEntry_Extension : PXGraphExtension<APInvoiceEntry>
    {
        protected void APTran_RowUpdating(PXCache cache, PXRowUpdatingEventArgs e, PXRowUpdating InvokeBaseHandler)
        {
            Contract conRow = PXSelect<Contract, Where<Contract.contractID, Equal<Current<APTran.projectID>>>>.Select(Base);
            ContractExt conRowE = conRow.GetExtension<ContractExt>();
            APTran row = e.NewRow as APTran;
            int? projectid = conRow.ContractID;
            int? baseprojectid = row.ProjectID;
            int? basebranchid = row.BranchID;
            int? branchid = conRowE.UsrBranch;
            if (
                //Check to make sure that selected Branch and Project match
                baseprojectid == projectid &&
                basebranchid != branchid
                )
            {
                throw new PXSetPropertyException("Branch and  project must match", PXErrorLevel.RowError);
            }
        }
    }
    

    您可以使用 PXSelect 简单地选择您的基本 DAC,然后如上例所示获取扩展值(您已经在不同的调用中获得了该值 - 效果很好)。如果你想显示一个 DAC 扩展并且图形还没有基本 DAC 的视图,你可以添加一个视图,否则我只在需要时使用 PXSelect。

    【讨论】:

    • 完美!谢谢布伦丹!
    猜你喜欢
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    相关资源
    最近更新 更多