Working With RecordRef Variables In Microsoft Dynamics NAV

当您不必知道要处理的记录或字段时,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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值