This guideline is very simple, yet it will allow LANSA programs to be completed more quickly and accurately.

When working on the code of a specific RDML function, always attempt to use a "top down" approach to coding. For instance, you may be given a program "specification" which looks like this:

  • Repeat until program terminated at user request
    • Get the user to input an order number
    • Get details of the order, and handle record not found
    • Get details of all the order lines
    • Display the order details and the line details

You must now "translate" this specification into the LANSA rapid development language.

With a structured (or organized) approach to coding, the program will follow similar steps to the example below.

Note how the arrow --> is used to indicate the new lines inserted in each step:

Step 1

     --> ********** Do until terminated by EXIT or MENU key
    --> BEGIN_LOOP
    --> END_LOOP

Step 2

         ********** Do until terminated by EXIT or MENU key
        BEGIN_LOOP
    --> ********** Request order number input until order is found
    --> ********** Build a list of all order lines
    --> ********** Display the order and its lines to the user
        END_LOOP

Step 3

         ********** Do until terminated by EXIT or MENU key
        BEGIN_LOOP
        ********** Request order number until order is found
    --> DOUNTIL    COND('#IO$STS = OK')
    --> ENDUNTIL
        ********** Build a list of all order lines
        ********** Display the order and its lines to the user
        END_LOOP

Step 4

         ********** Do until terminated by EXIT or MENU key
        BEGIN_LOOP
        ********** Request order number until order is found
        DOUNTIL    COND('#IO$STS = OK')
        ENDUNTIL
        ********** Build a list of all order lines
    --> CLR_LIST   NAMED(#LINES)
    --> SELECT     FIELDS(#LINES) FROM_FILE(ORDLIN) WITH_KEY(#ORDNUM)
    --> ENDSELECT
        ********** Display the order and its lines to the user
        END_LOOP

Step 5

         ********** Do until terminated by EXIT or MENU key
        BEGIN_LOOP
        ********** Request order number until order is found
        DOUNTIL    COND('#IO$STS = OK')
        ENDUNTIL
        ********** Build a list of all order lines
        CLR_LIST   NAMED(#LINES)
        SELECT     FIELDS(#LINES) FROM_FILE(ORDLIN) WITH_KEY(#ORDNUM)
        ENDSELECT
        ********** Display the order and its lines to the user
    --> DISPLAY    FIELDS(#HEADER) BROWSELIST(#LINES)
        END_LOOP

Step 6

         ********** Do until terminated by EXIT or MENU key
        BEGIN_LOOP
        ********** Request order number until order is found
        DOUNTIL    COND('#IO$STS = OK')
    --> ********** Request user inputs an order number
    --> ********** Attempt to locate the order
    --> ********** Issue message if order was not found
        ENDUNTIL
        ********** Build a list of all order lines
        CLR_LIST   NAMED(#LINES)
        SELECT     FIELDS(#LINES) FROM_FILE(ORDLIN) WITH_KEY(#ORDNUM)
        ENDSELECT
        ********** Display the order and its lines to the user
        DISPLAY    FIELDS(#HEADER) BROWSELIST(#LINES)
        END_LOOP

Step 7

         ********** Do until terminated by EXIT or MENU key
        BEGIN_LOOP
        ********** Request order number until order is found
        DOUNTIL    COND('#IO$STS = OK')
        ********** Request user inputs an order number
        REQUEST    FIELDS(#ORDNUM)
        ********** Attempt to locate the order
    --> FETCH      FIELDS(#HEAD) FROM_FILE(ORDMST) WITH_KEY(#ORDNUM)
        ********** Issue message if order was not found
        ENDUNTIL
        ********** Build a list of all order lines
        CLR_LIST   NAMED(#LINES)
        SELECT     FIELDS(#LINES) FROM_FILE(ORDLIN) WITH_KEY(#ORDNUM)
        ENDSELECT
        ********** Display the order and its lines to the user
        DISPLAY    FIELDS(#HEADER) BROWSELIST(#LINES)
        END_LOOP

Step 8

         ********** Do until terminated by EXIT or MENU key
        BEGIN_LOOP
        ********** Request order number until order is found
        DOUNTIL    COND('#IO$STS = OK')
        ********** Request user inputs an order number
        REQUEST    FIELDS(#ORDNUM)
        ********** Attempt to locate the order
        FETCH      FIELDS(#HEAD) FROM_FILE(ORDMST) WITH_KEY(#ORDNUM)
        ********** Issue message if order was not found
    --> IF_STATUS  WAS_NOT(*OKAY)
    --> ENDIF
        ENDUNTIL
        ********** Build a list of all order lines
        CLR_LIST   NAMED(#LINES)
        SELECT     FIELDS(#LINES) FROM_FILE(ORDLIN) WITH_KEY(#ORDNUM)
        ENDSELECT
        ********** Display the order and its lines to the user
        DISPLAY    FIELDS(#HEADER) BROWSELIST(#LINES)
        END_LOOP 

Step 9

         ********** Do until terminated by EXIT or MENU key
        BEGIN_LOOP
        ********** Request order number until order is found
        DOUNTIL    COND('#IO$STS = OK')
        ********** Request user inputs an order number
        REQUEST    FIELDS(#ORDNUM)
        ********** Attempt to locate the order
        FETCH      FIELDS(#HEAD) FROM_FILE(ORDMST) WITH_KEY(#ORDNUM)
        ********** Issue message if order was not found
        IF_STATUS  WAS_NOT(*OKAY)
    --> MESSAGE    MSGTXT('No details of this order found')
        ENDIF
        ENDUNTIL
        ********** Build a list of all order lines
        CLR_LIST   NAMED(#LINES)
        SELECT     FIELDS(#LINES) FROM_FILE(ORDLIN) WITH_KEY(#ORDNUM)
        ENDSELECT
        ********** Display the order and its lines to the user
        DISPLAY    FIELDS(#HEADER) BROWSELIST(#LINES)
        END_LOOP

Step 10

         ********** Do until terminated by EXIT or MENU key
        BEGIN_LOOP
        ********** Request order number until order is found
        DOUNTIL    COND('#IO$STS = OK')
        ********** Request user inputs an order number
        REQUEST    FIELDS(#ORDNUM)
        ********** Attempt to locate the order
        FETCH      FIELDS(#HEAD) FROM_FILE(ORDMST) WITH_KEY(#ORDNUM)
        ********** Issue message if order was not found
        IF_STATUS  WAS_NOT(*OKAY)
        MESSAGE    MSGTXT('No details of this order found')
        ENDIF
        ENDUNTIL
        ********** Build a list of all order lines
        CLR_LIST   NAMED(#LINES)
        SELECT     FIELDS(#LINES) FROM_FILE(ORDLIN) WITH_KEY(#ORDNUM)
    --> ADD_ENTRY  TO_LIST(#LINES)
        ENDSELECT
        ********** Display the order and its lines to the user
        DISPLAY    FIELDS(#HEADER) BROWSELIST(#LINES)
        END_LOOP

You should find that well structured and documented programs are very easy to produce by using this type of approach, which basically consists of always:

  • entering the structured programming constructs completely before coming back to fill in the details. For example: BEGIN_LOOP/END_LOOP, DOUNTIL/ENDUNTIL, SELECT/ENDSELECT, IF/ELSE/END, etc. etc.
  • including the comments before the commands.
  • No labels