代码之家  ›  专栏  ›  技术社区  ›  Akedren

使用RecordRef处理多个表

  •  0
  • Akedren  · 技术社区  · 9 年前

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

    我相信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 回复  |  直到 9 年前
        1
  •  1
  •   Mak Sim    9 年前

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

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

    然后从记录变量调用它

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

    我相信这是普遍的做法。

        2
  •  1
  •   Jake Edwards    9 年前

    你是说“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;