boucle DO *HIVAL

09-01-2007 à 15:30:44
Je sais qu'en free, cette instruction n'existe pas et qu'on la remplace par un Dow not %eof (par exemple) et moi j'ai un pb.

Mon pgm est structuré comme suit :

Read file;
Dow not %eof;
Si test1 KO => iter; pour ne pas traiter l'enreg et lire le suivant
Si test2 KO => iter; (idem)
Si testX KO => iter; (idem)
Je fais un traitement;
Read file;
Enddo;
Seton LR;


Je ne sors pas au bon endroit ou alors
l'instruction de sortie est mauvaise ou alors
la structure du pgm est mauvaise.

bref, c'est bien mauvais tout ça ! ce serait plus rapide pour moi de le faire avec les colonnes !



qqu'un a une suggestion de coding ?
  • Liens sponsorisés



05-01-2007 à 14:28:53
L'instruction ITER t'envoie directement sur le ENDDO et pas sur la lecture suivante : cela fonctionnerait si ta lecture suivante était juste après le DOW.
Dans ton cas, tu peux faire :
Read file;
Dow not %eof;
If Not test1 KO
and Not test2 KO
and Not testX KO;
Je fais un traitement;
EndIf;
Read file;
Enddo;
Seton LR;
05-01-2007 à 14:32:06
Merci Wilfrid

C'est ce que je pensais faire mais vu comme le prog était fait, c'est trop compliqué de faire ça car les tests que j'ai simplifié par testX sont des accès à des fichiers et si ça existe dans fic1 et dans fic2 et dans fic 3 je fais mon traitement puis des tests dans le traitement encore pour sortir si erreur...

fic lecture en IP


DO
si
toto=1 chain fic1 si pas trouvé leave
finsi
si
tata=2 chain fic2 si pas trouvé leave
finsi

etc.
ENDDO

C'est cette structure que je voulais garder en changeant mon coding colonné en free ...

--Message édité par Saavik le 05-01-07 à 14:40:52--
05-01-2007 à 14:48:21
tu peux utiliser des booléens qui correspondent aux résultats de tes tests :
D Test1Ok s b

Dow not %eof;
Test1Ok = *On;
Test2Ok = *On;
si toto=1
chain fic1
si pas trouvé Test1Ok = *Off
finsi
si tata=2
chain fic2
si pas trouvé Test2Ok = *Off
finsi
If Test1OK and Test2OK;
Je fais un traitement;
EndIf;
Read file;
Enddo;
Seton LR;

Au lieu de faire des leave, tu mets tes booléens à *Off et ton traitement n'est réalisé que si tous les booléens sont à *On
05-01-2007 à 14:55:59
C'est ce que je voulais faire aussi mais j'ai trouvé mieux (du moins je crois).
Je garde mes sorties par iter à l'enreg suivant

Dow not %eof;
Read file;
if %error;
leave;
else;
tralalala avec des sorties par iter aussi s'il le faut
endif;
enddo;
seton lr;

dans mon debbug je lis bien le premier enreg.


--Message édité par Saavik le 05-01-07 à 14:56:42--

--Message édité par Saavik le 05-01-07 à 14:57:19--
05-01-2007 à 14:59:21
oui c'est je que j'avais proposé au départ "si ta lecture suivante était juste après le DOW"
Tout dépend ensuite des structures que l'on veut ou que l'on peut mettre en place car il est vrai que moderniser du code déjà existant (et un peu "agé") n'est pas toujours aussi simple qu'il n'y parait.
05-01-2007 à 15:13:11
Plus simplement, en reprenant ton 1er exemple, et comme te l'a dit Wilfrid, culbute les 2 premières instructions, ajoute un LEAVE sur l'EOF et ça marchera :

Dow not %eof;

Read file;
If %EOF();
Leave;
Endif;

Si test1 KO => iter; pour ne pas traiter l'enreg et lire le suivant
Si test2 KO => iter; (idem)
Si testX KO => iter; (idem)
Je fais un traitement;
Read file;<--- A sucrer
Enddo;
09-01-2007 à 15:30:44
Autre solution structurée partant de l'idée que les contrôles sont faits dans une sous-routine pour conserver un corps de programme court même si les contrôles sont nombreux.

read fichier;
dow not %eof;
exsr controles;
if erreur = non;
(lignes de traitements ou exsr traitements)
endif;
read fichier;
enddo;

begsr controles;
erreur = non;
if (test1 ne fonctionne pas)
traitement de l'erreur (message, etc..)
erreur = oui;
leavesr;
endif;
if (test2 ne fonctionne pas)
traitement de l'erreur (message, etc..)
erreur = oui;
leavesr;
endif;
endsr;

Warning (GAG) : même si c'est extrèmement peu fréquent, ne pas oublier que le ENDDO peut être conditionné avec des indicateurs. Le Iter renvoie sur la ligne du ENDDO, les indicateurs conditionnent ensuite la sortie de boucle ou non.

--Message édité par Road Eagle le 09-01-07 à 15:31:50--

--Message édité par Road Eagle le 09-01-07 à 15:38:43--
19-11-2014 à 15:23:13
Merci beaucoup pour ce magnifique forum que je trouve d’ailleurs très intéressant avec une belle interface, facile en navigation. Il est vraiment super ! Bravo et bon courage .

voyance gratuite par mail
voyance gratuite par email
29-12-2014 à 11:12:01
Merci beaucoup pour ce site et toutes les informations qu’il regorge. Je le trouve très intéressant et je le conseille à tous !
Bonne continuation à vous.
Amicalement
voyance par mail gratuite
  • Liens sponsorisés