Je suis débutant sur cobol, voila j’ai réaliser un programme qui permets
D’afficher à l’écran des différentes fonctions (F1=le nombre de masculin, F2= le nombre de féminin, F3=le nombre totale de masculin et de féminin et la deniers fonction qui ne fonctionne pas c’est F4=compte rendu celle-ci permets de comparer les enregistrements lus (dans un fichier indexée) et celle saisie par l’utilisateur (si la valeur saisie existe alors je sort de la boucle sinon j’écris l’enregistrement dans le fichier ficmf.txt).
Le problème est situe dans TRT-F4 , en faite c’est la fonction qui permets de comparer l’enregistrement lus et celle saisie par l’utilisateur.
Je pense que c’est un problème de positionnement de curseur (POS-ZONE ) ou de déclaration de fichier indexée.
Erreur générer :
line 299: Undefined data item: W-FF
line 308: Warning: Imperative statement required (positionnement de curseur qui dépend de fichiers indexée ou sa peut venir de ma mon algo TRT-F4)
mais les reste de fonction (F1 F2 F3) , fonctionne corectement.
01 SAISIE-CORRECTE-NOK PIC 9.
88 SAISIE-CORRECTE-OK VALUE 1.
01 FINTRT-NOK PIC 9.
88 FINTRT-OK VALUE 1.
01 W-FF-KO PIC 9.
88 W-FF-OK VALUE 1.
* zone code retour statut
77 WSTAT-FICMF PIC X(2).
*************************************************************
COPY "w01tab1.wss".
COPY "nomfic.wss".
************************************************************
PROCEDURE DIVISION USING ZON-LINK.
DECLARATIVES.
COPY "ftabfic.dec".
DECFICMF SECTION.
USE AFTER STANDARD ERROR PROCEDURE ON FICMF.
DECFICMF-10.
IF WSTAT = "00" OR
WSTAT = "02" OR
WSTAT = "05" OR
WSTAT = "10" OR
WSTAT = "22" OR
WSTAT = "23" OR
WSTAT = "35"
GO TO F-DECFICMF-10.
*
MOVE "ficmf.isa" TO WFICH.
MOVE NOMFIC11 TO WFICHERR.
MOVE 1 TO WTYPERR.
CALL "geserr.cob" USING WSERR.
IF WSTAT = "99"
MOVE 2 TO WTYPERR
GO TO F-DECFICMF-10.
*
STOP RUN.
*
F-DECFICMF-10.
EXIT.
END DECLARATIVES.
**********************************************************
DEBUT SECTION.
DEBPROG.
*en cas d'erreur d'execution de programme propre Unix.
MOVE "exercice" TO WPROG.
MOVE ZON-LINK TO WZONLINK.
COPY "inifor.prg".
COPY "chgtab.prg".
INITPROG.
*ouverture de fichier
* OPEN INPUT FICMF
*permets la fenêtre sur Unix
PERFORM AFFDEB.
MOVE 0 TO W-I
FINTRT-NOK.
********************************************************************
***le programme principal permets d’affichage les touches de fonction ***F1=(CARTTT (02)), F2=(CARTTT (03)), F3=(CARTTT (04)), F4=(CARTTT ***(05)), chaque fonction est définie à l’extérieur programme ***principale. J’ouvre chaque fois le fichiers pour les fonction ***suivantes : F1, F2, F3, F4 si non ça ne fonction pas, je sais pas ***pourquoi .j’ ouvre ensuite je ferme le fichier.
********************************************************************
PERFORM UNTIL FINTRT-OK
DISPLAY SPACES LINE 24 POS 1 SIZE 80
DISPLAY "F1=masculin" LINE 24 POSITION 05 REVERSE
DISPLAY "F2=feminin" LINE 24 POSITION 18 REVERSE
DISPLAY "F3=nbmf" LINE 24 POSITION 30 REVERSE
DISPLAY "F4=compt-rondu" LINE 24 POSITION 45 REVERSE
DISPLAY "F6=quiter" LINE 24 POSITION 60 REVERSE
MOVE 0 TO W-I
MOVE SPACE TO WCAR
MOVE SPACE TO WESC
MOVE SPACE TO WOK
ACCEPT WOK LINE 24 POSITION 79
PROMPT ECHO UPDATE
ON EXCEPTION WESC
MOVE WESC TO WCAR
END-ACCEPT
EVALUATE RCAR
WHEN CARTTT (02)
DISPLAY SPACES LINE 5 POS 1 SIZE 80
DISPLAY SPACES LINE 6 POS 1 SIZE 80
DISPLAY SPACES LINE 7 POS 1 SIZE 80
DISPLAY SPACES LINE 8 POS 1 SIZE 80
DISPLAY SPACES LINE 9 POS 1 SIZE 80
DISPLAY SPACES LINE 10 POS 1 SIZE 80
OPEN INPUT FICMF
DISPLAY "LE NOMBRE TOTAL MASCULIN"
LINE 4 POSITION 2 REVERSE
MOVE 'M' TO SEXCHOISI
PERFORM TRT-F1 THRU F-TRT-F1
MOVE 0 TO WFF-FICMF-NOK
CLOSE FICMF
WHEN CARTTT (03)
DISPLAY SPACES LINE 4 POS 1 SIZE 80
DISPLAY SPACES LINE 5 POS 1 SIZE 80
DISPLAY SPACES LINE 6 POS 1 SIZE 80
DISPLAY SPACES LINE 7 POS 1 SIZE 80
DISPLAY SPACES LINE 8 POS 1 SIZE 80
DISPLAY SPACES LINE 9 POS 1 SIZE 80
DISPLAY SPACES LINE 10 POS 1 SIZE 80
OPEN INPUT FICMF
DISPLAY "LE NOMBRE TOTAL FEMININ"
LINE 4 POSITION 2 REVERSE
MOVE 'F' TO SEXCHOISI
PERFORM TRT-F1 THRU F-TRT-F1
MOVE 0 TO WFF-FICMF-NOK
CLOSE FICMF
WHEN CARTTT (04)
DISPLAY SPACES LINE 4 POS 1 SIZE 80
DISPLAY SPACES LINE 4 POS 1 SIZE 80
DISPLAY SPACES LINE 5 POS 1 SIZE 80
DISPLAY SPACES LINE 6 POS 1 SIZE 80
DISPLAY SPACES LINE 7 POS 1 SIZE 80
DISPLAY SPACES LINE 8 POS 1 SIZE 80
DISPLAY SPACES LINE 9 POS 1 SIZE 80
DISPLAY SPACES LINE 10 POS 1 SIZE 80
OPEN INPUT FICMF
DISPLAY "LE NOMBRE TOTAL DES PERSONNES:"
LINE 4 POSITION 4 REVERSE
PERFORM TRT-F3 THRU F-TRT-F3
MOVE 0 TO FF-FICMF-NOK
CLOSE FICMF
****************************************************************
***************cette fonction qui ne fonctionne par contre le **************traitement voire le début TRT-F4 et la fin F-TRT-F4
***************à la fin de programme
*****************************************************************
WHEN CARTTT (05)
OPEN INPUT FICMF
PERFORM TRT-F4 THRU F-TRT-F4
CLOSE FICMF
WHEN CARTTT (07)
SET FINTRT-OK TO TRUE
END-EVALUATE
END-PERFORM.
EXIT PROGRAM.
************************************************************
*traitement touche fonction F1(afficher la liste masc et femin)
*************************************************************
TRT-F1.
PERFORM UNTIL WFF-FICMF-OK
READ FICMF NEXT AT END
SET WFF-FICMF-OK TO TRUE
END-READ
IF T-SEX = SEXCHOISI
* DISPLAY SEXCHOISI REVERSE
DISPLAY ENREG-FICMF
ADD 1 TO TOTALE
END-IF
END-PERFORM
* SET WFF-FICMF-OK TO 1.
MOVE 1 TO WFF-FICMF-NOK.
F-TRT-F1.
EXIT.
***************************************************
*****************traitement de fonction F3*********
**************afficher nbm ou nbf******************i
***************************************************
TRT-F3.
MOVE 0 TO N-NBM
MOVE 0 TO N-NBF
PERFORM UNTIL FF-FICMF-OK OR FINTRT-OK
READ FICMF NEXT AT END
SET FF-FICMF-OK TO TRUE
END-READ
IF T-SEX = 'M'
ADD 1 TO N-NBM
ELSE
ADD 1 TO N-NBF
END-IF
END-PERFORM.
DISPLAY " masculin:"
N-NBM LINE 6 POS 9
DISPLAY " feminin:"
N-NBF LINE 8 POS 9.
MOVE 1 TO FF-FICMF-NOK.
F-TRT-F3.
EXIT.
****************************************************
*****saisir le nom, prénom et le sexe. Ensuite comparer;
***** les enregistrements lus dans le fichier indexé
***** et celle saisie par l’utilisateur à savoir (nom, prénom, sexe)
*****exemple : la valeur saisie toto, titi, Féminin
*****dans un première temps on va comparerez la valeur saisie par *****l’utilisateur et celle existant dans le fichiers FICMF.txt, s’il ****existe alors on sort de la boucle si non on écrit la valeur ***saisie dans le fichiers.
****************************************************
TRT-F4.
DISPLAY NOM LINE 6 POS 2
DISPLAY PRENOM LINE 6 POS 2
DISPLAY SEX LINE 6 POS 2
DISPLAY "F8 = validation" LINE 6 POS 2
DISPLAY "F = quitter" LINE 6 POS 2
*********initialisation des variable************
MOVE 0 TO SAISIE-CORRECTE
*****************************************
PERFORM UNTIL SAISIE-CORRECTE-OK
ACCEPT NOM-SAISIE LINE 6 POS 2
ACCEPT PRENOM-SAISIE LINE 7 POS 2
ACCEPT SEX-SAISIE LINE 8 POS 2
MOVE SPACE TO WCAR
*te tient pas compte de celle-ci permets tout simplement d’afficher *l’écran
ACCEPT WOK LINE 24 POSITION 79
PROMPT ECHO UPDATE
ON EXCEPTION WESC
MOVE WESC TO WCAR
END-ACCEPT
EVALUATE RCAR
*Carttt(08) il permets d’afficher la toucher de fonction ICI F8
* j’appuie sur F8, si SEX ='M' OR SEX = 'F', ouvrir le fichier et je *positionnement de curseur voire le positionnement à la fin de *programme PERFOM POS-ZONE THRU F-POS-ZONE tant que je suis pas à la fin de fichier je lus et j’incrémente pour passé à l’élément suivante.si la valeur lus égale à la valeur saisie
*fin de fichiers et j’écrits les enregistrements dans le fichiers
*si non je saisie à nouveaux (non, prénom, sexe).
* CARTTT(07), cette fonction permets de quitte l’écran.
WHEN CARTTT(08)
IF SEX ='M' OR SEX = 'F'
OPEN INPUT FICMF
PERFOM POS-ZONE THRU F-POS-ZONE
MOVE 0 TO W-FF
PERFORM UNTIL W-FF-OK
READ FICMF NEXT AT END
SET W-FF-OK TO TRUE
END-READ
IF T-SEX = SEX-SAISIE AND
T-NOM = NOM-SAISIE AND
T-PRENOM = PRENOM-SAISIE
END-IF
SET W-FF-OK TO TRUE
CLOSE FICMF
END-PERFORM
OPEN INPUT FICMF
MOVE NOM-SAISIE TO T-NOM
MOVE PRENOM-SAISIE TO T-PRENOM
MOVE SEX-SAISIE TO T-SEX
WRITE ENREG-FICMF
END-WRITE
CLOSE FICMF
SET SAISIE-CORRECTE-OK TO TRUE
ELSE
SET SAISIE-CORRECTE-OK TO TRUE
END-IF
WHEN CARTTT(07)
SET SAISIE-CORRECTE-OK TO TRUE
* MOVE 1 TO SAISIE-CORRECTE-OK
END-EVALUATE
END-PERFORM.
F-TRT-F4.
EXIT.
***************************************************************
***positionnement de curseur sur le premier élément de fichiers
****************************************************************
POS-ZONE.
f
OPEN OUTPUT FICMF
MOVE LOW-VALUE TO T-CLE
START FICMF KEY IS NOT LESS THAN T-CLE
INVALID
DISPLAY "INVALIDE" LINE 2 POS 2
END-START.