mercoledì 9 dicembre 2015

L'SQL senza l'SQL

SQL, da pronunciare rigorosamente siquel, è l'acronimo di Structured Query Language.
È uno strumento fondamentale per interrogare e fare manutenzione del Data Base sulla maggior parte delle piattaforme software: DB2, Windows, Linux comprendono strumenti per utilizzare questo linguaggio. Ci sono piccole differenze di sintassi, ma nulla che non si possa superare con un minimo di attenzione.

Chi si occupa di manutenzione software, e ha bisogno di uno strumento veloce per analizzare un archivio, per fare ricerche, per controllare informazioni e fare modifiche "al volo", deve saperlo utilizzare, almeno per quanto riguarda le funzioni base.

Un caso plausibile

Ora, provate a immaginare una situazione come questa: il consulente arriva dal cliente, dotato di un sistema iSeries, fa un po' di analisi della situazione, e vede che deve modificare sull'anagrafico Clienti un campo che chiameremo "flag di cliente vecchio", per tutti quelli che non hanno ordini nell'ultimo anno.
Ovviamente il nostro consulente sa che per fare questo è sufficiente lanciare un unico comando SQL, qualcosa del genere

Update Clienti set Cliente_Vecchio='S'
where Codice_Cliente not in 

(Select Codice_Cliente from Ordini where data >= data_di_un_anno_fa)

Non è dei più semplici, ma in pratica mette il flag su tutti i clienti il cui codice NON compare nella lista estratta dal comando in parentesi, che contiene tutti i codici cliente che hanno un ordine a partire dalla data di un anno fa.
Più semnplice da capire che da spiegare :-)

Ora però il nostro consulente va sulla riga comandi, scrive STRSQl (start SQL) e riceve il messaggio: "SQL for DB2 not installed".

Accidenti, e adesso?

Ovviamente si dovrà scrivere un programma, sempre che il cliente abbia installato il compilatore RPG o Cobol, a seconda delle capacità specifiche del professionista.

Soluzione alternativa (e divertente)

Oppure si può risolvere in un modo più elegante e tutto sommato divertente, basta avere installato sul proprio PC il modulo Operation Navigator nella sua versione completa.

Selezionate la vostra macchina nella lista a sinistra, aprite il gruppo Database, quindi cliccate con il pulsante destro del mouse sul nome della macchina: si aprirà un menù contestuale come nell'immagine.
Selezionate Esegui script SQL...

Comparirà un pannello simile a quello riportato qui sotto, nel quale potete già vedere alcune cose interessanti: vediamole.

Innanzi tutto, nella parte superiore potete inserire un qualsiasi comando SQL, che verrà eseguito sul sistema iSeries selezionato. Dovete solo fare attenzione a scrivere i nom delle Tabelle nel formato libreria.tabella e non con quella standard dell'AS/400 con la barra tra nome della libreria e nome del file.


Una volta selezionato il pulsante  Esegui script, una piccola clessidra, vedrete il risultato nella parte inferiore, con tutti i campi scelti nella clausola select.






Conclusioni

Questa funzione permette di fare un sacco di cose, oltre all'esecuzione pura e semplice di uno script, per esempio la possibilità di salvare un comando dentro un file di testo, per poterlo riutilizzare sempre qui oppure sull'iSeries, con un semplice taglia-incolla.

Vi ho incuriositi?
Lo spero, e vi invito a usare questo "trucchetto": fatemi sapere le vostre opinioni e se scoprite qualcos'altro, fatemelo sapere, così potrò aggiungerlo qui (ovviamente prendendomene il merito... :-D)

Un abbraccio

lunedì 7 dicembre 2015

iSeries e chiavette USB

Non so quanti di voi abbiano mai pensato: "Ma a cosa servono tutte quelle prese USB sull'AS/400 se poi non si possono utilizzare?!"

Bene, le cose non stanno esattamente così, se avete un Power7 e almeno la V7R1.

Vi faccio la versione breve:

1) prendete una chiavetta USB (o un disco con porta USB, come volete)
2) controllate che il valore di sistema QAUTOCFG sia impostato a "1"
3) inserite la chiavetta (o il disco, ma da qui in avanti parliamo di chiavetta), nella porta USB
4) aspettate qualche secondo, quindi controllate che il device RMS01 esista
5) lanciate INZOPT NEWVOL('USB01') DEV(RMS01) CHECK(*NO) MEDFMT(*UDF)

Da questo momento in avanti, la vostra chiavetta (che ovviamente sarà stata "pulita" dall'inizializzazione) potrà essere usata come device di salvataggio di QUALSIASI cosa, basterà utilizzarla come unità ottica riscrivibile.
Quindi SAVLIB, SAVOBJ, SAVSYS.
Ovviamente, se RMS01 non vi piace, nessuno vi vieta di ridenominarlo come USB01.

Inoltre, essendo un device accessibile da IFS, potrete utilizzarlo come target IMGCLG, quindi, tanto per fare un esempio, potrete creare un IMGCLG sulla chiavetta, definendolo come "virtual tape", e farci i vostri preziosissimi salvataggi serali, quadagnandoci in velocità e sicurezza.

Solo la fantasia può frenarvi, a questo punto!

Aggiungo che la chiavetta, formattata in questo modo, sarà perfettamente leggibile anche da PC e da MAC.

Cosa volete di più?

mercoledì 5 agosto 2015

Qualche trucco con le DS #2

Ieri vi ho raccontato cosa sono le DS qualificate, lasciandovi con la promessa di un altro trucchetto divertente. Siccome sono una persona di parola, eccomi qui :-)

Riprendiamo l'esempio con le due DS dell'esempio di ieri:

DDataGMA           DS               Qualified
D Giorno                       2S 0
D Mese                         2S 0

D Anno                         4S 0
DDataAMG           DS               Qualified
D Anno                         4S 0
D Mese                         2S 0

D Giorno                       2S 0


Essendo entrambe qualificate, i nomi dei campi possono essere duplicati.
Vi avevo anche messo un semplice esempio di come possono essere utilizzati: rivediamolo.

//free
    DataAMG = DataDaInvertire;
    DataGMA.Anno = DataAMG.Anno;
    DataGMA.Mese = DataAMG.Mese;
    DataGMA.Giorno = DataAMG.Giorno;
    DataInvertita = DataGMA;
//end-free


Ma qui scatta il giochino interessante.
Nel linguaggio COBOL esiste un codice operativo chiamato MOVE CORR che sposta tra due strutture dati i campi che hanno lo stesso nome. Cominciate a intravedere la possibilità?
Bene, nel linguaggio RPG non esisteva un codice operativo simile, fino a quando non è arrivato l'ILE. Grazie al codice EVAL-CORR diventa possibile scrivere l'istruzione sopra in un modo ancora più semplice:


//free
    DataAMG = DataDaInvertire;
    Eval-corr DataGMA = DataAMG;
    DataInvertita = DataGMA;
//end-free

Non male, vero?
Il fatto è che, a differenza di uno spostamento tra due DS generiche, questo comando permette di spostare SOLO i campi che esistono in entrambe le DS: se ci sono delle differenze, i campi o non vengono spostati perché mancanti nella DS di arrivo, oppure rimangono vuoti per ché mancanti nella DS di partenza.
Occorre prestare attenzione ai campi presenti nella DS di arrivo e non in quella di partenza, perché in quel caso vengono inizializzati a "NULL", valore che potrebbe non essere voluto. Eventualmente potete far precedere il EVAL-CORR da un RESET della DS.

Qui ho usato la codifica in formato free, ma si può usare anche con la solita forma a tracciato fisso.

Provateci e divertitevi :-)

martedì 4 agosto 2015

Qualche trucco con le DS #1

Tutti i programmatori RPG conoscono e usano con profitto le Strutture Dati.
Queste infatti danno la possibilità di impostare i dati in modo organizzato, e di accedere alle informazioni con semplicità, riferendosi o al singolo campo, o all'intera struttura.

Vediamo un esempio piuttosto semplice

DDataGMA           DS              
D Giorno                       2S 0
D Mese                         2S 0

D Anno                         4S 0

Qui possiamo fare riferimento ala DS "DataGMA" per passarla come parametro a un altro programma (che ovviamente dovrà riceverla e avere una DS uguale), oppure riferirci ai suoi campi interni, o sottocampi.

Una cosa da tenere presente è che nell'RPG ILE, i campi devono essere univoci, per cui in un'altra DS non potremo avere un altro campo che si chiama "ANNO".

A meno che non usiamo un trucchetto simpatico e, a mio avviso, molto utile, che ci permetterà per prima cosa di rendere più comprensibili i nostri programmi, e per seconda di utilizzare un codice operativo nuovo (nell'RPG) che arriva direttamente dal cugino COBOL.

Ma andiamo con ordine: come facciamo a definire gli stessi campi in due DS diverse?
Semplicemente mettendo, a livello della definizione della DS, nell'area dedicata alle parole chiave, il comando QUALIFIED.
Questa istruzione ha l'unico difetto di obbligarci di riferirci ai vari campi indicando anche di quale DS fanno parte.

Quindi supponiamo di avere, oltre alla DS indicata prima, quest'altra:

DDataAMG           DS               Qualified
D Anno                         4S 0
D Mese                         2S 0

D Giorno                       2S 0

Entrambe devono avere la dicitura "qualified", ovviamente.
Bene, e ora?

Ora possiamo scrivere questo:

//free
    DataAMG = DataDaInvertire;
    DataGMA.Anno = DataAMG.Anno;
    DataGMA.Mese = DataAMG.Mese;
    DataGMA.Giorno = DataAMG.Giorno;
    DataInvertita = DataGMA;
//end-free

Mi sembra molto chiaro cosa stiamo facendo, no?

Se invece di una data trattiamo con dati anagrafici, per esempio, potremmo avere una DS come questa:

DCliente           DS               Qualified  
D Cognome                     50A 
D Nome                        30A

D DataDiNascita               8S 0  

A questo punto, nel nostro programma potremo riferirci (dovremo, n realtà), riferirci ai vari campi come

Cliente.cognome
Cliente.nome
Cliente.DataDiNascita  

Già questo è piuttosto interessante, ma c'è una cosetta che può tornarci molto utile: il fatto che i campi di una DS possono riferirsi a un'altra DS.
Detta così sempra una fesseria, ma provate a pensare alla DS del Cliente in questo nuovo modo:

DCliente           DS               Qualified  
D Cognome                     50A 
D Nome                        30A

D DataDiNascita                     LikeDs(DataAMG)
 Uhm, mi sembra di vedere la perplessità sui vostri volti, e una domanda sul vostro crapino: "Bello, ma a cosa serve?".
Diciamo che, anche se non indispensabile, permette di riferirsi ai vari campi in questo modo:

Cliente.Cognome
Cliente.Nome
Cliente.DataDiNascita.Anno
Cliente.DataDiNascita.Mese
Cliente.DataDiNascita.Giorno

Ridondante? Forse, anzi probabilmente lo è. Ma sfido chiunque a NON capire a cosa si riferisca un campo che si chiama Cliente.DataDiNascita.Anno!
Sempre meglio di CLDNA, tanto per dire :-)


Naturalmente qui potrete sbizzarrirvi come preferite.
 Giocateci un po' e vedrete quante belle cose si possono fare.

Domani vi racconto di quello che si può fare con due DS qualificate.  

giovedì 2 luglio 2015

L'SQL senza l'SQL, parte terza

Come vi avevo promesso nella scorsa puntata, voglio ancora parlarvi di una funzione piuttosto interessante del modulo "Script SQL" presente nell'Operation Navigator.

Salvare i risultati

Normalmente l'SQL viene utilizzato come strumento di analisi e di modifica "al volo" dei data base.
Ma come possiamo fare se desideriamo salvare il risultato di un'estrazione?

La cosa, come vedremo, è piuttosto semplice e permette di ottenere un discreto risultato.

Per prima cosa, osservate la barra menù nella parte superiore, e trovate la voce Opzioni. Cliccateci, e verificate che il nome "Consenti salva risultati" sia flaggato con un segno di spunta a sinistra. Se non lo è, ovviamente, cliccateci.

Adesso preparate il vostro comando SQL, magari utilizzando il "wizard" di cui abbiamo parlato la scorsa volta, ed eseguitelo premendo ctrl-R, oppure il tasto a forma di clessidra nella barra dei comandi.
Nella parte inferiore apparirà il risultato.

A questo punto parte la cosa divertente: premete con il tasto destro del mouse, e scegliete Salva risultati, oppure premete ctrl-S, e vi comparirà uno schermo simile a quello riportato qui sotto.


Mi sembra che ci sia pochissimo da spiegare, no?

Come al solito vi invito a giocare con questa soluzione, e a farmi sapere cosa ne pensate.

Alla prossima

lunedì 29 giugno 2015

L'SQL senza l'SQL, parte seconda

Come spesso capita, l'appetito vien mangiando, e giocando con l'applicazione di cui abbiamo parlato nello scorso post, sono saltate fuori alcune opzioni interessanti.

Una mano nella creazione del comando

Come avviene anche nella versione "a caratteri" dell'SQL, è possibile richiedere un ausilio alla creazione del comando da eseguire.
Posizionatevi nella parte superiore del pannello, e premete il tasto standard per la richiesta del "prompt" su iSeries, l'F4. Vi si aprirà una nuova applicazione che, in modo molto semplice, vi guiderà nella selezione della libreria, del file, dei campi da selezionare, delle condizioni where, di raggruppamendo e di ordinamento. Potrete scegliere tra SELECT, INSERT, UPDATE e DELETE, quindi, praticamente, su tutto quello che vi può servire.
Per tutti gli altri comandi (create, drop, eccetera) non c'è un ausilio, ma sono comunque supportati.

Una funzione interessante è il Unisci Tabelle, che si attiva nel caso ci siano più tabelle selezionate.


Mediante questo piccolo pannello, è facile selezionare i campi di unione tra i due (o più) file, e stabilire il tipo di unione mediante il comodo "combo", oppure con il tastino "tipi di unione...", che permette di comprendere meglio il "modo" con cui l'SQL unirà le due tabelle.

Notate che, man mano che compilate il comando, questo si compone nella parte inferiore, in modo che possiamo tenere sotto controllo quello che stiamo facendo.

Conclusioni

Ecco un altro motivo per preferire questo sistema al "vecchio" (ma sempre valido, per carità!) terminale a caratteri.
Giocateci e divertitevi, domani vi scriverò un'altra interessante funzione di questo modulo.

Un abbraccio

venerdì 3 aprile 2015

La sindrome della sinistra

No, niente politica, per carità!

Politica, fede calcistica, miti musicali e gusti sessuali sono argomenti sui quali è facilissimo scivolare e battere la testa, scatenando un putiferio di "io ho ragione!", "no, ho ragione io!", "ma io ho più ragione di te!" che non concludono nulla.

La "sindrome della sinistra" di cui volevo parlarvi, è una nuova malattia che, a quanto pare, colpisce gli automobilisti.
La potete facilmente notare viaggiando su una strada qualsiasi, che abbia una dimensione tale da permettere a due vetture di procedere affiancate. Indipendentemente dalla presenza o meno della riga di separazione tra le corsie, che quanto meno potrebbe giustificare il comportamento di cui vi sto parlando, molto automobilisti tendono a viaggiare in prossimità del centro della carreggiata.

Per quale motivo, mi chiedo?
Be', volendo essere generosi, ci sono diversi motivi:

  1. a destra ci sono le macchine parcheggiate e, spesso, quelle in seconda fila;
  2. visto che stanno tutti a destra, stando a sinistra ho una visuale migliore;
  3. uhm...
Finiti i numerosi motivi, direi.
Sul fatto delle macchine in seconda fila, purtroppo hanno pure ragione.
Sul secondo punto, invece, direi proprio di no: se non altro perché sono TUTTI a sinistra!

E se questo capita nelle strade larghe, ma "monocorsia", la follia regna sovrana in quelle dove ci sono due, tre o addirittura quattro corsie, ben segnalate.
Se le corsie sono due, a destra ci sono i camion e a sinistra le macchine. E va bene.
Se sono tre, cioè la maggioranza delle autostrade e delle tangenziali, si assiste a questo fenomeno:
  • nella corsia di destra i camion più veloci e pochi furgoni;
  • nella corsia centrale le macchine meno veloci e quasi tutti i furgoni;
  • nella corsia di sinistra tutti gli altri.
Ora, poiché di macchine "meno veloci" sono rimaste solo le vecchie Panda, le Uno e qualche Centoventisette, questo vuole dire che nella corsia di sinistra ci sono praticamente tutte le vetture presenti nella strada. E tutte in coda!
Lo potete verificare in qualsiasi momento, facendo un giro.

Ma, e qui scatta la follia, questo fenomeno si verifica anche quando, di sabato e domenica, i camion nella corsia di destra NON CI SONO!
Meraviglioso: si vedono macchine tranquille in centro, macchine veloci a sinistra, e la corsia di destra perfettamente sgombra!

A questo punto parte il divertimento: viaggiare nella corsia di destra diventa estremamente fluido, senza grossi problemi (se trovate una Uno, basta sorpassarla normalmente, visto che la corsia centrale è comunque piuttosto libera), e anche rilassante.
Prima di scatenare dibattiti e denunce per incitamento alla ribellione, voglio ricordarvi che è vero che è vietato il sorpasso a destra, ma il "sorpasso" è, tecnicamente, essere dietro a una vettura, spostarsi di corsia, superarla e tornare nella corsia di prima; se procedete in una corsia senza spostarvi, NON si parla di sorpasso, ma superamento o sfilamento ;-)

Provate, e fatemi sapere.

Ciao, e alla prossima