Re: How can I write this program to a load library

2013-11-05 Thread Steve Comstock

On 11/4/2013 8:59 PM, Paul Gilmartin wrote:

On Mon, 4 Nov 2013 20:21:38 -0700, Steve Comstock wrote:


To do that has nothing to do with COBOL: it's JCL you need to
brush up on. Point LKED.SYSLMOD to a PDS/PDSE that contains
load modules or program objects.


Be very careful doing that!  When I was very young I tried something
similar without understanding that the following GO step contained:

 //STEPLIB DD DISP=(OLD,DELETE),DSN=*.LKED.SYSLMOD

Oops!

-- gil




Yeah, I did something similar once. State of New Mexico was down
for two days.

But the point is that the OP really needs to beef up his understanding
of JCL as well as his knowledge of COBOL if he is teaching for the
z/OS environment.

--

Kind regards,

-Steve Comstock
The Trainer's Friend, Inc.

303-355-2752
http://www.trainersfriend.com

* We are going out of business effective 30 December, 2013

* To purchase a set of our training materials at terrific prices,
  check out our Going Out Of Business Sale:

http://www.trainersfriend.com/SpecialSale

--
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN


Re: How can I write this program to a load library

2013-11-05 Thread Elardus Engelbrecht
Paul Gilmartin wrote:

 Be very careful doing that!  When I was very young I tried something similar 
 without understanding that the following GO step contained:
  //STEPLIB DD DISP=(OLD,DELETE),DSN=*.LKED.SYSLMOD
 Oops!

A common trap. RACF can help you to protect your dataset with access = UPDATE. 
This is why production loadlibs should not start with your userid.

One of my users, an ancient and somewhat crazy lady has a bad habit to delete 
her datasets and then ringing up the director (instead just calling our direct 
boss) saying WE deleted her things. When the director's contract was ending, 
he/she just call the new director and warn him/her about that troublesome user. 
Eventually we have a daily batch job which run backups incrementally. ;-)

Steve Comstock wrote:
Yeah, I did something similar once. State of New Mexico was down for two days.

Two days! Ouch. You really make those New Mexicans very OLD!! ;-)

But the point is that the OP really needs to beef up his understanding of JCL 
as well as his knowledge of COBOL if he is teaching for the z/OS environment.

Agreed. 

Groete / Greetings
Elardus Engelbrecht

--
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN


Re: How can I write this program to a load library

2013-11-05 Thread George Young

Have a look at

http://www-01.ibm.com/support/docview.wss?uid=swg27036733

and pick your compiler version release and have a look at the 
Programming Guide chapter that discusses cataloged procedures.


For example, for Enterprise COBOL for z/OS 4.2, see Chapter 14 Compiling 
under z/OS, section Using a Cataloged Procedure.


You might also want to reference the JCL books and consider breaking 
this into 2 steps, 1 that does the compile and link, and one that does 
the GO, which is a better example of the 'real world'  (where compile, 
link and go are rarely done at the same time).


For JCL books, I'd start here:

http://www-03.ibm.com/systems/z/os/zos/bkserv/

there are lots of ways to find books in there, so I won't try to go into 
that, but you want to look for these 2


MVS JCL Reference
MVS JCL User's Guide

George


On 11/4/2013 9:49 PM, Cameron Seay wrote:

All:

I am a re-newbie to COBOL (learned it years ago but it's very rusty). I am 
teaching it to my students because it's a great job skill now.  Below is job 
that contains the source code inline and runs great.  It compiles, links and 
runs error free.  What I want is the syntax to place the LOAD module into a 
data set.  I tried what I thought would work, but it didn't.  Many thanks!

//KC02177B JOB (12345678),'V HAMPTON',MSGLEVEL=(1,1),REGION=0M,
// NOTIFY=SYSUID,MSGCLASS=A,CLASS=A
//
//COBOL1  EXEC IGYWCLG,
//  PARM.COBOL='TEST,RENT,APOST,OBJECT,NODYNAM,LIB,SIZE(5048376)'
//COBOL.SYSPRINT DD SYSOUT=*
//COBOL.SYSIN DD *
IDENTIFICATION DIVISION. 
0004
PROGRAM-ID.  PROG1.  
0006
AUTHOR. VICKI HAMPTON.
   *  LAB EXERCISE 1.
0007
ENVIRONMENT DIVISION.
0009
CONFIGURATION SECTION.   
0011
INPUT-OUTPUT SECTION.
0017
FILE-CONTROL.
0019
 SELECT INPUT-FILE   ASSIGN TO DA-S-INPUT.   
0021
 SELECT PRNT-FILEASSIGN TO UR-S-PRNT.
0024
   *   INPUT-FILE IS THE NAME THE PROGRAM WILL USE
   *DA-S-INPUT TELLS JCL TO ASSIGN THE INPUT DATA
   *TO THE FILE NAME INPUT-FILE, SAME FOR PRNT-FILE
   *AND UR-S-PRNT
EJECT
0025
   *   EJECT DIRECTS THE PRINTER TO START THE NEXT
   *   OUTPUT TO BEGIN AT THE TOP OF THE PAGE
DATA DIVISION.   
0026
SKIP3
0027
   *   SKIP 3 INSERTS 3 BLANK LINES
FILE SECTION.
0028
SKIP2
0029
   *SKIP TO INSERTS 2 BLANK LINES
FD  INPUT-FILE   
0030
BLOCK CONTAINS 0 RECORDS 
0031
   *  THIS INFORMS THE SYSTEM THAT NO RECORDS ARE PRESENT
   *  WHEN WE START (WE ARE READING OUR DATA FROM
   *  AN INLINE STREAM
LABEL RECORDS ARE STANDARD.  
0032
01  INPUT-REC PIC X(80). 033
SKIP2
0034
FD  PRNT-FILE
0045
LABEL RECORDS ARE OMITTED.   
0046
01  PRNT-REC.
0047
03   PIC X(60).
03   PIC X(65).
   *  THIS IS FORMATTING FOR OUR REPORT
SKIP2
0048
EJECT
0049
WORKING-STORAGE SECTION. 
0050
SKIP2
0051
   **
0052
   *   LAYOUT FOR THE INPUT FILE   *0053
   **
0054
01  INPUT-DATA.  
0055
03  I-NAME PIC X(20).
0057
03  DEPT   PIC X(10).
03  FILLER PIC X(50).
0058
   *  FILLER IS USED FOR PADDING
SKIP2

Re: How can I write this program to a load library

2013-11-05 Thread Steve Comstock

On 11/4/2013 8:21 PM, Steve Comstock wrote:

On 11/4/2013 7:49 PM, Cameron Seay wrote:

All:

I am a re-newbie to COBOL (learned it years ago but it's very rusty). I am

teaching it to my students because it's a great job skill now. Below is job that
contains the source code inline and runs great. It compiles, links and runs
error free. What I want is the syntax to place the LOAD module into a data set.
I tried what I thought would work, but it didn't. Many thanks!

To do that has nothing to do with COBOL: it's JCL you need to
brush up on. Point LKED.SYSLMOD to a PDS/PDSE that contains
load modules or program objects.




//KC02177B JOB (12345678),'V HAMPTON',MSGLEVEL=(1,1),REGION=0M,
// NOTIFY=SYSUID,MSGCLASS=A,CLASS=A
//
//COBOL1  EXEC IGYWCLG,
//  PARM.COBOL='TEST,RENT,APOST,OBJECT,NODYNAM,LIB,SIZE(5048376)'
//COBOL.SYSPRINT DD SYSOUT=*
//COBOL.SYSIN DD *


Lots of very old syntax here.


IDENTIFICATION DIVISION. 
0004
PROGRAM-ID.  PROG1.  
0006
AUTHOR. VICKI HAMPTON.


   Obsolete paragraph, AUTHOR


   *  LAB EXERCISE 1.
0007
ENVIRONMENT DIVISION.
0009
CONFIGURATION SECTION.   
0011
INPUT-OUTPUT SECTION.
0017
FILE-CONTROL.
0019
 SELECT INPUT-FILE   ASSIGN TO DA-S-INPUT.   
0021

 just   ASSIGN TO S-INPUT is fine,

  my bad; S-INPUT won't work; AS-INDD would
  work for ESDS

  better would be:
ASSIGN TO INDD
   (the DA-S stuff is ignored, but 'INPUT' itself is a reserved word)



 SELECT PRNT-FILEASSIGN TO UR-S-PRNT.
0024

   just ASSIGN TO PRNT is better



   *   INPUT-FILE IS THE NAME THE PROGRAM WILL USE
   *DA-S-INPUT TELLS JCL TO ASSIGN THE INPUT DATA
   *TO THE FILE NAME INPUT-FILE, SAME FOR PRNT-FILE
   *AND UR-S-PRNT
EJECT

   EJECT and SKIP are only relevant when you print out
   your compiles to hard copy; otherwise pretty meaningless


0025

   *   EJECT DIRECTS THE PRINTER TO START THE NEXT
   *   OUTPUT TO BEGIN AT THE TOP OF THE PAGE


  Well, yes, but the output of the _compile_, not the
  output of the report


DATA DIVISION.   
0026
SKIP3
0027
   *   SKIP 3 INSERTS 3 BLANK LINES


   the current compilers simply accept blank lines



FILE SECTION.
0028
SKIP2
0029
   *SKIP TO INSERTS 2 BLANK LINES
FD  INPUT-FILE   
0030
BLOCK CONTAINS 0 RECORDS 
0031
   *  THIS INFORMS THE SYSTEM THAT NO RECORDS ARE PRESENT
   *  WHEN WE START (WE ARE READING OUR DATA FROM
   *  AN INLINE STREAM


  No, it does not. It tells the operating system to
  choose the block size


LABEL RECORDS ARE STANDARD.  
0032

   ' recording mode is F. ' is more important

   This is unnecessary, since it is the only option
   for disk and the default for tape


01  INPUT-REC PIC X(80). 033
SKIP2
0034
FD  PRNT-FILE
0045
LABEL RECORDS ARE OMITTED.   
0046

   Unnecessary;
   ' recording mode is F. ' is more important


01  PRNT-REC.
0047
03   PIC X(60).
03   PIC X(65).
   *  THIS IS FORMATTING FOR OUR REPORT
SKIP2
0048
EJECT
0049
WORKING-STORAGE SECTION. 
0050
SKIP2
0051
   **
0052
   *   LAYOUT FOR THE INPUT FILE   *0053
   

Re: How can I write this program to a load library

2013-11-05 Thread Mike Myers

Cameron:

I can't help you with your COBOL (not one of my languages), but what you 
need is some JCL help. Retired Mainframer set you on the the right 
direction by saying you should look for another procedure. As he said, 
language (assembler and compiler) procedures usually come in three 
forms: xxxC (compile only), xxxCL (compile and link/load) and xxxCLG 
(compile, load and go). You used IGYWCLG . There is an IGYWCL procedure 
on the Marist system, which you can use to to do what you want.


One thing you will have to do is find or set up a load library where you 
can link the load module you are creating. You can model the load 
library after the SYSLMOD DD statement in the LKED step in the 
procedure. SYSLMOD is where the LINK step puts the load module it 
creates. So you want to override this statement, creating a permanent 
library of your own or using a library of your own that already exists. 
If you don't have such a library already, I'd suggest:


//LKED.SYSLMOD DD DSN=KC02117.MY.LOADLIB,DISP=(,CATLG),UNIT=SYSALLDA,
//SPACE=(CYL,(1,1,5)),DSNTYPE=LIBRARY MAKE THIS A PDS/E

This needs to go after the end of your COBOL source code in order for it 
to be seen as being a part of the LKED step (hence LKED.SYSLMOD).


Creating the library as above does not name the member program, so you 
need to tell the link step what you want to call it. In the LKED step 
you will also see the //SYSLIN DD statement which concatenates the 
output of the COBOL compiler with an optional set of control statements 
for the link step. These statements, if supplied, would follow a //SYSIN 
DD statement, if supplied, so you want one after the SYSLMOD statement 
above. It should look like:


//LKED.SYSIN DD *
 NAME PROG1(R)  - this supplies the member name for your program 
and can be anything, but it will have to match what you put on the EXEC 
statement for your GO step, which you will need to create and is 
described below.  The (R) option causes the program to be replaced if 
you have to run the job again.


Last, you have to create a replacement for the GO step which is not a 
part of the procedure you had used. BTW, the //GO.ddname items as 
defined in your existing JCL will result in JCL errors, so you have to 
change all //GO.ddname DD statements to //ddname DD statements (remove 
the GO. part).


I would recommend you model your new GO step after the JCL in the 
IGYWCLG procedure. Keep the EXEC statement, but change it to EXEC 
PGM=PROG1 (or whatever you choose to use in the NAME statement for the 
LINK step).


You should keep the //STEPLIB DD statement in the CLG procedure, but you 
will want to concatenate your load library created above to  it, so 
follow up the existing STEPLIB DD statement with:


//  DD DSN=KC02117.MY.LOADLIB,DISP=SHR   - make sure 
this matches the name in the SYSLMOD statement above


Now follow up the STEPLIB concatenation with the remainder of your JCL 
originally intended for your GO step, but remember to remove the GO. 
parts of these DD names.


This should do it for you. There are other ways you could handle this, 
but I thought this was the easient fo explain and hope it will beef up 
your understanding of JCL. Good luck.


Mike Myers
Mentor Services Corporation


On 11/04/2013 09:49 PM, Cameron Seay wrote:

All:

I am a re-newbie to COBOL (learned it years ago but it's very rusty). I am 
teaching it to my students because it's a great job skill now.  Below is job 
that contains the source code inline and runs great.  It compiles, links and 
runs error free.  What I want is the syntax to place the LOAD module into a 
data set.  I tried what I thought would work, but it didn't.  Many thanks!

//KC02177B JOB (12345678),'V HAMPTON',MSGLEVEL=(1,1),REGION=0M,
// NOTIFY=SYSUID,MSGCLASS=A,CLASS=A
//
//COBOL1  EXEC IGYWCLG,
//  PARM.COBOL='TEST,RENT,APOST,OBJECT,NODYNAM,LIB,SIZE(5048376)'
//COBOL.SYSPRINT DD SYSOUT=*
//COBOL.SYSIN DD *
IDENTIFICATION DIVISION. 
0004
PROGRAM-ID.  PROG1.  
0006
AUTHOR. VICKI HAMPTON.
   *  LAB EXERCISE 1.
0007
ENVIRONMENT DIVISION.
0009
CONFIGURATION SECTION.   
0011
INPUT-OUTPUT SECTION.
0017
FILE-CONTROL.
0019
 SELECT INPUT-FILE   ASSIGN TO DA-S-INPUT.   
0021
 SELECT PRNT-FILEASSIGN TO UR-S-PRNT.
0024
   *   INPUT-FILE IS THE NAME THE PROGRAM WILL USE
   *DA-S-INPUT TELLS JCL TO ASSIGN THE INPUT DATA
   *TO THE FILE NAME INPUT-FILE, SAME FOR PRNT-FILE
   *AND UR-S-PRNT
EJECT

Re: How can I write this program to a load library

2013-11-04 Thread retired mainframer
The CLG at the end of your proc name stands for compile, link, and go.  You
should have a corresponding CL proc (for compile and link) that should be
set up to let you specify a permanent library via a symbolic parameter.  You
will then need to add Binder (nee Linkage Editor) control cards (or possibly
addition symbolic parameters) to specify the member name and other load
module options.

If the Binder runs with NCAL specified, you would run the program with the
corresponding LG (link and go) proc.  If not, you would use the
corresponding G (go) proc.

:: -Original Message-
:: From: IBM Mainframe Discussion List [mailto:IBM-MAIN@LISTSERV.UA.EDU] On
:: Behalf Of Cameron Seay
:: Sent: Monday, November 04, 2013 6:50 PM
:: To: IBM-MAIN@LISTSERV.UA.EDU
:: Subject: How can I write this program to a load library
::
:: All:
::
:: I am a re-newbie to COBOL (learned it years ago but it's very rusty). I
:: am teaching it to my students because it's a great job skill now.  Below
:: is job that contains the source code inline and runs great.  It
compiles,
:: links and runs error free.  What I want is the syntax to place the LOAD
:: module into a data set.  I tried what I thought would work, but it
:: didn't.  Many thanks!
::
:: //KC02177B JOB (12345678),'V HAMPTON',MSGLEVEL=(1,1),REGION=0M,
:: // NOTIFY=SYSUID,MSGCLASS=A,CLASS=A
:: //
:: //COBOL1  EXEC IGYWCLG,
:: //  PARM.COBOL='TEST,RENT,APOST,OBJECT,NODYNAM,LIB,SIZE(5048376)'
:: //COBOL.SYSPRINT DD SYSOUT=*
:: //COBOL.SYSIN DD *

snip

:: //GO.SYSOUT DD SYSOUT=*
:: //GO.SYSPRINT DD SYSOUT=*
:: //GO.INPUT DD *
:: VICKI HAMPTON   CIS
:: GEORGE WASHINGTON   ENG
:: IVAN ISGREATPHY
:: IGOR ISBETTER
:: IVANA GOHOME
:: COB OL
:: HUGH LESS
:: GARY MORE
:: PAULA PANTHER
:: //GO.PRNT DD SYSOUT=*
:: 

--
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN


Re: How can I write this program to a load library

2013-11-04 Thread Steve Comstock

On 11/4/2013 7:49 PM, Cameron Seay wrote:

All:

I am a re-newbie to COBOL (learned it years ago but it's very rusty). I am

teaching it to my students because it's a great job skill now. Below is job that
contains the source code inline and runs great. It compiles, links and runs
error free. What I want is the syntax to place the LOAD module into a data set.
I tried what I thought would work, but it didn't. Many thanks!

To do that has nothing to do with COBOL: it's JCL you need to
brush up on. Point LKED.SYSLMOD to a PDS/PDSE that contains
load modules or program objects.




//KC02177B JOB (12345678),'V HAMPTON',MSGLEVEL=(1,1),REGION=0M,
// NOTIFY=SYSUID,MSGCLASS=A,CLASS=A
//
//COBOL1  EXEC IGYWCLG,
//  PARM.COBOL='TEST,RENT,APOST,OBJECT,NODYNAM,LIB,SIZE(5048376)'
//COBOL.SYSPRINT DD SYSOUT=*
//COBOL.SYSIN DD *


Lots of very old syntax here.


IDENTIFICATION DIVISION. 
0004
PROGRAM-ID.  PROG1.  
0006
AUTHOR. VICKI HAMPTON.


  Obsolete paragraph, AUTHOR


   *  LAB EXERCISE 1.
0007
ENVIRONMENT DIVISION.
0009
CONFIGURATION SECTION.   
0011
INPUT-OUTPUT SECTION.
0017
FILE-CONTROL.
0019
 SELECT INPUT-FILE   ASSIGN TO DA-S-INPUT.   
0021

just   ASSIGN TO S-INPUT is fine,
 better would be:
   ASSIGN TO INDD
  (the DA-S stuff is ignored, but 'INPUT' itself is a reserved word)



 SELECT PRNT-FILEASSIGN TO UR-S-PRNT.
0024

  just ASSIGN TO PRNT is better



   *   INPUT-FILE IS THE NAME THE PROGRAM WILL USE
   *DA-S-INPUT TELLS JCL TO ASSIGN THE INPUT DATA
   *TO THE FILE NAME INPUT-FILE, SAME FOR PRNT-FILE
   *AND UR-S-PRNT
EJECT

  EJECT and SKIP are only relevant when you print out
  your compiles to hard copy; otherwise pretty meaningless

   
0025

   *   EJECT DIRECTS THE PRINTER TO START THE NEXT
   *   OUTPUT TO BEGIN AT THE TOP OF THE PAGE


 Well, yes, but the output of the _compile_, not the
 output of the report


DATA DIVISION.   
0026
SKIP3
0027
   *   SKIP 3 INSERTS 3 BLANK LINES


  the current compilers simply accept blank lines



FILE SECTION.
0028
SKIP2
0029
   *SKIP TO INSERTS 2 BLANK LINES
FD  INPUT-FILE   
0030
BLOCK CONTAINS 0 RECORDS 
0031
   *  THIS INFORMS THE SYSTEM THAT NO RECORDS ARE PRESENT
   *  WHEN WE START (WE ARE READING OUR DATA FROM
   *  AN INLINE STREAM


 No, it does not. It tells the operating system to
 choose the block size


LABEL RECORDS ARE STANDARD.  
0032

  ' recording mode is F. ' is more important

  This is unnecessary, since it is the only option
  for disk and the default for tape


01  INPUT-REC PIC X(80). 033
SKIP2
0034
FD  PRNT-FILE
0045
LABEL RECORDS ARE OMITTED.   
0046

  Unnecessary;
  ' recording mode is F. ' is more important


01  PRNT-REC.
0047
03   PIC X(60).
03   PIC X(65).
   *  THIS IS FORMATTING FOR OUR REPORT
SKIP2
0048
EJECT
0049
WORKING-STORAGE SECTION. 
0050
SKIP2
0051
   **
0052
   *   LAYOUT FOR THE INPUT FILE   *0053
   **
0054
01  INPUT-DATA. 

Re: How can I write this program to a load library

2013-11-04 Thread Lizette Koehler
With Cobol Installation, your shop should have loaded many IGYW* procs.  You 
are using IGYWCLG.

In the JESMSGLOG you should see a message that states

PROC IGYWCLG Expanded from x Library.

Go to that Library and see if you have other IGYW* procs there.  One of them 
should have an IEWL or BINDER step that you can override the SYSLMOD to a load 
library of your choice.

Also, go and look at the manual:  Application Programing for z/OS for your 
level of Cobol.  It should detail the different procs and what they can be used 
for.

I think the IGYWCL may be what you need to use.

HTH

Lizette


 -Original Message-
 From: IBM Mainframe Discussion List [mailto:IBM-MAIN@LISTSERV.UA.EDU] On
 Behalf Of Cameron Seay
 Sent: Monday, November 04, 2013 7:50 PM
 To: IBM-MAIN@LISTSERV.UA.EDU
 Subject: How can I write this program to a load library
 
 All:
 
 I am a re-newbie to COBOL (learned it years ago but it's very rusty). I am 
 teaching
 it to my students because it's a great job skill now.  Below is job that 
 contains the
 source code inline and runs great.  It compiles, links and runs error free.  
 What I
 want is the syntax to place the LOAD module into a data set.  I tried what I 
 thought
 would work, but it didn't.  Many thanks!
 
 //KC02177B JOB (12345678),'V HAMPTON',MSGLEVEL=(1,1),REGION=0M,
 // NOTIFY=SYSUID,MSGCLASS=A,CLASS=A
 //
 //COBOL1  EXEC IGYWCLG,
 //
 PARM.COBOL='TEST,RENT,APOST,OBJECT,NODYNAM,LIB,SIZE(5048376)'
 //COBOL.SYSPRINT DD SYSOUT=*
 //COBOL.SYSIN DD *

--
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN


Re: How can I write this program to a load library

2013-11-04 Thread Paul Gilmartin
On Mon, 4 Nov 2013 20:21:38 -0700, Steve Comstock wrote:

To do that has nothing to do with COBOL: it's JCL you need to
brush up on. Point LKED.SYSLMOD to a PDS/PDSE that contains
load modules or program objects.
 
Be very careful doing that!  When I was very young I tried something
similar without understanding that the following GO step contained:

//STEPLIB DD DISP=(OLD,DELETE),DSN=*.LKED.SYSLMOD

Oops!

-- gil

--
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN