Here is the scenario:
By submitting your email address, you agree to receive emails regarding relevant topic offers from TechTarget and its partners. You can withdraw your consent at any time. Contact TechTarget at 275 Grove Street, Newton, MA.
You are a new programmer or consultant and you are assigned a seemingly simple change to an existing program. With your skills it will be a piece of cake. What is the first thing you do? You have to find the source.
Let's make it even more fun and say that the previous programmer(s) left two weeks before you arrived and left vague notes that seem to be printed out with a DBCS font. Apparently there are multiple versions or source in various libraries on the system. Never fear, one thing you can do is use the DSPPGM command (if it's a program). But that does not guarantee the source is there. Maybe the program was compiled on another machine and moved over, maybe the source file has moved or been deleted (in which case you are out of luck, but you would hate to go looking for something that isn't there.) And if it's a display file, forget about finding an easy way to pinpoint the source by looking at the compiled object.
At this point I could probably make a good advertisement for my favorite 'for profit' utility "Pathfinder" by Hawkeye Information Systems, but if you are a consultant you have to be a little more self-sufficient and not always count on your quality utility to be there for you. Remember, there are no answers on the certification test that you can write "just use Hawkeye".
Now what? Endless hours of hunting in each source file you happen to stumble across? Well, if you are like me you think there must be a more logical approach, and you would rather just take the time to find out where the entire source is anyway. Which is going to save you tons of time in the future, and maybe even make you a hero.
Yes, there is something you can do. I created an outfile of all source members by using a simple command and a query tool to filter just the 'source' from my initial findings.
First try "DSPPGM PROGNAME". Look for the source file parameter in the display. See if the source is really there.
If you can't find the source and it's a CL program, you can always RTVCLSRC to get the code (without those helpful comments).
Finally, here is what I did:
1. Source members actually exist in physical files, so you can list information on all physical files and the source files will be in there. Do this by executing the following command -- in batch would be a good idea.
DSPFD FILE(*ALLUSR/*ALL) TYPE(*MBRLIST) OUTPUT(*OUTFILE) FILEATR(*PF) OUTFILE(QGPL/SOURCEMBR)
2. Now you have an outfile named 'SOURCEMBR' with some 32 fields of information in it. One of those fields is MLSEU, which is the "Source Type" field. (There is also an MLSEU2 field for S/38 code) You can filter your selections even further by using your favorite query method of SQL, IBM Query, OPNQRYF, or even CPYF to select field MLSEU not equal to blanks:
OPNQRYF FILE((QGPL/SOURCEMBR)) QRYSLT('MLSEU *NE " "')
You would want to sort by the MLNAME field which is the source member name.
Now you have a file listing of every source member name and the library it exists in. You can now pinpoint EXACTLY where the source is, and if there are multiple copies it will help you determine which is most current. There is other information in this file and I've listed the fields below. You can see how many records (MLNRCD) in the source file as well as the last change date (MLCHGD). Here is a field listing:
Field Name Field Description MLRCEN Retrieval century: 0=19x MLRDAT Retrieval date: year/mont MLRTIM Retrieval time: hour/minu MLFILE File MLLIB Library MLFTYP P=PF, L=LF, R=DDM PF, S=D MLFILA File attribute: *PHY or * MLMXD Reserved MLFATR File attribute: PF, LF, MLSYSN System Name (Source Syste MLASP Auxiliary storage pool ID MLRES Reserved MLNOMB Number of members MLNAME Member MLNRCD Current number of records MLNDTR Number of deleted records MLSIZE Data space and index size MLSEU Source type for S/38 View MLCCEN Member creation century: MLCDAT Member creation date: yea MLCHGC Last change century: 0=19 MLCHGD Last change date: year/mo MLCHGT Last change time: hour/mi MLMTXT Text 'description' MLSEU2 Source type MLUCEN Last Used Century: 0=19xx MLUDAT Last Used Date: year/mont MLUCNT Days Used Count MLTCEN Usage Data Reset Century: MLTDAT Usage Data Reset Date: ye MLSIZ2 Data Space and Index size MLSTFR Member storage freed Y=Ye
One additional tip: I had multiple iSeries' and was able to do this on each machine, then FTP'd the files to one machine where they were combined and then queried. There is another field in the SOURCEMBR file called MLSYSN, which is the system name.
Good luck! Hope this helps you all out there! - Jeff
MORE INFORMATION ON THIS TOPIC
The Best Web Links: tips, tutorials and more.
Ask your programming questions--or help out your peers by answering them--in our live discussion forums.
Ask the Experts yourself: Our application development gurus are waiting to answer your programming questions.