【问题标题】:Acumatica GI customization - adding total lines columnAcumatica GI 自定义 - 添加总行列
【发布时间】:2018-02-03 14:11:15
【问题描述】:

在为销售订单屏幕创建 GI 时,我想在文档详细信息选项卡中显示总行数。任何人都可以建议一种方法来开始实施这个吗?

在 GI 中包含自定义字段后,它不会用数据填充列。

打印行数的代码如下,Adding custom button in acumatica 也有讨论

public void SOOrder_UsrTotalTransactions_FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
  {
      e.ReturnValue = GetTotalTransactions(sender);
  }

  // Update values
  public void SOLine_RowDeleted(PXCache sender, PXRowDeletedEventArgs e)
  {
      UpdateTotals(sender, e.Row as SOOrder,  true);
  }

  public void SOLine_RowInserted(PXCache sender, PXRowInsertedEventArgs e)
  {
      UpdateTotals(sender, e.Row as SOOrder,  true);
}

  public void SOLine_OrderQty_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e)
  {
      UpdateTotals(sender, e.Row as SOOrder, false);
  }

  public void UpdateTotals(PXCache sender, SOOrder soOrder, bool isUpdateTranCount)
  {
      // Get SOOrder DAC extension
      if (soOrder != null)
      {
          SOOrderExt soOrderExt = sender.GetExtension<SOOrderExt>(soOrder);

          if (soOrderExt != null)
          {             
               if (isUpdateTranCount)
               {

                   sender.SetValueExt<SOOrderExt.usrTotalTransactions>(soOrder, GetTotalTransactions(sender));

               } 
          }
      }
  }



  public int? GetTotalTransactions(PXCache sender)
  {
      return Base.Transactions.Select().Count();
  }
 }
}

DAC 代码为: [PXDBInt] [PXUIField(DisplayName="Total Lines", Enabled = false)]

【问题讨论】:

  • 它不起作用的原因是 GI 只使用 DAC,如果您在另一个图表中设置未绑定字段或在 dac 中引用另一个图表,它将在 GI 中不起作用,这是它的自己的图。也许使用某种类型的 PXProjection 或 PXDBCalc 字段。替代方法是将值简单地存储到字段中并保存到销售订单图中的数据库中。
  • 您能解释一下如何将值存储在数据库中吗?我创建的自定义确实显示了值,但它没有保存在数据库中......它显示为 NULL
  • 您需要找到正确的触发器...也许持久化覆盖将是最简单的,在调用基本持久性之前检查行数(注意删除仍包含在计数中)并更新您的订单 UsrRowCount价值。
  • 您能提供帮助回答问题的代码吗? - 将其包含在问题中 - 如果可以请不要发表评论
  • 我已经用代码编辑了我的问题...

标签: acumatica


【解决方案1】:

如果您尝试设置值,我会尝试像这样的示例的简化版本...

namespace PX.Objects.SO
{
    public class SOOrderEntry_Extension : PXGraphExtension<SOOrderEntry>
    {
        public void SOLine_RowDeleted(PXCache sender, PXRowDeletedEventArgs e)
        {
            UpdateTotals(sender, e.Row as SOOrder);
        }

        public void SOLine_RowInserted(PXCache sender, PXRowInsertedEventArgs e)
        {
            UpdateTotals(sender, e.Row as SOOrder);
        }

        public void UpdateTotals(PXCache sender, SOOrder soOrder)
        {
            if (soOrder != null)
            {
                SOOrderExt soOrderExt = sender.GetExtension<SOOrderExt>(soOrder);

                if (soOrderExt != null)
                {
                    sender.SetValueExt<SOOrderExt.usrRowCount>(soOrder, GetRowCount());
                }
            }
        }

        public int GetRowCount()
        {
            return Base.Transactions?.Select().Count() ?? 0;
        }
    }
}

您将使用 FieldSelecting 设置未绑定的字段值。因为您的字段是绑定的,所以您不想为您的示例调用字段选择。

【讨论】:

  • 不客气,很高兴我能帮上忙。我猜您只需要删除字段选择并使用 sender.SetValueExt 设置您的值,这是在事件中设置值的更好方法。当您希望相关字段事件在该时间点触发而不是等到调用事件结束时更是如此。
  • 我在根据上面的代码修改后收到此错误...错误 CS0118: 'PX.Objects.SO.SOOrderExt.UsrRowCount' is a 'property' but is used like a 'type ' 错误在于这一行 >>sender.SetValueExt(soOrder, GetRowCount());
  • 您能否在问题中包含您的 dac 声明?设置值的类型应该是字段的小写 usRowCount 抽象类版本,但错误指出大写 UsrRowCount 是属性。
  • 哦好的...所以我将其更改为 usrRowCount 并且错误消失了...但现在它不显示总行数...该值未显示我有更新了问题中的代码
  • 调试GetRowCount返回的结果。您还可以尝试将值固定到 setvalueex 以确保一切都已连接。我还看到您正在添加一个总数量字段。仅供参考,如果您尝试实现自己的,已经有一个总数量字段。
猜你喜欢
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多