【问题标题】:Acumatica - Set checkbox to true based on a different fieldAcumatica - 根据不同的字段将复选框设置为 true
【发布时间】:2018-08-02 02:34:23
【问题描述】:

我知道这是基本的东西和条件,但我对服务订单中已经存在的一行有疑问。因此,我们有将导入 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 等。两个字段的 Commit Changes 都设置为 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);
        }
      }

    }

        }

【问题讨论】:

    标签: acumatica


    【解决方案1】:

    整体逻辑看起来不错。缓存对象不匹配可能会阻止 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 事件处理程序。

    【讨论】:

    • 我已对原帖进行了更新,详情请阅读。
    • 到底是什么问题?屏幕上显示的值还是数据库中保存的值?
    • 您的代码中有条件:如果 X 则执行 Y。如果您认为无论 X 的值如何都会发生 Y,我建议您调试并检查 X 的值。您可以转储使用 PXTrace.WriteInformation(rowExt.Usrwarrstat.ToString()) 跟踪的值;在 Acumatica 中打开 Help->Trace 窗口以显示该值。 C# 中的基本条件检查非常不太可能被破坏,我会寻找其他地方。
    • 我有更新。因此代码有效,当我将其更改为“W”的保修状态时,它确实选中了保修框。但是,一旦我点击保存,它就会将其更改回 false。我也确实更新了更新 1 中的代码。使用我正在使用的当前代码。
    • usrwarrantydetail 复选框是只读字段还是用户可修改字段?
    猜你喜欢
    • 2020-09-12
    • 2015-05-19
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    相关资源
    最近更新 更多