当您不必知道要处理的记录或字段时,Microsoft Dynamics导航中使用RecordRef和FieldRef变量类型来处理记录中的记录和字段。
在此博客文章中,我将介绍如何与他们合作。注意:这些说明应适用于从3.7版到Dynamics NAV 2013和Dynamics NAV 2013 R2的所有版本的Dynamics NAV。
您可能已经看到了RecordRef,FieldRef和KeyRef变量类型。如果您从未使用过它们,那么您可能不太了解它们是什么或它们如何工作。
当您知道需要使用一条记录或一组记录,但又不知道需要访问哪个表时,将使用这三种变量类型。 通常,我在两种不同情况下使用了RecordRef变量。
我要么需要对几个非常相似的表执行相同的操作,例如“销售标题”,“销售发票标题”和“销售发货标题”,要么需要对一大堆没有共同点的表进行相同的操作。
在这两种情况下,促使我进入RecordRef变量的原因是直到运行时我才知道要处理哪个表。 (我使用RecordRef要做的最大的项目涉及通过Web服务调用实时在NAV和外部数据库之间同步记录;我在ApplicationManagement代码单元中使用OnGlobalInsert,OnGlobalModify,OnGlobalDelete和OnGlobalRename触发器来调用一些Web服务,与RecordRef变量一起发送数据。)
RecordRef本质上是一个普通的Record变量,只需要您向它提供表号即可,以便NAV知道您要使用哪个表。您可以通过RecordRef.OPEN函数执行此操作,
该函数具有三个参数: 编号(必填):这是您要使用的表号。您可以使用DATABASE :: [表名]选项变量来查找要使用的表的编号(如果您不提前知道的话)。
Temp(可选):这是一个布尔值,告诉系统是要打开临时表(TRUE)还是打开实表(FALSE)。如果您省略此选项,则系统会假设您需要一个真实的表。
CompanyName(可选):这是您正在使用的NAV公司名称。如果您省略此选项,则系统会假设您正在与当前公司合作。
关于RecordRef变量,还有一些其他重要功能需要了解。 RecordRef.GETTABLE用于将RecordRef指向与Record变量相同的表实例,
而RecordRef.SETTABLE用于将Record变量指向与RecordRef变量相同的表实例。您可以使用GETTABLE和SETTABLE在RecordRef和常规Record变量之间传输数据。
您可以使用RecordRef变量的FINDFIRST,FINDLAST,FINDSET和NEXT函数遍历记录集,就像使用Record变量一样。您可以使用FieldRef变量在RecordRef上设置过滤器;
我将在下面介绍。您还可以使用INSERT,MODIFY,DELETE和RENAME函数通过RecordRef修改记录。请注意,可以使用TRUE或FALSE参数运行它们,
以在适当的表中触发OnInsert / OnModify / OnDelete / OnRename触发器。 若要访问RecordRef变量中记录的字段,您必须使用FieldRef。
FieldRef基本上类似于Record变量中的字段,但是进行了一些特殊的更改以处理可能随时存在的事实。 有两种使用FieldRef访问记录字段的方法。
您可以使用RecordRef.FIELDINDEX函数将字段加载到FieldRef中,也可以使用RecordRef.FIELD函数。
FIELDINDEX要求您按照字段在表中的显示顺序进行输入-第一个字段为1,第二个字段为2,依此类推,无论基础表中的字段号属性如何。
FIELD要求您从基础表中输入Field No.属性。您可以通过访问任何记录变量的FIELDNO属性并为其输入字段名称来找到字段的字段编号。
如果要查看记录变量中的所有字段,则可以使用整数计数器和RecordRef.FIELDCOUNT属性将它们与RecordRef.FIELDINDEX一起加载。
如果要查看特定字段,请使用RecordRef.FIELD。 可以使用FieldRef.VALUE属性读取或写入FieldRef变量。 FieldRef.VALUE的数据类型是一个变体
,因此您可以向其写入任何有效的NAV数据类型。 您可以使用FieldRef.SETRANGE和FieldRef.SETFILTER在RecordRef上设置过滤器。
您也可以使用RecordRef.RESET清除RecordRef变量上的所有过滤器。 对于NAV中的常规Record变量,可以将GET函数与主键值一起使用以从数据库中获取特定记录。
但是,您必须使用一种称为RecordID的特殊类型的变量,才能从数据库中获取RecordRef的特定记录。
RecordID是经过特殊编码的值,其中包含RecordRef变量的主键。 您可以使用RecordRef.RECORDID函数为RecordRef变量找到它。
如果要从Record变量中获取RecordID以便与RecordRef一起使用,则需要首先通过使用RecordRef.GETTABLE并将该Record变量输入,将Record变量转换为RecordRef。
这是我用RecordRef和FieldRef编写的一个示例代码单元,该代码单元将比较两个不同的记录,并在有任何差异时向您发送消息。 如果要检查记录是否已更改并相应地更新某些内容,则可能需要使用类似的内容。
OnRun()
Cust.GET('10000');
Cust2.GET('10000');
Cust2.Name := 'Changed';
CLEAR(RecRefCust1);
RecRefCust1.GETTABLE(Cust);
CLEAR(RecRefCust2);
RecRefCust2.GETTABLE(Cust2);
RecordCompare(RecRefCust1,RecRefCust2);
RecordCompare(RecRef1 : RecordRef;RecRef2 : RecordRef)
ChangesMade := FALSE;
lCounter := 1;
REPEAT
CLEAR(FldRef1);
FldRef1 := RecRef1.FIELDINDEX(lCounter);
CLEAR(FldRef2);
FldRef2 := RecRef2.FIELDINDEX(lCounter);
ChangesMade := (FldRef1.VALUE <> FldRef2.VALUE);
lCounter += 1;
UNTIL ChangesMade OR (lCounter > RecRef1.FIELDCOUNT);
IF ChangesMade THEN BEGIN
MESSAGE('The records do not match.');
END ELSE BEGIN
MESSAGE('The records are the same.');
END;