Hello World (using database, display file and RPG)

From Try-AS/400
Revision as of 21:25, 23 February 2020 by PoC (talk | contribs) (Reworked first few paragraphs)
Jump to navigation Jump to search
Qsicon Fixme.png This article isn't finished yet or needs to be revised. Please keep in mind that thus it may be incomplete.

Reason: Rephrase, reformat, set links and wade out unneccessary stuff.

This project will show you how to create the minimal components of a runnable application:

  • a database file,
  • a display file and
  • a program to show the content, in ILE RPG.

This could have been done more easily[1], but Heiko wanted to use these standard approach particular features to learn how to do this.

To start, a basic knowledge about AS/400 concepts and how to edit files is mandatory.

By the way: Don't bother about string cases. The AS/400 won't either. Using capital commands and names just makes it more readable in this article.

Creating a physical file to hold the sources

On most systems, every user has a personal library, just like a home in a Linux environment. Multiple libraries coexist, the current (= default for all operations) is stored in the special value *CURLIB[2], just like you are used to a cwd, current working directory in common operating systems with command lines.

Because the value of *CURLIB can be changed by the screen you are currently working in, all following commands will contain my personal library name HKRETSCHME. If you are sure *CURLIB is set correctly, you can usually omit the library.

This command creates a source physical file named HELLO01 which is about to contain all the source "files" (called "members"):

CRTSRCPF FILE(HKRETSCHME/HELLO01) RCDLEN(112) TEXT('Project Hello World')

I prefer to do this with prompting, which I'd recommend to every beginner:

CRTSRCPF

If you don't supply any arguments for this command (or press F4 instead of Enter), you will be presented with a form for helping you find the right parameters. HelloWorld01CRTSRCPF.png

Using no parameters to bring up the prompt screen works great for CRTSRCPF, but in general, OS/400 will only ask for necessary arguments. Some commands, like CHGUSRPRF will just do nothing, because there was nothing to change.

A small detour: "Physical Files"?

Heiko struggled a lot with this and thinks a small introduction is necessary:

  • Libraries: Every user has his own personal library, think of it like a Linux home directory. Details
  • Physical Files: Of course this is no physical file and you can't touch it. And don't think of if (like I as a german[3] do) as one file (f.e. /etc/passwd), it's more like an collection of informations, like you might know from MacOS resources.
  • Members: A member is a file in an physical file, like a book in a filing box. Members of a physical file share the given structure of the PF. Record structure, field lengths, etc.

A more visal approach of explaining:[4]
PhysicalFileOrWhat.png

The Library is the room you keep your Physical Files (like filing boxes) in. The Physical Files contain Members (like books) but must be the same size (okay, a crude explanation for the "must share structure" approach).

  • You can have as much rooms, filing boxes and books as you want.
  • But you can't put rooms in rooms, boxes in boxes or books in books[5].
  • The AS/400 has no tree-like storage structure, it is just a list (of Libraries) with a limited depth (Physical Files and Members) to unfold:
    PhysicalFileList.png

Creating the database

The procedure is as follows:

  • Create a text file (called DDS) describing the database
  • Compile it into a database physical file

Creating the DDS

The textual description of a database is called DDS. You can learn more here about DDS and here about the DDS format and database fields.

  • Input this to work with our just created Source Physical File:
    Hello01wrkmbrpdm01.png
    wrkmbrpdm file(hkretschme/hello01)
  • Hit F6 to create a new member:
    Hello01wrkmbrpdm01a.png
  • This will run STRSEU:
    (Input member name and type PF)
    Hello01wrkmbrpdm02.png
  • Which brings you to SEU:
    (Enter text as shown)
        ***************** Datenanfang *******************************************************************************************
0001.00      A          R MESSAGES                                                                               191001           means: Add[6] Record named MESSAGES
0002.00      A            TEXT          42A                                                                      191001           means: Add field named TEXT with 42 bytes of Ascii.
0003.00      A          K TEXT                                                                                   191010           means: Make the field TEXT the key.
        ******************Datenende *********************************************************************************************
  • Enter Y (here: J) to save the member.
    Hello01wrkmbrpdm04.png
    After saving, check the lower lines for messages. If there is a synthax error, return to SEU and check every line.
    Hint: Use F4 and F1 for assistance while coding!

Creating the database physical file

  • While working with PDM, enter 14 to compile the database.
    Hello01wrkmbrpdm05.png
  • The compiling will be queued…
    Hello01wrkmbrpdm06.png
  • …and you have to check with DSPMSG whether it was successful or not[7]

Hint: Checking my messages with DSPMSG only showed me it wouldn't compile. No error message or any other useful information. If you run into trouble, double check your DDS in SEU, using F4 on every single line. And remember the AS/400 is picky. Even an empty line is enough cause to abort compilation.

  • If compilation worked out, you can see your compiled database physical file here:
    wrklib + <F4>
  • Enter 5 to show contents of your library
  • And here it is:
    Hello01wrkmbrpdm10.png
    It is named HELLO, named after the DDS Member we compiled[8].

Insert content into the database

  • STRSQL + F4
    • Enter the library name, in this example HKRETSCHME[9]
  • In the interactive SQL session, enter: INSERT INTO HELLO (TEXT) VALUES ('Hello World!')
  • There are many ways to display the result:
    • If you're still in STRSQL, enter: SELECT * FROM HELLO
    • On command line, try this: DSPF FILE(HKRETSCHME/HELLO)

Display the content

Create a display file

A Display File (device) is a template for displaying your content.

  • Read this and this about creating Display Files (DSPF)
  • CRTDSPF followed by F4
    • Enter target file and library (I used: HELLODSP, HKRETSCHME), which will result in a newly created Display File named HELLODSP)
    • Enter source file, library and DDS member (in this example: HELLO01, HKRETSCHME and HELLO)
    • Press ⏎
  • Then I ran into an problem: The DSPF wasn't created and I couldn't locate the error message. Depending on your system's configuration you will find them in your Print-Queue (use WRKOUTQ!), or even printed out on a printer.

After some hours, I got it right:

   Spalten . . . :    1 100                                     Editieren                                          HKRETSCHME/HELLO01 
   SEU==>                                                                                                                   HELLODSPF
   FMT DP .....AAN01N02N03A.Name++++++RLängeDDsFZeiPosFunktionen++++++++++++++++++++++++++ ...+... 9 ...+... 0                       
       ***************** Datenanfang *******************************************************************************************  
  0001.00                                             REF(HKRETSCHME/HELLO)                                        191007             
  0002.00      A          R MESSAGES_                                                                              191007             
  0003.00      A            TEXT      R   42A  O  5  3                                                             191007             
          ******************Datenende *********************************************************************************************   

I copied the DDS Member to a new Member named HELLODSPF, changed the type to DSPF, and added the red characters. Explanation:

  • the first row to indicate this refers to a database physical file[10]
  • the record is named slightly differently than in the DDS, using a trailing _.
  • R to mark this field als reference[11]
  • O to mark this field als output[12]
  • 5 3 to locate the field in row 5, column 3 of the output screen[13]

If you struggle with the positions of the keywords, have a look at IBM's DDS Reference (PDF) (I used Version 4), the 708 pages are packed with great screenshots and explanations.

Finally, 14 to compile XOR CRTDSPF FILE(HKRETSCHME/HELLODSP) SRCFILE(HKRETSCHME/HELLO01) SRCMBR(HELLODSPF) worked out:
HelloWorldCRTDSPFOK.png

Create the program

Now it's getting clear, that the whole design follows the MVC Paradigma:

  • Database Physical File => Model
  • Display File => View
  • Program[14] => Controller

You can create programs in many languages: CL, REXX, C, COBOL and most commonly used, RPG.

Let's create a RPG:

  • WRKMBRPDM
  • Press F6 to create a new RPGLE file called HELLORPG
  • Enter this code:
        ***************** Datenanfang *******************************************************************************************
0001.00 F* Program for reading one row from database and write it do display                                191008               
0002.00 FHELLO     IF   E           K DISK                                         Def. DB PF               191010               
0003.00 FHELLODSPF CF   E             WORKSTN                                      Def. DSPF                191010               
0004.00 C                   READ      MESSAGES                                     Read 1 row               191010               
0005.00 C                   WRITE     MESSAGES_                                    Print 1 row              191010               
0006.00 C                   READ      MESSAGES_                                    Wait for input (key)     191010               
0007.00 C                   RETURN                                                 End program              191008               
       ******************Datenende *********************************************************************************************
  • Use 14 to compile>[15]

Run the program

  • Enter CALL HKRETSCHME/HELLORPG:
    HelloWorldRPGFinallyDone.png

We did it! \o/




  1. e. g. with Hello World (using C)
  2. About the Current Library: https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_71/rzarl/rzarlcurlib.htm
  3. Yes, as a german IT guy you think of "file" as "Datei". But "file" in english can also mean "Akte" or "Karton mit Akten". Sorry for Kauderwelsch.
  4. I'm not good at drawing...
  5. And as you may have guessed, you can't put rooms in boxes, boxes in books…
  6. I know, A stands alphanumeric. But Add is no much better to remember. :)
  7. Can anyone tell me how this is done synchronously? Performance isn't an issue any more…
  8. If we had chosen the same name for the member as for the source physical file, the PDM would have asked, if I'd want to overwrite the source physical file with the compiled database. Naming the member differently avoided this. This has the advantage that the DDS member remains for later use.
  9. Shortcut: STRSQL LIBOPT(HKRETSCHME)
  10. Beginning with column 45
  11. Column 29
  12. Column 38
  13. Row: 39-41, column: 42-44
  14. Short: PGM
  15. If it doesn't check DSPSMG and, most importantly, your queues with WRKOUTQ. In my case, the compilation reports will be filed as PDF in my home.