I have a couple of communications asking about how to "correctly" code a data structure to receive the data from and update a data area in the latest, all freeRPG. One of person even sent me their code, which I will be using for the basis for my examples.
While I am not sure if there is just one "correct" way to do this I will be giving my version of the following three scenarios:.
I am not going to describe the basics of how to code Data Structures in free format in this post, as I covered this in Defining variables in RPG all free. As you all know I like to things simple and uncomplicated, therefore, I would code the data structure like below:.
On line 1 I use the data area name, PPZD, as the name of my data structure and define it characters long. To receive the data from the data area I just use the IN operation code followed by the data structure name, which is the same as the data structure's name as I used its name as the data structure name.
On line 1 I have decided not to use the data area's name as the data structure's name. This time I am only going to give an example with my preferred format of data structure. In this example I am going to increment part of the data area, positionsby one:. The only difference from the data structure in previous examples is that this time I have defined a alphanumeric subfield, Char60, which is 3 long.
On line 6 I have defined a stand alone variable, Nbr60, which is an unsigned integer that is 3 long with inferred 0 decimal places. I have to admit that I am surprised that IBM insists that you have to have decimal places with integer and unsigned integer variables as, by their nature, they cannot have decimals.
On line 5 I "in" the contents of the data area. In lines 5 — 10 I convert the value in the alphanumeric subfield Char60 into a number in the unsigned integer Nbr On line 11 I increment Nbr60 by 1.
Then I update the data area using OUT on line After this program has completed if I look at the data structure I see that the characters have been incremented. You could use the UNLOCK operation code to unlock the data area during the program, but that runs counter to the whole idea of wanting the data area to be brought in at initialization and update at termination.
I define the subfield Printer on line 2. I change the value of the subfield Printer on line 4, and when the program ends that value updates the LDA. This article was written for IBM i 7. I am surprised that IBM insists that you have to have decimal places with integer and unsigned integer variables as, by their nature, they cannot have decimals. Also, the highest number that can be assigned to an unsigned integer with a length of 3 is If you want up to to be assigned, then a signed or packed numeric with a length of 3 should be used.
I was referring to the DCL-S statement for the unsigned integer. I now I have not given the number of decimals in that as it is optional and inferred. But I could have code: dcl-s Nbr60 uns ; I just wonder why we have to code for the number of decimal when we declare the variable. As for the maximum value allowed in an unsigned variable I thank you for bringing that to my attention.
I have to put that down for to trying to get the post done quickly. My apologies, Simon. I didn't know that decimal positions could even be specified for an integer or unsigned integer data type even though it must be 0which is why I was confused. Thank you. I am glad you worked it out. To prevent "comment spam" all comments are moderated.
Learn about this website's comments policy here. Some people have reported that they cannot post a comment using certain computers and browsers. If this is you feel free to use the Contact Form to send me the comment and I will post it for you, please include the title of the post so I know which one to post the comment to.RPG has multiple numeric datatype support.
Each digit takes 8 bits of memory. Every digit in the number user half of byte means 4 bits. More details in Comment section. IBM i developer. View all posts by Sumit goyal. OK — got that out of my system — I feel better now.
Buy DCL - The Game
This should be noted — and is another good reason to use the new free-form version. The old B type exists for compatibility reasons only and is very inefficient. When any operation is performed on a type B field the content is moved to a temporary packed field, the operation is performed, and the result copied back to the B field.
A lot of overhead. There really is no reason to use it in new code. Zoned harks back to the old days of punch cards and is a very old term. Thanks Jon for lot of this useful information. Still raising funds to get a new logo and domain.
Your email address will not be published. Here is how these Datatypes work 1. Actually for every digit in a number of more than 1 byte4 bits are wasted without any use. How are the SIGN saved? Decimal position is always ZERO. Only predefined lengths As shown in table below are allowed. Published by Sumit goyal. Leave a Reply Cancel reply Your email address will not be published.Sign in to add this item to your wishlist, follow it, or mark it as not interested.
Sign in to see reasons why you may or may not like this based on your games, friends, and curators you follow. Developed in collaboration with Climax Studios Ltd.
Climax Studios and its related logos are property of Climax Games Ltd. All Rights Reserved. All rights reserved. Portions of this program c PlayFab, Inc. You can use this widget-maker to generate a bit of HTML that can be embedded in your website to easily allow customers to purchase this game on Steam. Sign in. Home Discussions Workshop Market Broadcasts.
Change language. Install Steam. Your Store. Browse Browse. Community Hub. Join the flying revolution! Recent Reviews:. All Reviews:. Popular user-defined tags for this product:. Sign in or Open in Steam. Includes 39 Steam Achievements. Share Embed. Add to Cart. An innovative race series, blurring the lives between virtual and reality. It enables pilots to race on authentic DCL tracks in epic locations. I can't wait to race against my best friends online.
I'm playing a lot if I don't have the time to go outside and fly to stay in shape and get stick-time.A varying-length field differs from a conventional character field in that the length you define characters in the above examples is the field's maximum size. At any given time, the current length of the field varies from a minimum of zero to the maximum of How does RPG know the current field length? Well, a variable-length field actually consists of two parts: an integer field that holds the length, followed by the actual data itself.
Because of this, a variable-length field always occupies more bytes than its maximum length. For fields up to 65, characters in length, that integer is two bytes in length. For longer fields that length portion is four bytes. The only exception is when viewing such fields in debug. The debugger will normally just display the field like any other character field and it will appear to have trailing blanks.
If you need to know if those blanks are really part of the field then you need to display the field in hex. EVAL variable name:x in the green screen debugger. You can then look at the contents of the first two or four bytes to determine the actual length of the field. Note that in both examples we specified the keyword INZ to initialize the field to a zero length.
However, the default initialization for all fields in a data structure is blanks—and blanks in the length portion of a variable length field can cause problems. As a result, we tend to always be explicit and specify initialization for any variable length field.
For example, suppose you needed to take all the elements in the array monthlySales and form them into a single comma separated string. Using a fixed length character field you might write logic like this:. In this example, the process to add a new element requires that any trailing spaces first be trimmed from the current content before the new data is added. But of course, RPG will add those spaces back in to pad the field to its full length. For all except the final item, this trim and pad process is repeated to append a comma to each element added to the data.
This action takes place for each element added to the string. If you think that this all sounds very inefficient you are absolutely correct. It is horribly inefficient and the bigger the target string the worse it gets.
However, by using a varying length result field instead, the logic looks quite a bit simpler—and even more importantly, performs significantly better. So when adding data, RPG simply places it following the last character and updates the length accordingly with no blank padding. But suppose we were adding the contents of character strings that could have trailing blanks. What then? The answer is to simply trim the string as it is added. Like this:. Another common use is for building up a person's name from individual first and last names.
If the names are stored in conventional fixed-length fields, the code would look something like this:. If, on the other hand, we had stored the names as variable-length fields, we could use the simpler and certainly more intuitive code:. With a variable-length field, we can actually set the field to have no value. There are two ways to accomplish this in RPG.
We could set the field to a null string represented by two consecutive single quote characters which will result in RPG setting its active length to zero.I am going to assume that you know what Procedures and Subprocedures are. Below I am going to give the three most common ways I use Procedures and Subprocedures. I prefer the simpler looking code I gave in the first example as, in my opinion, it is easier to understand.
In this next example I am using a Subprocedure like a subroutine, to validate a date. The old way would look like below. Below is the equivalent with free definitions. In this example I am going to execute a procedure, ValLineNbr, to validate that the alphanumeric line number is numeric and if the field is numeric return the line number as a number.
And below is the free format version. This is what it looks like in fixed format:. For more details about how to define a data structure see here.
And now for the Procedure itself. The fixed format version has the starting Procedure specification P-specline 5, and ending P-spec, line The Procedure interface is coded on lines 6 and 7. As I said before there are many other ways to code and use Procedures. If you have a method you would like to share please do not post it in the comments, as the formatting in that section will make it look strange.
Contact me through the Contact Formon the right, and I will send you an email with my address. If you send me your example in an email I will include it method in a new post. I mostly use procedures instead of subroutines now. Some of the real power of this method is to use it in conjunction with RPG modules. Modules allow you to create multiple use objects similar to copybooks without the overhead. I think this great that IBM finally made free form for the "D" specs.
Although, I don't know when I will be able to experiment with the code as I have been out of work for a long time I am in the Chicago area where the companies existbut work is scarce.
Just as it is in CL. The code here is not particularly inviting, and I think that is because it is not arranged at all.
An Introduction to Variable Field Lengths in RPG
It is actually much prettier and easier to read when the field descriptions line up, and I don't think this is due to strangeness. I get the same reaction from users on screens; they look better lined up. I totally agree. I also do programming work in Clarion9 for Windows and always try to make it look "inviting" to read, for the people who will bethere when I'm not. So go back and use fixed format then! Problem solved! Whining about how code is formatted when you get a lot of free tips is just so insulting!
Grow up! I disagree with "Anonymous". It is very possible to be appreciative of the advice while still offering additional ideas that are useful to other like minded people. I am very grateful to Simon Hutchinson and others like him, but I also very much appreciate the comments from Lyne Noll and bolle if for no other reason, than the awareness that there are other people out there that value visual structure within the free environment.
Forums like this provide a free exchange of ideas, so those of Anonymous are also welcome. I just wanted to chime in, in hopes of encouraging more and not less open communication here. Good day Mr.April 16, Jon Paris. In the first part of this series I discussed why I thought that RPGers should care about the new free-form support. All definitions begin with a declaration operation code. For D-spec type definitions these take the form dcl-X where X is:.
Of course D-specs are also the vehicle by which we define prototypes and procedure interfaces. If you read the manual you will also see that there is also a dcl-subf for the definition of DS subfields but this will normally be omitted in much the same way as we omit EVAL in calcs. The only time it is required is when the field name matches that of an existing op-code.
Next comes the field name, optionally followed by the data type and length definition. These are followed by optional keywords, which for the most part are the same as they were on the old D-specs. In other words the sequence of elements is basically the same as in the old D-specs.
RPG's New Procedure Overloading and DATA-GEN Capabilities
I found it useful to keep this in mind while learning the ropes of the new specifications. Time for some examples. First, the old 30a length definition has been replaced by the more meaningful char A similar thing has happened with the 5s 0 definition, which is now replaced by zoned 5. As you can see there is no need to specify the number of decimal places when there are none. I really like that.
Last but not least, you can see 3 the end-ds that completes the DS. The name of the DS has been included here in much the same way as the name can be repeated on the end markers of subroutines and subprocedures.US M1 (M1A2) Abrams vs Russian T-90 S - Main Battle Tank / Military Comparison
It is not compulsory but can be useful when navigating through the code. This makes sense since no subfields can be defined within such structures. To avoid having to code an additional line when specifying a DS with no defined subfields the rules are relaxed to allow the end-ds to be coded on the same line as the dcl-ds.
This applies to externally described DS and to any DS with a length definition, but no subfields, as shown in the examples below. Much as I like this new support, one thing I am still wrestling with is how best to align the various ele-ments.
The only place I used to have to worry about that was how to indent the field names. At the moment I have settled on using the style you see in these examples, but I reserve the right to change my mind at any time!
This example takes advantage of the fact that you do not need to name fields in a DS to provide an alternative to compile time arrays, which I have always disliked. The other significant difference is that we are no longer permitted to use the Overlay keyword against a DS name. Instead we use the new POS keyword, which is the equivalent of the old From column. This is the result:. One other notable change is that, in some situations, data attributes that were formerly designated by keywords are now incorporated into the definition.
This is one of the advantages of being able to use more than a single column for the data type. For example, the data type VarChar is now used instead of defining the field as character Char and then adding the Varying keyword. As the example also shows, date fields no longer require the DatFmt keyword—the format is now incorporated as a parameter to the data type itself.It has been pointed out that this web site lacks a good description of how to retrieve the data from the Local Data Area, LDAin the post about defining variables in free format RPG.
I agree, which is why I have written this about retrieving and updating the LDA. I am going assume that we all know what the LDA is. If you do not then you can read IBM's definition of what it is. I need to describe how to replace both of those in free format RPG. In its simplest form the UDS data structure, as defined below, will bring the contents of the LDA into the data structure's subfields at program initialization, and update the LDA when the program ends.
The same functionality is available in free format definitions, but not using UDS. If I give this data structure a name the compile will try to find a use a data area of that name rather than the LDA. Let me add this data structure to a small program to demonstrate how the LDA is retrieved and updated without me needing to do anything to the data area in my RPG code. When I look at the LDA after the program has completed I can see that the first character has changed. Rather than have to code all of the data structure's subfields I can use a file as an externally described data structure.
This is a good idea as I can ensure that the same data structure is used in many programs, stopping me from mis-mapping a value in one program which was moved to the LDA by another.
Rather than have the program retrieve the values in the LDA at program initialization and update at the end of the program, I can decide to control when I retrieve and when I update.
Numeric Datatypes in RPG.
To do so I must define my data structure slightly differently. If I was doing this in fixed format it would look like this:. But as I have shaken off the shackles of fixed format I would code it like this:.
I am not going to bother to show the before and after of the LDA as the results are exactly the same as the previous example. Now I have examples of how to use the LDA in free format programs. This article was written for IBM i 7. To prevent "comment spam" all comments are moderated. Learn about this website's comments policy here. Some people have reported that they cannot post a comment using certain computers and browsers.
If this is you feel free to use the Contact Form to send me the comment and I will post it for you, please include the title of the post so I know which one to post the comment to. Data area. The rest of the program is really simple: 08 in MyLda ; 09 MyLda.