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,但无法确定出什么问题。
答案 0 :(得分:0)
如果要在委托中读取它,则无法在RowSelected事件中设置UsrVendorClassID。在具有该模式的委托中,它将始终为null。
执行顺序为:
在委托中,您总是从头开始返回新记录。该执行顺序将在每次回调时重新出现,因此UsrVendorClassID在下次也进入委托时也将为null。
如果从那里读取未绑定字段,则需要在委托中设置它们:
foreach (APAdjust apdoc in Base.APDocumentList.Select())
{
APAdjustExt apdocExt = apdoc.GetExtension<APAdjustExt>();
apdocExt.UsrVendorClassID = […];
if (apdocExt.UsrVendorClassID == filterExt.UsrVendorClass)
{
yield return apdoc;
}
}