Modifying field value which is in setrange

lawlaw Member Posts: 19
I wrote the following code:
rTable.SETCURRENTKEY(Ready);
rTable.SETRANGE(Ready,FALSE);
IF rTable.FIND('-') THEN
  REPEAT

    IF {condition} THEN BEGIN
      rTable.Ready:=TRUE;
      rTable.MODIFY;
    END;

  UNTIL rTable.NEXT=0;

After modifying the first record, the until condition is true, so this code doesn't iterate through the range (MODIFY do a refresh?).
Is there a solution other than declaring an other record type variable, GET the wanted record and modify through this variable?

Comments

  • SteveOSteveO Member Posts: 164
    The problem you're experiencing is that you are changing the value of the field that you are sorting on. If the table isn't too big record wise then it shouldn't really effect performance if you use a different key.

    You could also try using the MODIFYALL function but in order to so this you would have to make your condition into a filter. This would save you having to loop through the table.

    Another solution is to use the MARK function and then filter on MARKEDONLY

    rTable.SETCURRENTKEY(Ready);
    rTable.SETRANGE(Ready,FALSE);
    IF rTable.FIND('-') THEN
    REPEAT
    rTable.MARK := {condition}
    UNTIL rTable.NEXT=0

    rTable.SETCURRENTKEY(Some other key);
    rTable.SETRANGE(Ready);
    rTable.MARKEDONLY(TRUE);
    IF rTable.FIND('-') THEN
    REPEAT
    rTable.Ready:=TRUE;
    rTable.MODIFY;
    UNTIL rTable.NEXT = 0;
    This isn't a signature, I type this at the bottom of every message
  • kvbkvb Member Posts: 107
    law wrote:
    I wrote the following code:
    rTable.SETCURRENTKEY(Ready);
    rTable.SETRANGE(Ready,FALSE);
    IF rTable.FIND('-') THEN
      REPEAT
    
        IF {condition} THEN BEGIN
          rTable.Ready:=TRUE;
          rTable.MODIFY;
        END;
    
      UNTIL rTable.NEXT=0;
    

    Try this:
    rTable.SETCURRENTKEY(Ready);
    rTable.SETRANGE(Ready,FALSE);
    IF rTable.FIND('-') THEN
      REPEAT
    
        IF {condition} THEN BEGIN
          rTable2.GET(rTable.KeyField);
          rTable2.Ready:=TRUE;
          rTable2.MODIFY;
        END;
    
      UNTIL rTable.NEXT=0;
    

    The hint is to use 2 record variables.
    One to cycle through and to check your condition and another to modify.
  • fbfb Member Posts: 246
    Or, you could do this...
    rTable.SETCURRENTKEY(Ready); 
    rTable.SETRANGE(Ready,FALSE); 
    IF rTable.FIND('-') THEN 
      REPEAT 
    
        IF {condition} THEN BEGIN 
          rTable.Ready:=TRUE; 
          rTable.MODIFY; 
          rTable.Ready := FALSE; // reset for NEXT's sake...
        END; 
    
      UNTIL rTable.NEXT=0;
    
Sign In or Register to comment.