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:
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)
Riceviamo e pubblichiamo ben volentieri questo "tip & trick" di Patrick Rizzi che presenta una tecnica che permette di intervenire…
Prendo spunto da una risposta di Michael Mayer sulle mailing list di Midrange.com a chi chiedeva come monitorare i messaggi…
Le imprese sono sempre più alla ricerca di strumenti che possano migliorare l'efficienza, la collaborazione e la gestione delle risorse.…
I primi di Aprile è uscita la "Spring Version" di ACS Access Client Solution, versione 1.1.9.5 Interessanti novità soprattutto in…
Se non vi bastava la ricca agenda delle sessioni del Common Europe Congress 2024, 3-6 Giugno Milano, ecco un altro…
Le funzioni di debug con Visual Studio Code sono disponibili da qualche tempo ma questa nuova versione 2.10.0 semplifica la…