Acumatica 在发布Porecipentry期间,如何将数据附加到IntrantCost上的自定义字段?
我需要在收到采购订单时将自定义数据附加到添加到成本的新字段中 在面包屑之后,Porecipentry->Release操作似乎最终调用了INDocumentRelease.ReleaseDoc,最终创建了内部成本。我尝试扩展porecipentry和INDocumentRelease来添加一个事件,用于发布PXTrace消息,但跟踪没有出现,告诉我没有达到预期的事件。(这就解释了为什么我需要的真正的业务逻辑没有启动。)Acumatica 在发布Porecipentry期间,如何将数据附加到IntrantCost上的自定义字段?,acumatica,Acumatica,我需要在收到采购订单时将自定义数据附加到添加到成本的新字段中 在面包屑之后,Porecipentry->Release操作似乎最终调用了INDocumentRelease.ReleaseDoc,最终创建了内部成本。我尝试扩展porecipentry和INDocumentRelease来添加一个事件,用于发布PXTrace消息,但跟踪没有出现,告诉我没有达到预期的事件。(这就解释了为什么我需要的真正的业务逻辑没有启动。) protected virtual void(Events.rowe) {
protected virtual void(Events.rowe)
{
PXTrace.WriteInformation(“就是它了!”);
}
当然,我想把真正的代码放在这里,但我只是想确保我正确地击中了事件。这几乎适用于我所做的所有其他工作,包括将类似数据附加到内部文本字段。我无法让它为INTranCost工作,以便添加到IntranCostText。在这一点上,我无法确定这是位置(哪个图形扩展)还是这个特殊情况所需的特殊方法
我还尝试过重写事件并在代码上设置断点,但好像我根本不在同一个进程上。(是的,我已检查是否已连接到正确的Acumatica实例,并且没有错误。)
在什么情况下,需要使用哪个图形来捕获在INTranCost中创建的采购订单收据,以更新IntranCostText中的自定义字段?使用请求探查器,我能够确定我已接近但不够深入。虽然要插入的IntrantCost对象是在INDocumentRelease文件中构建的,但实际插入是在同一文件的INReleaseProcess图形中处理的 我只需要在创建内部成本记录时,从POLine上捕获的数据执行此“推送”,LineNbr是一个关键字段,因此在设置后不会更新。我需要确保我有足够的数据恢复连接,并且主键可以轻松地将我链接回内部网。然后返回到POReceiptLine到POLine,在该POLine中维护需要在事务过帐时捕获“当前值”的数据。因为我需要更新DAC扩展,所以我需要使用一个允许现有DAC.update应用我的值的事件。因此,我在INTranCost_LineNbr_FieldUpdated上添加了一个事件处理程序,因为该值在初始设置后不应“更新” 完成任务的代码:
public class INReleaseProcess_Extension : PXGraphExtension<INReleaseProcess>
{
public override void Initialize()
{
base.Initialize();
}
protected virtual void _(Events.FieldUpdated<INTranCost.lineNbr> e)
{
INTranCost row = (INTranCost) e.Row;
INTran tran = PXSelect<INTran,
Where<INTran.docType, Equal<Required<INTran.docType>>,
And<INTran.refNbr, Equal<Required<INTran.refNbr>>,
And<INTran.lineNbr, Equal<Required<INTran.lineNbr>>
>>>>
.SelectSingleBound(Base, null, row.DocType, row.RefNbr, (int?) e.NewValue);
if (tran?.POReceiptType != null && tran?.POReceiptNbr != null)
{
PXResultset<POReceiptLine> Results = PXSelectJoin<POReceiptLine,
InnerJoin<POLine, On<POLine.orderType, Equal<POReceiptLine.pOType>,
And<POLine.orderNbr, Equal<POReceiptLine.pONbr>,
And<POLine.lineNbr, Equal<POReceiptLine.pOLineNbr>>>>,
InnerJoin<POOrder, On<POOrder.orderType, Equal<POLine.orderType>,
And<POOrder.orderNbr, Equal<POLine.orderNbr>>>>>,
Where<POReceiptLine.receiptType, Equal<Required<POReceiptLine.receiptType>>,
And<POReceiptLine.receiptNbr, Equal<Required<POReceiptLine.receiptNbr>>,
And<POReceiptLine.lineNbr, Equal<Required<POReceiptLine.lineNbr>>>>>>.
SelectSingleBound(Base, null, tran.POReceiptType, tran.POReceiptNbr, tran.POReceiptLineNbr);
if (Results != null)
{
foreach (PXResult<POReceiptLine, POLine, POOrder> result in Results)
{
POReceiptLine receipt = result;
POLine line = result;
POOrder order = result;
POLineExt pOLineExt = PXCache<POLine>.GetExtension<POLineExt>(line);
INTranCostExt iNTranCostExt = PXCache<INTranCost>.GetExtension<INTranCostExt>(row);
if (pOLineExt != null && iNTranCostExt != null)
{
Base.Caches[typeof(INTranCost)].SetValueExt<INTranCostExt.usrField>(row, pOLineExt.UsrField);
}
}
}
}
}
}
EleaseProcess_扩展中的公共类:pxGrapherExtension
{
公共覆盖无效初始化()
{
base.Initialize();
}
受保护的虚拟空间(Events.fielde)
{
内部成本行=(内部成本)e.行;
内部传输=PXSelect
.SelectSingleBound(Base,null,row.DocType,row.RefNbr,(int?)e.NewValue);
if(tran?.poreciptype!=null&&tran?.poreciptnbr!=null)
{
PXResultset Results=PXSelectJoin。
选择SingleBound(Base,null,tran.POReceiptType,tran.POReceiptNbr,tran.POReceiptLineNbr);
如果(结果!=null)
{
foreach(PXResult in Results)
{
POReceiptLine收据=结果;
POLine线=结果;
顺序=结果;
POLineExt POLineExt=PXCache.GetExtension(行);
INTranCostExt INTranCostExt=PXCache.GetExtension(行);
if(pOLineExt!=null&&iNTranCostExt!=null)
{
Base.Caches[typeof(INTranCost)].SetValueExt(row,pOLineExt.UsrField);
}
}
}
}
}
}
public class INReleaseProcess_Extension : PXGraphExtension<INReleaseProcess>
{
public override void Initialize()
{
base.Initialize();
}
protected virtual void _(Events.FieldUpdated<INTranCost.lineNbr> e)
{
INTranCost row = (INTranCost) e.Row;
INTran tran = PXSelect<INTran,
Where<INTran.docType, Equal<Required<INTran.docType>>,
And<INTran.refNbr, Equal<Required<INTran.refNbr>>,
And<INTran.lineNbr, Equal<Required<INTran.lineNbr>>
>>>>
.SelectSingleBound(Base, null, row.DocType, row.RefNbr, (int?) e.NewValue);
if (tran?.POReceiptType != null && tran?.POReceiptNbr != null)
{
PXResultset<POReceiptLine> Results = PXSelectJoin<POReceiptLine,
InnerJoin<POLine, On<POLine.orderType, Equal<POReceiptLine.pOType>,
And<POLine.orderNbr, Equal<POReceiptLine.pONbr>,
And<POLine.lineNbr, Equal<POReceiptLine.pOLineNbr>>>>,
InnerJoin<POOrder, On<POOrder.orderType, Equal<POLine.orderType>,
And<POOrder.orderNbr, Equal<POLine.orderNbr>>>>>,
Where<POReceiptLine.receiptType, Equal<Required<POReceiptLine.receiptType>>,
And<POReceiptLine.receiptNbr, Equal<Required<POReceiptLine.receiptNbr>>,
And<POReceiptLine.lineNbr, Equal<Required<POReceiptLine.lineNbr>>>>>>.
SelectSingleBound(Base, null, tran.POReceiptType, tran.POReceiptNbr, tran.POReceiptLineNbr);
if (Results != null)
{
foreach (PXResult<POReceiptLine, POLine, POOrder> result in Results)
{
POReceiptLine receipt = result;
POLine line = result;
POOrder order = result;
POLineExt pOLineExt = PXCache<POLine>.GetExtension<POLineExt>(line);
INTranCostExt iNTranCostExt = PXCache<INTranCost>.GetExtension<INTranCostExt>(row);
if (pOLineExt != null && iNTranCostExt != null)
{
Base.Caches[typeof(INTranCost)].SetValueExt<INTranCostExt.usrField>(row, pOLineExt.UsrField);
}
}
}
}
}
}