AIUTO IN LINEA NELLE APPLICAZIONI 5250

Siamo onesti: da molti anni si parla di modernizzazione delle applicazioni IBM i, ma, nonostante gli sforzi fatti da IBM e dai ISV, la maggior parte delle applicazioni interattive eseguite su IBM i usa ancora il vecchio ‘display file’ definito con DDS. Il protocollo 5250 ha molti vantaggi (è veloce, robusto e affidabile) ma anche degli svantaggi dovuti al limite fisico dell’area in cui visualizzare le informazioni. Sempre più spesso 1920 caratteri (il 24 x 80 è ancora largamente usato) non sono sufficienti per visualizzare tutte le informazioni, quindi il programmatore è costretto ad abbreviare le costanti per lasciare più spazio ai dati; la conseguenza di questa azione è che il pannello visualizzato diventa un rebus che solo un utente esperto di quella applicazione è in grado di risolvere (le abbreviazioni spesso sono chiarissime a chi le scrive, molto meno a chi le legge). In un mondo perfetto la soluzione sarebbe cambiare l’interfaccia utente con una più moderna, ma la vita è fatta di compromessi e quindi ci teniamo la nostra vecchia interfaccia a caratteri, ignorando il ribrezzo degli utenti più giovani.

Una buon compromesso è quello di definire l’aiuto in linea usando le parole chiave fornite da DDS, in modo che l’utente possa premere il tasto F1 e leggere l’aiuto. Il testo di aiuto si scrive in un membro origine di tipo PNLGRP da cui, con il comando CRTPNLGRP, si ottiene un oggetto *PNLGRP. Tutto questo è descritto nel manuale “Application Display Programming” parte 4 “Programming Help Displays”. In questo articolo vedremo come definire un semplice ‘display file’ con il relativo aiuto in linea.

Supponiamo di avere un pannello costituito da:

  • una riga con il titolo;
  • una riga con due campi di input;
  • una riga con la descrizione delle opzioni;
  • una riga con l’intestazione delle colonne;
  • un sub file con un campo opzione e tre colonne di dati;
  • una riga con la descrizione dei tasti funzionali in calce al sub file.

Più o meno così:

                               Anagrafico clienti                               
Da codice: 0000000 Annullati: *
2=Modificare... 3=Copiare... 4=Annullare... 5=Visualizzare...
Op Codice Descrizione A
0000001 Descrizione 1 0
0000002 Descrizione 2 0
0000003 Descrizione 3 0
0000004 Descrizione 4 0
0000005 Descrizione 5 0
0000006 Descrizione 6 0
0000007 Descrizione 7 0
0000008 Descrizione 8 0
0000009 Descrizione 9 0
0000010 Descrizione 10 0
0000011 Descrizione 11 0
0000012 Descrizione 12 0
0000013 Descrizione 13 0
0000014 Descrizione 14 0
0000015 Descrizione 15 0
0000016 Descrizione 16 0
0000017 Descrizione 17 0
0000018 Descrizione 18 0
F1=Aiuto F3=Uscire F5=Rinfescare F6=Nuovo...

Per prima cosa sarebbe molto utile leggere una descrizione generale della applicazione che stiamo usando: questo lo ottengo posizionando il cursore sul titolo (riga 1) e premendo F1:

                               Anagrafico clienti                               
Da codice: 0000000 Annullati: * ..........................................
2=Modificare... 3=Copiare... 4=An : ANAGRAFICO CLIENTI :
Op Codice Descrizione : :
0000001 Descrizione 1 : Con questa applicazione si gestisce :
0000002 Descrizione 2 : l'anagrafico dei clienti. È :
0000003 Descrizione 3 : possibile filtrare le anagrafiche e :
0000004 Descrizione 4 : visualizzarle in un elenco. Le :
0000005 Descrizione 5 : anagrafiche sono ordinate per :
0000006 Descrizione 6 : codice. :
0000007 Descrizione 7 : Fine :
0000008 Descrizione 8 : F2=Aiuto esteso F10=Inizio dati :
0000009 Descrizione 9 : F12=Ann. F24=Altri tasti :
0000010 Descrizione 10 : :
0000011 Descrizione 11 :........................................:
0000012 Descrizione 12 0
0000013 Descrizione 13 0
0000014 Descrizione 14 0
0000015 Descrizione 15 0
0000016 Descrizione 16 0
0000017 Descrizione 17 0
0000018 Descrizione 18 0
F1=Aiuto F3=Uscire F5=Rinfescare F6=Nuovo...

A cosa serve il campo “Da codice”? Ci posiziono il cursore e premo F1:

                               Anagrafico clienti                               
Da codice: 0000000 Annullati: *
2=Modifica ...................................................................
Op Codice : Da codice :
0000001 : :
0000002 : Inserire un codice cliente da cui partire per caricare :
0000003 : l'elenco. :
0000004 : Fine :
0000005 : F2=Aiuto esteso F3=Fine F10=Inizio dati F12=Ann. :
0000006 : F13=Supporto informativo F14=Stampa aiuto :
0000007 : :
0000008 :.................................................................:
0000009 Descrizione 9 0
0000010 Descrizione 10 0
0000011 Descrizione 11 0
0000012 Descrizione 12 0
0000013 Descrizione 13 0
0000014 Descrizione 14 0
0000015 Descrizione 15 0
0000016 Descrizione 16 0
0000017 Descrizione 17 0
0000018 Descrizione 18 0
F1=Aiuto F3=Uscire F5=Rinfescare F6=Nuovo...

Poi passo nel campo “Annullati” e premo F1 (molto utile la spiegazione di cosa accade nella applicazione per ogni valore inserito nel campo):

                               Anagrafico clienti                               
Da codice: 0000000 Annullati: *
2=Modificare... 3=Copiare... 4 .............................................
Op Codice Descrizione : Annullati :
0000001 Descrizione 1 : :
0000002 Descrizione 2 : Filtro dei codici annullati: :
0000003 Descrizione 3 : :
0000004 Descrizione 4 : Valore Descrizione :
0000005 Descrizione 5 : :
0000006 Descrizione 6 : '*' Tutti i codici. :
0000007 Descrizione 7 : :
0000008 Descrizione 8 : '0' Solo i codici attivi. :
0000009 Descrizione 9 : :
0000010 Descrizione 10 : Segue... :
0000011 Descrizione 11 : F2=Aiuto esteso F10=Inizio dati :
0000012 Descrizione 12 : F12=Ann. F24=Altri tasti :
0000013 Descrizione 13 : :
0000014 Descrizione 14 :...........................................:
0000015 Descrizione 15 0
0000016 Descrizione 16 0
0000017 Descrizione 17 0
0000018 Descrizione 18 0
F1=Aiuto F3=Uscire F5=Rinfescare F6=Nuovo...

Spesso le opzioni sono tante e la loro descrizione viene accorciata per non usare più di una riga, quindi posiziono il cursore sulla riga delle opzioni, oppure in un qualsiasi punto della colonna “Op”, e premo F1:

                               Anagrafico clienti                               
Da codice: 0000000 Annullati: *
2=Modificare... 3=Copiare... 4=Annullare... 5=Visualizzare...
..............................................................................
: Opzioni :
: :
: Opzione Descrizione :
: :
: 2 Per modificare una anagrafica. :
: :
: 3 Per inserire una nuova anagrafica copiandola da una già :
: esistente. :
: :
: 4 Per annullare/ripristinare una anagrafica. :
: :
: 5 Per visualizzare una anagrafica. :
: :
: Nota: Per ripetere un'opzione su tutte le righe scrivere l'opzione :
: e premere F13: l'opzione sarà ripetuta da quella riga in poi, fino :
: Segue... :
: F2=Aiuto esteso F3=Fine F10=Inizio dati F12=Ann. :
: F13=Supporto informativo F14=Stampa aiuto F20=Ingrand. :
: :
:............................................................................:

Cosa contiene la colonna “A”? Basta posizionare il cursore in un punto qualsiasi della colonna e premere F1:

                               Anagrafico clienti                               
Da codice: 0000000 Annullati: *
2=Modificare... 3=Copiare... 4=Annullare... 5=Visualizzare...
Op Codice Descrizione A
................................................... 0
: A (Annullato) : 0
: : 0
: Questa colonna evidenzia i codici annullati: : 0
: : 0
: Valore : 0
: : 0
: '0' Codice attivo. : 0
: : 0
: Segue... : 0
: F2=Aiuto esteso F10=Inizio dati F12=Ann. : 0
: F13=Supporto informativo F24=Altri tasti : 0
: : 0
:.................................................: 0
0000015 Descrizione 15 0
0000016 Descrizione 16 0
0000017 Descrizione 17 0
0000018 Descrizione 18 0
F1=Aiuto F3=Uscire F5=Rinfescare F6=Nuovo...

E per finire posiziono il cursore sulla riga dei tasti funzione e premo F1:

                               Anagrafico clienti                               
Da codice: 0000000 Annullati: *
2=Modificare... 3=Copiare... 4=Annullare... 5=Visualizzare...
Op Codice Descrizione A
0000001 Descrizione 1 0
..............................................................................
: Tasti funzionali :
: :
: Tasto Descrizione :
: :
: F1 Per visualizzare l'aiuto in linea. :
: :
: F3 Per uscire dall'applicazione e tornare a menu. :
: :
: F5 Per rinfrescare l'elenco. :
: :
: F6 Per inserire una nuova anagrafica. :
: Fine :
: F2=Aiuto esteso F3=Fine F10=Inizio dati F12=Ann. :
: F13=Supporto informativo F14=Stampa aiuto :
: :
:............................................................................:
F1=Aiuto F3=Uscire F5=Rinfescare F6=Nuovo...

Scrivere l’aiuto in linea di una applicazione è utile non solo all’utente, ma anche al programmatore che ha sviluppato l’applicazione: proprio oggi un utente mi ha telefonato perché aveva dimenticato il significato di un campo in una applicazione che usa da tanti anni e me la sono cavata dicendogli di premere F1 e leggere l’aiuto.

Questo è il sorgente CUSHELP tipo DSPF:

     A*%%TS  DD  20101202  173727  CussiniD    REL-V5.0.1  WDSc
A*%%EC
A DSPSIZ(*DS3)
A HELP
A ALTHELP
A HLPTITLE('Aiuto')
A R SFL1 SFL
A OPZIONE 2 B 5 2TEXT('Opzione subfile.')
A CDCLIENTE 7N 0O 5 5ALIAS(CODICE_CLIENTE)
A TEXT('Codice cliente.')
A DZCLIENTE 40 O 5 13ALIAS(DESCRIZIONE_CLIENTE)
A TEXT('Descrizione cliente.')
A ANNULLATO 1 O 5 54TEXT('Annullato.')
A R CTL1 SFLCTL(SFL1)
A SFLDSPCTL
A SFLDSP
A SFLPAG(18)
A SFLSIZ(18)
A CA03
A CF01
A CA05
A OVERLAY
A H
A HLPPNLGRP(DACODICE CUSHELP)
A HLPARA(*FLD CDCLIENTE)
A H
A HLPARA(*FLD ANNULLATI)
A HLPPNLGRP(FILTROANNULLATI CUSHELP)
A H
A HLPPNLGRP(OPZIONI CUSHELP)
A HLPARA(3 1 3 80)
A H
A HLPPNLGRP(OPZIONI CUSHELP)
A HLPARA(4 2 22 3)
A H
A HLPARA(4 5 22 11)
A HLPPNLGRP(CDCLIENTE CUSHELP)
A H
A HLPARA(4 13 22 52)
A HLPPNLGRP(DZCLIENTE CUSHELP)
A H
A HLPARA(4 54 22 54)
A HLPPNLGRP(ANNULLATO CUSHELP)
A H
A HLPARA(23 1 23 80)
A HLPPNLGRP(TASTI CUSHELP)
A H
A HLPARA(1 1 24 80)
A HLPPNLGRP(LABEL CUSHELP)
A 4 2'Op'
A COLOR(WHT)
A 4 6'Codice'
A COLOR(WHT)
A 4 13'Descrizione'
A COLOR(WHT)
A 2 2'Da codice:'
A COLOR(WHT)
A CDCLIENTE 7N 0B 2 13ALIAS(CODICE_CLIENTE)
A TEXT('Codice cliente.')
A 2 22'Annullati:'
A COLOR(WHT)
A ANNULLATI 1 B 2 33
A TEXT('Filtro codici annullati.')
A DFTVAL('*')
A VALUES('*' '0' '1')
A 3 2'2=Modificare... 3=Co-
A piare... 4=Annullare... 5=Visual-
A izzare...'
A COLOR(BLU)
A 1 32'Anagrafico clienti'
A 4 54'A'
A COLOR(WHT)
A R TASTI TEXT('Tasti funzione.')
A 23 2'F1=Aiuto F3=Uscire F5=Rinfescare-
A F6=Nuovo...'
A COLOR(BLU)
A*%%RS+<record-sequences>
A*%%RS+ <sequence name="Elenco clienti">
A*%%RS+ <device type="display" width="80" height="24" />
A*%%RS+ <record-write record-format="SFL1" />
A*%%RS+ <record-write record-format="CTL1" />
A*%%RS+ <record-write record-format="TASTI" />
A*%%RS+ </sequence>
A*%%RS </record-sequences>

La parola chiave HLPPNLGRP specifica quale aiuto visualizzare e il nome del *PNLGRP.

La parola chiave HLPARA(*FLD ANNULLATI) specifica che l’aiuto FILTROANNULLATI di CUSHELP deve essere visualizzato quando si preme F1 col cursore posizionato nel campo ANNULLATI.

La parola chiave HLPARA(3 1 3 80) specifica che l’aiuto deve essere visualizzato quando si preme F1 col cursore posizionato in un’area compresa tra riga 3 colonna 1 e riga 3 colonna 80.

Questo è il sorgente CUSHELP tipo PNLGRP:

:HELP NAME='LABEL'.
ANAGRAFICO CLIENTI
:P.
Con questa applicazione si gestisce l'anagrafico dei clienti.
È possibile filtrare le anagrafiche e visualizzarle in un elenco.
Le anagrafiche sono ordinate per codice.
:EHELP.

:HELP NAME='DACODICE'.
Da codice
:P.
Inserire un codice cliente da cui partire per caricare l'elenco.
:EHELP.

:HELP NAME='CDCLIENTE'.
Codice
:P.
Questa colonna contiene il codice cliente.
:EHELP.

:HELP NAME='DZCLIENTE'.
Descrizione
:P.
Questa colonna contiene la descrizione cliente.
:EHELP.

:HELP NAME='FILTROANNULLATI'.
Annullati
:P.
Filtro dei codici annullati:
:DL.
:DTHD.Valore
:DDHD.Descrizione
:DT.'*'
:DD.Tutti i codici.
:DT.'0'
:DD.Solo i codici attivi.
:DT.'1'
:DD.Solo i codici annullati.
:EDL.
:EHELP.

:HELP NAME='ANNULLATO'.
A (Annullato)
:P.
Questa colonna evidenzia i codici annullati:
:DL.
:DTHD.Valore
:DT.'0'
:DD.Codice attivo.
:DT.'1'
:DD.Codice annullato.
:EDL.
:EHELP.

:HELP NAME='OPZIONI'.
Opzioni
:DL.
:DTHD.Opzione
:DDHD.Descrizione
:DT.2
:DD.Per modificare una anagrafica.
:DT.3
:DD.Per inserire una nuova anagrafica copiandola da una già esistente.
:DT.4
:DD.Per annullare/ripristinare una anagrafica.
:DT.5
:DD.Per visualizzare una anagrafica.
:EDL.
:NOTE.
Per ripetere un'opzione su tutte le righe scrivere l'opzione e premere F13:
l'opzione sarà ripetuta da quella riga in poi, fino all'ultima riga dell'elenco,
sulle righe senza opzione.
Al termine il cursore si posiziona sull'ultima riga dove è stata ripetuta l'opzione.
:ENOTE.
:EHELP.

:HELP NAME='TASTI'.
Tasti funzionali
:DL.
:DTHD.Tasto
:DDHD.Descrizione
:DT.F1
:DD.Per visualizzare l'aiuto in linea.
:DT.F3
:DD.Per uscire dall'applicazione e tornare a menu.
:DT.F5
:DD.Per rinfrescare l'elenco.
:DT.F6
:DD.Per inserire una nuova anagrafica.
:EDL.
:EHELP.

Questo è il sorgente CUSHELP tipo RPGLE:

**free
dcl-f cusHelp workstn sfile(sfl1:s) alias;
dcl-s s uns(3);

for s = 1 to 18;
  codice_cliente = s;
  descrizione_cliente = 'Descrizione ' + %char(s);
  annullato = *off;
  write sfl1;
endfor;

dou *inlr;
  write tasti;
  clear codice_cliente;
  exfmt ctl1;
  *inlr = *inkc;
enddo;

I comandi di compilazione sono:

CRTDSPF FILE([libreria]/CUSHELP) SRCFILE([libreria]/SRCFILE) SRCMBR(CUSHELP) REPLACE(*YES)
CRTPNLGRP SRCFILE([libreria]/SRCPNLGRP) SRCMBR(CUSHELP) REPLACE(*YES) PNLGRP([libreria]/CUSHELP)
CRTBNDRPG PGM([libreria]/CUSHELP) SRCFILE([libreria]/SRCPGM) SRCMBR(CUSHELP) REPLACE(*YES)
Related Posts
DB2 for i SQL – Stringhe – POSSTR-LOCATE-LOCATE_IN_STRING (IT)

Introduzione Spesso, nelle nostre applicazioni, abbiamo la necessità di lavorare con le stringhe di testo e l'SQL del DB2 può Read more

DB2 for i & SQL – FAQ & Howto (Part. 1) (IT)

Database DB2 e SQL ... forse lo strumento più potente e completo che abbiamo sulla piattaforma IBM i: ecco una Read more

Annuncio IBM i 7.4

Arriva direttamente con l'uovo di Pasqua questo annuncio IBM per le novità della versione IBM i 7.4, versione iNext secondo Read more

Generated Always Columns – Approfondimenti (IT)

Introduzione "Generated Always Column": sono colonne, campi, di una tabella il cui contenuto è controllato direttamente dal sistema ... e Read more

Recent Posts

VsCode Extension: Bob Cozzi’s RPG IV to RPG Free Conversion

L’estensione “RPG IV to Free Format Conversion” sviluppata da Bob Cozzi (Cozzi Research) è pensata per semplificare la conversione di…

11 mesi ago

IBM i & SQL Tips #010 – Localizzare programmi nella Call Stack con STACK_INFO

Ciao a tutti, oggi voglio segnalarvi un altro interessante contributo di Massimo Duca, parte della sua ormai nota serie IBM…

11 mesi ago

Display file DDS Edit per VsCode, nuova preview.

Incuriosito da alcuni messaggi di Cristian Larsen su Linkedin (New Release - Display File DDS Edit v.0.10.1) ho voluto scaricare…

11 mesi ago

Project Bob: il nuovo strumento AI di IBM per sviluppo COBOL su IBM Z e RPG su IBM i

Ciao a tutti,oggi voglio segnalarvi un annuncio che potrebbe segnare una svolta per lo sviluppo applicativo su ambienti IBM: Project…

11 mesi ago

IBM i & SQL Tips #6: chiamare API REST e analizzare le risposte JSON con SQL

Voglio segnalarvi un nuovo articolo molto interessante di Massimo Duca nella serie IBM i & SQL Tips. In questo sesto…

12 mesi ago

Come funziona il passaggio di parametri a un programma IBM i (RPG / Cobol)

Ciao a tutti, voglio segnalarvi un post molto utile di Marco Riva sul suo sito Markonetools, in cui spiega in…

12 mesi ago