使用 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;
我相信这是常见的做法。
我有一组 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;
我相信这是常见的做法。