free-form syntax

17-11-2006 à 08:19:37
Bonjour,

Je vais m'essayer dans la programmation "free syntax" mais je ne sais pas comment faire.
Utilise-t-on les cartes H,F,D,I,C,O encore ?
J'ai l'impression que oui, mais pas toutes ...
La syntaxe free me semble-t-il peut alléger l'écriture et la lisibilité des instructions ... Me trompe-je ?

Quelqu'un peut-il m'aider à commencer et m'aiguiller dans une direction à prendre ?

Saavik
  • Liens sponsorisés



14-11-2006 à 14:06:16
Salut !

la free syntaxe, uniquement à la place des spécifs C, les autres spécifs sont colonnées comem d'hab', pas le choix.

...
Derniere spécif D

D mavar s 1a

/free
mavar = 10; // ; obligatoire. Je mets 10 dans mavar
mavar = (mavar3 * 4) / (mavar2 * 50);
// si je dois repasser en mode colonné, je mets /end-free en col 8+
/end-free
C EVAL mavar = 10
C EVAL mavar = (mavar3 * 4) / (mavar2 * 50)
/free
...
/end-free

14-11-2006 à 14:54:30
Salut,

J'ai enfin fini par compiler mon 1° programme avec la free syntaxe ! Par contre, j'ai une erreur sur un test trop long dans un If que j'ai contourné lamentablement...
En effet, j'ai une Nudepa (2s0) qui doit être 25, 39, 52, 70 ou 90 pour ma région.
"if nudepa<>0 and nudepa<>25 and .... nudepa<>90;" ne tient pas sur une ligne et je n'ai pas trouvé comment on fait pour couper une instruction ou si c'est possible ???
Erreur "Fin de l'expression escomptée"
et "L'entrée Commentaire d'une spécification de traitement de
type structure libre est incorrecte".

Peux-tu m'éclairer ? Merci

Saavik
14-11-2006 à 15:45:19
if nudepa<>0
and nudepa<>25
...
and nudepa<>90; // le pt-virgule à la fin de la condition seulement.

Mais si tu as plus de, disons, 3 valeurs à tester, mieux vaut mettre ces valeurs en tableau et tester ensuite par lookup.
14-11-2006 à 16:08:17
J'ai bien pensé au tableau mais j'ai pas encore cherché comment le faire. Pendant que je te tiens, DO ... ENDDO pas DOW ni DOU ni DO *HIVAL, une boucle DO (1 seule fois).
J'ai écrit
/free
Do;
If Nudepa=0;
Leave;
Endif;
If Copopu<>' ';
Exsr Traitement;
Else;
Exsr Erreur;
Endif;
Enddo;
/end-free
Il ne me reconnait pas mon Do; alors j'ai rusé par Dow not *in99;
ou alors est-ce comme cela qu'il fallait faire ?
14-11-2006 à 16:25:37
"Il" ne reconnait pas le DO ? Poutant, je ne vois pas d'erreur.
Montre ici l'erreur que tu as.
14-11-2006 à 16:33:14
/free

BegSr Ctrl_Saisi;

*In21='0';
*In99='0';

Do;

If DNudepa=0 and DCopopu=' ';
Leave;
aaaaa
2 30 a 017703 Les opérations LEAVE et ITER ne sont admises que dans les
boucles DO, DOWxx ou DOUxx ; la spécification est ignorée.
EndIf;
<etc....>

EndDo;

EndSr;
14-11-2006 à 16:34:55
/end-free
14-11-2006 à 16:54:56
Je m'en souviens maintenant. le compilateur est bogué, mais je ne savais plus précisément dans quels cas. Tu es tombée sur un de ces cas. Il devrait en effet accepter LEAVE dans une boucle DO, même si cetet boucle est dans une sous-routine. Tu devrais déclarer un APAR à Big Blue...
Je vais de mon côté soumettre le problème aux Gourous US et voir ce qu'ils en disent. Je te tiendrai au courant.

Pour résoudre ton problème immédiat, supprime cette boucle DO...ENDDO et remplace LEAVE par LEAVESR:

BegSr Ctrl_Saisi;

*In21='0';
*In99='0';

If DNudepa=0 and DCopopu=' ';
LeaveSR;
EndIf;
<etc....>

EndSr;
14-11-2006 à 17:02:57
"Tu devrais déclarer un APAR à Big Blue" => ??? j'ai pas compris

Bonne soirée et encore merci.
14-11-2006 à 17:24:35
Un APAR (Authorized Program Analysis Report) est un terme qu'IBM utilise pour décrire un problème dans un programme IBM. Cet APAR sera ensuite formellement suivi par IBM jusqu'à ce qu'une solution soit trouvée.

Un APAR peut donner lieu à la création d'une PTF.


14-11-2006 à 19:16:48
Voici les réponses que j'ai eu de la part des Gourous US. Voir ce lien (pour anglophones seulement) :
http://www.rpgiv.com/rpgivforum/view?SID=20061114095954218616&NRL=6
16-11-2006 à 09:02:22
Ainsi les gourous donnent des solutions de s'en sortir mais le pb reste là (si j'ai tout suivi)...

Comment on déclare un APAR à Big Blue ? C'est qui Big Blue ?

Ce n'est peut-etre pas de mon ressort... On a un responsable exploitation qui fait toutes les MAJ de PTF, de dernière version de l'OS etc.

Thanks a lot !
16-11-2006 à 12:54:14
Une autre question : Comment fait-on pour faire un Call d'un programme en free-syntaxe ? J'ai écrit

CallP NomPgm ($parm1:$parm2); mais ca ne compile même pas "le nom ou l'indicateur n'est pas défini"...

Comment faire un ancien
MOVE ZoneNum dans ZoneCar ?
MOVE *Date (8s0) dans DATE (D DATFMT *EUR) ?

Merci
16-11-2006 à 15:05:37
Sur les écrans j'ai une ligne qui permet de cadrer les titres (2 lignes) avec la free syntaxe, ma zone est mise à blanc alors que je ne le veux pas... Comment faire... ?
Je m'explique :

C EVAL %SUBST(TITRE1:%INT(
C (%LEN(TITRE1)-%LEN(%TRIM(TTIT(1))))/2):
C %LEN(%TRIM(TTIT(1))))=%TRIM(TTIT(1))
C MOVEL PGMQ TITRE1
C MOVEL *DATE DATE
C MOVE DATE TITRE1
C EVAL %SUBST(TITRE2:%INT(
C (%LEN(TITRE2)-%LEN(%TRIM(TTIT(2))))/2):
C %LEN(%TRIM(TTIT(2))))=%TRIM(TTIT(2))
C MOVE USER TITRE2


**CTDATA TTIT
FACTURATION
Saisie de paramètre

NomPGM FACTURATION 16.11.2006
Saisie de paramètre NomUSER

Et maintenant :

%Subst(Titre1:%Int((%Len(Titre1)-%Len(%Trim(TTit(1))))/2):
%Len(%Trim(TTit(1))))=%Trim(TTit(1));
Titre1=PgmQ;
D_8A=%Char(*Date);
Date=D_J+'.'+D_M+'.'+D_A;
Titre1=Date;
%Subst(Titre2:%Int((%Len(Titre2)-%Len(%Trim(TTit(2))))/2):
%Len(%Trim(TTit(2))))=%Trim(TTit(2));
Titre2=User;

Ca donne :

16.11.2006
NomUSER

Plus de Titre1 ni Titre2, des ID ? Je cherche de mon coté...
16-11-2006 à 18:00:13
A toutes ces questions, je répondrai cette fois encore. Pour la plupart d'entre elles, il faudra toutefois à l'avenir chercher les réponses dans les docs de Big Blue (pardon ... IBM).

Ainsi les gourous donnent des solutions de s'en sortir mais le pb reste là (si j'ai tout suivi)...
Le pb n'en est pas resté pas là, au contraire. Les Gourous me disent que l'instruction DO n'est tout simplement pas supportée en free syntaxe et que le message d'erreur aurait du apparaître sur le LEAVE et non sur le DO.
Au passage, je te signale que Mercury, c'est moi sur le forum RPGIV.com. javascript:emoticonp(' ')
javascript:emoticonp(' ')

C'est qui Big Blue ? Je crois que tu as compris maintenant qu'il s'agit d'IBM.

Comment fait-on pour faire un Call d'un programme en free-syntaxe ? J'ai écrit
CallP NomPgm ($parm1:$parm2); mais ca ne compile même pas "le nom ou l'indicateur n'est pas défini"...

Il faut lire la doc. de référence RPGIV ILE dont j'ai donné l'adresse à maintes reprises. Je la redonne encore:
http://publib.boulder.ibm.com/iseries/v5r2/ic2924/books/c0925084.pdf
et celle de la doc. Guide du Programmeur RPG ILE:
http://publib.boulder.ibm.com/iseries/v5r2/ic2924/books/c0925074.pdf

Réponse: pour faire un CallP (c'est à dire un call Prototypé), il faut déclarer d'abord un prototype.
Mais bon, l'ILE ne s'apprend pas au travers des qq indications qu'on peut donner dans un forum. IL FAUT COMMENCER PAR LIRE ET COMPRENDRE la doc. sur le concept ILE, dont je donne (encore) l'adresse ci-dessous:
http://publib.boulder.ibm.com/iseries/v5r2/ic2924/books/c4156066.pdf

Il est utile de conserver ces 3 bouquins sur le DD de son PC.

Quant à ton histoire de cadrage (au centre ?) de titres, tu employais les coûteux MOVE et des MOVEL dans ton RPGIII. EVALR et EVAL pourraient peut-être être employés à leur place mais j'emploierais plutôt la fonction intégrée %subst.
En outre, EVALuer comme tu l'écris
Titre1=Date; et Titre2=User; écrase le contenu des zones résultats et cadre à gauche dans ces zones la date et le titre en question en complétant à droite par des blancs si nécessaire.
  • Liens sponsorisés