Hvordan man kortlægger JCL til COBOL og hvorfor det betyder noget

Hvordan man kortlægger JCL til COBOL og hvorfor det betyder noget

Enhver mainframe i en virksomhed kører to sammenflettede sprog, som de fleste moderne udviklere aldrig har skrevet. COBOL implementerer forretningslogik, beregninger, filbehandling, posttransformationer og regulatorisk rapportering. JCL (Job Control Language) orkestrerer udførelsen af ​​denne logik og definerer, hvilke programmer der kører, i hvilken rækkefølge, med hvilke filer, under hvilke betingelser, og hvad der sker, når de lykkes eller fejler. Ingen af ​​sprogene er komplette uden det andet. Et COBOL-program aner ikke, hvor dets inputfiler kommer fra, eller hvor dets output går hen; JCL besvarer begge spørgsmål, før den første post læses.

For organisationer, der vedligeholder, reviderer eller moderniserer mainframe-systemer, er forståelse af JCL-til-COBOL-forholdet ikke valgfri baggrundsviden. Det er forudsætningen for alt: konsekvensanalyse før enhver ændring, dokumentation før enhver migrering, videnoverførsel før enhver ekspert går på pension. Jobbet, der behandler natlig fakturering, batchkørslen, der genererer kvartalsvise regulatoriske rapporter, proceduren, der fører data fra et system til et andet - alt dette er defineret af JCL, udført af COBOL og forstået kun af den krympende gruppe af ingeniører, der har arbejdet med begge dele.

Har du brug for JCL til COBOL Mapping Tool?

Udforsk SMART TS XL!

Mere info

Hvad er JCL?

JCL står for Job Control Language. Det er det scriptsprog, der bruges på IBM-mainframesystemer til at sende batchjob til udførelse. JCL behandler ikke selv data. Det fortæller operativsystemet, hvordan programmer skal udføres: hvilket program der skal køres, hvilke filer der skal gøres tilgængelige, hvilke hukommelses- og CPU-ressourcer der skal allokeres, hvad der skal gøres, hvis et trin fejler, og i hvilken rækkefølge flere trin skal køres i et enkelt job.

Hvert JCL-job består af tre grundlæggende sætningstyper:

JOB-sætningen identificerer jobbet for systemet og definerer parametre for regnskab, prioritet og planlægning.

EXEC-sætning , angiver det program eller den procedure, der skal udføres i et trin.

DD-sætningen (Data Definition) definerer de datasæt, som programmet vil læse eller skrive, herunder deres placering, format og 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 dette eksempel: PAYBATCH er jobbets navn, STEP010 er ét trin i arbejdet, PGM=PAYROLL1 navngiver det COBOL-program, der skal udføres, og DD-sætningerne definerer alle filer, som programmet kan tilgå. COBOL-programmet PAYROLL1 ved ikke eller er ligeglad med hvor EMPFILE or TRANSACT kommer fysisk fra, læser den dem blot efter ddname. JCL fortolker den fysiske placering, postformatet og adgangstilstanden, før udførelsen begynder.

JCL-katalogiserede procedurer (PROC'er)

I stedet for at skrive det samme JCL-mønster for hvert job, definerer mainframe-teams katalogiserede procedurer (PROC'er), der indkapsler genanvendelige udførelsesmønstre. En PROC er en skabelon, der er gemt i et procedurebibliotek; individuelle job refererer til den og tilsidesætter specifikke parametre 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

Kald af PROC fra et job:

jcl

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

Denne enkelte EXEC-sætning udvides til den fulde PROC på udførelsestidspunktet, med MEMBER og RUNDATE erstattet hvor som helst &MEMBER og &RUNDATE PROC'er er en af ​​de primære årsager til, at JCL-til-COBOL-kortlægning er kompleks: et job kan kalde snesevis af COBOL-programmer via en enkelt PROC-reference, og de faktiske programmer, der kaldes, afhænger af symbolske parametre, der varierer pr. kørsel.

Hvad er forskellen mellem JCL og COBOL?

JCL og COBOL nævnes ofte sammen, men de har helt forskellige roller. Ingen af ​​dem erstatter den anden, og begge er nødvendige for at mainframe-batchbehandling kan fungere.

DimensionJCLCOBOL
FormålOrkestrerer udførelseImplementerer forretningslogik
Hvad det definererJob, trin, filer, betingelserProgrammer, datastrukturer, beregninger
Når den kørerFør programudførelse (opsætning) og efter (oprydning)Under programudførelse
Læser/skriver dataVia datasætallokering (DD-udsagn)Via FILE SECTION og READ/WRITE-sætninger
Fejl ved håndteringReturkoder, betinget trinudførelseUNDTAGELSES-håndterere, PERFORM-fejlrutiner
OverførselIBM z/OS-specifikBærbar på tværs af platforme med compilere
Hvem skriver detSystemprogrammører, batchingeniørerApplikationsudviklere
Moderne ækvivalentCI/CD-pipeline + containerorkestreringApplikationskode (Java, Python, C++)

Den nemmeste måde at konceptualisere forholdet på: JCL er implementerings- og orkestreringslaget; COBOL er applikationslaget. I et moderne cloud-native system ville JCL's rolle blive udfyldt af Kubernetes jobmanifester, shell-scripts og CI/CD-pipelinefaser. COBOL's rolle ville blive udfyldt af applikationstjenester skrevet i Java, Python eller Go.

Hvordan JCL aktiverer COBOL: Udførelseskæden

Vejen fra et JCL-job til COBOL-udførelse følger en ensartet kæde. Forståelse af hvert trin er fundamentet for at forstå, hvad et JCL-til-COBOL-kort skal indfange.

Trin 1: Jobindsendelse. JCL-jobbet indsendes til Job Entry Subsystem (JES). JES sætter jobbet i kø og begynder at læse dets sætninger.

Trin 2: Trinopsætning. For hvert EXEC-trin finder systemet det navngivne program i det indlæsningsbibliotek, der er angivet af STEPLIB DD-sætningen. Hvis der ikke er angivet nogen STEPLIB, søger systemet i systemets linkbibliotek.

Trin 3: Datasætallokering. Før programmet kører, allokerer systemet alle datasæt, der er defineret af DD-sætninger i trinnet. Dette inkluderer åbning af filer, verificering af, at inputdatasæt findes, og oprettelse af outputdatasæt.

Trin 4: Programudførelse. COBOL-programmet udføres. Det tilgår filer ved hjælp af de dd-navne, der er defineret i JCL, OPEN INPUT EMPFILE i COBOL knyttes direkte til den navngivne DD-sætning EMPFILE i JCL.

Trin 5: Evaluering af returkode. Når COBOL-programmet slutter, sætter det en returkode (typisk 0 for succes, 4 for advarsel, 8 for fejl, 12 eller 16 for alvorlig fejl). JCL bruger COND parametre eller IF/THEN/ELSE konstruktioner for at bestemme, om efterfølgende trin skal køres baseret på denne kode.

Trin 6: Datasætdisponering. Efter trinnet behandler systemet datasætdisponeringerne, der er defineret i hver DD-sætning: behold, slet, katalogiser, afkatalogiser eller videregiv til næste trin.

Følgende eksempel viser, hvordan denne kæde ser ud i praksis, med JCL til venstre og de tilsvarende COBOL-elementer til højre:

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 indeholder:

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).

SELECT INFILE ASSIGN TO INFILE i COBOLs FILE-CONTROL-sektion forbinder til DD-sætningen med navnet INFILE i JCL. Dette er den grundlæggende kortlægningsrelation: COBOL bruger logiske filnavne; JCL omdanner dem til fysiske datasæt.

JCL Abend-koder: Hvad de betyder

JCL-abendkoder (unormale slutkoder) identificerer, hvorfor et jobtrin afsluttedes uventet. De vises i joboutputtet som S000 (systemfejl) eller U0000 (brugerabend) koder. Det er vigtigt at forstå dem for at kunne diagnosticere fejl i batchjobs.

Abend-kodenTypeFælles årsag
S001SystemkravI/O-fejl ved læsning eller skrivning af et datasæt
S013SystemkravUoverensstemmelse i DCB-attribut, uoverensstemmelse i postlængde eller format mellem JCL DD og COBOL FD
S0C4SystemkravUndtagelse for lagerbeskyttelse, program forsøgte at få adgang til hukommelse uden for dets allokerede område
S0C7SystemkravDatafejl, forsøg på aritmetik på ikke-numeriske data (meget almindelig COBOL-fejl)
S322SystemkravTidsgrænse overskredet, jobbet kørte længere end tilladt af TIME-parameteren
S806SystemkravIndlæsningsmodul ikke fundet, program navngivet i EXEC PGM= ikke i noget søgt indlæsningsbibliotek
S913SystemkravSikkerhedsbrud for adgang til datasæt, RACF eller tilsvarende nægtet adgang
U0000BrugerApplikationsdefineret abend, COBOL-program kaldet STOP RUN med en brugerkode
U4076BrugerIMS-specifik fejl, databaseadgangsfejl

Den mest almindelige produktionsfejl, S0C7, opstår, når et COBOL-program forsøger at udføre aritmetiske beregninger på et felt, der indeholder mellemrum eller ikke-numeriske tegn. Den typiske årsag er en uoverensstemmelse mellem det forventede dataformat i COBOL-programmet og de faktiske data leveret af JCL, hvilket er præcis den slags uoverensstemmelse, som JCL-til-COBOL-kortlægning afslører, før den forårsager en produktionsfejl ved midnat.

COND-parameteren og betinget udførelse

JCL styrer hvilke trin der kører baseret på returkoder fra tidligere trin ved hjælp af 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: spring dette trin over, hvis returkoden for et af de foregående trin er mindre end 4. COND=(4,LT,STEP010) betyder: spring dette trin over, hvis STEP010's returkode er mindre end 4. COND=(0,NE,STEP010) betyder: spring STEP030 over, hvis STEP010s returkode ikke er lig med 0, dvs. kør kun oprydning, hvis STEP010 lykkedes.

Moderne JCL bruger IF/THEN/ELSE/ENDIF konstruktion i stedet, hvilket er mere 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

Kortlægning af betingede udførelsesstier er et af de mest kritiske og oftest oversete elementer i JCL-til-COBOL-analyse. Et COBOL-program, der kun kører, når et tidligere trin fejler, kan håndtere fejltilstande, rollback-logik eller gendannelsesprocedurer, en funktionalitet, der er helt usynlig, hvis man kun ser på COBOL-kildekoden uden den JCL, der driver den.

JCL, COBOL og DB2: Trelagsstakken

De fleste mainframe-transaktionssystemer involverer en tredje komponent udover JCL og COBOL: DB2, IBMs relationsdatabase. COBOL-programmer tilgår DB2 via indlejrede SQL-sætninger (EXEC SQL-blokke). JCL administrerer DB2-undersystemforbindelsen og DBRM (Database Request Module) via specifikke DD-sætninger.

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-stakken leverer JCL runtime-miljøet og adgang til datasættet; COBOL implementerer forretningslogik og kalder databasen; DB2 lagrer og henter data i henhold til den SQL, der er integreret i COBOL-programmet. Et komplet afhængighedskort over ethvert COBOL-program, der bruger DB2, skal ikke blot omfatte, hvilke JCL-jobs der kalder det, men også hvilke DB2-tabeller det læser og skriver til, hvilke kolonner det tilgår, og hvilke andre programmer der tilgår de samme tabeller, fordi en skemaændring i en tabel påvirker alle COBOL-programmer, der refererer til den.

Hvorfor JCL-til-COBOL-kortlægning er vigtig for modernisering

At kortlægge JCL til COBOL er ikke primært en teknisk øvelse. Det er en risikostyringsøvelse. Enhver ændring af et mainframe-system, uanset om det drejer sig om at ændre en JCL-parameter, tilføje et trin, ændre et datasætnavn eller ændre det COBOL-program, et job kalder, har konsekvenser, der rækker ud over den ændrede komponent. Den eneste måde at vurdere disse konsekvenser præcist på, før man foretager en ændring, er at have et komplet kort over, hvad der findes, og hvordan alting forbinder.

Før migrering : Flytning af batch-arbejdsbelastninger fra mainframe til skyen kræver viden om, hvilke JCL-job der findes, hvilke COBOL-programmer de kalder, hvilke datasæt der flyder mellem trin, hvad udførelsessekvensen er, og hvad der sker, når trin fejler. Uden dette kort arbejder migreringsteamet ud fra ufuldstændig dokumentation eller slet ingen dokumentation. Trin bliver overset. Afhængigheder bliver opdaget i produktionen. Overførselsdatoer bliver forsinkede.

Før enhver kodeændring : Et COBOL-program, der er ændret uden at kontrollere, hvilke JCL-job der kalder det, kan afbryde job, der kører under forskellige forhold eller med forskellige datasætkonfigurationer. En ændring af JCL-parameteren, der synes lokal, kan påvirke opførslen af ​​et COBOL-program, der er afhængig af specifikke datasætattributter. Konsekvensanalyse kræver kendskab til den fulde JCL-til-COBOL-til-datasæt-kæde, før der foretages nogen ændring.

Til videnoverførsel : Når en COBOL-udvikler, der har vedligeholdt et batchsystem i tyve år, går på pension, tager de den mentale model for, hvordan JCL-job og COBOL-programmer forbindes, med sig. Et dokumenteret kort er den eneste mekanisme til at overføre denne viden til det næste team. Uden det arver nye udviklere et system, de ikke sikkert kan modificere.

Til compliance-revision : Regulatoriske revisioner kræver ofte demonstration af, at finansielle beregninger, datatransformationer eller adgangskontroller fungerer som dokumenteret. Hvis JCL-til-COBOL-forholdet ikke er dokumenteret, er det umuligt at demonstrere dette uden at reverse engineere systemet under revisionspres.

JCL-administrationsværktøjer og analyseplatforme

Den flersprogede karakter af Search Console-dataene i denne artikel, med forespørgsler på italiensk, fransk, spansk, japansk og tysk, der alle spørger om JCL-administrationsværktøjer, afspejler, hvor globalt distribueret mainframe-IT-fællesskabet er, og hvor konsekvent teams i alle regioner står over for det samme problem: Deres JCL- og COBOL-dokumentation er ufuldstændig, forældet eller ikke-eksisterende.

De værktøjer, der er tilgængelige til JCL-analyse og -styring, falder i tre kategorier:

IBM-native værktøjer : IBM tilbyder Job Entry Subsystem-faciliteter, JES-spoolstyring og IBM z/OS Batch Runtime. Disse håndterer udførelse og overvågning, men tilbyder ikke analyse eller visualisering af afhængigheder på tværs af programmer.

Tredjeparts jobplanlæggere : CA7, TWS (Tivoli Workload Scheduler) og Broadcoms ESP Workload Automation administrerer batchplanlægning på tværs af tusindvis af job, leverer afhængighedsbaseret planlægning og advarer om fejl. De forstår afhængigheder på jobniveau, men analyserer typisk ikke de COBOL-programmer, der kaldes i hvert trin.

Statisk kodeanalyse og platforme til afhængighedskortlægning : Værktøjer, der analyserer JCL- og COBOL-kildekode for at opbygge en strukturel model af, hvilke job der kalder hvilke programmer, hvilke programmer der tilgår hvilke datasæt, og hvordan data flyder på tværs af systemet. Disse giver den tværgående synlighed, som jobplanlæggere og IBM-native værktøjer ikke kan: forholdet mellem en specifik JCL DD-sætning og den COBOL FILE-CONTROL-post, der er knyttet til den, eller mellem et COBOL-program, der skriver til et datasæt, og det næste job, der læser det datasæt som input.

SMART TS XL tilhører denne tredje kategori og udvider den til at dække alle sprog i virksomhedsmiljøet, COBOL, JCL, PL/I, Assembler, SQL, Java og andre, og leverer den tværsproglige strukturelle analyse, som intet enkeltsproget værktøj kan levere.

Hvordan SMART TS XL Kortlægger JCL til COBOL i virksomhedsskala

Manuel JCL-til-COBOL-kortlægning kan håndteres for et enkelt job med tre trin. Det er ikke håndterbart for en organisation med 50,000 JCL-job, 200,000 COBOL-programmer og millioner af datasætreferencer akkumuleret over fire årtier. Forholdet mellem en specifik PROC, de symbolske parametre, der bruges til at kalde den, de COBOL-programmer, disse parametre opløses i, og de datasæt, disse programmer tilgår, kan ikke spores manuelt i den skala.

SMART TS XL analyserer JCL- og COBOL-kildekode, inklusive PROC'er med symbolsk parametersubstitution, in-stream-procedurer, INCLUDE-medlemmer, overrides og betinget udførelseslogik, og opbygger en samlet krydsreferencemodel, der repræsenterer alle strukturelle relationer i systemet. Denne model er forespørgbar, navigerbar og altid aktuel, fordi den regenereres fra kildekoden i stedet for at vedligeholdes som et manuelt opdateret dokument.

JCL udvidelse Funktionen løser symbolsk parametersubstitution for at vise de faktiske programmer og datasæt, der kaldes af en hvilken som helst PROC, under hensyntagen til de tilsidesættelser, der anvendes af hvert kaldende job. En PROC, der bruger &PGMNAME som en symbolsk parameter vises i modellen som alle de konkrete programmer, den løser op til på tværs af alle dens kaldere, ikke som en uløst reference.

Funktionen til kortlægning af applikationsafhængigheder opbygger den fulde graf fra JCL-jobbet via COBOL-programmet, DB2-tabellen og downstream-programmet, og viser alle komponenter i systemet og alle forbindelser mellem dem. Før enhver moderniseringsændring kan teamet forespørge: hvilke job kalder dette program? Hvilke datasæt læser dette program? Hvilke andre programmer skriver til disse datasæt? Hvilke job kører derefter i sekvensen?

Effektanalysefunktionen genererer et opregnet omfang af konsekvenser for enhver foreslået ændring: rediger denne kopibog og se alle programmer, der inkluderer den; rediger dette datasætlayout og se alle JCL DD-sætninger, der refererer til det; fjern dette trin fra et job og se alle downstream-trin, der afhang af dets output.

For teams, der står over for JCL-til-COBOL-kortlægning som en del af en arvemodernisering program, SMART TS XL giver det fundament, som moderniseringsleverandører, Astadia, TSRI, Advanced og andre, har brug for, før ethvert konverteringsarbejde påbegyndes: en komplet og nøjagtig strukturel opgørelse over, hvad der eksisterer, så konverteringsomfanget defineres ved analyse snarere end ved antagelser.

Kortet er ikke territoriet, men det er udgangspunktet

JCL og COBOL forsvinder ikke. De batchsystemer, der behandler løn, håndterer forsikringskrav, kører regulatoriske rapporter og afregner finansielle transaktioner, vil fortsat køre på mainframes, mens cloud-migreringer planlægges, godkendes, finansieres og udføres, en proces, der typisk tager år snarere end måneder. I løbet af disse år skal systemerne vedligeholdes, modificeres og forstås.

JCL-til-COBOL-kortlægning er ikke et engangsprojekt. Det er en kontinuerlig praksis: at holde den strukturelle model opdateret, efterhånden som programmer ændres, job tilføjes, og datasæt reorganiseres. De teams, der investerer i denne praksis, bevarer evnen til at foretage sikre ændringer i systemer, som det meste af branchen behandler som sorte bokse. De teams, der ikke gør det, foretager ændringer i systemer, de ikke fuldt ud kan se, i miljøer, hvor en overset afhængighed ikke producerer en compilerfejl, hvilket resulterer i en produktionsfejl klokken 3 om natten under den natlige batchkørsel.