In V5R1, IBM introduced the LIKEDS keyword. This keyword allows you to create a data structure that has the same set of subfields as an existing data structure. To make this happen, IBM had to create qualified data structures. I've previously talked about qualified data structures, so I won't go into those in detail.
The LIKEDS keyword allows you to clone a data structure over and over again. To take advantage of this keyword, you'll need a data structure. It can be an existing legacy data structure or it can be a new one created as a template. By "template" I mean a data structure that contains the QUALIFIED keyword and, optionally, the BASED keyword. The QUALIFIED keyword allows you to create a data structure whose subfields do not conflict with other field names, and if the BASED keyword is specified, no memory is used up by the existence of the data structure.
Along with these two keywords, you'll also need a data structure name to create a data structure template. Traditionally, a template has a unique suffix that indicates that it's a template. In the C and C++ languages, the underscore followed by the letter T (_T) is often used. For example:
D BASED(templ_ptr)
Of course, subfields need to be added, but we'll illustrate those in a minute.
In this example, the data structure named LINEITEM_T is declared. The data structure also contains the QUALIFIED keyword and BASED(templ_ptr). The BASED keyword is normally used to identify a pointer whose memory this data structure uses. If we create a dummy pointer name, as I did with templ_ptr, and then don't reference it, we effectively cause this data structure to be a template that can be used only to declare other data structures.
To declare another data structure that contains the same subfields as LINEITEM_T, we would use the LIKEDS keyword, as follows:
The new data structure named ITEMS is declared. It is a qualified data structure and includes all the subfields of the LINEITEM_T data structure. The new data structure does not inherit the BASED keyword, OCCURS, DIM, or any other data structure-level keyword. All LIKEDS data structures are implicitly qualified. In fact, the QUALIFIED keyword cannot be specified on the data structure that contains the LIKEDS keyword.
Let's look at a more complete example. Here is the data structure template again, but this time it includes the subfield definitions.
D BASED(templ_ptr)
D item 5A
D qty 7P 0
D price 7P 2
Next, I want to declare an array with the same format as this data structure template. To do this, the following code is specified:
D DIM(50)
You never access LINEITEM_T in your program, except through the LIKEDS keyword. To add data to the new ITEMS data structure array, you would use the following code.
D DIM(50)
C eval count = cgiGetVarCount('ITEM')
C for i = 1 to Count
C eval items(i).item = cgiGetVar('ITEM':i)
C eval items(i).qty = cgiGetVarInt('QTY':i)
C items(i).item Chain ItemRec
C if %Found()
C eval items(i).price = itmprice
C else
C eval items(i).price = 0
C endif
C endfor
In this example, the CGI functions included free in RPG xTools are used to extract data from an HTML Web page. Assuming an online shopping cart is used, the item and quantity ordered are retrieved, and then the item number is used to access the price. The price is then stored in the PRICE subfield of the ITEMS data structure.
Remember, you can use data structure templates over and over in the same source member, so, for example, the following is perfectly valid code:
D items_SAVE DS LikeDS(lineItem_T)
D items_UNDO DS LikeDS(lineItem_T) DIM(10)
The ITEMS data structure is used as our regular data structure array to store the data from the shopping cart. The ITEMS_SAVE data structure is used to store the current data when necessary (before altering it, for example). The ITEMS_UNDO data structure saves up to 10 instances of the ITEMS data structure so that the user can undo up to 10 actions. An UNDO function might be more applicable to an interactive/5250 application.
This is just a sample of how powerful data structure templates can be. What ways can you find to use them?
Bob Cozzi is a programmer/consultant, writer/author, and software developer of the RPG xTools, a popular add-on subprocedure library for RPG IV. His book The Modern RPG Language has been the most widely used RPG programming book for nearly two decades. He, along with others, speaks at and runs the highly-popular RPG World conference for RPG programmers.
LATEST COMMENTS
MC Press Online