Acumatica-根据不同的字段将复选框设置为true

时间:2018-08-01 16:21:05

标签: acumatica

我知道这是基本条件,但是我对服务订单中已存在的行有疑问。因此,我们有将被导入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);
        }
      }

    }

        }

1 个答案:

答案 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事件处理程序。