How to get field value

asereb

New Member
I need to compare two records (field by field) to see if
any changes has been made.

To accomplish this, I retrieved field names from the table using Metaschema fields (_field-name) and then
stored field name in the variable.

How I can retrive actual field value using variable that holding field name?

Alex Serebrenik
aserebre@wilsontool.com
 

Chris Kelleher

Administrator
Staff member
Here's a procedure I use to compare two records, field by field:

Code:
PROCEDURE CheckChanged:

  /* Temp buffers to place our before and after records into */
  DEFINE BUFFER bBuffer1 FOR table-name.
  DEFINE BUFFER bBuffer2 FOR table-name.

  IF NOT(AVAILABLE(bBuffer1)) OR NOT(AVAILABLE(bBuffer2)) THEN 
     RETURN ERROR.
  
  /* Handles for our two records */   
  DEFINE VARIABLE hBeforeHandle AS HANDLE    NO-UNDO.
  DEFINE VARIABLE hAfterHandle  AS HANDLE    NO-UNDO.
  
  /* Output record displays to /dev/null */  
  IF OPSYS EQ "UNIX":U THEN
    OUTPUT STREAM sNull TO /dev/null.
  ELSE
    OUTPUT STREAM sNull TO NUL.

  DISPLAY STREAM sNull bBuffer1 WITH FRAME fBefore WIDTH 255.
  DISPLAY STREAM sNull bBuffer2 WITH FRAME fAfter  WIDTH 255.

  OUTPUT STREAM sNull CLOSE.

  ASSIGN
    hBeforeHandle = FRAME fBefore:HANDLE      /* Frame handle */
    hBeforeHandle = hBeforeHandle:FIRST-CHILD /* Field group handle */
    hBeforeHandle = hBeforeHandle:FIRST-CHILD /* First field's handle */
    hAfterHandle  = FRAME fAfter:HANDLE
    hAfterHandle  = hAfterHandle:FIRST-CHILD
    hAfterHandle  = hAfterHandle:FIRST-CHILD.

  HandleLoop:
  REPEAT:

    IF hBeforeHandle:NAME NE ? THEN 
    DO:
      /* Did our values change */
      IF hBeforeHandle:SCREEN-VALUE NE hAfterHandle:SCREEN-VALUE THEN
      DO:

      END.
    END.

    /* Do we have any more fields to check? */
    IF hBeforeHandle:NEXT-SIBLING EQ ? THEN
      LEAVE HandleLoop. 

    /* If so, Get the next field */
    ASSIGN
      hBeforeHandle = hBeforeHandle:NEXT-SIBLING
      hAfterHandle  = hAfterHandle:NEXT-SIBLING.

  END.

END PROCEDURE.
 
Top