微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

覆盖 PXFilteredProcessingJoin 和 APPrintChecks 的委托

如何解决覆盖 PXFilteredProcessingJoin 和 APPrintChecks 的委托

我和下面的链接有同样的问题,但有不同的图表 (ApprintChecks)

how-do-i-override-pxfilteredprocessingjoin-in-a-graph-extension-without-altering

我正在覆盖主视图以从 APContact 中提取汇款名称显示在网格中。

[PXFilterable]
public PXFilteredProcessingJoin<APPayment,PrintChecksFilter,InnerJoin<vendor,On<vendor.bAccountID,Equal<APPayment.vendorID>>,InnerJoin<APContact,On<APContact.contactID,Equal<APPayment.remitContactID>>>>,Where<boolTrue,Equal<boolTrue>>,OrderBy<Asc<vendor.acctName,Asc<APPayment.refNbr>>>> APPaymentList;

但是,我不知道如何覆盖委托,因此我不会遇到与其他海报相同的问题(未应用过滤器)。

protected virtual IEnumerable appaymentlist()
    {
        if (cleared)
        {
            foreach (APPayment doc in APPaymentList.Cache.Updated)
            {
                doc.Passed = false;
            }
        }

        foreach (PXResult<APPayment,vendor,PaymentMethod,CABatchDetail> doc in PXSelectJoin<APPayment,InnerJoinSingleTable<vendor,InnerJoin<PaymentMethod,On<PaymentMethod.paymentMethodID,Equal<APPayment.paymentMethodID>>,LeftJoin<CABatchDetail,On<CABatchDetail.origModule,Equal<BatchModule.moduleAP>,And<CABatchDetail.origDocType,Equal<APPayment.docType>,And<CABatchDetail.origRefNbr,Equal<APPayment.refNbr>>>>>>>,Where2<Where<APPayment.status,Equal<APDocStatus.pendingPrint>,And<CABatchDetail.batchNbr,IsNull,And<APPayment.cashAccountID,Equal<Current<PrintChecksFilter.payAccountID>>,And<APPayment.paymentMethodID,Equal<Current<PrintChecksFilter.payTypeID>>,And<Match<vendor,Current<AccessInfo.userName>>>>>>>,And<APPayment.docType,In3<APDocType.check,APDocType.prepayment,APDocType.quickCheck>>>>.Select(this))
        {
            yield return new PXResult<APPayment,vendor>(doc,doc);
            if (_copies.ContainsKey((APPayment)doc))
            {
                _copies.Remove((APPayment)doc);
            }
            _copies.Add((APPayment)doc,PXCache<APPayment>.Createcopy(doc));
        }
    }

这里引用了其他私有变量。任何帮助表示赞赏。

此外,如果有一种更简单的方法可以在像这样的网格(DAC 中的虚拟字段?)上提取相关值,我不会坚持使用图形扩展来做。

解决方法

所以这看起来可行,但看起来很混乱并且重复了很多代码和私有变量。如果有更好的方法可以做到这一点,请提供任何反馈:

 public class APPrintChecks_Extension : PXGraphExtension<APPrintChecks> {

[PXFilterable]
public PXFilteredProcessingJoin<APPayment,PrintChecksFilter,InnerJoin<Vendor,On<Vendor.bAccountID,Equal<APPayment.vendorID>>,InnerJoin<APContact,On<APContact.contactID,Equal<APPayment.remitContactID>>>>,Where<boolTrue,Equal<boolTrue>>,OrderBy<Asc<Vendor.acctName,Asc<APPayment.refNbr>>>> APPaymentList;


    public IEnumerable appaymentlist()
    {
      
      if (cleared)
      {
        foreach (APPayment doc in APPaymentList.Cache.Updated)
        {
          doc.Passed = false;
        }
      }

      foreach (PXResult<APPayment,Vendor,APContact,PaymentMethod,CABatchDetail> doc in PXSelectJoin<APPayment,InnerJoinSingleTable<Vendor,Equal<APPayment.remitContactID>>,InnerJoin<PaymentMethod,On<PaymentMethod.paymentMethodID,Equal<APPayment.paymentMethodID>>,LeftJoin<CABatchDetail,On<CABatchDetail.origModule,Equal<BatchModule.moduleAP>,And<CABatchDetail.origDocType,Equal<APPayment.docType>,And<CABatchDetail.origRefNbr,Equal<APPayment.refNbr>>>>>>>>,Where2<Where<APPayment.status,Equal<APDocStatus.pendingPrint>,And<CABatchDetail.batchNbr,IsNull,And<APPayment.cashAccountID,Equal<Current<PrintChecksFilter.payAccountID>>,And<APPayment.paymentMethodID,Equal<Current<PrintChecksFilter.payTypeID>>,And<Match<Vendor,Current<AccessInfo.userName>>>>>>>,And<APPayment.docType,In3<APDocType.check,APDocType.prepayment,APDocType.quickCheck>>>>.Select(Base))
      {
        yield return new PXResult<APPayment,APContact>(doc,doc,doc);
        if (_copies.ContainsKey((APPayment)doc))
        {
          _copies.Remove((APPayment)doc);
        }
        _copies.Add((APPayment)doc,PXCache<APPayment>.CreateCopy(doc));
      }
    }
    
    private bool cleared;
    public void Clear()
    {
      Base.Filter.Current.CurySelTotal = 0m;
      Base.Filter.Current.SelTotal = 0m;
      Base.Filter.Current.SelCount = 0;
      cleared = true;
      Base.Clear();
    }

    private readonly Dictionary<object,object> _copies = new Dictionary<object,object>();

}

,

根据 Rick 的建议,我实现了 FieldSelecting 方法。很多,更简单/更干净的代码。当在网格列中使用它时,它实际上会导致每行到数据库的往返,但是,对于支票打印,这应该是可以接受的。谢谢瑞克!代码如下。

protected void APPayment_UsrRemitTo_FieldSelecting(PXCache cache,PXFieldSelectingEventArgs e)
    {

        var row = (APPayment)e.Row;
        // fill usrRemitTo from APContact
        if (row != null)
        {
            var extension = PXCache<APRegister>.GetExtension<APRegisterExt>(row);

            using (PXConnectionScope cs = new PXConnectionScope())
            {
                APContact rec = PXSelectReadonly<APContact,Where<APContact.contactID,Equal<Required<APPayment.remitContactID>>>>.Select(Base,row.RemitContactID);

                if (rec != null)
                {
                    string remitToName = (!string.IsNullOrEmpty(rec.FullName)) ? rec.FullName : "";
                   
                    e.ReturnValue = remitToName;
                }
                else
                {
                    e.ReturnValue = "";
                }
            }
        }



    }
,

使用 DBScalar,您只需一行代码就可以进一步简化您的活动:

public class APPaymentExt : PXCacheExtension<APPayment>
{
  #region UsrRemitTo
  [PXString(100)]
  [PXUIField(DisplayName="Remit To")]    
  [PXDBScalar(typeof(Search<APContact.fullName,Equal<APPayment.remitContactID>>>))]
  public virtual string UsrRemitTo { get; set; }
  public abstract class usrRemitTo : PX.Data.BQL.BqlString.Field<usrRemitTo> { }
  #endregion
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。