Skip to main content

构建自定义公式函数

您可以创建自定义函数。在 Designer 中,只要工具配置界面提供了表达式编辑器,用户即可调用这些函数。要创建自定义函数...

  • 编写 XML 文件,将参数封装到其他函数调用中。

  • 编写 C 风格的 DLL。

无论采用何种创建方法,这些函数都可通过 XML 公式函数文件在 Designer 中提供,该文件必须包含以下属性:

  • <name>:在函数列表中显示的唯一名称。

  • <NumParams>:函数接受的参数数量。

  • <Category>:显示该函数的类别。这可以是新类别,也可以是现有类别。

  • <InsertText>:使用该函数时,插入到表达式编辑器中的样板文本。

  • <Description>:鼠标悬停于函数上方时显示的说明。

自定义公式函数

如果您使用自定义公式函数,并且您的自定义函数与现有 Alteryx 函数(或新引入的 Alteryx 函数)同名,则可能会遇到意外结果和冲突。

要解决此问题,请重命名您的自定义函数(或添加前缀/后缀)以将其与基础版本安装的 Designer 函数区分开来。

使用 XML 构建

当仅使用 XML 创建函数时,文件的结构遵循以下示例:

<?xml version="1.0" encoding="utf-8"?>
<FormulaAddIn>
  <Function>
    <Name>Sample_XML</Name>
    <NumParams variable="false">3</NumParams>
    <Category>Sample</Category>
    <InsertText>Sample_XML(Num1, Num2, Num3)</InsertText>
    <Description>Obtains the average of three numbers.</Description>
    <Formula>((P1+P2+P3)/3)</Formula>
  </Function>
</FormulaAddIn>

NumParams 元素具有一个 variable 属性。该属性设置为 false,因为接受的参数数量是固定的。当仅使用 XML 创建函数时,接受的参数数量始终是固定的。

Formula 元素包含实际执行工作的公式。内容对用户不可见。参数始终引用为 P1P2P3 等,与 InsertText 中显示的文本无关。

要将第二个函数添加到同一 XML 文件中,请在 FormulaAddIn 元素中创建另一个 Function 元素。

使用 DLL 和 XML 进行构建

要使用 DLL,请编写所需的函数,然后从 DLL 中导出。假设导出的函数定义为:

struct FormulaAddInData{
        int nVarType;           // 1 for double, 2 for wchar_t
        int isNull;             // 1 if NULL, 0 if valid
        double dVal;            // valid if nVarType==1 && isNull==0
        const wchar_t * pVal;   // valid if nVarType==2 && isNull==0
};

导出的函数具有以下签名:

typedef long ( _stdcall * FormulaAddInPlugin)(int nNumArgs, FormulaAddInData *pArgs, FormulaAddInData *pReturnValue);

nNumArgs 包含调用中的实际参数个数。

pArgs 指向实际参数的数组。

该函数应返回 1 表示成功,返回 0 表示失败。

如果调用成功,则 pReturnValue 将返回计算结果;如果调用失败,则返回字符串错误消息。任何返回的字符串都必须使用 GlobalAlloc 进行分配,并由 Alteryx Designer 管理其释放。

成功设置 DLL 后,您需要在 XML 文件中引用该 DLL。

<?xml version="1.0" encoding="utf-8"?>
<FormulaAddIn>
  <Function>
    <Name>AddInData</Name>
    <NumParams variable="true">3</NumParams>
    <Category>Sample</Category>
    <InsertText>AddInData(VarType, isNull, double)</InsertText>
    <Description>Verifies data type before adding data.</Description>
    <Dll>
        <Name>AddInData</Name>
        <EntryPoint>FormulaAddInData</EntryPoint>
    </Dll>
  </Function>
</FormulaAddIn>

NumParams 元素具有一个 variable 属性。由于接受的参数数量可变,因此该属性设置为 true。当使用可变数量的参数时,该值应等于所需的最小参数数量。

Dll 元素包含两个子元素,用于提供有关该 DLL 的必要信息。

  • <Name>:DLL 文件的名称(不含扩展名)。

  • <EntryPoint>:正在使用的导出函数的名称。

  • <RunSingleThreaded>:(可选参数)用于强制进行单线程处理的选项。此选项的值可以是 False(默认)或 True。当函数在多线程环境中无法正常工作时,您可以使用此参数。

    注意

    为获得更佳性能,建议将函数改为在多线程环境中运行,而非使用此参数。

访问 Designer 中的函数

要使 Alteryx Designer 中的函数可用,请转至 Alteryx Designer 安装目录下的 RuntimeData 文件夹。检查名为 \FormulaAddIn 的文件夹。如果文件夹不存在,请创建。

FormulaAddIn 的示例 XML

该文件夹包含 Sample.xml,这是一个正确配置的文件。添加类别,保存文件,然后重启 Alteryx Designer 以查看示例函数。

C:\Program Files\Alteryx\bin\RuntimeData\FormulaAddIn

将 XML 文件保存到 \FormulaAddIn 目录。如果使用 DLL,请将相关 DLL 文件保存在同一位置。标准命名规范是使 DLL 和 XML 文件的名称保持一致。

如果一台计算机上同时运行两个 Designer 实例(管理员版和非管理员版),则包含自定义公式函数的 XML 文件应通过不同的路径分别存放,以便在相应版本的 Designer GUI 中显示。

  • 对于非管理员版本,路径为 C:\Program Files\Alteryx\bin\RuntimeData\FormulaAddIn

  • 对于管理员版本,路径为 C:\Alteryx\RuntimeData\FormulaAddIn