2015-10-23 1 views
0

J'essaye d'exécuter un programme simple de COBOL sur le système de mainframe de z/OS. Le programme ouvre et ferme uniquement un fichier. Il compile sans erreur mais quand je l'exécute, j'obtiens un abend U4038.Comment réparer un U4038 dans un programme simple

Voici le code du programme:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7-|--+----8 
     IDENTIFICATION DIVISION. 
     PROGRAM-ID. LISTKSDS 
     AUTHOR. TestingUser 

     ENVIRONMENT DIVISION. 
     CONFIGURATION SECTION. 
     INPUT-OUTPUT SECTION. 
     FILE-CONTROL. 
      SELECT INFILE ASSIGN TO DATAIN 
      ORGANIZATION IS INDEXED 
      ACCESS MODE IS SEQUENTIAL 
      RECORD KEY EST-KEY 
      FILE STATUS IS WS-FILE-STATUS. 

     DATA DIVISION. 
     FILE SECTION. 
     FD INFILE. 
     COPY EST01. 

     WORKING-STORAGE SECTION. 
     01 VARIABLES. 
      05 WS-FILE-STATUS PIC X(2). 

     LINKAGE SECTION. 

     PROCEDURE DIVISION. 
      DISPLAY "STARTING PROGRAM.." 
      PERFORM INITIALIZATION 
      PERFORM TERMINATION 
      GOBACK. 

     INITIALIZATION. 
      DISPLAY "OPENING FILE.." 
      OPEN INPUT INFILE 
      IF WS-FILE-STATUS IS NOT EQUAL TO '00' 
      THEN 
      GO TO ERROR-EXIT 
      END-IF. 

     TERMINATION. 
      CLOSE INFILE. 

     ERROR-EXIT. 

Job pour compiler:

//TESTUSEC JOB NERT4587,CLASS=C,MSGCLASS=X,NOTIFY=&SYSUID 
//* 
//STEP1 EXEC IGYWCL,PARM=(LIB) 
//SYSLIB DD DSN=TES.COPIES.TEST,DISP=SHR 
//COBOL.SYSIN DD DSN=TES.SOFT.SRC(SRC04),DISP=SHR 
//LKED.SYSLMOD DD DISP=SHR,DSN=TES.SOFT.LIB 
//LKED.SYSIN DD * 
    ENTRY LISTKSDS 
    NAME LISTKSDS(R) 
/* 
//* 

Job pour soumettre:

//TESTUSEC JOB NERT4587,CLASS=C,MSGCLASS=X,NOTIFY=&SYSUID 
//* 
//JOBLIB DD DSN=TES.SOFT.LIB,DISP=SHR 
//* 
//STEP1 EXEC PGM=LISTKSDS,REGION=2M 
//DATAIN DD DSN=TES.VS.TEST,DISP=SHR 
//* 
+0

Vous avez également remarqué que vous n'avez pas // SYSOUT DD SYSOUT =? 'Où? est ce que vous devriez utiliser pour votre sortie (définie par le site). Cela signifie que vous avez * deux * entrées de spool pour votre JOB (avec le même JOBNO) et votre sortie DISPLAY est probable dans le premier cas, et probablement dans le message Language Language. –

Répondre

3

Un U4038 Abend est un utilisateur Abend qui vient de Language Environment, le "run-time" pour les programmes mainframe (il supporte plusieurs langages mainframe).

Vous avez plus d'informations à ce sujet. Si vous regardez votre sortie de bobine, je m'attendrais à ce que vous puissiez trouver plus d'informations.

Vous avez spécifié une clause FILE STATUS sur SELECT pour votre fichier. Il est donc peu probable que le fichier U4038 soit lié au fichier.

Cependant, il est probable que vous rencontriez un problème de fichier qui entraîne ce problème de programme.

Ceci est probablement être le problème. Si ce n'est pas le problème, il est un problème:

  IF WS-FILE-STATUS IS NOT EQUAL TO '00' 
     THEN 
     GO TO ERROR-EXIT 
     END-IF. 

Je suppose que vous obtenez un non-zéro dans WS-FILE-STATUS. Le paragraphe contenant ceci est PERFORM ed, et le GO TO vous emmène hors de la portée du PERFORM. Lorsque vous testez un statut de fichier différent de zéro, il est toujours bon de définir DISPLAY la valeur non nulle que vous rencontrez.

L'utilisation de GO TO en dehors de la plage d'une PERFORM est particulièrement mauvaise. Votre programme continuera à partir du paragraphe cible du GO TO et continuera à tomber séquentiellement dans le code suivant.

Vous n'avez pas de "code suivant". Donc le programme "tombe de la fin". Ce n'est pas une chose valide à faire, alors vous obtenez une fin anormale.

Bien que nous ne puissions pas voir le contenu du copybook, l'élément qui a donné le statut de fichier non nul présumé se trouve probablement entre la définition du fichier et le fichier que vous avez spécifié dans l'instruction DD DATAIN.

Le plus probable est qu'il existe une incompatibilité dans la taille des données définies dans votre programme avec le fichier nommé dans le JCL ou que la clé définie dans le programme ne correspond pas au fichier dans le JCL.

Vous devez localiser le message supplémentaire dans votre sortie de bobine. Cela va normalement beaucoup aider. Si vous ne parvenez pas à l'obtenir, collez la sortie SYSOUT entière à partir de l'étape.

Vous utilisez un nombre minimal de points/périodes, mais il est préférable de les placer sur une ligne, dans la colonne 12, afin qu'ils ne soient rattachés à aucun code. Alors vous ne pouvez pas copier le code et accidentellement finir avec un arrêt complet/période dans un endroit crucialement mauvais.

Vous auriez également reçu un diagnostic du compilateur, car ERROR-EXIT ne contient pas de code. Regardez toujours vos messages et corrigez le code en conséquence.

Faites également attention à l'indentation. Cela n'a aucune signification pour le compilateur, mais vous formatez le code pour le lecteur humain, alors faites attention à cela, car vous ne saurez jamais quand vous le ferez plus tard, ou à l'un de vos coéquipiers à 2h du matin. Ou votre tuteur/mentor examinant votre travail.

Sur votre linkedit/bind, vous avez spécifié DISP = SHR. Changez cela pour DISP = OLD, s'il vous plaît. Si vous parvenez à exécuter deux liens en même temps, vous pouvez supprimer votre bibliothèque.

+0

Merci Bill. J'ai supprimé le GO TO et changé pour afficher la valeur de WS-FILE-STATUS. Il donne le numéro 35 au lieu de 0. Note: l'exemple que je donne est: http://theamericanprogrammer.com/programming/16-vsamseq1.shtml Est-ce qu'il semble avoir la même erreur? – Nico

+0

Je cherchais le numéro d'erreur 35, mais le fichier existe et l'instruction DD dans JCL semble bien: S. – Nico

+0

@Nico oui, vous avez été malchanceux avec votre exemple. Si vous regardez les commentaires dans ce paragraphe d'erreur, vous êtes censé regarder un autre programme. Je vais développer la réponse à la question de savoir pourquoi c'est encore une mauvaise chose à faire dans Enterprise COBOL (en utilisant GO TO sur une PERFORM). –