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

Gestione dei file video bloccati su IBM i: una soluzione efficace

Riceviamo e pubblichiamo ben volentieri questo "tip & trick" di Patrick Rizzi che presenta una tecnica che permette di intervenire…

1 mese ago

Monitoraggio Messaggi QSYSOPR: SQL per Ottenere Messaggi e Reply

Prendo spunto da una risposta di Michael Mayer sulle mailing list di Midrange.com a chi chiedeva come monitorare i messaggi…

1 mese ago

Perché l’ERP è la Chiave del Successo per le Imprese Moderne

Le imprese sono sempre più alla ricerca di strumenti che possano migliorare l'efficienza, la collaborazione e la gestione delle risorse.…

3 mesi ago

ACS Access Client Solution 1.1.9.5

I primi di Aprile è uscita la "Spring Version" di ACS Access Client Solution, versione 1.1.9.5 Interessanti novità soprattutto in…

8 mesi ago

Tim Rowe and Scott Forstie – Promo video for CEC 2024 – Milan

Se non vi bastava la ricca agenda delle sessioni del Common Europe Congress 2024, 3-6 Giugno Milano, ecco un altro…

8 mesi ago

Code for IBM i 2.10.0 – Debug IBM i con Visual Studio Code

Le funzioni di debug con Visual Studio Code sono disponibili da qualche tempo ma questa nuova versione 2.10.0 semplifica la…

8 mesi ago