Modifying field value which is in setrange
law
Member Posts: 19
I wrote the following code:
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?
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?
0
Comments
-
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 message0 -
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.0 -
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;0
Categories
- All Categories
- 75 General
- 75 Announcements
- 66.7K Microsoft Dynamics NAV
- 18.8K NAV Three Tier
- 38.4K NAV/Navision Classic Client
- 3.6K Navision Attain
- 2.4K Navision Financials
- 116 Navision DOS
- 851 Navision e-Commerce
- 1K NAV Tips & Tricks
- 772 NAV Dutch speaking only
- 611 NAV Courses, Exams & Certification
- 2K Microsoft Dynamics-Other
- 1.5K Dynamics AX
- 253 Dynamics CRM
- 103 Dynamics GP
- 6 Dynamics SL
- 1.5K Other
- 991 SQL General
- 383 SQL Performance
- 34 SQL Tips & Tricks
- 28 Design Patterns (General & Best Practices)
- Architectural Patterns
- 9 Design Patterns
- 4 Implementation Patterns
- 53 3rd Party Products, Services & Events
- 1.6K General
- 1K General Chat
- 1.6K Website
- 77 Testing
- 1.2K Download section
- 23 How Tos section
- 249 Feedback
- 12 NAV TechDays 2013 Sessions
- 13 NAV TechDays 2012 Sessions