Showing posts with label How To. Show all posts
Showing posts with label How To. Show all posts

Friday, November 30, 2012

Submit or Retrieve Jobs with FTP / Alternative For Remote Job entry (RJE)

This post is about an alternative for remote job entry, you can use the TCP/IP FTP service in zOS and a Shell/command prompt to retrieve, List, and submit Jobs to Mainframe.

Basic Commands used in this article

FTP                   - To start FTP
Open remore_system_ip - To connect to host via FTP
QUOTE site filetype=JES     - Connect to JESPLEX, (conect to JES in layman terms)
DIR                   - List Jobs
Get filename          - Get Job dataset from remote system
PUT filename          - Submit Job

Make Sure that the FTP is up and running in your mainframe system.

You can do this by find the “TCPIP” job in your spool.

Connect to Mainframe via FTP

Open the command prompt/Shell and Enter FTP.
Enter Open your mainframe_host_ip
Enter your user ID followed by password


C:\>ftp
ftp> open demomvs.demopkg.ibm.com

Connected to demomvs.demopkg.ibm.com.
220-FTPD1 IBM FTP CS V1R13 at demomvs.demopkg.IBM.COM, 05:53:23 on 2012-11-30.
220 Connection will close if idle for more than 5 minutes.
User (demomvs.demopkg.ibm.com:(none)): dds1764
331 Send password please.
Password:
230 DDS1764 is logged on.  Working directory is "DDS1764.".
ftp>

At this point you are connected to MVS subsystem,  if you issue a DIR you can see your MVS datasets, issue SITE FILETYPE=JES to get connected to JESPLEX

ftp> quote site filetype=jes
200 SITE command was accepted

Issue a DIR command to see the jobs.

Unlike SDSF, the dir command display the last ran job, first in the list

ftp> dir
200 Port request OK.
125 List started OK for JESJOBNAME=DDS1764*, JESSTATUS=ALL and JESOWNER=DDS
JOBNAME  JOBID    OWNER    STATUS CLASS
DDS1764J JOB01982 DDS1764  OUTPUT A        RC=0000 6 spool files
DDS1764J JOB01683 DDS1764  OUTPUT A        RC=0000 6 spool files
DDS1764J JOB01682 DDS1764  OUTPUT A        RC=0016 6 spool files
DDS1764J JOB01681 DDS1764  OUTPUT A        RC=0016 6 spool files
DDS1764J JOB01680 DDS1764  OUTPUT A        RC=0016 6 spool files
DDS1764J JOB01678 DDS1764  OUTPUT A        RC=0016 6 spool files
DDS1764J JOB01676 DDS1764  OUTPUT A        RC=0016 6 spool files
DDS1764J JOB01675 DDS1764  OUTPUT A        RC=0016 6 spool files
DDS1764J JOB01673 DDS1764  OUTPUT A        RC=0016 4 spool files
DDS1764J JOB01672 DDS1764  OUTPUT A        RC=0016 4 spool files
DDS1764J JOB01667 DDS1764  OUTPUT A        RC=0016 5 spool files
DDS1764J JOB01665 DDS1764  OUTPUT A        RC=0012 4 spool files
DDS1764J JOB01662 DDS1764  OUTPUT A        (JCL error) 3 spool files
DDS1764C JOB00417 DDS1764  OUTPUT A        RC=0000 6 spool files
DDS17641 JOB00414 DDS1764  OUTPUT A        RC=0012 4 spool files
DDS1764E JOB05786 DDS1764  OUTPUT A        RC=0000 4 spool files
DDS17641 JOB04559 DDS1764  OUTPUT A        RC=0000 5 spool files
DDS17641 JOB04557 DDS1764  OUTPUT A        RC=0012 4 spool files
DDS17641 JOB04555 DDS1764  OUTPUT A        RC=0012 4 spool files
DDS17641 JOB04498 DDS1764  OUTPUT A        RC=0012 4 spool files
DDS1764  TSU01992 DDS1764  ACTIVE TSU
250 List completed successfully.
ftp: 1430 bytes received in 0.70Seconds 2.03Kbytes/sec.
ftp>

Issue DIR JOBID to see the files associated with the JOB

ftp> dir JOB01982
200 Port request OK.
125 List started OK for JESJOBNAME=DDS1764*, JESSTATUS=ALL and JESOWNER=DDS1764
JOBNAME  JOBID    OWNER    STATUS CLASS
DDS1764J JOB01982 DDS1764  OUTPUT A        RC=0000
--------
         ID  STEPNAME PROCSTEP C DDNAME   BYTE-COUNT
         001 JES2              A JESMSGLG      1137
         002 JES2              A JESJCL         425
         003 JES2              A JESYSMSG      4303
         004 STP010            A SYSOUT        2645
         005 STP010            A JNF1JMSG      2746
         006 STP010            A JNF2JMSG      2746
6 spool files
250 List completed successfully.
ftp: 500 bytes received in 0.00Seconds 166.67Kbytes/sec.

Issue GET JOBID.n “destination_file” to ftp the job files from Mainframe to your machine. If you issue GET JOBID.n (n is a number) you will get the nth file from JOB, if it is GET JOBID.X you will get all the files belongs to that JOB

ftp> get JOB01982.x "C:\temp1\JOB01982.x.txt"
200 Port request OK.
125 Sending all spool files for requested Jobid
250 Transfer completed successfully.
ftp: 22154 bytes received in 1.53Seconds 14.47Kbytes/sec.
ftp> get JOB01982.1 "C:\temp1\JOB01982.1.txt"
200 Port request OK.
125 Sending data set DDS1764.DDS1764J.JOB01982.D0000002.JESMSGLG
250 Transfer completed successfully.
ftp: 1312 bytes received in 0.00Seconds 1312.00Kbytes/sec.
ftp>

Issue PUT “JCLL_location”  (JCLL_location is the JCL file path in your local machine). Eg. in my Machine the JCL is located at “C:\temp1\sort_jcl.txt”

image

ftp> put "C:\temp1\sort_jcl.txt"
200 Port request OK.
125 Sending Job to JES internal reader FIXrecfm 80
250-It is known to JES as JOB02315
250 Transfer completed successfully.
ftp: 754 bytes sent in 0.37Seconds 2.02Kbytes/sec.
ftp>

Issue DIR to see the latest JOB

250 Transfer completed successfully.
ftp: 754 bytes sent in 0.37Seconds 2.02Kbytes/sec.
ftp> dir
200 Port request OK.
125 List started OK for JESJOBNAME=DDS1764*, JESSTATUS=ALL and JESOWNER=DDS1764
JOBNAME  JOBID    OWNER    STATUS CLASS
DDS1764J JOB02315 DDS1764  OUTPUT A        RC=0000 6 spool files
DDS1764J JOB01982 DDS1764  OUTPUT A        RC=0000 6 spool files
DDS1764J JOB01683 DDS1764  OUTPUT A        RC=0000 6 spool files
DDS1764J JOB01682 DDS1764  OUTPUT A        RC=0016 6 spool files
DDS1764J JOB01681 DDS1764  OUTPUT A        RC=0016 6 spool files

 

Guys try this yourself, if this post helped you, don’t forget to Comment/like/share the page and of course visit the below advertisement.

Cheers- Shibu Thannikkunnath

Installing and configuring 3270 Terminal emulator in Mac

Step 1. Download 3270 client for MAC OSX

Download tn3270 from here - http://www.brown.edu/cis/tn3270/index.html#latest . When I’m writing this article the latest version of tn3270 is 3.3b6 (beta). It worked perfectly in my 2012(mid) Macbook pro Retina display.

Step 2. Mount the dmg and open the disk in finder.

Screen Shot 2012-11-29 at 7.46.32 PM

Step 3. Copy tn3270x Application file to your applications folder

Step 4. Invoke tn3270x by double clicking on the application

Screen Shot 2012-11-29 at 7.50.15 PM

Fill your hostname on “Host Name” field. By default the port will be 23, but if you want you can change the port number by clicking on “Special” Button

Screen Shot 2012-11-29 at 7.52.40 PM

Once you are done with your settings, click on “open connection” Button.

Screen Shot 2012-11-29 at 7.55.50 PM

I have used Fandezhi/efglobe mainframe, it is a free mainframe and can be used for your skills development. If you want to know more about creating an id, visit my post about getting a free mainframe id (http://mainframegeek.me/2012/11/23/free-mainframe-id-to-practice/)

That’s it; you know how to go from here J Hey guys, if this post helped you, subscribe for my posts, share it or like my Facebook page.

Cheers –Shibu-

          

 

Wednesday, November 28, 2012

Declare numeric field with More than 18 Digits in Cobol

Have you ever wondered about the 18digits maximum limit of Numerical variable declaration (PIC 9(18) ) in Cobol?

Well you can override it in Enterprise Cool, or in other words if Language environment (a.k.a LE) is available at your shop. The Language environment is introduced back in 2000 by IBM, which is a common application layer for many Programming languages. The LE has a lot of cool features which I’ll be covering future posts. So keep coming back.

Here is a sample program for Numeric field declaration with more than 18 digits. The Compiler directive (CBL) is that really turning the ship around.
This compiler-directing statement selectively suppresses output or causes output to be produced. The keywords *CONTROL and *CBL are synonymous.

The Program logic is simple its just move a 31 digit number to the number 1 variable, then add it with itself and display it.
If you Don’t have mainframe access to try it out, visit my post on getting a free mainframe id, it really helps.  http://mainframegeek.me/2012/11/23/free-mainframe-id-to-practice/ . It’s a raw mainframe so you won’t be getting handy compile JCL on this mainframe, let me know if you need one, I can help you.







 CBL ARITH(EXTEND)
IDENTIFICATION DIVISION.
PROGRAM-ID. COB18DIG.
AUTHOR.     SHIBU.T.
*
DATA DIVISION.
WORKING-STORAGE SECTION.
77  WS-NUM1                      PIC 9(31).
*
PROCEDURE DIVISION.
A0000100-MAIN-PARA.
MOVE 1234567890123456789012345678901
TO WS-NUM1.
DISPLAY 'WS-NUM1 BEFORE ADDITION: ' WS-NUM1.
ADD WS-NUM1                 TO WS-NUM1.
DISPLAY 'WS-NUM1 AFTER ADDITION: ' WS-NUM1.
STOP RUN.

 

The compile and run JCL will complete with return-code 000, here is the output I got in my machine.

image

Does my Program, post helped you? Comment, rate or like my facebook page (top right corner of this page) and click on the adds listed below. It really help me to make this website alive.

-Cheers, Shibu

Friday, November 23, 2012

Free Mainframe ID to practice.

Hey guys here is the Thanks giving gift. I’m not sure how many of you are aware about this.

You can access Fandezhi mainframe system for your Mainframe skills development, there is no hidden charges to use its (Read the below notes), yes it’s completely free.

efglobe/Fandezhi Mainframe is a virtual Mainframe and running on zOS 1.6 ADCD (Application Developers Controlled Distributions). The latest release of zOS is 1.13 but zOs 1.6 is more than enough for practicing. I’m not willing to talk about the virtualization of Mainframe.

**Important

Make sure you will not create some random user ids and run any infinite loop Programs on fandezhi mainframe. It is closely monitored by the admins and you may be banned from using dezhi mainframe if you do so.  The mainframe system is for people who wants to do the the things which are not possible at their work. Its so sad that the system is misused by a bunch of training center from India and that affects the complete system performance and other users. being a Dezhi MF user I‘ve personally experienced this. Again Make sure you don’t do the same. 

Also read the comments from fandezhi system Admin Prino.

All you need to have to use fandezhi/efglobe mainframe is

  • Get zOS credentials
  • Get a terminal emulator Program
  • Configure Terminal Emulator program and connect to efglobe mainframe

1. Get zOS Credentials

Go to efglobe/fandezhi mainframe support site using the below link

http://zos.efglobe.com/cgi-bin/mainframe/mainuser

Click on apply for new TSO ID, you will get the below screen

image

fill in your desired TSO ID, your name and your email id, then click on submit. After a while you will get an email with the TSO ID/Password and the Mainframe host IP etc.

As you see in the mainframe support site, you can

  • Apply for TSO ID.
  • Find you TSO ID (if you forgot yours)
  • Reset your ID
  • Renew your ID
  • Delete your ID
  • Disconnect your ID, if you disconnected from Mainframe by mistake and not able to login back.

2. Get a Terminal Emulator Program

I personally recommend IBM Personal communications, but it comes with a price tag. You can buy it (its really worth the money and its rich in features). If you prefer cheap/free you can get one of these

Once you download the terminal emulator go ahead and install it.

3.  Configure your Terminal Emulator program and connect to efglobe Host Mainframe.

If you are using IBM Personal communications then click on “Connections>Configure” and click on “link parameters”, then enter the host IP address you received on you email or you can use zos.efglobe.com and port 23.

image

In addition to this you can configure keyboard and graphics (if you want to use GDDM), since we all will be using different Terminal emulators I’m not going to cover it. Click on ok and connect to the host.

Here is the efglobe/fandezhi TSO Logon Page. You can use TSO, CICS, NETVIEW, NVAS and AOF. IMS will be working in this zOs configuration.

image

That’s, you know how to go from here. try it. Let me know if you get any problems while logging in.

Always comply to the rules and don’t misuse the system.

Thursday, November 22, 2012

Setup FTP from Mainframe to Non-Mainframe Method III

Using Microsoft IIS –FTP (Internet Information Services

As I Promised beginning of this series, here is the third method to transfer files from Mainframe to non Mainframe (Windows) . I have used Windows 7 X64 professional Operating system on my laptop and Internet Information Server 7.5.

You could also read other methods I’ve written about FTP’ing files from IBM Mainframe to Windows. These methods are easy to use and utilizes the free resources available in IBM Mainframe as well as Windows/free wares.

1. Simple FTP with Windows Bat file - http://mainframegeek.me/2012/11/20/setup-ftp-from-mainframe-to-non-mainframe-method-ii-using-bat-file/

2. Setup FTP with Filezilla server.

http://mainframegeek.me/2012/09/12/setup-ftp-from-mainframe-to-personal-computermethod-i-using-filezilla-server-on-windows/

3. Setup FTP with IIS (Internet Information Service) FTP server.

http://http://mainframegeek.me/2012/11/23/setup-ftp-from-mainframe-to-non-mainframe-method-iii/

By default Windows comes with Internet Information services. You just need to turn them on.

1. Turn On FTP server in Internet Information Services.

Navigate to Control Panel>Programs and features/Add or remove programs, and click on Turn windows features on or off. It will take  a while to turn on the service.

clip_image002_thumb[2]

2. Add a directory to our FTP server service

Navigate to Control Panel>Administrative tools and open Internet Information services

image

Right click on the FTP area and select View sites,

image

Now right click on the workspace and select add FTP site

Enter a FTP site name and choose directory where you want your incoming (From Mainframe) files stored to.

 clip_image008_thumb[2]

Click on next, select an IP Address (Copy to a text file for using in JCL) make sure you selected No SSL (you won’t be able to transfer files otherwise) and click on next. remember I said in the first method, FTP always uses port 21, so leave it as it is.

image

Click on Next and Enable anonymous authentication (or you can use a user id and password) and hit finish

clip_image012_thumb[2]

On the sites window, right click the FTP site you just created and select Basic Settings

3. Enable windows security

Click on connect as , then select specific user and click on set and enter your windows user id and password

image

Hit Ok for all the dialog boxes and go back to mainframe and edit your JCL as below

4. Submit FTP job from Mainframe

Copy paste the below JCL to your ISPF editor, make the changes as I mentioned below·

  • //STEP001 EXEC PGM=FTP,PARM='255.255.255.0 ---- Change IP address to the one you copied to text file during FTP server setup  (Step 2)
  • update windows (Same credentials you entered on Basic settings window) userid/pasword and file list on //INPUT DD*
  • Update your Data set names followed by the filename on windows on PUT statement

Complete JCL

//DDS1764J JOB NOTIFY=DDS1764
//STEP001 EXEC PGM=FTP,PARM='255.255.255.0 (EXIT'
//SYSPRINT DD SYSOUT=*
//OUTPUT DD SYSOUT=*
//INPUT DD *
Windows_user_id
Windows_user_password
DIR
PUT 'DDS1764.PGMG.CBL(FLEPGM)' ToIIS.txt
QUIT

Now Submit the JCL (it will complete with MAXCC 000). Due to security issues (I don’t want some spammer to submit random FTP jobs to my PC Winking smile ) I have blurred my ip address.

image 

Then check your shared folder (On your PC) for received file. Did you forget your shared folder? refer back to step 2 to see the folder.

· image

and That’s it now you are familiar with the 3 FTP methods which I know, FTP with IIS as well as Filezilla are same in a way, just the server software on the windows system is changing.

Try these three methods, let me know if you know any other methods (leave a comment on this page or email me @ shibubalakrishnan@live.com). 

If this tutorial helped you, please share the page on facebook, like it and please support me by clicking on the below ads.

Monday, November 19, 2012

Setup FTP from Mainframe to Non-Mainframe –Method II using Bat file

Here is another method with which you can transfer files from Mainframe to a windows Machine. To use this method you need to have a .Bat file and a file with list of files need to be transferred and valid Mainframe credentials.

You could also read other methods I’ve written about FTP’ing files from IBM Mainframe to Windows. These methods are easy to use and utilizes the free resources available in IBM Mainframe as well as Windows/free wares.

1. Simple FTP with Windows Bat file - http://mainframegeek.me/2012/11/20/setup-ftp-from-mainframe-to-non-mainframe-method-ii-using-bat-file/

2. Setup FTP with Filezilla server.

http://mainframegeek.me/2012/09/12/setup-ftp-from-mainframe-to-personal-computermethod-i-using-filezilla-server-on-windows/

3. Setup FTP with IIS (Internet Information Service) FTP server.

http://http://mainframegeek.me/2012/11/23/setup-ftp-from-mainframe-to-non-mainframe-method-iii/

Copy the contents of below table and save it as script.txt. You can save anywhere you want, I saved it on C:\temp1 folder. Change my_mainframe_userid and my_mainframe_password to your mainframe user id and password. By default the your HLQ (High level qualifier) will be your mainframe id, so whatever DD names you mention in the script file will have HLQ (High level Qualifier) padded, e.g HLQ.DDS1764.PGMG.CBL(ASCEBCB1) ,

To avoid this, we issue  cd ..    . Update the DD names with your list of data set names, you can either use PDS member names, a PS or Compressed (xmited) PDS or everything. there is no limit for the number of files, but keep in mind that this could eat a lot of bandwidth, followed by the destination file. Save this file as script.txt in your windows machine.

my_mainframe_userid
my_mainframe_password
cd ..
get "DDS1764.PGMG.CBL(ASCEBCB1)"  "C:\temp101.txt"
get "DDS1764.PGMG.CBL(ASCED)"  "C:\temp102.txt"
get "DDS1764.PGMG.CBL(ASMLNK1)"  "C:\temp103.txt"
get "DDS1764.PGMG.CBL(COB18DIG)"  "C:\temp104.txt"
get "DDS1764.PGMG.CBL(DIVZERO)"  "C:\temp105.txt"
quit

Copy the contents of below table and save it as batchftp.bat .   Before oyu save the file, change my_mainframe_ip  to your mainframe host ip for name. when you save the file from Microsoft notepad, make sure you choose file name: batchftp.bat and Save as type: All Files (*.*) .

echo off
cls
echo Batch FTP From Mainframe to Windows
echo   ***** Created by Shibu Thannikkunnath
echo   ***** mainframegeek@hotmail.com
echo   ***** http://mainframegeek.me
pause
ftp -s:script.txt my_mainframe_ip
exit
pause

 

Make sure you keep both the script.txt as well as the batchftp.bat file in the same folder. Now double click on the batchftp.bat to start download.  Once the script finished you can see all the transferred files in the folder mentioned in script.txt.

image

 

Try the script, let me know if you have any questions. If you think this tutorial helped you, don’t forget to like my facebook page, rate or share.  and support me by watching the below video (Ad)

-Cheers

Shibu

Friday, December 2, 2011

How to Fix “GDG Generation Not Found JCL Error”

Here is the snippet to avoid JCL error due to NO GDG Generations are found on SMS.

You know that the only possible way to avoid DATASET NOT FOUND JCL Error is “Create datasets or use Dummy” here is a method to handle the errors in JCL itself.

You can have IDCAMS to issue LISTCAT LVL to list all the generations for the GDG and the move the out put to an input file, then use SORT utility to Check the resultant file for the .G and V00 characters on the file. If no GDG generations found set Return code of the step to 4 (it can be anything). then setup COND parameter for an IEFBR step in such a way that if the CONDCODE matches 4 (“COND=(4,NE)”), create the versions :)

JCL.

//R0318BMJ  JOB 'GDG VER FINDER',NOTIFY=R0318B               
//IDCAMS   EXEC PGM=IDCAMS                                   
//SYSPRINT DD DSN=&&TEMP,DISP=(,PASS)                        
//SYSIN    DD *                                              
LISTCAT LVL('TSHRCI.PATMAN.REPORT.GROUP') ALL               
/*                                                           
//*                                                          
//GETPOS   EXEC PGM=SORT                                     
//SYSOUT   DD SYSOUT=*                                       
//SORTIN   DD DSN=&&TEMP,DISP=SHR                            
//SORTOUT  DD SYSOUT=*                                       
//SYSIN    DD *                                              
OPTION    NULLOUT=RC4,VLSCMP                                
SORT      FIELDS=COPY                                       
 INCLUDE   COND=(48,2,CH,EQ,C'.G',AND,54,3,CH,EQ,C'V00')     
/*                                                           
//MODEL    EXEC PGM=IEFBR14,COND=(4,NE,GETPOS)               
//GDGMODEL DD   DSN=TSHRCI.PATMAN.REPORT.GROUP(+1),          
//         DISP=(NEW,CATLG,DELETE),                          
//         UNIT=SYSDA,                                       
//         SPACE=(TRK,(1,1),RLSE),                           
//         DCB=(LRECL=80,RECFM=FB,BLKSIZE=800,DSORG=PS)      
//SYSPRINT DD   SYSOUT=*                                     
//SYSIN    DD DUMMY
                                          

INCLUDE   COND=(48,2,CH,EQ,C'.G',AND,54,3,CH,EQ,C'V00') 

Once you executed IDCAMS step the messages from LISTCAT will be moved to &&TEMP dataset, then using the above CONDITION statement SORT utility will check for .G and V00 characters on the TEMPDATASET, if found SOR will skip the step else if set RETURN CODE 4.

The TEMP Dataset is FBA, so you need to add 4 bytes to the actual position of the characters on TEMP dataset. 44 and 50 are the Character positions of .G & V00 on my TEMPDATASET, after adding 4 it will become 48 and 54.  To find the positions of your characters replace TEMP with a dataset on your system then, check the file. “Don’t forget to add 4 bytes”

//MODEL    EXEC PGM=IEFBR14,COND=(4,NE,GETPOS)

This will execute only if the GETPOS step returned a return code of 4.

Let me know if you have any concerns on the JCL. and Like it/rate it/Comment on it you like the post.

Thanks

-Shibu-

Saturday, October 29, 2011

Programming a CICS-DPL-COBOL application & setting up the region.

DPL (Distributed Program Link) enables a Local CICS program to issue a EXEC CICS LINK to a program in the remote CICS region which return control to the calling program. DPL provides the below advantages for a CICS application.

  1. It allows a non OS390/zOS application to use DL/I, SQL, BDAM and VSAM files owned by a zOS/os390 system.
  2. Allows CICS programmer to use LU 6.2 link Protocol without knowing the protocol.
Restrictions of DPL.

You cannot use the below CICS services on the remote application.

  1. You cannot issue any terminal control commands. e.g. SEND, RECEIVE.
  2. No BMS commands.
  3. No security commands like SIGNON or SIGNOFF.

If you are receiving any abends on the remote application and it didn’t handle the abend by itself then, abend code will returned to the Main program.

Defining and installing CICS entries.

Assume that you have a Mainframe connectivity like below.

image

Here I have 2 TSO sessions, 8 CICS regions, 2 IMS, 1 CICSPlex/SM and few Session manager setups and Misce sessions.

I am using the CICSA and CICSB regions, I.e my Main program is in CICSA and it then calling the program on CICSB using a COMMAREA, second program will write the message passed in commarea into a VSAM file, set a message onto COMMAREA and returns into CICSA region.

Before you are getting started with your program, make sure that MRO/ISC is configured in your Mainframe, you can contact you system Admin or follow my instructions below.

  1. Go to your CICS region batch job in spool.
  2. Open the JESYSMSG and Check for ISC and IRCSTRT init parms are setup to YES.
  3. IF the above initparms are not setup to YES then you need to ask your sysadmin to set this up before you continue with DPL program.
Usually SYSADMIN do the below steps to setup ISC or IRCSTRT.
  1. Bring down CICS region using master console or Perform SHUTDOWN using CEMT.
  2. Find SIP parameter for the region.
  3. Go to SYSIN PDS of the Installed CICS TS.
  4. Find the DFH$SIP<SIP PARM> member and add the ISC and IRCSTRT parms.
  5. Restart CICS region.

You can also issue a CEMT I IRC to check whether IRC is setup for the region.

image

Steps to create CICS table entries for a DPL program.

  1. Define and Install the main program on LOCAL CICS region as usual.
  2. Define and install Mirror Entries of remote CICS transaction and program on LOCAL CIS region. Set the remote Attributes (Remote System as the 4 digit remote CICS region ID, and program name) You can see the remote system ID on SYSID field once you issue a CEMT/CEDA command (See below screenshots).
  3. Go to Remote CICS region and define and Install only remote Program and Transaction.
  4. Compile CICS programs and move Load module to the respective libraries of local and Remote CICS regions.
  5. Perform New copy for the Local program on Local CICS region and Remote program on remote region.
  6. Invoke the Local CICS program using the defined Transaction on Local CICS region.
DPL Sample program

Main program.

IDENTIFICATION DIVISION.
PROGRAM-ID. CDPL01A.
AUTHOR.     SHIBU.T.
*
DATA DIVISION.
WORKING-STORAGE SECTION.
77  WS-MSG-1                    PIC X(100).
77  WS-MSG-LEN                  PIC S9(4) COMP.
*
01  WS-COMMAREA.
     02  WS-RECID                PIC X(10).
     02  WS-MSG                  PIC X(40).
     02  WS-PROG-ID              PIC X(08).
LINKAGE SECTION.
01  DFHCOMMAREA.
     02  LS-COMMAREA.
         03  LS-RECID            PIC X(10).
         03  LS-MSG              PIC X(40).
         03  LS-PROG-ID          PIC X(08).
PROCEDURE DIVISION.
A0001-MAIN-PARA.
     MOVE SPACES                 TO WS-COMMAREA WS-MSG-1.
     IF EIBCALEN = 0 THEN
        PERFORM A00150-INITIALIZE
     ELSE
        PERFORM A00200-LINK
     END-IF.

*
A00150-INITIALIZE.
     MOVE 'PROGRAM ON CICSAOR1 REGION'
                                 TO WS-MSG.
     MOVE '1000000123'           TO WS-RECID.
     MOVE 'CDPL01A'              TO WS-PROG-ID.
     MOVE 'WS-MSG BEFORE DPL: '  TO WS-MSG-1(1:20).
     MOVE WS-MSG                 TO WS-MSG-1(21:26).
     MOVE '* PROGRAM-ID: '       TO WS-MSG-1(47:14).
     MOVE WS-PROG-ID             TO WS-MSG-1(61:08).
     EXEC CICS SEND TEXT
         FROM(WS-MSG-1)
         ERASE
     END-EXEC.
     EXEC CICS RETURN
         TRANSID('AA05')
         COMMAREA(WS-COMMAREA)
     END-EXEC.

*
A00200-LINK.
     MOVE LS-COMMAREA            TO WS-COMMAREA.
     EXEC CICS LINK
         PROGRAM('CDPL01B')
         COMMAREA(WS-COMMAREA)
     END-EXEC.

     MOVE SPACES                 TO WS-MSG-1.
     MOVE 'WS-MSG AFTER  DPL: '  TO WS-MSG-1(1:20).
     MOVE WS-MSG                 TO WS-MSG-1(21:26).
     MOVE '* PROGRAM-ID: '       TO WS-MSG-1(47:14).
     MOVE WS-PROG-ID             TO WS-MSG-1(61:08).
     EXEC CICS SEND TEXT
         FROM(WS-MSG-1)
         ERASE
     END-EXEC.
     EXEC CICS RETURN
     END-EXEC.

Sub Program on Remote region.

IDENTIFICATION DIVISION.
PROGRAM-ID. CDPL01B.
AUTHOR.     SHIBU.T.
*
DATA DIVISION.
WORKING-STORAGE SECTION.
77  WS-MSG-1                    PIC X(100).
77  WS-MSG-LEN                  PIC S9(4) COMP.
01  WS-FILE-DT.
     02  WS-DAT.
         03  WS-KEY              PIC X(10).
         03  WS-DAT1             PIC X(40) VALUE SPACES.
         03                      PIC X(60) VALUE SPACES.
*
01  WS-COMMAREA.
     02  WS-RECID                PIC X(10) VALUE SPACES.
     02  WS-MSG                  PIC X(40).
     02  WS-PROG-ID              PIC X(08).
LINKAGE SECTION.
01  DFHCOMMAREA.
     02  LS-COMMAREA.
         03  LS-RECID            PIC X(10).
         03  LS-MSG              PIC X(40).
         03  LS-PROG-ID          PIC X(08).
PROCEDURE DIVISION USING DFHCOMMAREA.
A0001-MAIN-PARA.
*    MOVE SPACES                 TO WS-COMMAREA WS-MSG-1.
     MOVE LS-RECID               TO WS-KEY.
     MOVE LS-MSG                 TO WS-DAT1.
     EXEC CICS WRITE
          DATASET('VFILE1')
          FROM(WS-DAT)
          LENGTH(LENGTH OF WS-DAT)
          RIDFLD(WS-KEY)
     END-EXEC.
     MOVE 'PROGRAM ON CICSAORB REGION'
                                 TO WS-MSG.
     MOVE 'CDPL01B'              TO WS-PROG-ID.
     MOVE WS-COMMAREA            TO LS-COMMAREA.
     EXEC CICS RETURN
     END-EXEC.

Compile aCICS programs and Move load modules to respective LOAD LIBS of CICS regions.

Please refer to http://mainframegeek.wordpress.com/2011/10/11/prepare-compile-define-install-execute-a-cics-cobol-program/ for more info on how to prepare compile a COBOL-CICS program, how to find LOAD LIB od CICS region and move the Load module.

Defining and Installing Resources to CICS.
On CICS REGION CICSA

Step 1 Create and Install Program entries for the Main program on CICSA, defining is similar to a normal CICS program.

clip_image002[12]

Step 2 Install the program.

clip_image002[32]

Step 3 Define Transaction Entry for Main program on CICSA, you need to mention main program name (CDPL01A) while defining Transaction entry.

clip_image002[8]

Step 4  Install the transaction.

clip_image002[10]

Step 5 Define Mirror Program.

clip_image002[14]

clip_image002[16]

clip_image002[18]

Step 6 Define and Install Mirror Transaction.

clip_image002[22]

clip_image002[24]

clip_image002[26]

on remote region

Step 7 Define, Install Program and Transaction entries .

image

clip_image002[6]

clip_image002[28]

clip_image002[30]

Step 9 Execute Program.

Issue AA05 on CICSA to execute program, do a cedf if you want to see what is exactly happening in the program. This is a pseudo-conversation program, it displays commarea content before links to the remote app. Press enter to issue LINK.

clip_image002[34]

clip_image002[36]

Control came back from Remote app, you can see the commarea contents which set up by remote app.

You can also open the file to ensure that Remote app is getitng COMMAREA conts correctly ( Remote app will write the commarea contents to VSAM file). Look for th last line, that is the message passed on commarea.

clip_image002[38]

Tuesday, October 11, 2011

Prepare, Compile, Define, Install, Execute a CICS (COBOL) program

Here I’m trying to cover the necessary steps to Prepare, Compile, Define and Execute a CICS COBOL program, Technically there no difference in Link edit, Define, Install and Execute a COBOL program and the programs prepared in any other languages such as Assembler, C/C++, PL\1. But yes there is difference in compiling object codes.

 

                    cics-lifecycle

Step 1. Compile/Link edit a CICS COBOL Program.

IBM has supplied a standard procedure for Compile and link edit CICS-COBOL code. The pre-compile ( Translating ) will comment all the CICS commands from the source code and then replace them with specific COBOL call statements. This translated source code then passed to Compile step, which will compile the source code and create the object code. The Cobol compilation is done with IGYCRCTL compiler program. The object code then given as input to the IBM linkedit program. you can use HEWL or IEWL for this purpose, you can find this program in CEE.SCEELKED or CEE.SCEECICS this may be different in your system. The IBM supplied standard procedure name is DFHEITVL. You can find this proc in SDFHPROC,of the CICS base location. for me it was CICSTS42.CICS.SDFHPROC.  And of course you can see a lot of other procs in the CICS proclib, some of them can be used for CICS-DB2-COBOL, CICS-Assempler, CICS-C/C++, CICS-PL\1 or compile and link edit BMS Maps etc. you can then use the below jcl for precompile, Compile and Link edit your program.

//DDS1764J   JOB 'SHIBU THANNIKKUNNATH',NOTIFY=&SYSUID  
//IBMLIB     JCLLIB ORDER=CICSTS42.CICS.SDFHPROC               
//CPLSTP     EXEC DFHEITVL                               
//TRN.SYSIN  DD DSN=TSHRCI.PGMG.CICOB(PGM1),DISP=SHR    
//LKED.SYSIN DD *                                       
   NAME PGM1(R)                                         
//

make sure that the PROGLIB in the DFHEITVL is pointed to your CICS loadlib. If you are not sure about this you can go to The JESJCL of the job for your CICS region in Spool and check for DFHRPL dd statement.

Step 2. DEFINE and INSTALL PROGRAM and TRANSACTION Entries.

You should have Administration privileges to do the below steps.

Define Program Entries.

To define a CICS prog entry, you can issue CEDA  DEF  PROG( Program ID) GROUP(group ID). If the group doesn’t exist in the system them CICS will create a new group for you. If your program lies in the same CICS region itself then the mandatory values are Program Id and Group name. If your program is a Remote program , lies in a different CICS region then you need to have the destination CICS region ID and remote Program ID in addition to the program Id and group ID.

image

Install the Program ID

You can issue a CEDA INS PROG(Program id) GROUP(Group ID). the group and program are must be defined in the system.

image

Define Transaction ID

You can Issue a CEDA DEF TRANS(transaction id) group(group id) for this. If the group is not existing in the system then group will be created by CICS. You must Give Program ID (associated with the trans-id) while defining Transaction. Again if your transaction is for a remote program then you must provide the destination CICS region ID and destination transaction name.

image

Then Issue CEDA INS TRANS(Transaction ID) GROUP( Group ID) to install the transaction id.

image

Step 3. Run The Program

You can just enter the transaction Id associated with the program to execute it. You can also use CEDF for debugging mode, in CEDF you can see the step by step execution of CICS commands in your program, you can also see the working storage section, EIB Fields values and lot mode when you use CEDF.

Executing with CEDF

image

image

 

Execution without CEDF

image

here is my CICS-COBOL Source code.. This is a Link program, but I’m not giving my second program’s source code, please comment in this post if you guys want me to post my second program.

 Identification division.                                     
Program-id.    pgm1.                                         
author.        shibu.t.                                      
data division.                                               
working-storage section.                                     
77  msg-len                     pic s9(4) comp.              
77  msg-out                     pic x(30).                   
01  ws-commarea.                                             
     05  ws-pgm1                 pic x(8).                    
     05  ws-pgm2                 pic x(8).                    
77  temp-data                   pic x(10).                   
linkage section.                                             
01  dfhcommarea.                                             
     02  ls-commarea.                                         
         05  ls-pgm1             pic x(8).                    
         05  ls-pgm2             pic x(8).                    
Procedure division.                                          
     Move 'PGM1:YES' to ws-pgm1.                              
     Move 'PGM2:NO ' to ws-pgm2.                              
     Move 16 to msg-len.                                      
     exec cics send                                           
       from(ws-commarea)                                      
       length(msg-len)                                        
       erase                                                  
     end-exec.                                                
     exec cics LINK                                           
       program('PGM2')                                        
       commarea(ws-commarea)                                  
     end-exec.                                                
*    move ls-commarea            to ws-commarea.              
*    move ls-commarea            to temp-data.                
*    move 10                     to msg-len.                  
     exec cics send                                           
       from(ws-commarea)                                      
       length(msg-len)                                        

       erase                                                   
     end-exec.                                                 
     Exec cics return                                          
     end-exec.                                                 
     goback.
                                                   

Tuesday, September 13, 2011

DSNTIAR & DSNTIAC–SQLCA formatter for Batch & CICS

We must check for the SQLCODE before we issue commit on a table in DB2, handle the errors- Display description or whatever. handling/remembering reason for each and every sqlcode every time is a time pressing task always. There is DSNTIAR and DSNTIAC comes in picture. DSNTIAR and DSNTIAC are two assembler routine which helps to get a formatted version of SQLCA and the text message based on the sqlcode in the SQLCA.

DSNTIAR takes data from SQLCA formats and puts into a data area provided by the calling program. DSNTIAR will overwrite the contents of the data area before it moves the data.

DSTIAR expects the SQLCA in its original for, so before you call DSNTIAR/DSNTIAC make sure that you haven’t modified SQLCA.

Defining Message output Data name

Calling program must allocate output message data name and pass it,

make sure:

1. First 2 bytes are length – a pic s9(4) comp will be ideal for the purpose.

2.You must define enough space for the message in character type, data should be minimum of 10 lines of 72 bytes. A  PIC x(72)  occurs 10 times. will  be quite enough for the message.

e.g.

01  ERROR-MESSAGE.                                
        02  ERROR-LEN   PIC S9(4)  COMP VALUE +720.
        02  ERROR-TEXT  PIC X(72)  OCCURS 10 TIMES.

keep the length in another variable.

77  ERROR-TEXT-LEN      PIC S9(9)  COMP VALUE +72.

Once we executed a SQL statement, we are ready to issue a call to DSNTIAR,

CALL 'DSNTIAR' USING SQLCA ERROR-MESSAGE ERROR-TEXT-LEN

display the resultant message by displaying “ ERROR-TEXT() “ table.

Possible return codes for DSNTIAR/DSNTIAC
0 Successful execution.
4 More data available than could fit into the provided message area.
8 Error record length is not between 72 & 240
12 Message area is not large enough,  we need to provide more space needs to be defined and must be passed.
16 Error in message routine.

 

Sample program

IDENTIFICATION DIVISION.                                        
PROGRAM-ID. DBPGM01.                                            
AUTHOR    . SHIBU.T.                                            
*                                                                
DATA DIVISION.                                                  
WORKING-STORAGE SECTION.                                        
     EXEC SQL                                                    
         INCLUDE MYNAM                                           
     END-EXEC.                                                   
     EXEC SQL                                                    
         INCLUDE SQLCA                                           
     END-EXEC.                                                   
                                                                 
01  ERROR-MESSAGE.                                              
         02  ERROR-LEN   PIC S9(4)  COMP VALUE +720.             
         02  ERROR-TEXT  PIC X(72)  OCCURS 10 TIMES.             
77  ERROR-TEXT-LEN      PIC S9(9)  COMP VALUE +72.              
                                                                 
01  WS-TEMP-VAR.                                                
     05  TEMP                    PIC X(30).                      
     05  TEMP-MSG                PIC X(60).                      
     05  WS-IND                  PIC X VALUE 'Y'.                
01  WS-TBLE-DTA.                                                
     05  WS-SEQ                  PIC X(3).                       
     05  WS-SEQ-TMP              PIC X(3).                       
     05  WS-NAME                 PIC X(15).                      
                                                                 
77  WS-I                        PIC S9(4) COMP.                 
                                                                 
01  WS-SQLCODE                  PIC ------9.                    
*                                                                
PROCEDURE DIVISION.                                             
     PERFORM A00100-READ-PARA.                                   
                                                                 
Z00100-EXIT-PARA.                                               
     STOP RUN.                                                   
A00100-READ-PARA.                                               
     DISPLAY '         A00100-READ-PARA.           '             
     EXEC SQL                                                   
         DECLARE CURREAD1 CURSOR FOR                            
             SELECT NAME,SEQ FROM IBMGRP.MYNAM                  
     END-EXEC.                                                  
     EXEC SQL                                                   
        OPEN CURREAD1                                           
     END-EXEC.                                                  
     EVALUATE TRUE                                              
     WHEN SQLCODE = 0                                           
      PERFORM A00150-READ-PARA                                  
     WHEN SQLCODE > 0                                           
      DISPLAY 'FETCH WAS SUCCESS WITH A WARNING'                
      CALL 'DSNTIAR' USING SQLCA ERROR-MESSAGE ERROR-TEXT-LEN   
      PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I = 10          
        DISPLAY ERROR-TEXT(WS-I)                                
      END-PERFORM                                               
     WHEN OTHER                                                 
      CALL 'DSNTIAR' USING SQLCA ERROR-MESSAGE ERROR-TEXT-LEN   
      PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I = 10          
        DISPLAY ERROR-TEXT(WS-I)                                
      END-PERFORM                                               
      PERFORM Z00100-EXIT-PARA                                  
     END-EVALUATE.                                              
     MOVE SQLCODE             TO WS-SQLCODE.                    
     DISPLAY 'SQLCODE OPEN  ' WS-SQLCODE.                       
A00150-READ-PARA.                                              
     DISPLAY '****DATA FROM TABLE***'                           
     PERFORM UNTIL SQLCODE = 100                                
        EXEC SQL                                                
           FETCH CURREAD1 INTO :WS-NAME,:WS-SEQ                 
        END-EXEC                                                
        MOVE SQLCODE             TO WS-SQLCODE                  
        EVALUATE TRUE                                           
        WHEN SQLCODE = 0                                        
         MOVE SPACES TO TEMP-MSG                                
         STRING                                                 
         'NAME: ' DELIMITED BY SPACE ' ' DELIMITED BY SIZE      
         WS-NAME DELIMITED BY SPACE ',' DELIMITED BY SIZE       
         'SEQ#' DELIMITED BY SPACE ' ' DELIMITED BY SIZE        
         WS-SEQ DELIMITED BY SIZE INTO TEMP-MSG                 
         DISPLAY TEMP-MSG                                       
        WHEN  SQLCODE > 0                                       
         DISPLAY 'FETCH WAS SUCCESS WITH A WARNING'             
         CALL 'DSNTIAR' USING SQLCA ERROR-MESSAGE ERROR-TEXT-LEN
         PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I = 10       
         DISPLAY ERROR-TEXT(WS-I)                               
      END-PERFORM                                               
        WHEN OTHER                                              
         CALL 'DSNTIAR' USING SQLCA ERROR-MESSAGE ERROR-TEXT-LEN
         PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I = 10       
           DISPLAY ERROR-TEXT(WS-I)                             
         END-PERFORM                                            
         PERFORM Z00100-EXIT-PARA                               
        END-EVALUATE                                            
     END-PERFORM.                                               
     DISPLAY '****END OF TABLE DATA****'                        
     EXEC SQL                                                   
        CLOSE CURREAD1                                          
     END-EXEC.                                                  
     MOVE SQLCODE             TO WS-SQLCODE.                    
     DISPLAY 'SQLCODE CLOSE ' WS-SQLCODE.                       
     EXIT                                                       
     .                                                          

Compiling and link editing.

remember you must concatenate <HLQ>.SDSNLOAD of DB2 installed in your host mainframe to the STEPLIB of compile step, otherwise it will result in DSNTIAR module not found error while compiling. Read http://mainframegeek.wordpress.com/2011/05/12/steps-in-a-cobol-db2-program/ for the jcl for compile, link edit and exec ut the DB2 cobol program. Don’t forget to change the JCL as mentioned below.

e.g.

//DB2COBA JOB (12345678),MSGCLASS=H,REGION=4M,                        
//        MSGLEVEL=(1,1),CLASS=A,NOTIFY=&SYSUID                       
//*                                                                   
//JOBLIB    DD DSN=DSN910.DB9G.SDSNEXIT,DISP=SHR                      
//          DD DSN=DSN910.SDSNLOAD,DISP=SHR                           
//*****************************************************************   
//* SQL PREPROC AND COBOL COMPILATION:                                
//*****************************************************************   
//*-NB---SQL PREPROC NOW IS NOW DONE BY THE COBOL COMPILER:           
//*****************************************************************   
//COB     EXEC  PGM=IGYCRCTL,                                         
//            PARM=(SQL,LIB,NOTERM,NOSEQUENCE,LIB,XREF,DYN,'')        
//STEPLIB   DD DSN=IGY410.SIGYCOMP,DISP=SHR                           
//          DD DSN=DSN910.SDSNLOAD,DISP=SHR                           
//DBRMLIB   DD DSN=TSHRCI.PGMG.DBRM(DBPGM02),DISP=SHR                 
//SYSIN     DD DSN=TSHRCI.PGMG.COBOL1(DBPGM02),DISP=SHR               
//SYSLIB    DD DSN=TSHRCI.PGMG.COBOL1,DISP=SHR                        
//SYSLIN    DD DSN=&&LOADSET,DISP=(MOD,PASS),UNIT=SYSDA,              
//             SPACE=(800,(500,500))                                  
//SYSPRINT  DD SYSOUT=*                                               
//SYSUDUMP  DD SYSOUT=*                                               
//SYSUT1    DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA               
//SYSUT2    DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA               
//SYSUT3    DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA               
//SYSUT4    DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA               
//SYSUT5    DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA               
//SYSUT6    DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA               
//SYSUT7    DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA               
//*****************************************************************
   

Outputs.

image