[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico] [volume] [parte]
Il linguaggio SQL consente di costruire delle espressioni elementari, attraverso operatori matematici e funzioni comuni. L'interrogazione di una relazione può essere realizzata anche attraverso l'uso di espressioni e questo è lo scopo del capitolo.
|
|
Nella relazione Movimenti appare un attributo denominato Valore. Si tratta del valore dell'articolo, determinato in base al costo di acquisto (da non confondere con il prezzo di listino), con il quale si determina il valore delle merci in magazzino. Pre ogni tupla della relazione, si vuole ottenere il valore unitario, che si calcola dividendo il valore per la quantità movimentata corrispondente.
Si crei il file prova-interrogazione-movimenti-vu.sql
, contenente il testo seguente, sostituendo le metavariabili con informazioni appropriate e rispettando la punteggiatura:
|
Si osservi che, nell'ultima colonna del listato che si vuole ottenere, viene indicata l'espressione (Valore/Quantita), associata a un alias, in modo da mostrare una descrizione appropriata.
Una volta completato e salvato il file prova-interrogazione-movimenti-vu.sql
, se ne deve controllare il funzionamento con la base di dati:
$
sqlite3 mag.db < prova-interrogazione-movimenti-vu.sql
[Invio]
Si dovrebbe ottenere un listato simile a quello seguente:
Articolo Causale Data Quantita ValoreUnitario ---------- ---------- ---------- ---------- -------------- 2 1 2006-01-15 10000 0.01 2 2 2006-01-16 1000 0.01 102 1 2006-01-17 1000 0.2 102 2 2006-01-18 100 0.2 401 1 2006-01-19 1000 0.2 401 2 2006-01-20 200 0.2 401 4 2006-01-20 100 0.2 102 4 2006-01-20 100 0.2 601 1 2006-01-21 2000 0.5 601 2 2006-01-25 1000 0.5 |
Se invece si ottengono degli errori, dovrebbe essere sufficiente correggere il file prova-interrogazione-movimenti-vu.sql
e poi riprovare.
Così come è possibile scrivere un'interrogazione a una relazione indicando delle espressioni, se ne può realizzare una vista, così da semplificare gli accessi a queste informazioni generate attraverso dei calcoli.
Si crei il file vista-movimenti-extra.sql
, contenente il testo seguente, sostituendo le metavariabili con informazioni appropriate e rispettando la punteggiatura:
|
La vista MovimentiExtra che si ottiene in questo modo, include tutti gli attributi della relazione Movimenti, aggiungendo l'attributo virtuale ValoreUnitario, ottenuto dividendo il valore complessivo per la quantità movimentata.
Una volta completato e salvato il file vista-movimenti-extra.sql
, se ne deve controllare il funzionamento con la base di dati:
$
sqlite3 mag.db < vista-movimenti-extra.sql
[Invio]
Se non vengono generati dei messaggi, l'operazione dovrebbe essere stata completata con successo, altrimenti, se la vista è stata creata, ma in modo errato, è necessario eliminarla, quindi si può correggere il file vista-movimenti-extra.sql
e riprovare. Per eliminare la vista creata in modo errato, si può utilizzare il programma sqlite3 in modo interattivo, come già mostrato in altri capitoli (istruzione DROP VIEW).
Quando si ritiene di avere creato la vista in modo corretto, è bene verificare di avere ottenuto il risultato desiderato:
$
sqlite3 mag.db
[Invio]
SQLite version ... Enter ".help" for instructions |
sqlite>
.headers on
[Invio]
sqlite>
.mode columns
[Invio]
sqlite>
SELECT * FROM MovimentiExtra
[Invio]
Movimento Articolo Causale Data Cliente Fornitore Quantita Valore ValoreUnitario --------- -------- ------- ---------- ------- --------- -------- ------ -------------- 1 2 1 2006-01-15 3 10000 100 0.01 2 2 2 2006-01-16 2 1000 10 0.01 3 102 1 2006-01-17 2 1000 200 0.2 4 102 2 2006-01-18 1 100 20 0.2 5 401 1 2006-01-19 1 1000 200 0.2 6 401 2 2006-01-20 3 200 20 0.2 7 401 4 2006-01-20 1 100 20 0.2 8 102 4 2006-01-20 2 100 20 0.2 9 601 1 2006-01-21 3 2000 1000 0.5 10 601 2 2006-01-25 1 1000 500 0.5 |
sqlite>
.quit
[Invio]
In questa verifica si deve riprendere il file vista-movimenti-extra.sql
, per modificarlo, in modo da aggiungere un attributo virtuale ulteriore, contenente la quantità in forma algebrica: valori positivi per i carichi e valori negativi per gli scarichi. Dal momento che l'informazione se trattasi di carico o scarico è contenuta nella relazione Causali, anche questa va utilizzata nella costruzione della vista.
Si modifichi il file vista-movimenti-extra.sql
, seguendo lo scheletro che viene proposto, per far sì che la vista MovimentiExtra contenga gli attributi seguenti:
Movimento, corrispondente al numero di sequenza assegnato a ogni movimento nella relazione Movimenti;
Articolo, corrispondente al codice articolo della relazione Movimenti;
Causale, corrispondente al codice causale della relazione Movimenti;
Data, corrispondente alla data del movimento nella relazione Movimenti;
Cliente, corrispondente al codice cliente della relazione Movimenti;
Fornitore, corrispondente al codice fornitore della relazione Movimenti;
Quantità, corrispondente alla quantità movimentata nella relazione Movimenti;
Valore, corrispondente al valore del movimento, nella relazione Movimenti;
ValoreUnitario, corrispondente al valore unitario del movimento, ottenuto dividendo il valore complessivo per la quantità (dalla relazione Movimenti);
QuantitaAlgebrica, corrispondente alla quantità movimentata, con segno, ottenuta moltiplicando l'attributo Variazione della relazione Causali all'attributo Quantita della relazione Movimenti.
|
Prima di poter eseguire questo file con la base di dati, occorre eliminare la vista MovimentiExtra, che già dovrebbe esistere. Si ricorda che per eliminare una vista si utilizza l'istruzione DROP VIEW e che conviene intervenire con il programma sqlite3 in modo interattivo.
Per eseguire il file vista-movimenti-extra.sql
, si agisce come sempre:
$
sqlite3 mag.db < vista-movimenti-extra.sql
[Invio]
Se la creazione della vista produce degli errori, occorre eliminare nuovamente la vista e, dopo la correzione del file vista-movimenti-extra.sql
, si può ritentare.
Quando si è consapevoli di avere creato correttamente la vista MovimentiExtra, la si può interrogare come se fosse una relazione normale:
$
sqlite3 mag.db
[Invio]
SQLite version ... Enter ".help" for instructions |
sqlite>
.headers on
[Invio]
sqlite>
.mode column
[Invio]
sqlite>
SELECT * FROM MovimentiExtra;
[Invio]
Si dovrebbe ottenere il listato seguente:
Movimento Articolo Causale Data Cliente Fornitore Quantita Valore ValoreUnitario QuantitaAlgebrica --------- -------- ------- ---------- ------- --------- -------- ------ -------------- ----------------- 1 2 1 2006-01-15 3 10000 100 0.01 10000 2 2 2 2006-01-16 2 1000 10 0.01 -1000 3 102 1 2006-01-17 2 1000 200 0.2 1000 4 102 2 2006-01-18 1 100 20 0.2 -100 5 401 1 2006-01-19 1 1000 200 0.2 1000 6 401 2 2006-01-20 3 200 20 0.2 -200 7 401 4 2006-01-20 1 100 20 0.2 -100 8 102 4 2006-01-20 2 100 20 0.2 -100 9 601 1 2006-01-21 3 2000 1000 0.5 2000 10 601 2 2006-01-25 1 1000 500 0.5 -1000 |
Se tutto funziona regolarmente, si consegni per la valutazione la stampa del file vista-movimenti-extra.sql
.
Prima di passare al capitolo successivo, si deve riprendere il file magazzino.sql
e vi si deve aggiungere l'istruzione per la creazione della vista MovimentiExtra, come realizzato nella verifica appena conclusa.
Una volta aggiornato il file magazzino.sql
come descritto, si deve cancellare il file mag.db
e ricreare a partire dalle istruzioni contenute nel file magazzino.sql
:
$
sqlite3 mag.db < magazzino.sql
[Invio]
Se vengono segnalati degli errori, occorre correggere il file magazzino.sql
, cancellare nuovamente il file mag.db
, quindi si deve ripetere l'operazione. La base di dati contenuta nel file mag.db
, viene usata nel capitolo successivo e non si può proseguire se non si riesce a ricrearla correttamente.
Appunti di informatica libera 2006.07.01 --- Copyright © 2000-2006 Daniele Giacomini -- <daniele (ad) swlibero·org>
Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome selezione_di_attributi_virtuali_ottenuti_da_un_x0027_espress.htm
[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico]