使用RecordRef处理多个表

时间:2016-01-21 20:26:38

标签: microsoft-dynamics dynamics-nav

我有一组表,我需要整数键,我希望能够将它们中的任何一个传递到一个表中,并获得该键的下一个值。

我相信RecordRef是这样做的方法,但到目前为止代码似乎并不合适。

我正在尝试构建一个函数,该函数将获取一个表记录,然后返回一个整数值,该整数值将成为主键的下一个记录。 IE:如果最后一个记录的密钥是62825,则该函数将返回62826。

FunctionA
BEGIN
  Id := GetNextId(SalesRecord);  //Assignment not allowed
END;

FunctionB
BEGIN
  Id := GetNextId(CreditMemoRecord);  //Assignment not allowed
END;

GetNextId(pTableReference: RecordRef) rNextId : Integer
BEGIN
  CASE pTableReference.NUMBER OF
    DATABASE::SalesRecord: BEGIN
      //Find last Record
      pTableReference.FINDLAST;
      lFieldRef := pTableReference.FIELD(1); //Set to the PK field
    END;
    DATABASE::CreditMemoRecord: BEGIN
      //Find last Record
      pTableReference.FINDLAST;
      lFieldRef := pTableReference.FIELD(10); //Set to the PK field
    END;
    ... //do more here
  END; //CASE

  EVALUATE(rNextId,FORMAT(lFieldRef.VALUE)); //Get the integer value from FieldRef
  rNextId := rNextId + 1; //Add one for the next value
  EXIT(rNextId);  //return the value
END;  

使用此代码我收到错误“此变量不允许分配”。关于对GetNextId的函数调用

表结构的想法:

Table - SalesRecord
FieldId, Fieldname, Type, Description
1 id integer PK
2 text1 text(30)
3 text2 text(30)
4 dec1 decimal
5 dec2 decmial

Table - CreditMemoRecord
FieldId, Fieldname, Type, Description
10 id integer PK
20 text1 text(30)
30 text2 text(30)
40 dec1 decmial
50 dec2 decmial

2 个答案:

答案 0 :(得分:1)

你的意思是" GetNextValue"得到下一个记录?我不太了解你的用例。

如果要传递通用记录,那么您将要使用VARIANT数据类型。这是一个通配符类型,它将接受来自任何表的记录,并允许您从任何表返回记录。

这是未经测试的,但希望能让您了解它们的工作原理;

LOCAL NextRecord(VAR RecVariant : Variant)

IF RecVariant.ISRECORD THEN BEGIN
  RecRef.GETTABLE(RecVariant);

  // RecRef.NUMBER is useful for Database::"Customer" style comparisons

  RecRef.NEXT;
  RecRef.SETTABLE(RecVariant); // Might not be necessary

END;

答案 1 :(得分:1)

只需将这样的函数放在两个表中

GetNextId() rNextId : Integer
BEGIN
  RESET;
  FINDLAST;
  EXIT(id+1);
END;

然后从记录变量

中调用它
FunctionA
BEGIN
  Id := SalesRecord.GetNextId();
END;

FunctionB
BEGIN
  Id := CreditMemoRecord.GetNextId();
END;

这是我认为的常见做法。