× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.




I see Jon has given you some answers. I will add my own comments:

The ILE COBOL Programmer's Guide (V5R4) has a section on mapping COBOL data types to RPG data types. See page 318 in the PDF.


On 26/02/2008, at 5:30 AM, Aaron Bartell wrote:

I didn't know if COBOL would ever enter my life again, but it has and I am
doing some wheel spinning. I am working with a shop that is on the iSeries
and has zero RPG coders so I am trying to span the gap and understand some
basic ILE syntax priciples in the COBOL environment.

Below I have contructed a very busy sub procedure that takes on a variety of
parameter passing features. I have been reading the Infocenter COBOL
manuals but the going is slow and I am wondering if somebody could give me a
kick start and convert it into COBOL??

Basically I need to know:
1) How to build proc1 into a COBOL prototype that could be /COPY'd into a
COBOL program

No prototyping as such but you can use the SPECIAL-NAMES paragraph to define certain aspects of the interface. You can specify the linkage type is a procedure (rather than program) and you can specify which, if any, parameters need an operational descriptor. You will need an operation descriptor passed if you rely on RPG %PARMS. For example:

linkage procedure for "FBNGETDAY" using all described

I put all these definitions in one or more copy members and then add the following to the COBOL source:

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
LINKAGE SYS FOR "CEEHDLR"
COPY FBNDATE OF CBLLEINC.
COPY FBNMSG OF CBLLEINC.
.

NOTE 1: LINKAGE SYS is necessary is you want to invoke CEE APIs.

NOTE 2: The line below the second copy statement contains a full stop (or period to you lot) and is necessary to properly terminate the SPECIAL-NAMES paragraph. It may get removed in transit (although that should only happen if it's in the first position of the line).

I find this easier than using CALL PROCEDURE throughout the COBOL code.

NOTE 3: COBOL mono-cases procedure calls unless you over-ride that behaviour. Specify NOMONOPRC on the PROCESS statement (like an H-spec for compiler options) or on the CRTCBLMOD/CRTBNDCBL OPTION keyword.

I realise you are linking to RPG and the default is for RPG to export mono-cased procedure names but it does not have to do that.


2) How to build a data structure and then reference it using something
similar to our LIKEDS (I saw COBOL has the LIKE keyword and I have been
playing around with that).

Most program variables go in the WORKING-STORAGE Section. Data structures are built using level numbers to identify the nesting. Level 01 would be the DS itself, level 05 would be the first group of sub-fields, level 10 would be sub-fields that overlay one or more sub- fields at level 05, etc. You can set you own level numbers (between 1 and 49) as you see fit but there are some that have special meaning to COBOL such as level 66, 77, or 88. For example (from the manual):

01 EMPLOYEE-RECORD.
05 EMPLOYEE-NAME.
10 FIRST PICTURE X(10).
10 LAST PICTURE X(10).
05 EMPLOYEE-ADDRESS.
10 STREET PICTURE X(10).
10 CITY PICTURE X(10).

The source indenting is simply a visual cue (like RPG IV) and has no bearing on the structure.

No LIKEDS support.

COBOL's LIKE clause is similar to RPG's but does not allow the length to be changed.

COBOL's REDEFINES clause is similar to RPG's OVERLAY keyword.

3) Show an example of calling this sub procedure from a mainline.

COBOL supports passing parameters BY REFERENCE (the default), BY VALUE, and BY CONTENT which is similar to RPG's CONST without the automagic data type conversions.

CALL PROCEDURE PROC1 USING BY CONTENT p1 p2 BY VALUE p3 BY VALUE p4 p5 p6 GIVING some-result.
or
CALL PROCEDURE PROC1 USING BY CONTENT p1 p2 BY VALUE p3 BY VALUE p4 p5 p6 p7 GIVING some-result.
or
CALL PROCEDURE PROC1 USING BY CONTENT p1 p2 BY VALUE p3 BY VALUE p4 p5 p6 p7 p8 GIVING some-result.

If you want to omit p2 then use the OMITTED keyword.
CALL PROCEDURE PROC1 USING BY CONTENT p1 OMITTED BY VALUE p3 BY VALUE p4 p5 p6 p7 GIVING some-result.

NOTE: Not specifying BY CONTENT on p1 will have no effect on the call except that the called procedure is addressing the caller's storage directly.


4) Show an example of defining/coding a local sub procedure.

No local procedure support. Can use nested programs or separate modules (like V3R1 RPG). Can have named sections of code and pass control using PERFORM--behaves like subroutines in RPG.


D proc1 pr 3 0
D pParm1 10a const
D pParm2 15P 0 value options(*omit)
D pParm3 z value
D pParm4 128a value varying
D pParm5 n value
D pParm6 like(fld1)
D pParm7 likeds(ds1) options (*nopass)
D pParm8 * procptr value options (*nopass)

The CALL PROCEDURE statement above will require appropriately defined variables.

Because you are using *NOPASS you must be relying on %PARMS therefore you will require a minimal operational descriptor to be passed. I don't recall whether COBOL passes a minimal descriptor like RPG but I generally need full descriptors:

So:
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL_NAMES.
linkage procedure for "PROC1" using all described.

(You could probably get away with using 1 described if all you need is %PARMS)

Variables and parameters would be something like:

DATA DIVISION.
WORKING-STORAGE SECTION.
01 fld1 pic x(10).
01 ds1.
05 fld1.
10 fld1-len pic s9(4) COMP-4.
10 fld1-data pic x(1024).
05 fld2 pic x(10).
05 fld3 pic s9(9) comp-4.
05 fld4.
10 fld4-len pic s9(4) COMP-4.
10 fld4-data pic x(30).
01 p1 pic x(10).
01 p2 pic S9(15) COMP-3.
01 p3 format of timestamp.
01 p4.
05 p4-len pic S9(4) COMP-4.
05 p4-data pic x(128).
01 p5 pic X(1).
88 ind-off VALUE "0".
88 ind-on VALUE "1".
01 p6 like fld1.
01 p7 like ds1.
01 p8 procedure-pointer.

NOTE: LIKE on ds1 declares a FIELD the same length as DS1, not a data structure.


D fld1 s 10a

01 fld1 pic X(10).


D ds1 ds qualified inz
D fld1 1024a varying
D fld2 10a
D fld3 10i 0
D fld4 30a varying

Jon already showed you this. All COBOL structures are implicitly QUALIFIED. You have to do the hard work related to varying fields but COBOL provides intrinsic functions that can help. Still not a good choice for cross-language support.


Makes me with they had a "COBOL for RPG programmers" book :-)

Interoperation is described reasonably well in the COBOL Programmers Guide.

Hmm, that turned out to be more detailed than I intended.


Thanks in advance,
Aaron Bartell
http://mowyourlawn.com


--
This is the RPG programming on the AS400 / iSeries (RPG400-L) mailing list
To post a message email: RPG400-L@xxxxxxxxxxxx
To subscribe, unsubscribe, or change list options,
visit: http://lists.midrange.com/mailman/listinfo/rpg400-l
or email: RPG400-L-request@xxxxxxxxxxxx
Before posting, please take a moment to review the archives
at http://archive.midrange.com/rpg400-l.



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.

This thread ...

Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.