使用 RecordRef 处理多个表

Using RecordRef to Work with Multiple Tables

我有一组 table 需要从中获取整数键,我希望能够将它们中的任何一个传入单个并获取键的下一个值。

我相信 RecordRef 是执行此操作的方法,但到目前为止的代码似乎不太正确。

我正在尝试构建一个函数,它将接受 table 记录,然后 return 一个整数值,该整数值将是主键的下一个记录。 IE:如果最后一条记录的键是 62825 函数将 return 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

的函数调用中收到错误 "Assignment is not allowed for this variable."

Table 结构的想法:

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

你是说"GetNextValue"获取下一条记录?我不太明白你的use-case.

如果要传递通用记录,则需要使用 VARIANT 数据类型。这是一个通配符类型,它将接受来自任何 table 的记录,并允许您 return 来自任何 table.

的记录

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

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;

把这样的函数放在两个表中就可以了

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

然后从记录变量中调用它

FunctionA
BEGIN
  Id := SalesRecord.GetNextId();
END;

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

我相信这是常见的做法。