On 10/06/2009, at 6:04 AM, Scott Lindstrom wrote:
My COBOL skills are quite a bit rusty and I have a production
problem that
needs solving. I have an old COBOL program that is our ODBC/SQL log
program. It makes some references to some fields in QSYSINC/EZDAEP
that
must have changed between V4R4 (the last time the program was
compiled) and
V5R4 (the release we are on now).
This include changed at VRM450.
In 440 the structure for QZDA-NDB-FORMAT2 defined LIB-NAME as: OCCURS
00001 TIMES. In 450 and later it is commented out because it is a
varying-length array (i.e., the number of elements varies according to
the NBR-OF-LIBRARIES field value.
In 440 the structure for QZDA-SQL-FORMAT2 defined SQL-STATEMENT-TEXT
as: PIC X(00001). In 450 and later it is commented out because it is a
varying-length character field (i.e., its length is determined by the
value of SQL-STATEMENT-TEXT-LEN.
Why did this happen? Because all the non-C language includes are
generated from the C includes. They changed from initially defining
the first element (or byte) of the field in 440 (and earlier) to
simply commenting the existence of the field. The first form works
very well in C because it has no concept of an array out-of-bounds
error thus the programmer can reference an array element that was
never defined (as long as sufficient storage exists for it). Because
IBM code supplies the data structure to your exit program you can be
sure (barring a defect in IBM code) that the structure is correctly
populated thus if the structure says 7 libraries are in the list you
can be sure that the structure has space for at least 7 libraries.
I think IBM stopped using this technique once structures started to
have more than one varying-length field. Although the first such field
would be correctly addressed by a structure defining only the first
element or byte any subsequent varying-length fields would not be
correctly addressed.
This change requires the programmer to use based storage to address
the varying length fields.
First - I reference these fields:
LIB-NAME OF QZDA-NDB-FORMAT2 (1)
LIB-NAME OF QZDA-NDB-FORMAT2 (2)
LIB-NAME OF QZDA-NDB-FORMAT2 (3)
LIB-NAME OF QZDA-NDB-FORMAT2 (4)
LIB-NAME OF QZDA-NDB-FORMAT2 (5)
First question: How can you be sure there will only be at most 5
library names? The structure allows an open limit. Your code really
needs to handle the actual number of libraries supplied.
This used to work but the copybook now is defined as:
05 NBR-OF-LIBRARIES PIC S9(00009) BINARY.
* Number of libraries in list
* 05 LIB-NAME PIC X(00010)
* OCCURS xxxxx TIMES.
* Varying number
* of library names
with LIB-NAME commented out. How can I readily access the first 'x'
number
of occurrences of LIB-NAME (up to 5 of them) so I can move these
fields to
the logfile record.
You will need to define your own array of library names and base it on
a pointer. Set that pointer to the address of the structure plus the
current length of the structure. Then process your array for as many
elements as the NBR-OF-LIBRARIES filed says is supplied.
Second - I reference this field:
SQL-STATEMENT-TEXT OF QZDA-SQL-FORMAT2
which now is defined as:
05 SQL-STATEMENT-TEXT-LEN PIC S9(00009) BINARY.
* Length of SQL Stmt text
* 05 SQL-STATEMENT-TEXT PIC X(xxxxx).
* Varying length
* SQL statement text
Again, SQL-STATEMENT-TEXT is now commented out. How I can
reference the
SQL-STATEMENT-TEXT?
Similar thing here. Define your own large field based on a pointer.
Set the pointer to the address of the structure plus its current
length. Limit your character processing to the number of bytes
specified in SQL-STATEMENT-TEXT-LEN
TIA for pointing me in the correct direction,
Did that help?
Regards,
Simon Coulter.
--------------------------------------------------------------------
FlyByNight Software OS/400, i5/OS Technical Specialists
http://www.flybynight.com.au/
Phone: +61 2 6657 8251 Mobile: +61 0411 091 400 /"\
Fax: +61 2 6657 8251 \ /
X
ASCII Ribbon campaign against HTML E-Mail / \
--------------------------------------------------------------------
As an Amazon Associate we earn from qualifying purchases.