Bonjour à tous j'aurais aimé savoir comment envoyer des variables vers un fichier PRTF depuis un programme en SQLRPGLE ?
Merci de vos réponses !
R4ndy
Bonjour à tous j'aurais aimé savoir comment envoyer des variables vers un fichier PRTF depuis un programme en SQLRPGLE ?
Merci de vos réponses !
R4ndy
C'est du même tonneau que pour un fichier écran (DSPF). Tu définis ta ou tes pages sous PDM + RLU (option 19) ou WDSc et tu définis "à l'intérieur" les constantes et variables à y insérer.
Salut,
Donc je fais un WRITE vers mon PRTF et ça devrai passer ?
R4ndy.
Oui, un WRITE du format.
Si tu utilises RLU (Report Layout Utility), tu peux le démarrer par STRRLU comme tu démarrerais SDA avec STRSDA.
Salut,
J'utilise CODE400
Je laisse ce topic ouvert en attendant d'autres petits problèmes.
Bjr,
La question est trop vaste pour donner une réponse réellement utile.
Seul un minimum de formation pourra t'aider (ou alors te plonger pendant des jours dans les docs IBM).
AMHA
Salut tout le monde !
Je remet ce topic d'actualité puisque j'ai, à ce jour, quelques petits problèmes.
J'ai un programme en SQLRPGLE qui récupère des données les stocke dans une nouvelle bases de données.
Jusque là tout va bien.
Par la suite j'aimerais récupérer les données stockées, et les envoyer vers un PRTF.
Je procède comme cela :
Bien ou pas ?!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 FPRTF O E PRINTER (...) Requête SQL qui me récupère la valeur VAR1, et on l'attribue à la variable présente dans mon PRTF Eval $VAR1 = VAR1; WRITE $VAR1;
Voilà pour une première chose.
Ensuite, j'ai mon prtf qui se présente comme ceci :
Le "haut et le bas de page" seront toujours présents.$HAUTDEPAGE
$VAR1$VAR2...$DETAILS
$VAR5$VAR6...$DETAILS
$VAR5$VAR6...$BASDEPAGE
$VAR3$VAR4...
Le "Détail" pourra apparaître au moins une fois. Dans les 2 "$DETAIL", les variables $VAR5 et $VAR6 sont identiques (même définition), cependant d'un "$DETAIL" à l'autre la valeur des variables diffère (puisque la requête récupère un élément différent).
Est ce que vous auriez une idée de comment je pourrai faire apparaitre "$DETAIL" plusieurs fois d'affilée avec des valeurs de variables changeantes ?!
Je vous montre une ébauche de ce à quoi j'avais pensé :
Des idées ?! Suis-je sur la bonne voie ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Eval X = 0; Eval Y = 1; DOW X<>10 Exec sql Select VAR5, VAR6 into :VAR5, :VAR6 From TABLE1 Where VAR10 = X AND VAR11 = Y; Eval $VAR5 = VAR5; Eval $VAR6 = VAR6; WRITE $VAR5; WRITE $VAR6; Eval X = X+1; ENDDO;
Si je n'ai pas été assez clair faites le moi savoir j'essayerai de vous ré-expliquer ça le plus clairement possible.
R4ndy
Bonjour,
Sur le principe général c'est pas mal, mais il y a deux petites choses à préciser :
- L'écriture des PRTF se fait par format (une ou plusieurs lignes) et non pas zone à zone.
- D'une manière générale, sur l'AS400 (et ses prédécesseurs 32 34 36 38...) la gestion des fins de page ne se fait pas par comptage des lignes. Un mécanisme gère ça automatiquement.
Donc pour le PRTF, les DDS décrivent des formats avec des constantes et des variables. Dans ton cas il y aura 3 formats.
Lors de la création du PRTF (CRTPRTF) il y a des paramètres donnant le nombre de colonnes (défaut 132, max 254 en externe) et le nombre de lignes par page (défaut 66, mais pour du A4 il vaut mieux mettre 72) Ces valeurs dépendent de la police, des CPI (Characters Per Inch) LPI (Lines Per Inch) ...
Mais il y a un autre paramètre très important : OVRFLW (Numéro de ligne de fin de page). Par défaut à 60, sa valeur doit être inférieure ou égale au nombre de ligne par page.
Ainsi lorsque l'on écrit des lignes dans le PRTF, nous serons informé lorsque la ligne d'overflow sera franchie
Pas besoin donc de compter les lignes, il faut juste règler la "marge" de bas de page avec ce n° de ligne d'overflow de manière à nous laisser la place d'écrire le bas de page.
En RPG IV l'information d'OverFlow est récupérée par un indicateur spécifié dans la spec F, mot clé OFLIND:
Ensuite, donc l'on écrit le format après alimentation des zones de ce format.
Code : Sélectionner tout - Visualiser dans une fenêtre à part FPRTF O E PRINTER OFLIND(*IN33)
Je reprends ton exemple :
En général la boucle se fait jusqu'à EOF
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 Eval X = 0; Eval Y = 1; *IN33 = *ON; // On force la première en-tête DOW X<>10 Exec sql Select VAR5, VAR6 into :VAR5, :VAR6 From TABLE1 Where VAR10 = X AND VAR11 = Y; Eval $VAR5 = VAR5; Eval $VAR6 = VAR6; IF *IN33; WRITE $HAUTDEPAGE; // Impression en tête *IN33 = *OFF; EndIf; WRITE $DETAILS; // Ligne détail IF *IN33; WRITE $BASDEPAGE; // Impression pied EndIf; Eval X = X+1; ENDDO;
Même si ça a un aspect "vieillerie", le cycle GAP (RPG) est tout indiqué pour gérer ce genre de traitement. Tu n'as pas besoin de SQL.
Tu ferais bien de :
- laisser tomber les spécifs O et définir ton printer file en externe (DDS)
- d'employer le cycle pour faire automatiquement avancer ton fichier de données et tester les niveaux de contrôle (L1, L2, etc)
Tu apprendrais ainsi probablement à utiliser intelligemment le cycle que t'offre RPG et à créer les printer files en externe.
Remarque
Si ça se trouve, un simple Query/400 pourrait faire l'affaire et t'éviter de créer un prtf et un programme d'édition.
Merci pour vos réponses.
@jump400 : je check tout ce que tu m'a donné comme info, et je teste ça dès que je suis au boulot
@Mercure : j'ai déjà créé mon programme (en partie) et mon prtf, il me faut juste le remplir avec les variables, et l'imprimer (sur imprimante) donc je ne vais pas tout recommencer...
Si ?!
A ton avis, qui est le plus fort, l'envie d'apprendre ou bricoler ?Envoyé par R4ndy
Bonjour,
ma petite pierre à l'édifice.
Le cycle RPG : Beurk.
Aucune lisibilité.
Moi je te recommande de programmer en format variable ce qui devrait se rapprocher d'un autre langage récent, si tu en connais un.
Mais c'est juste mon avis.
Sorry Mercure pour cet avis à rebrousse poil, mais bon j'ai quelques millier de lignes de RPG3 et IV à mon actif, et quand tu programmes par exemple en VBA en en RPG III avec le cycle, c'est je trouve pour pêter une case.
Mais il est vrai qu'avec le cycle le code est "vachement plus court".
Bonne soirée.
(\ _ /) Cordialement G@dz
(='.'=)
(")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.
A mon tour d'être désolé pour toi, mais ce que vais dire est malheureusement un fait.
La plupart du temps, pour ne pas dire à tous les coups, ceux qui critiquent négativement le cycle RPG sont les mêmes que ceux qui n'y ont rien compris. Il faut faire un petit effort pour le comprendre et puis aussi il fait peur. Du coup, on dit "c'est obsolète, c'est une vieillerie" et on utilise son incompréhension comme un bouclier de protection.
Qu'on me dise que c'est une usine-à-gaz d'utiliser le rapprochement de fichiers dans le cycle (vous savez, l'indicateur MR), je serai totalement d'accord avec vous. En revanche, je trouve qu'il n'y a pas photo quand on utilise le cycle de cette façon :
J'utilise le format colonné du RPG pour appeler mes sous-routines qui sont le coeur du programme. J'utilise les niveaux de contrôle (L2, L4, ...) qui me permettent d'insérer également des breaks supplémentaires si besoin. Une fois que les sous-routines sont fixées dans le cycle, je passe en format libre (free) pour les écrire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 IMyRecord I KeyField1 L4 I KeyField2 L2 C L4 Exsr L4Init C L2 Exsr L2Init C Exsr ProcRcd CL2 Exsr L2Tots CL4 Exsr L4Tots CLR Exsr LRTots ********************************************************************************************** /FREE //******************************************************************************************* BegSR L4Init; //------------------------------------------------------------------------------------------- ETC
Quoi de plus simple ? Vaut-il mieux réinventer la roue ?
Il y a peu, j'ai réduit à 20 lignes, je dis bien 20 lignes, un programme qui en faisait 300 ! Il lisait explicitement le fichier depuis le début (*LOVAL SETLL) et générait les niveaux de contrôle au fur et à mesure de son avancement. J'ai récrit ce programme en mettant le fichier en Input Primaire (IP) et en utilisant les indicateurs Ln. 20 lignes, c'est autrement plus facile à maintenir que 300 !
Donc j'ai modifié mon SQLRPGLE pour faire simplement apparaitre le haut de page :et lors de la compilation j'ai une erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 FPSDPRINT O E (...) WRITE $HAUT;J'ai cherché...mais je n'ai pas trouvé mon erreurDéfinition externe du fichier PSDPRINT non trouvée.
R4ndy
Cela veut dire que le compilateur ne trouve pas ton fichier externe car il n'est pas dans la library list et il n'y a pas non plus d'override dessus (si tu compiles en interactif).Définition externe du fichier PSDPRINT non trouvée.
Trouve la libraie de ton fichier et fait un ADDLIBLE de cette librairie avant de compiler.
Attention, à l'exécution le même problème pourrait se poser.
Mercure
Je ne suis pas de cette catégorie, mais je ne suis pas fan. Il est vrai que pour certains traitements batchs de flux logiques, il n'y a pas plus court. Mais pour tous les autres cas, c'est inutile.La plupart du temps, pour ne pas dire à tous les coups, ceux qui critiquent négativement le cycle RPG sont les mêmes que ceux qui n'y ont rien compris. Il faut faire un petit effort pour le comprendre et puis aussi il fait peur. Du coup, on dit "c'est obsolète, c'est une vieillerie" et on utilise son incompréhension comme un bouclier de protection.
C'est vrai que le court, c'est beau et apparement facile.
Moi par gout je préfère une structre visuelle dans mon code, quitte à devoir réinventer la roue.
Si tu travailles avec des squellettes de programmes standard, pas de soucis de ce côté.
L'avantage que j'y trouve est une constance dans l'aspect visuels des programmes ainsi qu'un accès en lecture plus aisé pour quelqu'un qui ne connait rien au RPG. Donc, à mon sens plus portable, si une telle gageure existe.
Autre aspect, peut-être banal: si tu fais au quotidien du RPG en cycle, pas de soucis. Si tu développes sur toutes les plateformes, et que tu y reviens rarement, bonjour la galère.
Mais il est vrai que la puissance du RPG en cycle à côté d'une usine à gaz JAVA pour faire exactement la même chose, est totallement indéniable.
Bonne journée.
(\ _ /) Cordialement G@dz
(='.'=)
(")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.
Salut,
J'ai ajouté ma Lib aux LIBL, ça ne change rien.
Le PRTF et le RPG sont pourtant dans la meme Lib...
Pour l'override je n'ai pas trop compris... comment puis je faire ?!
Salut,
Ce que tu me dis Fabrice_44 est un peu flou... je vais essayer de faire ce que tu me dis avec OVRDBF, cependant, peux tu m'éclaircir un peu les idées stp ?!
Bibliothèque en ligne ? quoi que c'est ?!
Merci
Ah, c'est la LIBL. C'est ton terme bibliothèque en ligne qui me dérangeait.
Le fichier imprimante existe. Il est créé et compilé. J'ai re-vérifier les noms dans mon SQLRPGLE et tout est bon.- soit ton fichier imprimante n'existe pas sous le même nom que celui utilisé dans ton programme et dans ce cas il faut utiliser la commande override pour le créer temporairement,
- soit le fichier existe mais il n'est pas en ligne, c'est à dire que le job de compilation ne le trouve pas dans la liste de bibliothèque qu'on lui a donné et dans ce cas il faut ajouter la bibliothèque concernée dans la liste
Le PRTF et le SQLRPGLE sont dans la même Lib, et cette Lib est dans la LibL.
Je compile en Batch (option 14 de PDM)
J'ai fait comme Godzestla me l'a conseillé, c'est à dire un ADDLIBLE de ma Lib (en *first en plus).
Edit : Bon je poste les principales parties de mon prtf.
Vous en pensez quoi ?! Une erreur quelque part ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 A REF(QGPL/QINVREC INVREC) A R $HAUT A 1' _________________________________- A ___________________________________- A ___________________________________- A ___________________________' A SPACEA(1) (...) A $PSDPEXP 25A O +0TEXT('BLABLABLA') A 106'!' (...) A R $DETAIL A 1 1'!' A 1 8'BLALBLABLA ' (...) A $PSDNOBL 30A O 4 3TEXT('BLABLABLA') A 3 34'!' A 3 59'!' (...) A R $DESI A 1 1'!' A $PSDDESF 100A O 2 17TEXT('BLABLABLA') (...) A R $BAS A SPACEB(1) A 1'!_________________________________- A ___________________________________- A ___________________________________- A ___________________________!' A SPACEA(1) (...)
@Fabrice,
C'est bien dans la JOBD de soumission qu'il faut effectivement ajouter la bibliothèque en question puisque R4ndy compile en batch.
@R4ndy,
Va sous PDM dans la gestion des membres et fais F18.
Relève le nom de la JOBD de soumission et,avec la commande CHGJOBD, ajoutes-y la bibliothèque en question au niveau du mot clé INLLIBL puis recompile.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager