Now, let's do something a little more practical as an example. Have you ever had someone ask if a report can be sent to their PC, instead of printed? Here's an example of doing that with a stream file.
Since the files that a report would typically be printed off of are not a standard part of OS/400, I decided to make a report by listing the objects in a given library. The library will be a parameter.
It might be a good exercise for you to create your own report. Use mine as a sample, but take a report that's commonly used in your company, and convert it to write a text file as well as the printer output.
Anyway, here's the code:
* CH5LIBLIST: Example of a report in ASCII text format * (From Chap 5) * * To compile: * CRTBNDRPG CH5LIBLIST SRCFILE(xxx/QRPGLESRC) DBGVIEW(*LIST) * H DFTACTGRP(*NO) ACTGRP(*NEW) BNDDIR('QC2LE') BNDDIR('IFSTEXT') FQADSPOBJ IF E K DISK USROPN D/copy IFSEBOOK/QRPGLESRC,IFSIO_H D/copy IFSEBOOK/QRPGLESRC,ERRNO_H D/copy IFSEBOOK/QRPGLESRC,IFSTEXT_H D Cmd PR ExtPgm('QCMDEXC') D command 200A const D len 15P 5 const D FmtDate PR 10A D mmddyy 6A const D fd S 10I 0 D line S 100A D len S 10I 0 D LineNo S 10I 0 c *entry plist c parm MyLib 10 C********************************************************* C* Create a file containing the objects we wish to report C********************************************************* C callp cmd('DSPOBJD OBJ('+%trim(MyLib)+'/*ALL)'+ C ' OBJTYPE(*ALL) OUTPUT(*OUTFILE) ' + C ' OUTFILE(QTEMP/QADSPOBJ) ' + C ' OUTMBR(*FIRST *REPLACE)': 200) C********************************************************* C* Open the list of objects: C********************************************************* c callp cmd('OVRDBF FILE(QADSPOBJ) TOFILE(' + c 'QTEMP/QADSPOBJ)': 200) c open QADSPOBJ C********************************************************* C* Open a stream file to write report to: C********************************************************* c eval fd = open('/ifstest/object_report.txt': c O_CREAT+O_TRUNC+O_CODEPAGE+O_WRONLY: c S_IRWXU+S_IRWXG+S_IROTH: 819) c if fd < 0 c callp die('open(): ' + %str(strerror(errno))) c endif c callp close(fd) c eval fd = open('/ifstest/object_report.txt': c O_TEXTDATA+O_WRONLY) c if fd < 0 c callp die('open(): ' + %str(strerror(errno))) c endif C********************************************************* C* Create the report C********************************************************* c exsr Heading c read QADSPOBJ c dow not %eof(QADSPOBJ) c exsr WriteObj c read QADSPOBJ c enddo C********************************************************* c* Clean up and exit C********************************************************* c callp close(fd) c close QADSPOBJ c callp cmd('DLTOVR FILE(QADSPOBJ)': 50) c callp cmd('DLTF QTEMP/QADSPOBJ': 50) c eval *inlr = *on C*=============================================================== C* Write a heading on the report C*=============================================================== CSR Heading begsr C*------------------------ C* x'0C' = Form Feed C eval line = x'0c' c eval len = 1 c callp writeline(fd: %addr(line): len) C eval line = 'Listing of objects in ' + c %trim(MyLib) + ' library' c eval len = %len(%trimr(line)) c callp writeline(fd: %addr(line): len) c eval line = *blanks c eval len = 0 c callp writeline(fd: %addr(line): len) c eval line = 'Object Name' c eval %subst(line: 15) = 'Object Type' c eval %subst(line: 30) = 'Object Size' c eval %subst(line: 45) = 'Last Modified' c eval %subst(line: 60) = 'Last Used' c eval len = %len(%trimr(line)) c callp writeline(fd: %addr(line): len) c eval line = '-----------' c eval %subst(line: 15) = '-----------' c eval %subst(line: 30) = '-----------' c eval %subst(line: 45) = '-------------' c eval %subst(line: 60) = '---------' c eval len = %len(%trimr(line)) c callp writeline(fd: %addr(line): len) c eval LineNo = 5 C*------------------------ csr endsr C*=============================================================== C* Add an object to the report C*=============================================================== CSR WriteObj begsr C*------------------------ c if LineNo > 60 c exsr Heading c endif c eval Line = odObNm c eval %subst(line: 15) = odobtp c eval %subst(line: 30) = %editc(odobsz:'L') c eval %subst(line: 45) = FmtDate(odldat) c eval %subst(line: 60) = FmtDate(odudat) c eval len = %len(%trimr(line)) c callp writeline(fd: %addr(line): len) c eval LineNo = LineNo + 1 C*------------------------ csr endsr *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * Format a date into human-readable YYYY-MM-DD format: *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ P FmtDate B D FmtDate PI 10A D mmddyy 6A const D Temp6 S 6 0 D TempDate S D D Temp10 S 10A C* If date isn't a valid number, return *blanks c testn mmddyy 99 c if *in99 = *off c return *blanks c endif C* If date isn't a valid MMDDYY date, return *blanks c move mmddyy Temp6 c *mdy test(de) Temp6 c if %error c return *blanks c endif C* Convert date to ISO format, and return it. c *mdy move Temp6 TempDate c *iso move TempDate Temp10 c return Temp10 P E /DEFINE ERRNO_LOAD_PROCEDURE /COPY IFSEBOOK/QRPGLESRC,ERRNO_H