如何解决覆盖 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 举报,一经查实,本站将立刻删除。