• 716-472-4484
  • ptsteadman@gmail.com

在 Dynamics NAV 的页面中添加 Lookup 字段


在构建一个使用 NAV Web Services 的非简单应用时,我遇到的一个问题是:如何把来自不同表的字段“关联”起来。
比如,当你从作业表暴露一个包含所需资源的作业列表时,你可能不只需要表中的资源 id,还需要资源名称和描述。对于单条记录,这很容易拿到;但当你需要从一个已被动态过滤的表里拿几百条记录时呢?当你把一个 Page 暴露为 Web 服务时,包含该页面所基于表的字段很容易,但如何包含来自另一张表的字段就不那么清晰了。

这篇帖子这样的讨论让我一度以为无法在 Page 的 Web 服务中暴露 flow 字段,并且当我尝试暴露一张表的所有字段时还会抛异常。实际上,暴露 flow 字段完全是可行的:真正不工作的其实是 flow filters。不过我也不想为此去修改底层的作业表来添加 flow 字段,也没看到往 Page 里添加 flow 字段的简单方法。我试过在 C# 应用里做“关联”,但网络开销让应用慢到不可用。

这个问题的解决方案是:在 Page 里用 C/AL 代码来有效地创建一个 lookup / flow 字段。这样数据在离开 NAV Server 之前就已经“预关联”好了,既快又干净,而且你并没有修改任何表。下面是具体做法:

Step 1. Add a Field with SourceExpression Set to a Function Name

首先,我们用向导创建一个 Page,其中包含底层表的所有字段。然后,我们手动添加一些字段,用来承载来自其他表的 lookup 数据。SourceExpression 列中的文本将是为该字段提供值的函数名。
Add a Field with SourceExpression Set to a Function Name

Step 2. Create Function in the Page’s C/AL Code

打开 Page 的字段设计器,进入 C/AL Globals 的函数标签页,添加一个函数,函数名就是 SourceExpression 列中的文本。通过 “Locals” 按钮设置函数的返回类型,随后在页面的 C/AL 代码编辑器里会出现该函数的触发器。为该触发器的主体添加代码,它会在每条记录上被调用,从而为该字段提供值。
Create Function in the Page's C/AL Code