我知道这是基本条件,但是我对服务订单中已存在的行有疑问。因此,我们有将被导入Acumatica的服务订单,并且已经有一条订单行。在Acumatica系统中,有人将进入“服务订单”屏幕(SD300100),并在导入后进行所需的更改。在这种情况下,他们将更改“保修状态”,这是我们创建的自定义字段,它将更改详细信息和标题中的某些值。除了从明细行中的导入引入的第一行之外,我已完成所有工作。因此,此订单中将有一行已插入到“人工”选项卡中。我的问题是,当我们将“保修状态”更改为“保修”时,应在详细信息行中选中另一个名为“保修”的自定义字段。我可以将它用于任何新插入的行,但是无法通过现有的行来获取它。我已经在Header和Labor行数据视图上尝试了RowUpdated,RowUpdating,RowInserted,RowInserting。以及表头保修选择器上的FieldUpdated,FieldUpdating和Selecting,以及“人工”选项卡下详细信息中的“保修”复选框。
这是我的代码:
public PXSelect<FSSODet, Where<FSSODet.sOID, Equal<Current<FSSODet.sOID>>>> FSSODets;
protected void FSServiceOrder_Usrwarrstat_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e)
{
var row = (FSServiceOrder)e.Row;
if (row == null) return;
FSSODet line = FSSODets.Current;
if (line == null) return;
if (line != null){
FSServiceOrderExt rowExt = PXCache<FSServiceOrder>.GetExtension<FSServiceOrderExt>(row);
if(rowExt == null)
return;
if (rowExt.Usrwarrstat == null)
return;
if (rowExt.Usrwarrstat == "W"){
cache.SetValueExt<FSSODetExt.usrwarrantydetail>(line, true);
}
}
}
这是我去这里之前尝试的最后一种方法。如果有人使用其他方法,则可以为上面提到的任何方法(RowUpdated,RowUpdating等)提供代码。在这两个字段上,“提交更改”均设置为true。
简而言之,当服务订单标题中的Usrwarrstat字段设置为“ W”时,我希望将“人工”选项卡/详细信息中的Usrwarrantydetail设置为true。
更新1 :所以我使用了下面的第一个答案建议,它确实将复选框更改为选中,但是无论状态如何,它都会发生。我只需要检查它是否设置为“ W”或“ P”,唯一的另一个选项是“ N”,所以我添加了一个检查,如果它设置为“ N”,那将是错误的。但是,它仍然将其保存为true。 这是更新的代码:
public PXSelect<FSSODetService, Where<FSSODetService.sOID, Equal<Current<FSSODetService.sOID>>>> FSSODets;
protected void FSServiceOrder_Usrwarrstat_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e)
{
var row = (FSServiceOrder)e.Row;
if (row == null) return;
FSSODetService line = FSSODets.Current;
if (line == null) return;
if (line != null){
FSServiceOrderExt rowExt = PXCache<FSServiceOrder>.GetExtension<FSServiceOrderExt>(row);
if(rowExt == null)
return;
if (rowExt.Usrwarrstat == null)
return;
if (rowExt.Usrwarrstat == "W" || rowExt.Usrwarrstat == "P"){
FSSODets.Cache.SetValueExt<FSSODetExt.usrwarrantydetail>(line, true);
}
if (rowExt.Usrwarrstat == "N"){
FSSODets.Cache.SetValueExt<FSSODetExt.usrwarrantydetail>(line, false);
}
}
}
}
答案 0 :(得分:0)
总体而言,逻辑看起来不错。缓存对象不匹配可能会阻止SetValueExt工作:
// When this event handler is called by the framework
// PXCache cache object will be of type FSServiceOrder
// because the event is bound on FSServiceOrder DAC
protected void FSServiceOrder_Usrwarrstat_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e)
调用SetValueExt时,应使用匹配类型的缓存对象:
// cache reference is of type FSServiceOrder but we want to modify FSSODetExt DAC field
cache.SetValueExt<FSSODetExt.usrwarrantydetail>(line, true);
// With extensions you have to use the base DAC cache
// you already declared a DataView on FSSODet so you can use it's cache reference
FSSODets.Cache.SetValueExt<FSSODetExt.usrwarrantydetail>(line, true);
除了DAC缓存参考不匹配外,您还可能确实成功修改了该字段值,但是另一个事件处理程序/机制会在您之后再次对其进行修改。 若要检查是否可以在目标字段上声明事件处理程序,请在其中放置一个断点,然后使用Visual Studio调试堆栈跟踪窗口对其进行调试。堆栈跟踪将显示导致字段修改的方法。
protected void FSSODet_Usrwarrantydetail_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e)
还要确保Usrwarrstat字段在ASPX文件中设置了CommitChanges = True属性,否则修改屏幕上的字段将不会执行关联的FieldUpdated事件处理程序。