[COBOL] Écriture vers fichier VSAM

Voir le sujet précédent Voir le sujet suivant Aller en bas

resolu [COBOL] Écriture vers fichier VSAM

Message  M. Pixel le Jeu 02 Fév 2012, 22:51

Hello à tous et à toutes.

Me voici donc un peu perdu, je ne parviens pas à écrire vers un fichier VSAM.
Contrairement à l'AS400, le mainframe m'informe gentillement de l'erreur survenue:
Code:
There was an unsuccessful WRITE to file VSCLI in module GO program PROJETP1 at
offset X'624'.  The file status code was 48, which indicates:

  The execution of a WRITE statement was attempted on a file not open in the
  I-O, output, or extend mode.

Le code provoquant l'erreur est donc la seule écriture vers le fichier:
Code:
          WRITE UN-CLI-OUT
              INVALID KEY DISPLAY "Erreur: Clé invalide"
          END-WRITE

Or, j'ai bien ouvert le fichier en output (et je reçois la confirmation du display).
Code:
          OPEN
              INPUT CLI-IN
              OUTPUT CLI-OUT
          DISPLAY "Fichiers ouverts"

J'ai défini mon cluster (en supprimant d'abord le précédent):
Code:
      DELETE VSECOL.ANDR.TEST.ETUD128.VSCLI
      DEFINE CLUSTER( NAME(VSECOL.ANDR.TEST.ETUD128.VSCLI) -
                      INDEXED                              -
                      RECORDSIZE(70 70)                    -
                      KEYS(8 0)                            -
                      TRACKS(1,1))

Et je lui ai donné un nom de liason:
Code:
//GO.VSCLI      DD DSN=VSECOL.ANDR.TEST.ETUD128.VSCLI,DISP=MOD

Ça va faire 3 heures que je cherche une solution (sans compter le temps passé au labo) mais je commence à manquer d'inspiration...
Je vous remercie d'avance si vous pouvez me suggérer une modification.


Dernière édition par M. Pixel le Sam 04 Fév 2012, 18:55, édité 1 fois

M. Pixel

Nombre de messages : 19
Prénom : Etienne
Localisation : 0x7C00
Date d'inscription : 15/12/2010

Revenir en haut Aller en bas

resolu Re: [COBOL] Écriture vers fichier VSAM

Message  efo le Sam 04 Fév 2012, 12:31

Bonjour,

une première remarque qui n'a rien à voir avec le problème signalé mais qui aura des conséquences : la longueur de clé n'est pas correcte dans le code idcams.

L'erreur renseignée : les instructions fournies sont correctes mais quel est le code complet ? La séquence est-elle bonne ? Vous pouvez être certain que le fichier n'est pas ouvert au moment de l'interruption (d'un write) puisque c'est le message d'erreur fourni. N'y aurait-il pas un problème de fin de programme (stop run) ?

efo

Nombre de messages : 125
Age : 59
Prénom : Eric
Localisation : tournai
Date d'inscription : 08/08/2007

Revenir en haut Aller en bas

resolu Re: [COBOL] Écriture vers fichier VSAM

Message  M. Pixel le Sam 04 Fév 2012, 13:43

efo a écrit:Bonjour,

une première remarque qui n'a rien à voir avec le problème signalé mais qui aura des conséquences : la longueur de clé n'est pas correcte dans le code idcams.

L'erreur renseignée : les instructions fournies sont correctes mais quel est le code complet ? La séquence est-elle bonne ? Vous pouvez être certain que le fichier n'est pas ouvert au moment de l'interruption (d'un write) puisque c'est le message d'erreur fourni. N'y aurait-il pas un problème de fin de programme (stop run) ?

Merci pour votre réponse!
En effet, je n'ai pas fait attention à la longueur de clé (je ne pourrais pas dire combien de fois j'ai changé l'idcams), mais comme vous le dites, cela ne devrait pas être la cause du problème: j'ai également essayé en NONINDEXED.

Le fichier n'est pas ouvert au moment de l'interruption, mais c'est ça qui me perturbe! Car je ne vois vraiment pas comment c'est possible! En plus, j'ai utilisé des "display" pour bien vérifier l'ordre d'exécution, et la, tout se passe comme prévu.
Code:
      PROCEDURE DIVISION.
      0-CLIENT.
          PERFORM 1-OUVRIR
          PERFORM 1-COPIE-CLI UNTIL CLI-IS-EOF
          PERFORM 1-COPIE-CPT UNTIL CPT-IS-EOF
          PERFORM 1-FERMER
          STOP RUN
          .
     
      1-OUVRIR.
          OPEN
              INPUT CLI-IN
              INPUT CPT-IN
              OUTPUT CLI-OUT
              OUTPUT CPT-OUT
          DISPLAY "Fichiers ouverts"
          READ CLI-IN
              AT END SET CLI-IS-EOF TO TRUE
          END-READ
          READ CPT-IN
              AT END SET CPT-IS-EOF TO TRUE
          END-READ
          .

Il semblerait donc qu'il passe bien par l'OPEN, sans ouvrir les fichiers VSAM et sans indiquer l'erreur au moment de l'ouverture... Shocked
Dès que je reboot sous windows je vais tester la modification de la longueur de clé, juste pour être sur que ce n'est pas la source du problème.

M. Pixel

Nombre de messages : 19
Prénom : Etienne
Localisation : 0x7C00
Date d'inscription : 15/12/2010

Revenir en haut Aller en bas

resolu Re: [COBOL] Écriture vers fichier VSAM

Message  efo le Sam 04 Fév 2012, 16:28

Je ne vois pas le code dans son entiéreté mais il est manifestement différent de ce que je pensais trouver : cela n'est pas nécessairement une bonne idée de coupler dans un même step le chargement des 2 fichiers. c'est du 'copy' de lignes et un changement pour compte ou client peut très vite être oublié. Cela peut arriver en 2 steps aussi mais au moins plus facile à voir puisque l'un des 2 devrait être correct.
Donc : où sont réellement les 'fermer' ? Erreur(s) de noms de variables suite à copy ? Le display après ouverture est fait mais le file status est-il correct ?
Petite aide : mettre des display 1, 2 ... (tjs ma recette miracle) dans les paragraphes et voir combien de fois on les a. Il y a 7 clients et 8 comptes. Ceci devrait donner une indication quant aux nombres d'exécutions des itérations.

efo

Nombre de messages : 125
Age : 59
Prénom : Eric
Localisation : tournai
Date d'inscription : 08/08/2007

Revenir en haut Aller en bas

resolu Re: [COBOL] Écriture vers fichier VSAM

Message  M. Pixel le Sam 04 Fév 2012, 18:54

J'y suis parvenu!!! Enfin! Very Happy

Apparemment, c'était bien ces KEYS() qui causaient problème.
Mes idcams étaient en NONINDEXED et je définisais KEYS(). Initialement je n'ai pas fais attention au NONINDEXED et j'ai mis à jour les valeurs de KEYS(). Le résultat était donc bien décevant, jusqu'au moment où j'ai découvert les NONINDEXED...

Pourquoi est-ce que ça ne marchait pas précédemment, en mode séquentiel? Je ne sais pas: j'avais mis les idcams en NONINDEXED (et la, je n'avais pas de KEYS() ). J'avais également modifié le code du FILE-CONTROL pour traiter le fichier VSAM comme un séquentiel, mais je tombais toujours sur un MAXCC=3000. Je suspecte donc que je trainais un autre bug avec moi, qu’apparemment j'ai résolu involontairement...

Enfin, je ne me plains pas... It works.

efo a écrit:Je ne vois pas le code dans son entiéreté mais il est manifestement différent de ce que je pensais trouver : cela n'est pas nécessairement une bonne idée de coupler dans un même step le chargement des 2 fichiers. c'est du 'copy' de lignes et un changement pour compte ou client peut très vite être oublié. Cela peut arriver en 2 steps aussi mais au moins plus facile à voir puisque l'un des 2 devrait être correct.
Oui en effet, je ferais mieux de séparer ces deux définitions de fichier, mais bon, au moment de l'ouverture de ce sujet, je n'avais pas encore ajouté le code pour le deuxième fichier.
À présent, je peux me concentrer sur les petits détails. :-)


Un très gros merci à vous M. Fonteine! Ça fait un gros problème en moins de mon coté!

M. Pixel

Nombre de messages : 19
Prénom : Etienne
Localisation : 0x7C00
Date d'inscription : 15/12/2010

Revenir en haut Aller en bas

resolu Re: [COBOL] Écriture vers fichier VSAM

Message  Contenu sponsorisé Aujourd'hui à 21:04


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum