更改的BLC数据视图委托不过滤

时间:2019-04-29 21:36:37

标签: acumatica

最新更新:

As suggested by HB_Acumatica in his answer below,我的APAdjust_RowSelecting实际上对我没有多大帮助,我现在在委托中声明APAdjustExt.UsrVendorClass的值。我在下面更新了我的代码以反映这一点。

另一位Acumatica开发人员建议我在APPayBills业务逻辑中重写BQL构造函数方法,并使用委托和事件处理程序跳过所有代码。看起来像这样:

namespace PX.Objects.AP
{
    public class APPayBills_Extension : PXGraphExtension<APPayBills>
    {
        public delegate PXSelectBase<APInvoice> ComposeBQLCommandForAPDocumentListSelectDelegate();
        [PXOverride]
        public PXSelectBase<APInvoice> ComposeBQLCommandForAPDocumentListSelect(ComposeBQLCommandForAPDocumentListSelectDelegate baseMethod)
        {
            var cmd = baseMethod();
            cmd.WhereAnd<Where<Vendor.vendorClassID, Equal<Current<PayBillsFilterExt.usrVendorClass>>,
                Or<Current<PayBillsFilterExt.usrVendorClass>, IsNull>>>();

            return cmd;
        }
    }
}

当我在真空中实现此代码时,它可以工作。但是,当我将其与项目的其余部分结合在一起时,它将停止工作。我的项目中似乎与其他内容存在冲突。一旦解决了这个问题,我将接受能够实现其代码的答案。

以前的更新:

(保留历史,直到我可以解决上述问题为止)

我意识到我从来没有为APAdjust.UsrVendorClassID分配值,所以我在APAdjust上编写了RowSelecting事件处理程序以为每行分配所需的值:

    protected virtual void APAdjust_RowSelecting(PXCache sender, PXRowSelectingEventArgs e, PXRowSelecting InvokeBaseHandler)
    {
        InvokeBaseHandler?.Invoke(sender, e);
        var row = (APAdjust)e.Row;
        if (e.Row == null) return;
        APAdjustExt rowExt = row.GetExtension<APAdjustExt>();
        if (rowExt == null) return;

        using (new PXConnectionScope())
        { 
            Vendor vendor = PXSelectReadonly<Vendor,
                Where<Vendor.bAccountID, Equal<Required<APAdjust.vendorID>>>>.Select(Base, row.VendorID);
            if (vendor != null)
                rowExt.UsrVendorClassID = vendor.VendorClassID;
        }
    }

尽管如此,新字段也不会刷新网格结果。此外,当我在网格中显示该列时,我不会显示该列的值。当我通过VS进行调试时,我看到这个新的事件处理程序被调用,但是我从未看到它实际分配了一个值。因此,我知道我在这里丢失了一些东西,但是我看不到。

原始问题:

我正在编辑付款处理屏幕AP503000。我向过滤器添加了新字段:供应商类别。我已将此字段添加到我的PayBillsFilter扩展中:

namespace PX.Objects.AP
{
    public class PayBillsFilterExt : PXCacheExtension<PX.Objects.AP.PayBillsFilter>
    {
        #region UsrVendorClass
        [PXString]
        [PXUIField(DisplayName = "Vendor Class")]
        [PXSelector(
            typeof(Search2<VendorClass.vendorClassID,
                        LeftJoin<EPEmployeeClass,
                          On<EPEmployeeClass.vendorClassID, Equal<VendorClass.vendorClassID>>>,
                        Where<EPEmployeeClass.vendorClassID, IsNull>>),
            DescriptionField = typeof(VendorClass.descr),
            SubstituteKey = typeof(VendorClass.vendorClassID),
            CacheGlobal = true
        )]
        public virtual string UsrVendorClass { get; set; }
        public abstract class usrVendorClass : IBqlField { }
        #endregion
    }
}

我还将此字段添加到了APAdjust扩展名:

namespace PX.Objects.AP
{
    public class APAdjustExt : PXCacheExtension<PX.Objects.AP.APAdjust>
    {
        #region UsrVendorClassID  
        [PXString]
        [PXUIField(DisplayName = "Vendor Class")]

        public string UsrVendorClassID { get; set; }
        public abstract class usrVendorClassID : IBqlField { }
        #endregion
    }
}

最后,我在APPayBills扩展中创建了委托:

namespace PX.Objects.AP
{
    public class APPayBills_Extension : PXGraphExtension<APPayBills>
    {
        [PXFilterable]
        public PXFilteredProcessingJoin<APAdjust, PayBillsFilter, 
            InnerJoin<APInvoice, 
                On<APInvoice.docType, Equal<APAdjust.adjdDocType>, 
                    And<APInvoice.refNbr, Equal<APAdjust.adjdRefNbr>>>,
            LeftJoin<Vendor,
                On<Vendor.bAccountID, Equal<APInvoice.vendorID>>>>> APDocumentList;

        protected IEnumerable apdocumentlist()
        {
            PayBillsFilter filter = Base.Filter.Current;
            PayBillsFilterExt filterExt = filter.GetExtension<PayBillsFilterExt>();

            foreach (APAdjust apdoc in Base.APDocumentList.Select())
            {
                APAdjustExt apdocExt = apdoc.GetExtension<APAdjustExt>();

                Vendor vendor = PXSelectReadonly<Vendor,
                    Where<Vendor.bAccountID, Equal<Required<APAdjust.vendorID>>>>.Select(Base, apdoc.VendorID);
                apdocExt.UsrVendorClass = vendor.VendorClassID;

                if (apdocExt.UsrVendorClass == filterExt.UsrVendorClass)
                {
                    yield return apdoc;
                }
            }
        }

        #region Event Handlers
        public void PayBillsFilter_RowSelected(PXCache sender, PXRowSelectedEventArgs e, PXRowSelected InvokeBaseHandler)
        {
            InvokeBaseHandler?.Invoke(sender, e);
            if (e.Row == null) return;

            PayBillsFilter filter = e.Row as PayBillsFilter;
            PayBillsFilterExt filterExt = filter.GetExtension<PayBillsFilterExt>();

            if (filter != null && !string.IsNullOrEmpty(filterExt.UsrVendorClass))
            {
                Dictionary<string, object> parameters = Base.Filter.Cache.ToDictionary(filter);
                APDocumentList.SetProcessTarget(null, null, null, filterExt.UsrVendorClass, parameters);
            }
        }
        #endregion
    }
}

所有内容都能在网站上正常编译和加载,但是当我现在尝试进行过滤时,原始过滤器字段仍然有效,但是我的扩展字段似乎仍然被忽略。

我想念什么?我在T300培训课程中查看了示例here,但无法确定出什么问题。

1 个答案:

答案 0 :(得分:0)

如果要在委托中读取它,则无法在RowSelected事件中设置UsrVendorClassID。在具有该模式的委托中,它将始终为null。

执行顺序为:

  1. 对APDocumentList数据视图执行选择
  2. 执行apdocumentlist委托以选择记录,UsrVendorClassID为空
  3. 执行RowSelected事件,现在UsrVendorClassID不为空

在委托中,您总是从头开始返回新记录。该执行顺序将在每次回调时重新出现,因此UsrVendorClassID在下次也进入委托时也将为null。

如果从那里读取未绑定字段,则需要在委托中设置它们:

foreach (APAdjust apdoc in Base.APDocumentList.Select())
{
    APAdjustExt apdocExt = apdoc.GetExtension<APAdjustExt>();
    apdocExt.UsrVendorClassID = […];

    if (apdocExt.UsrVendorClassID == filterExt.UsrVendorClass)
    {
        yield return apdoc;
    }
}