Hur man mappar JCL till COBOL och varför det spelar roll

Hur man mappar JCL till COBOL och varför det spelar roll

Varje stordator i ett företag kör två sammanflätade språk som de flesta moderna utvecklare aldrig har skrivit. COBOL implementerar affärslogik, beräkningar, filbehandling, posttransformationer och regulatorisk rapportering. JCL (Job Control Language) orkestrerar exekveringen av den logiken och definierar vilka program som körs, i vilken ordning, med vilka filer, under vilka förhållanden och vad som händer när de lyckas eller misslyckas. Inget av språken är komplett utan det andra. Ett COBOL-program har ingen aning om var dess indatafiler kommer ifrån eller vart dess utdata går; JCL besvarar båda frågorna innan den första posten läses.

För organisationer som underhåller, granskar eller moderniserar stordatorsystem är förståelse för JCL-till-COBOL-relationen inte valfri bakgrundskunskap. Det är en förutsättning för allt: konsekvensanalys före varje förändring, dokumentation före varje migrering, kunskapsöverföring innan någon expert går i pension. Jobbet som behandlar nattlig fakturering, batchkörningen som genererar kvartalsvisa regulatoriska rapporter, proceduren som matar data från ett system till ett annat, allt detta definieras av JCL, exekveras av COBOL och förstås endast av den krympande gruppen ingenjörer som har arbetat med båda.

Behöver du JCL till COBOL Mapping Tool?

Utforska SMART TS XL!

Mer information

Vad är JCL?

JCL står för Job Control Language. Det är skriptspråket som används på IBMs stordatorsystem för att skicka batchjobb för körning. JCL bearbetar inte data i sig. Det talar om för operativsystemet hur program ska köras: vilket program som ska köras, vilka filer som ska göras tillgängliga, vilka minnes- och CPU-resurser som ska allokeras, vad som ska göras om ett steg misslyckas och i vilken ordning flera steg ska köras inom ett enda jobb.

Varje JCL-jobb består av tre grundläggande typer av uttryck:

JOB-uttrycket identifierar jobbet för systemet och definierar parametrar för redovisning, prioritet och schemaläggning.

EXEC-uttryck , anger vilket program eller vilken procedur som ska köras i ett steg.

DD-uttrycket (Data Definition) definierar de datauppsättningar som programmet kommer att läsa eller skriva, inklusive deras plats, format och disposition.

jcl

//PAYBATCH JOB (ACCT#7), 'PAYROLL RUN',
//          CLASS=A, MSGCLASS=X, NOTIFY=&SYSUID
//*
//STEP010  EXEC PGM=PAYROLL1
//STEPLIB  DD   DSN=PROD.PAYROLL.LOADLIB,DISP=SHR
//EMPFILE  DD   DSN=PROD.PAYROLL.EMPLOYEE,DISP=SHR
//TRANSACT DD   DSN=PROD.PAYROLL.TRANS.D&&DATE,DISP=SHR
//PAYRPT   DD   SYSOUT=A
//SYSOUT   DD   SYSOUT=*
//SYSIN    DD   DUMMY

I detta exempel: PAYBATCH är jobbets namn, STEP010 är ett steg i jobbet, PGM=PAYROLL1 namnger det COBOL-program som ska köras, och DD-satserna definierar varje fil som programmet kan komma åt. COBOL-programmet PAYROLL1 vet inte eller bryr sig var EMPFILE or TRANSACT kommer fysiskt ifrån, läser den dem helt enkelt efter ddnamn. JCL löser den fysiska platsen, postformatet och åtkomstläget innan körningen börjar.

JCL-katalogiserade procedurer (PROC)

Istället för att skriva samma JCL-mönster för varje jobb definierar stordatorteam katalogiserade procedurer (PROC) som inkapslar återanvändbara exekveringsmönster. En PROC är en mall som lagras i ett procedurbibliotek; enskilda jobb refererar till den och åsidosätter specifika parametrar efter behov.

jcl

//PAYPROC  PROC RUNDATE=TODAY
//COMPILE  EXEC PGM=IGYCRCTL,PARM='OBJECT,NODUMP'
//SYSIN    DD   DSN=PROD.COBOL.SRC(&MEMBER),DISP=SHR
//SYSOBJ   DD   DSN=&&OBJSET,DISP=(NEW,PASS),
//              UNIT=SYSDA,SPACE=(TRK,(10,5))
//LKED     EXEC PGM=IEWL,PARM='LIST,LET,XREF'
//SYSLIN   DD   DSN=&&OBJSET,DISP=(OLD,DELETE)
//SYSLMOD  DD   DSN=PROD.PAYROLL.LOADLIB(&MEMBER),
//              DISP=SHR
//         PEND

Anropa PROC från ett jobb:

jcl

//COMPILE  EXEC PAYPROC,MEMBER=PAYROLL1,RUNDATE=20251205

Denna enda EXEC-sats expanderar till den fullständiga PROC:n vid exekveringstillfället, med MEMBER och RUNDATE ersättas var som helst &MEMBER och &RUNDATE PROC:er är en av de främsta anledningarna till att JCL-till-COBOL-mappning är komplex: ett jobb kan anropa dussintals COBOL-program via en enda PROC-referens, och de faktiska programmen som anropas beror på symboliska parametrar som varierar per körning.

Vad är skillnaden mellan JCL och COBOL?

JCL och COBOL nämns ofta tillsammans men de fyller helt olika roller. Ingen av dem ersätter den andra, och båda är nödvändiga för att batchbehandling i stordatorer ska fungera.

DimensioneraJCLCOBOL
SyfteOrkestrerar utförandetImplementerar affärslogik
Vad det definierarJobb, steg, filer, villkorProgram, datastrukturer, beräkningar
När den körsFöre programkörning (installation) och efter (rensning)Under programkörning
Läser/skriver dataVia datasetallokering (DD-satser)Via FILE SECTION och READ/WRITE-satser
FelhanteringReturkoder, villkorlig stegkörningUNDANTAGSHanterare, PERFORM-felrutiner
PortabilitetIBM z/OS-specifikBärbar över plattformar med kompilatorer
Vem skriver detSystemprogrammerare, batchingenjörerApplikationsutvecklare
Modern motsvarighetCI/CD-pipeline + containerorkestreringApplikationskod (Java, Python, C++)

Det enklaste sättet att konceptualisera relationen är: JCL är distributions- och orkestreringslagret; COBOL är applikationslagret. I ett modernt molnbaserat system skulle JCL:s roll fyllas av Kubernetes jobbmanifest, shellskript och CI/CD-pipelinesteg. COBOL:s roll skulle fyllas av applikationstjänster skrivna i Java, Python eller Go.

Hur JCL anropar COBOL: Exekveringskedjan

Vägen från ett JCL-jobb till COBOL-körning följer en konsekvent kedja. Att förstå varje steg är grunden för att förstå vad en JCL-till-COBOL-mappning måste fånga.

Steg 1: Jobbinlämning. JCL-jobbet skickas till Job Entry Subsystem (JES). JES köar jobbet och börjar läsa dess meddelanden.

Steg 2: Stegkonfiguration. För varje EXEC-steg lokaliserar systemet det namngivna programmet i det laddningsbibliotek som anges av STEPLIB DD-satsen. Om ingen STEPLIB anges söker systemet i systemlänkbiblioteket.

Steg 3: Datauppsättningsallokering. Innan programmet körs allokerar systemet alla datauppsättningar som definierats av DD-satser i steget. Detta inkluderar att öppna filer, verifiera att indatauppsättningar finns och skapa utdatauppsättningar.

Steg 4: Programkörning. COBOL-programmet körs. Det öppnar filer med hjälp av de dd-namn som definierats i JCL, OPEN INPUT EMPFILE i COBOL mappas direkt till DD-satsen med namnet EMPFILE i JCL.

Steg 5: Utvärdering av returkod. När COBOL-programmet avslutas anger det en returkod (vanligtvis 0 för lyckat resultat, 4 för varning, 8 för fel, 12 eller 16 för allvarligt fel). JCL använder COND parametrar eller IF/THEN/ELSE konstruktioner för att avgöra om efterföljande steg ska köras baserat på denna kod.

Steg 6: Disposition av dataset. Efter steget bearbetar systemet dispositionerna av dataset som definieras i varje DD-sats: behåll, ta bort, katalogisera, avkatalogisera eller gå vidare till nästa steg.

Följande exempel visar hur denna kedja ser ut i praktiken, JCL till vänster, motsvarande COBOL-element till höger:

jcl

//STEP020  EXEC PGM=ACCTREC
//STEPLIB  DD   DSN=PROD.ACCOUNT.LOADLIB,DISP=SHR
//INFILE   DD   DSN=PROD.ACCT.DAILY.INPUT,DISP=SHR     ← maps to COBOL SELECT/ASSIGN
//OUTFILE  DD   DSN=PROD.ACCT.PROCESSED,               ← maps to COBOL SELECT/ASSIGN
//              DISP=(NEW,CATLG,DELETE),
//              UNIT=SYSDA,SPACE=(CYL,(5,2),RLSE)
//RPTFILE  DD   SYSOUT=A                                ← maps to COBOL WRITE report
//SYSOUT   DD   SYSOUT=*

COBOL-programmet ACCTREC innehåller:

cobol

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT INFILE    ASSIGN TO INFILE.         *> maps to DD INFILE
           SELECT OUTFILE   ASSIGN TO OUTFILE.        *> maps to DD OUTFILE
           SELECT RPTFILE   ASSIGN TO RPTFILE.        *> maps to DD RPTFILE

       DATA DIVISION.
       FILE SECTION.
       FD  INFILE
           RECORDING MODE IS F
           BLOCK CONTAINS 0 RECORDS
           RECORD CONTAINS 200 CHARACTERS.
       01  ACCOUNT-RECORD.
           05  ACCT-NUMBER    PIC X(10).
           05  ACCT-BALANCE   PIC S9(13)V99 COMP-3.
           05  ACCT-STATUS    PIC X(2).

Ocuco-landskapet SELECT INFILE ASSIGN TO INFILE i COBOLs FILE-CONTROL-sektion ansluter till DD-satsen med namnet INFILE i JCL. Detta är den grundläggande mappningsrelationen: COBOL använder logiska filnamn; JCL löser upp dem till fysiska datamängder.

JCL Abend-koder: Vad de betyder

JCL-abendkoder (onormala slutkoder) identifierar varför ett jobbsteg avslutades oväntat. De visas i jobbutdata som S000 (systemfel) eller U0000 (användarens abend) koder. Att förstå dem är avgörande för att diagnostisera misslyckade batchjobb.

Abend-kodenTypVanlig orsak
S001SystemkravI/O-fel vid läsning eller skrivning av en datauppsättning
S013SystemkravDCB-attributfelmatchning, postlängds- eller formatfelmatchning mellan JCL DD och COBOL FD
S0C4SystemkravUndantag för lagringsskydd, programmet försökte komma åt minne utanför dess allokerade region
S0C7SystemkravDataundantag, försök till aritmetik på icke-numeriska data (mycket vanligt COBOL-undantag)
S322SystemkravTidsgränsen har överskridits, jobbet kördes längre än vad TIME-parametern tillåter
S806SystemkravLaddningsmodulen hittades inte, programnamnet i EXEC PGM= finns inte i något sökt laddningsbibliotek
S913SystemkravSäkerhetsöverträdelse för datauppsättning, RACF eller motsvarande nekad åtkomst
U0000AnvändareApplikationsdefinierad abend, COBOL-program kallat STOP RUN med en användarkod
U4076AnvändareIMS-specifik fel, databasåtkomstfel

Den vanligaste produktionsavvikelsen, S0C7, inträffar när ett COBOL-program försöker utföra aritmetiska beräkningar på ett fält som innehåller mellanslag eller icke-numeriska tecken. Den typiska orsaken är en avvikelse mellan det förväntade dataformatet i COBOL-programmet och de faktiska data som levereras av JCL, vilket är precis den typ av avvikelse som JCL-till-COBOL-mappning avslöjar innan den orsakar ett produktionsfel vid midnatt.

COND-parametern och villkorlig exekvering

JCL styr vilka steg som körs baserat på returkoder från tidigare steg med hjälp av COND parameter:

jcl

//STEP010  EXEC PGM=VALIDATE,COND=(4,LT)
//STEP020  EXEC PGM=PROCESS, COND=(4,LT,STEP010)
//STEP030  EXEC PGM=CLEANUP, COND=(0,NE,STEP010)

COND=(4,LT) betyder: hoppa över detta steg om returkoden för något föregående steg är mindre än 4. COND=(4,LT,STEP010) betyder: hoppa över detta steg om STEP010:s returkod är mindre än 4. COND=(0,NE,STEP010) betyder: hoppa över STEP030 om STEP010s returkod inte är lika med 0, dvs. kör endast rensningen om STEP010 lyckades.

Moderna JCL använder IF/THEN/ELSE/ENDIF konstruktion istället, vilket är mer läsbart:

jcl

//IF010    IF (STEP010.RC = 0) THEN
//STEP020  EXEC PGM=PROCESS
//         ENDIF
//IF020    IF (STEP010.RC > 4) THEN
//STEP030  EXEC PGM=ERRORHANDLER
//         ENDIF

Att mappa villkorliga exekveringsvägar är ett av de viktigaste och oftast missade elementen i JCL-till-COBOL-analys. Ett COBOL-program som bara körs när ett tidigare steg misslyckas kan hantera feltillstånd, rollback-logik eller återställningsprocedurer, funktionalitet som är helt osynlig om man bara tittar på COBOL-källkoden utan JCL:n som driver den.

JCL, COBOL och DB2: Trelagerstacken

De flesta stordatortransaktionssystem involverar en tredje komponent vid sidan av JCL och COBOL: DB2, IBMs relationsdatabas. COBOL-program kommer åt DB2 via inbäddade SQL-satser (EXEC SQL-block). JCL hanterar DB2-undersystemanslutningen och DBRM (Database Request Module) genom specifika DD-satser.

jcl

//DBRM     DD   DSN=PROD.DBRMLIB.DATA(ACCTREC),DISP=SHR
//SYSPRINT DD   SYSOUT=*

cobol

       WORKING-STORAGE SECTION.
       EXEC SQL
           INCLUDE SQLCA
       END-EXEC.

       PROCEDURE DIVISION.
       MAIN-LOGIC.
           EXEC SQL
               SELECT ACCT_BALANCE, ACCT_STATUS
               INTO   :WS-BALANCE, :WS-STATUS
               FROM   ACCOUNT_MASTER
               WHERE  ACCT_NUMBER = :WS-ACCT-NUM
           END-EXEC.

           IF SQLCODE NOT = 0
               PERFORM DB2-ERROR-ROUTINE
           END-IF.

I JCL-COBOL-DB2-stacken tillhandahåller JCL runtime-miljön och åtkomst till dataset; COBOL implementerar affärslogik och anropar databasen; DB2 lagrar och hämtar data enligt den SQL som är inbäddad i COBOL-programmet. En komplett beroendekarta för alla COBOL-program som använder DB2 måste inkludera inte bara vilka JCL-jobb som anropar det utan även vilka DB2-tabeller det läser och skriver, vilka kolumner det kommer åt och vilka andra program som kommer åt samma tabeller, eftersom en schemaändring i en tabell påverkar varje COBOL-program som refererar till den.

Varför JCL-till-COBOL-mappning är viktig för modernisering

Att mappa JCL till COBOL är inte primärt en teknisk övning. Det är en riskhanteringsövning. Varje ändring i ett stordatorsystem, oavsett om det gäller att ändra en JCL-parameter, lägga till ett steg, ändra ett datamängdsnamn eller ändra COBOL-programmet som ett jobb anropar, medför konsekvenser som sträcker sig bortom den ändrade komponenten. Det enda sättet att noggrant bedöma dessa konsekvenser innan man gör en ändring är att ha en komplett karta över vad som finns och hur allting kopplas samman.

Före migrering : Att flytta batch-arbetsbelastningar från stordator till molnet kräver att man vet vilka JCL-jobb som finns, vilka COBOL-program de anropar, vilka datamängder som flyter mellan steg, vad exekveringssekvensen är och vad som händer när steg misslyckas. Utan denna karta arbetar migreringsteamet med ofullständig dokumentation, eller med ingen dokumentation alls. Steg missas. Beroenden upptäcks i produktionen. Övergångsdatum försenas.

Före någon kodändring : Ett COBOL-program som modifieras utan att kontrollera vilka JCL-jobb som anropar det kan förstöra jobb som körs under andra förhållanden eller med olika datamängdskonfigurationer. En JCL-parameterändring som verkar lokal kan påverka beteendet hos ett COBOL-program som förlitar sig på specifika datamängdsattribut. Konsekvensanalys kräver att man känner till hela JCL-till-COBOL-till-datamängdskedjan innan någon ändring görs.

För kunskapsöverföring : När en COBOL-utvecklare som har underhållit ett batchsystem i tjugo år går i pension tar de med sig den mentala modellen för hur JCL-jobb och COBOL-program kopplas samman. En dokumenterad karta är den enda mekanismen för att överföra den kunskapen till nästa team. Utan den ärver nya utvecklare ett system som de inte kan modifiera på ett säkert sätt.

För efterlevnadsrevision : Myndighetsrevisioner kräver ofta att man visar att finansiella beräkningar, datatransformationer eller åtkomstkontroller fungerar som dokumenterat. Om JCL-till-COBOL-förhållandet är odokumenterat är det omöjligt att visa detta utan att reverse-engineera systemet under revisionstryck.

JCL-hanteringsverktyg och analysplattformar

Den flerspråkiga karaktären hos Search Console-datan för den här artikeln, med frågor på italienska, franska, spanska, japanska och tyska som alla frågar om JCL-hanteringsverktyg, återspeglar hur globalt distribuerad stordator-IT-communityn är och hur konsekvent team i varje region står inför samma problem: deras JCL- och COBOL-dokumentation är ofullständig, föråldrad eller obefintlig.

De verktyg som finns tillgängliga för JCL-analys och -hantering delas in i tre kategorier:

IBM-baserade verktyg : IBM erbjuder Job Entry Subsystem-funktioner, JES-spoolhantering och IBM z/OS Batch Runtime. Dessa hanterar exekvering och övervakning men tillhandahåller inte analys eller visualisering av beroenden mellan program.

Tredjepartsjobbschemaläggare : CA7, TWS (Tivoli Workload Scheduler) och Broadcoms ESP Workload Automation hanterar batchschemaläggning över tusentals jobb, tillhandahåller beroendebaserad schemaläggning och varnar för fel. De förstår beroenden på jobbnivå men analyserar vanligtvis inte de COBOL-program som anropas i varje steg.

Plattformar för statisk kodanalys och beroendemappning : Verktyg som analyserar JCL- och COBOL-källkod för att bygga en strukturell modell av vilka jobb som anropar vilka program, vilka program som har åtkomst till vilka datamängder och hur data flödar över systemet. Dessa ger den övergripande insyn i lager som jobbschemaläggare och IBM-baserade verktyg inte kan: förhållandet mellan ett specifikt JCL DD-uttryck och COBOL FILE-CONTROL-posten som mappas till det, eller mellan ett COBOL-program som skriver till en datamängd och nästa jobb som läser den datamängden som indata.

SMART TS XL tillhör denna tredje kategori och utökar den till att omfatta alla språk i företagsmiljön, COBOL, JCL, PL/I, Assembler, SQL, Java och andra, och tillhandahåller den språkövergripande strukturanalys som inget enspråkigt verktyg kan leverera.

Hur SMART TS XL Mappar JCL till COBOL i företagsskala

Manuell JCL-till-COBOL-mappning är hanterbar för ett enskilt jobb i tre steg. Den är inte hanterbar för en organisation med 50 000 JCL-jobb, 200 000 COBOL-program och miljontals datamängdsreferenser som ackumulerats under fyra decennier. Relationen mellan en specifik PROC, de symboliska parametrar som används för att anropa den, de COBOL-program som dessa parametrar tolkas till och de datamängder som dessa program har åtkomst till kan inte spåras manuellt i den skalan.

SMART TS XL analyserar JCL- och COBOL-källkod, inklusive PROC:er med symbolisk parametersubstitution, in-stream-procedurer, INCLUDE-medlemmar, overrides och villkorlig exekveringslogik, och bygger en enhetlig korsreferensmodell som representerar varje strukturell relation i systemet. Den modellen är frågabar, navigerbar och alltid aktuell eftersom den regenereras från källkoden snarare än underhålls som ett manuellt uppdaterat dokument.

Ocuco-landskapet JCL expansion Funktionen löser symbolisk parametersubstitution för att visa de faktiska program och datauppsättningar som anropas av en PROC, med hänsyn till de åsidosättningar som tillämpas av varje anropande jobb. En PROC som använder &PGMNAME som en symbolisk parameter visas i modellen som alla konkreta program den löses upp till över alla dess anropare, inte som en olöst referens.

Funktionen för mappning av applikationsberoenden bygger hela grafen från JCL-jobb via COBOL-program, DB2-tabeller och nedströmsprogram, och visar varje komponent i systemet och varje koppling mellan dem. Innan någon moderniseringsändring kan teamet fråga: vilka jobb anropar detta program? Vilka datauppsättningar läser detta program? Vilka andra program skriver till dessa datauppsättningar? Vilka jobb körs härnäst i sekvensen?

Effektanalysfunktionen genererar ett uppräknat antal konsekvenser för alla föreslagna ändringar: ändra denna kopia och se alla program som inkluderar den; ändra denna datasetlayout och se alla JCL DD-satser som refererar till den; ta bort detta steg från ett jobb och se alla nedströmssteg som var beroende av dess utdata.

För team som står inför JCL-till-COBOL-mappning som en del av en äldre modernisering program, SMART TS XL ger den grund som moderniseringsleverantörer, Astadia, TSRI, Advanced och andra, behöver innan något konverteringsarbete påbörjas: en komplett och korrekt strukturell inventering av vad som finns, så att konverteringsomfattningen definieras genom analys snarare än genom antaganden.

Kartan är inte territoriet, utan utgångspunkten

JCL och COBOL kommer inte att försvinna. Batchsystemen som hanterar löner, försäkringsanspråk, kör rapporter från myndigheter och reglerar finansiella transaktioner kommer att fortsätta att köras på stordatorer medan molnmigreringar planeras, godkänns, finansieras och genomförs, en process som vanligtvis tar år snarare än månader. Under dessa år måste systemen underhållas, modifieras och förstås.

Mappning av JCL till COBOL är inte ett engångsprojekt. Det är en kontinuerlig metod: att hålla den strukturella modellen aktuell allt eftersom program modifieras, jobb läggs till och datamängder omorganiseras. De team som investerar i denna metod bibehåller förmågan att göra säkra ändringar i system som de flesta i branschen behandlar som svarta lådor. De team som inte gör det gör ändringar i system som de inte helt kan se, i miljöer där ett missat beroende inte producerar ett kompileringsfel, vilket ger ett produktionsfel klockan 3 på morgonen under den nattliga batchkörningen.