Imagine a nice simple file being added to your data model. I have added one below.
As you can see above it has one key and a few neatly named attributes.
The file was a reference file but for cleanliness I have removed the default edit file and select record functions. Also in our shop we have a standard of preceding the primitive DBF functions with an asterisk so I have done this also.
The parameter structure for the CHGOBJ is as expected for a full record CHGOBJ. Nothing spectacular here. This thankfully is default 2E behaviour.
In order to show the proposed methods I want you to use, we need to imagine how we are going to modify the data in this file. Typically we won't change the entire record with the exception being an EDTFIL/EDTTRN which will as default use the full record update or if you have created a W/W + PMTRCD maintenance suite which is quite common. type function .
In the real world we update a total amount, a status, or more typically a subset of relevant data. To do this we often create individual CHGOBJ's named something like 'Change Account Status' or 'Update Address Only'.
Below I have created two separate CHGOBJ's to update the status field on this file. I have imaginatively named as below.
Method 1 is (as defaulted) passing the entire file structure as RCD. The parameters at the detail level are setup as follows. Note that I have set the parameters we are not updating as NEITHER and turned off the MAP role Nothing gets me more irritated in Synon coding than leftover MAP roles...
Method 2 has the data passed differently. I am using two parameter blocks. The first one for the keys or key in our case. The second line for the data attributes where I have set the status filed we wish to update as input. Again I switched off that darn MAP role.
Both these CHGOBJ's (Method 1 and Method 2) now have the same interface as far as calling programs are concerned. i.e. two fields. The key 'MSF My Key' and the fields we want to update i.e. the status field 'MSF Attribute 03 (STS)'.
There is one caveat though. Method 2 won't work.
Not yet anyway. Let me explain why...
There is action diagram code inside all CHGOBJ's that implies the function moves the data passed in via the parameters (PAR) to the database record (DB1) just prior to update. You can see this in the picture below.
However, the Synon generator has been written (by design/bug/undocumented feature) to only move fields passed in the first parameter block.
Yes. Shortsighted I know but it is a known limitation. Go ahead try it for yourself.
This means that in this instance it will only move the values passed in the highlighted row below. In our example for Method 2 this would be the key only.
The way we get around this is to do the move ourselves in the user point immediately after the badly generated code.
This now moves the attributes into the DB1 context from PAR.
Job done. This function will perform valiantly and won't let you down. However, at this stage there is no advantage doing the CHGOBJ this way. Why would you separate the parameters and add extra complexity forcing developers to add the *MOVE ALL if the two functions are now (functionally) identical?
If your shop has standards then it's likely you've learned the hard way. Remember the average application spends 90% of its functioning life in maintenance, and therefore, it is these activities that cost the real pounds/dollars and take the time to implement.
Change is inevitable and most files will require some form of change during their lives and the most common type of change for a file is adding new fields. This is where method 2 outshines method 1.
Let's make some basic adjustments to the file. In the example below we are adding three extra fields which have been appropriately named.
So how has this impacted our functions that we have created in the blog post? The standard CHGOBJ (the *CHG) for the entire record has the three additional parameters automatically added. We just need to visit its usages and set the values accordingly.
Our two examples (Method 1 and Method 2) fair quite differently. Let's discuss these below.
First;y, I will quickly remind you that the two methods for the CHGOBJs were only updating a subset of fields of this file rather than the entire record, in our case the status field 'MSF Attribute 03 (STS)'.
Method 1 has had the extra fields added automatically which is not ideal or what we want. We now need set these to NEITHER. Forget this at you peril. Note: I also removed the MAP!
Method 2 however, keeps the existing input parameter structure. There are no changes to be made other than regeneration due to the changed file.
So on the surface it would appear that method 2 is best for CHGOBJ's where a subset of data is changed.
At this point I would recommend you utilise *Template if you haven't already looked at them. I even have templates for a standard RTVOBJ so I don't forget the *MOVE ALL for CON and DB1.
Below is an example of how I implemented method 2.
Function name.
Parameter block.
Detail for parameter block 1 .
Detail for parameter block 2.
Add the AD code for the move all.
That's the template completed. Use Shift F9 to create the function from the EDIT FUNCTIONS screen. Select the template type and then name it appropriately.
Set the parameters you want to include in the CHGOBJ.
Switch off the map and you are up and running.
The Action Diagram code has automatically been added to your new function as long as you put the *MOVE ALL in the *Template.
In Summary.
It hasn't got to be a one size fits all approach. There is no harm in choosing a hybrid approach, so.
- Use Method 1 for full record updates.
- Use Method 2 for subset or single field updates.
- Consider using templates to enforce your standards and to reduce any mistakes or omissions.
Thanks for reading.
Lee.
No comments:
Post a Comment
Thanks for considering leaving some comments about my random rants for everything software development and more.