Where allowed to run: All environments (*ALL) Threadsafe: No |
Parameters Examples Error messages |
Testa la conversione di un numero nella sua descrizione alfabetica restituendo un messaggio in log.
Note: Il programma RPGLE JXLTNBRD costituisce il cuore del comando JXLTNBR ed e' disponibile anche per la chiamata con una tradizionale call, con gli stessi parametri del comando JXLTNBR, o con la funzione sql JXLTNBR, che restituisce la descrizione alfabetica. In realta', per il comando qui documentato, non si prevede un uso diretto produttivo. Esso e' tuttavia il miglior punto di ingresso per questa documentazione e per il test del programma cuore.
Note: Il testo d'aiuto della funzione SQL JXLTNBR e' consultabile sia dal video comandi che dal video SQL con la chiamata: CALL NERONI2/JXLTNBR
Lo scopo del programma cuore JXLTNBRD, ricevuti dal comando i parametri qui illustrati, e' restituire un campo alfanumerico lungo al massimo 200 caratteri contenente la traduzione in lettere del numero ricevuto. Se il programma riesce a produrre una traduzione utilizzabile, il comando visualizza la traduzione nel messaggio di risposta.
Top |
Keyword | Description | Choices | Notes |
---|---|---|---|
NUMBER | Number to translate | Decimal number | Required, Positional 1 |
LENGTH | Translation lenght | 11-200, 200 | Optional, Positional 2 |
SEPARATORS | Decimal separators | Character value, ',', '.', '<EURO>', '+CENT' | Optional, Positional 3 |
CLOSE | Close without cents | Character value, '<EURO>', '//' | Optional, Positional 4 |
CLOSECENTS | Close with cents | Character value, *CLOSE, '<CENT>', '//' | Optional, Positional 5 |
LANGUAGE | Language | ITA, ENG, DEU, FRA, NED, ESP, XXXX | Optional, Positional 6 |
Top |
Numero da tradurre nella sua descrizione alfabetica.
Sono permesse fino a 12 cifre intere piu' 2 decimali.
Valori permessi:
Il valore e' obbligatorio.
Top |
Lunghezza massima richiesta per la descrizione alfabetica da ottenere.
E' permesso indicare una lunghezza compresa tra 11 e 200. Il valore deve essere pero' ragionevolmente adeguato alla dimensione massima del numero da tradurre in lettere, tenendo anche conto delle stringhe di servizio fornite nei parametri SEPARATORS, CLOSE e CLOSECENTS.
Se dopo il primo tentativo la lunghezza del risultato e' eccessiva, avvengono due ulteriori tentativi sacrificando prima la traduzione dei due decimali, poi quella della terna di cifre delle unita'.
Se l'algoritmo non riesce a ottenere una descrizione soddisfacente, segnala il problema lasciando in bianco il risultato e il comando restituisce un diagnostico.
Valori permessi:
Top |
Dicitura da interporre tra la traduzione della parte intera e la traduzione dei centesimi se i decimali sono diversi da zero.
Valori permessi:
Valori speciali:
Top |
Dicitura da accodare alla traduzione della parte intera quando i decimali sono a zero.
Valori permessi:
Valori speciali:
Top |
Dicitura da accodare alla traduzione della parte intera quando sono presenti anche i decimali.
Valori permessi:
Valori speciali:
Top |
Lingua da usare nella traduzione del numero in lettere.
Valori permessi:
Top |
Esempio 1: Uso del comando estemporaneo per verificare la traduzione di un numero
Chiamando il comando JXLTNBR con alcuni numeri e varie opzioni si ottiene il seguente log, moderatamente reimpaginato per migliorarne la leggibilita':
Un numero molto lungo > JXLTNBR NUMBER(454454454454,54) quattrocentocinquantaquattromiliardiquattrocentocinquantaq uattromilioniquattrocentocinquantaquattromilaquattrocent ocinquantaquattro,cinquantaquattro Lo stesso numero in tutte le lingue > JXLTNBR NUMBER(12345,67) dodicimilatrecentoquarantacinque,sessantasette > JXLTNBR NUMBER(12345,67) LANGUAGE(ENG) twelvethousandthreehundredfortyfive,sixtyseven > JXLTNBR NUMBER(12345,67) LANGUAGE(FRA) douzemilletroiscentquarantecinq,soixantesept > JXLTNBR NUMBER(12345,67) LANGUAGE(DEU) zwoelftausenddreihundertfuenfundvierzig,siebenundsechzig > JXLTNBR NUMBER(12345,67) LANGUAGE(ESP) docemiltrescientoscuarentaycinco,sesentaysiete > JXLTNBR NUMBER(12345,67) LANGUAGE(NED) twaalfduizenddriehonderdvijfenveertig,zevenenzestig > JXLTNBR NUMBER(12345,67) LANGUAGE(XXXX) La lingua richiesta XXXX non e' prevista. Ho usato ITA dodicimilatrecentoquarantacinque,sessantasette Stringe la lunghezza desiderata > JXLTNBR NUMBER(12345,67) LENGTH(45) LANGUAGE(ITA) dodicimilatrecentoquarantacinque,67 > JXLTNBR NUMBER(12345,67) LENGTH(30) LANGUAGE(ITA) dodicimila345,67 > JXLTNBR NUMBER(12345,67) LENGTH(15) LANGUAGE(ITA) La descrizione ottenibile e' piu ampia della lunghezza massima richiesta oppure la conversione in lettere e' terminata in errore. Usa le costanti descrittive con strategia post > JXLTNBR NUMBER(12345,67) SEPARATORS('<EURO>') CLOSE('<EURO>') CLOSECENTS('<CENT>') LANGUAGE(ITA) dodicimilatrecentoquarantacinque<EURO>sessantasette<CENT> > JXLTNBR NUMBER(12345) SEPARATORS('<EURO>') CLOSE('<EURO>') CLOSECENTS('<CENT>') LANGUAGE(ITA) dodicimilatrecentoquarantacinque<EURO> Usa le costanti descrittive con strategia ante > JXLTNBR NUMBER(12345,00) SEPARATORS('+CENT') CLOSE('//') dodicimilatrecentoquarantacinque// > JXLTNBR NUMBER(12345,67) SEPARATORS('+CENT') CLOSE('//') dodicimilatrecentoquarantacinque+CENTsessantasette//
Si osservino i messaggi risultanti.
Esempio 2: Uso del programma cuore JXLTNBRD per tradurre un numero in lettere mediante CALL
Si riporta uno stralcio del sorgente RPGLE JXLTNBRS che esemplifica la chiamata al programma cuore del controllo mediante la definizione di una procedure RPG. Per gli incolonnamenti giusti e per maggiore dettaglio, consultare il sorgente stesso.
*---------------------------------------------------------- * Claudio Neroni 30-05-2017 Creato. * JXLTNBRS * Translate number to letters. Tst Callp Expr Short * Definisce la procedura senza programma esterno. * Usa la CALLP implicita che puo' stare nelle espressioni. * Il campo risultante e' prelevato dalla funzione. * Nella procedure il pgm originale viene chiamato con CALL. *---------------------------------------------------------- H DFTACTGRP(*NO) D let ds 200 O Translation D let1 50 D let2 50 D let3 50 D let4 50 D stop s 1 inz('X') U Stop dsply C *entry plist * Riceve il numero da tradurre. * Ad esempio, per tradurre il numero 12345,67 eseguire: * call JXLTNBRS x'000000001234567f' C parm nbr 14 2 /free let = jxltnbr (nbr:200:',':' ':' ':'ITA'); *inlr=*on; dsply let1; dsply let2; dsply let3; dsply let4 ' ' stop; /end-free *---------------------------------------------------------- P jxltnbr b D jxltnbr pi 200a D Jlegnr 14p 2 const I Number D Jlegle 3p 0 const I Lenght D Jlegse 14a const I Separators D Jlegcl 14a const I CloseNoCent D Jlegcc 14a const I CloseCent D Jlegln 4a const I Language D jxltnbrout s 200a O Translation C call 'JXLTNBRD' C parm jlegnr plegnr 14 2 I Number C parm jlegle plegle 3 0 I Lenght C parm jlegse plegse 14 I Separators C parm jlegcl plegcl 14 I CloseNoCent C parm jlegcc plegcc 14 I CloseCent C parm jlegln plegln 4 I Language C jxltnbrout parm plegxl 200 O Translation C return jxltnbrout P jxltnbr e *-----------------------------------------------------------
Il significato dei campi e' lo stesso che si legge nel testo d'aiuto dei parametri del comando JXLTNBR.
L'esecuzione della chiamata: > call JXLTNBRS x'045445445445454f' genera la seguente visualizzazione: DSPLY quattrocentocinquantaquattromiliardiquattrocentoci DSPLY nquantaquattromilioniquattrocentocinquantaquattrom DSPLY ilaquattrocentocinquantaquattro,cinquantaquattro DSPLY X
Per altri esempi d'uso RPGLE, consultare il sorgente dei programmi JXLTNBRS0, JXLTNBRS1, JXLTNBRS2, JXLTNBRS3, JXLTNBRS4. Alcuni di questi usano come /COPY i sorgenti JXLTNBR1 e JXLTNBR2, utili per l'uso delle procedure RPG.
Esempio 3: Uso della funzione SQL JXLTNBR
Si riporta un adattamento del testo d'aiuto della funzione SQL JXLTNBR che usa il programma RPGLE JXLTNBRD, cuore dell'ambaradan.
Sql function JXLTNBR Translate number to letters Traduce numero in lettere - La funzione riceve tre parametri: 1) Un numero da tradurre in lettere costituito da 14 cifre di cui 2 decimali; sono tollerati da 1 a 12 interi e da 0 a 2 decimali. 2) La lunghezza in 3 cifre dello spazio a disposizione per contenere la traduzione in lettere; la lunghezza massima deve essere tra 11 e 200. 3) Un alfanumerico con due valori: Nei primi tre caratteri la lingua in cui tradurre, con esempi per 12,31. ITA = Italiano dodici,trentuno ENG = Inglese twelve,thirtyone DEU = Tedesco zwoelf,einunddreissig FRA = Francese douze,trenteun NED = Olandese twaalf,eenendertig ESP = Spagnolo doce,treintayuno Nel quarto carattere il nome della batteria di costanti che editano la descrizione, con esempi per 12 e 12,31. 0 = Punto dodici dodici.trentuno 1 = Virgola dodici dodici,trentuno 2 = Post dodici<EURO> dodici<EURO>trentuno<CENT> 3 = Ante dodici// dodici+CENTtrentuno// Altre batterie potranno essere aggiunte se necessario. - La funzione restituisce un valore di 200 caratteri: Traduzione in lettere del numero ricevuto editata come da lunghezza e costanti richieste. - La funzione SQL e' stata sviluppata inizialmente per il release V7R2 che interpreta come char la costante tra apici fornita alla funzione come dagli esempi seguenti. Purtroppo pero' il release V7R1 riconosce la stessa costante come varchar che comporta l'aggiunta automatica di un integer iniziale di due byte a prefissare la costante. Ne seguono evidenti difficolta' interpretative da parte del programma esecutore della funzione tra un release e l'altro. Deciso di risolvere il release piu' recente, per sanare il problema nel piu' vecchio, due vie: A) Caricare il valore in una variabile di ambiente e passare la variabile in luogo della costante. Ad esempio, per creare una variabile: create variable LANGEDIT char(4); Per riempire la medesima variabile: set LANGEDIT = 'FRA2'; Di striscio, per vedere la variabile: select * from (values(LANGEDIT)) variables(LANGEDIT); Invece quindi della semplice costante, ad esempio 'FRA2' si passa alla funzione la variabile LANGEDIT B) Invece della semplice costante, ad esempio 'ESP2' passare alla funzione il piu' complesso cast('ESP2' as char(4)) - Si riporta un primo esempio da V7R2 di chiamata sui dati del file di test: SELECT t1nbr1, jxltnbr(t1nbr1, 200, 'ITA1') FROM jxltnbrt1; Oppure per V7R1, versione cast: SELECT t1nbr1, jxltnbr(t1nbr1, 200, cast('ITA1' as char(4))) FROM jxltnbrt1; Oppure per V7R1, versione variabile: set LANGEDIT = 'ITA1'; SELECT t1nbr1, jxltnbr(t1nbr1, 200, LANGEDIT) FROM jxltnbrt1; Si genera il seguente output: Numero JXLTNBR 14,2 12,00 dodici 12,31 dodici,trentuno 12.345,67 dodicimilatrecentoquarantacinque,sessantasette ... Un secondo, per troncare la traduzione a 45 caratteri: SELECT t1nbr1, substr(jxltnbr(t1nbr1, 45, 'ITA1'), 1, 45) FROM jxltnbrt1; Oppure per V7R1 versione cast: SELECT t1nbr1, substr (jxltnbr(t1nbr1, 45, cast('ITA1' as char(4))), 1, 45) FROM jxltnbrt1; Si genera il seguente output: Numero JXLTNBR 14,2 12,00 dodici 12,31 dodici,trentuno 12.345,67 dodicimilatrecentoquarantacinque,67 ... Si osservi che il campo di output contenente la traduzione e' troncato alla stessa lunghezza richiesta nella funzione. Si osservi inoltre che l'algoritmo ha rinunciato alla traduzione dei decimali di 12.345,67 ... Senza piu' dettagliare per V7R1, un terzo, per troncare la traduzione a 30 caratteri: SELECT t1nbr1, substr(jxltnbr(t1nbr1, 30, 'ITA1'), 1, 30) FROM jxltnbrt1 Si genera il seguente output: Numero JXLTNBR 14,2 12,00 dodici 12,31 dodici,trentuno 12.345,67 dodicimila345,67 ... Si osservi che l'algoritmo ha rinunciato anche alla traduzione delle terna delle unita' di 12.345,67 - Un quarto, per troncare la traduzione a 15 caratteri: SELECT t1nbr1, substr(jxltnbr(t1nbr1, 15, 'ITA1'), 1, 15) FROM jxltnbrt1 Si genera il seguente output: Numero JXLTNBR 14,2 12,00 dodici 12,31 dodici,trentuno 12.345,67 ... Si osservi che l'algoritmo ha rinunciato completamente alla traduzione di 12.345,67 - La visualizzazione del presente testo e' ottenibile dal video comandi o dal video SQL con: CALL NERONI2/JXLTNBR
Top |
Messaggi *INFO e *COMP
Messaggi *DIAG seguiti da *ESCAPE CPF0001
Nessun messaggio previsto.
Messaggi *DIAG non seguiti da *ESCAPE
Top |