【发布时间】:2018-08-07 13:33:03
【问题描述】:
我有一个用 Acumatica 编写的通用函数,我们在各种 Acumatica 屏幕上使用它,我们想在报表设计器中使用这个函数,以便我们可以打印值。 示例:CheckBday() 如果我们传递一个客户代码,它将检查此客户生日字段,如果是今天,则返回“生日快乐”
是否可以在报表设计器中调用这个常用函数进行处理?如果是这样,如何在报表设计器中实现这一点,任何见解都会有所帮助。
【问题讨论】:
标签: acumatica
我有一个用 Acumatica 编写的通用函数,我们在各种 Acumatica 屏幕上使用它,我们想在报表设计器中使用这个函数,以便我们可以打印值。 示例:CheckBday() 如果我们传递一个客户代码,它将检查此客户生日字段,如果是今天,则返回“生日快乐”
是否可以在报表设计器中调用这个常用函数进行处理?如果是这样,如何在报表设计器中实现这一点,任何见解都会有所帮助。
【问题讨论】:
标签: acumatica
您可以通过使用用户定义函数 (UDF) 在报表设计器上使用扩展函数。 你可以:
添加公共功能 YOURFUNCTION:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PX.Objects.AP;
namespace ReportUDF
{
public class UtilFunctions
{
public string YOURFUNCTION(string PARAM)
{
try
{
//function code
}
catch (Exception ex)
{
return ex.Message;
}
}
}
}
参数及其数据类型: 类中的方法应始终包含字符串类型的参数并始终返回字符串类型的值。处理参数和返回参数的最佳方法是将它们声明为 Object 类型。但是,您需要在使用或使用这些参数之前将它们转换为适当的数据类型,以确保您的方法正常运行。
编译此附加项目。编译成功后,确保程序集(ReportUDF.dll)放在Acumatica网站的Bin文件夹中。
在 ReportLauncher.aspx.cs 中连接这个新程序集,如下所述:
在静态构造函数Pages_ReportLauncer的底部添加以下代码行:
Type DemoReportFunctionsType =
System.Web.Compilation.BuildManager.GetType("ReportUDF.UtilFunctions", false);
if(DemoReportFunctionsType != null)
{
ExpressionContext.RegisterExternalObject("ReportUDF",Activator.CreateInstance(DemoReportFunctionsType));
}
在报表设计器中打开您的表单报表,并使用如下表达式添加 TextBox 控件,如下所示:
= ReportUDF.YOURFUNCTION([DAC.UsrSomeField])
观察:UDF 不会显示在表达式编辑器中。
观察:自定义 ReportLauncher.aspx.cs 不是标准做法,应重新应用升级期间的更改。您始终可以将这些更改编译为自定义包的一部分;但是,您应该确保在升级期间保留此代码文件的增强功能(如果存在)。否则报告可能无法按预期运行。
【讨论】:
正如@cbetabeta 提到的,使用Reports User Defined Function(UDF) 是一种可能的方法。但是维护自定义的ReportLauncher.aspx.cs 版本将是一个挑战。
对此的替代可能方法是通过具有PXFormula/PXDBScalar/PXDBCalced 属性的未绑定 DAC 字段。您也可以使用自定义 BQL 函数(派生自 BqlFormulaEvaluator) - 您可以参考 PX.Objects 源代码的公式子文件夹中提供的开箱即用的自定义 BQL 函数。或者您可以参考KB article 使用此类自定义 BQL 函数HierarchySorting。
【讨论】: