Q: I have two programs that use the same file, and one program calls the other. The second (called) program does some work on the file and then returns to the first program. When it returns, the keys for the file point to the next record, but the field data is from the original record. What is going on?
A: It sounds like you are having trouble with shared open data paths (ODPs). When you tell DB2/400 (also known as DB2 for OS/400) to share ODPs, it will open a file once; then, any programs in the call stack that refer to the file will use the same data path. This means that, when a called program changes the current record, the record pointer will point to the new current record when it returns.
ODPs are often shared for performance and memory reasons. Reducing the number of files that your application opens and sharing these open files can have a significant effect on performance.
You can overcome this using many different techniques. If you don't want to share ODPs, change the file or override it to SHARE(*NO). If you do want to share data paths, you can save any key values before you call a program that uses the file and reposition the file when the program returns. An alternative technique is to just be sure your key values can't be changed by another program, and then reread the file with these values before you use any data from the file.
- Brian Singleton