[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 736.   nanoMAG: preparazione

nanoMAG è una procedura didattica per la gestione di un magazzino. Si compone di uno script SQL, fatto precisamente per SQLite, e di uno script per una shell POSIX. Attraverso l'ausilio di SQLite viene gestita una contabilità di magazzino in una base di dati contenuta tutta in un file.

Lo script di shell ha il nome nmag (ma potrebbe essere nominato come si vuole); lo script SQL ha lo stesso nome, con l'aggiunta dell'estensione .sql (se si cambia nome allo script di shell, di conseguenza cambia anche quello che contiene il codice SQL).

Si osservi che i due script devono risiedere nella stessa directory.

Lo script contenente codice SQL serve a creare le relazioni, le viste e i grilletti necessari, mentre la popolazione delle relazioni viene lasciata alla manualità degli studenti.

La parte c contiene un'esercitazione che costruisce una gestione di magazzino, simile a quella di nanoMAG; tuttavia, c'è una diversità che dovrebbe essere sufficiente a rendere difficile la copia agli studenti che, in quella situazione, non vogliono fare fatica nel risolvere le verifiche.

736.1   Utilizzo

nanoMAG è gestito tramite lo script nmag:

nmag file_db

Come si vede, la sintassi per l'avvio di nmag è semplicissima: si deve indicare il nome di un file da usare come contenitore della base di dati per la gestione del magazzino. Se il file non c'è, viene creato al volo, utilizzando le istruzioni contenute nel file nmag.sql, che deve risiedere nella stessa directory in cui si trova già nmag. L'esempio seguente avvia nmag per accedere alla base di dati contenuta nel file prova.db:

nmag prova.db[Invio]

Si ottiene un menù di funzioni:

.--------------------------------nanoMAG-----------------------------------.
| nanoMAG menu                                                             |
| .----------------------------------------------------------------------. |
| |   inserimento comandi      Accesso alla riga di comando              | |
| |   listato articoli         Stampa degli articoli di magazzino        | |
| |   listato causali          Stampa delle causali di magazzino         | |
| |   listato clienti          Stampa dei clienti                        | |
| |   listato fornitori        Stampa dei fornitori                      | |
| |   listato movimenti        Stampa dei movimenti                      | |
| |   listato mov dettagliato  Stampa dettagliata movimenti              | |
| |   listato situazione       Stampa della situazione del magazzino     | |
| |   applica costo medio      Costo medio agli scarichi indeterminati   | |
| |   fine lavoro              Conclusione                               | |
| `----------------------------------------------------------------------' |
|--------------------------------------------------------------------------|
|                     <  OK   >            <Cancel>                        |
`--------------------------------------------------------------------------'

La prima voce, {inserimento comandi}, consente di accedere all'utilizzo di sqlite3, in modo interattivo; le voci successive, consentono di visualizzare e stampare il contenuto di una relazione o di una vista particolare; la voce {applica costo medio} serva a modificare i movimenti privi di valore, applicando il costo medio.

736.2   Script

Per disporre di nanoMAG, occorre riprodurre i file nmag e nmag.sql, ricordando di rendere eseguibile il primo e di metterli assieme nella stessa directory, tenendo conto che, probabilmente, si vuole che nmag si trovi in una directory prevista tra i percorsi degli eseguibili.

Figura 736.2. Lo script nmag che dovrebbe essere ottenibile da <allegati/a2/nmag>.

#!/bin/sh
##
## nmag DB_FILE
##
#
# Temporary file.
#
TEMPORARY=`tempfile`
touch $TEMPORARY
#
# Command line arguments.
#
PROGRAM_NAME="$0"
DB_FILE="$1"
PROGRAM_DIR=`dirname $PROGRAM_NAME`
PROGRAM_EXE=`basename $PROGRAM_NAME`
#
# End of work.
#
end_of_work () {
    #
    rm -f $TEMPORARY
    #
    exit
}
#
# Help.
#
help_message () {
    #
    echo "  nmag DB_FILE"
    #
    # See what was typed.
    #
    echo ""
    echo "You wrote:"
    echo "$PROGRAM_NAME $DB_FILE"
}
#
# Main menu.
#
main_menu () {
    #
    # Menu selection.
    #
    local SELECTION=""
    #
    #
    #
    while dialog   \
        --clear \
        --title "nanoMAG" \
        --menu "nanoMAG menu\n" \
        0 0 0 \
        "inserimento comandi"     "Accesso alla riga di comando"  \
        "listato articoli"        "Stampa degli articoli di magazzino"  \
        "listato causali"         "Stampa delle causali di magazzino"  \
        "listato clienti"         "Stampa dei clienti"  \
        "listato fornitori"       "Stampa dei fornitori"  \
        "listato movimenti"       "Stampa dei movimenti"  \
        "listato mov dettagliato" "Stampa dettagliata movimenti"  \
        "listato situazione"      "Stampa della situazione del magazzino"  \
        "applica costo medio"     "Costo medio agli scarichi indeterminati" \
        "fine lavoro"             "Conclusione"         \
        2> $TEMPORARY
    do
        SELECTION=`cat $TEMPORARY`
        echo "" > "$TEMPORARY"
        #
        # Do the selected work.
        #
        do_as_selected "$SELECTION"
    done
}
#
# Do the selected work.
#
do_as_selected () {
    #
    SELECTION="$1"
    #
    if   [ "$SELECTION" = "fine lavoro" ]
    then
        end_of_work
    elif [ "$SELECTION" = "inserimento comandi" ]
    then
        sqlite3 -nullvalue "NULL" -header -column "$DB_FILE"
    elif [ "$SELECTION" = "listato articoli" ]
    then
        select_to_print "$DB_FILE" "Listato_articoli" 100
    elif [ "$SELECTION" = "listato causali" ]
    then
        select_to_print "$DB_FILE" "Listato_causali" 100
    elif [ "$SELECTION" = "listato clienti" ]
    then
        select_to_print "$DB_FILE" "Listato_clienti" 200
    elif [ "$SELECTION" = "listato fornitori" ]
    then
        select_to_print "$DB_FILE" "Listato_fornitori" 200
    elif [ "$SELECTION" = "listato movimenti" ]
    then
        select_to_print "$DB_FILE" "Listato_movimenti" 100
    elif [ "$SELECTION" = "listato mov dettagliato" ]
    then
        select_to_print "$DB_FILE" "Listato_movimenti_dettagliato" 180
    elif [ "$SELECTION" = "listato situazione" ]
    then
        select_to_print "$DB_FILE" "Listato_situazione" 80
    elif [ "$SELECTION" = "applica costo medio" ]
    then
        #
        ARTICOLO=0
        COSTO_MEDIO=0
        #
        for ARTICOLO in `echo "SELECT articolo FROM Articoli;" | sqlite3 "$DB_FILE"`
        do
            COSTO_MEDIO=`echo "SELECT costo_medio FROM Situazione_magazzino WHERE articolo = $ARTICOLO;" | sqlite3 "$DB_FILE"`
            if [ ! "$COSTO_MEDIO" = "" ]
            then
                echo "[$0] articolo $ARTICOLO; costo medio $COSTO_MEDIO"
                (echo "UPDATE Movimenti"
                 echo "       SET valore = ($COSTO_MEDIO * quantita)"
                 echo "       WHERE articolo = $ARTICOLO AND valore IS NULL;") \
                 |  sqlite3 "$DB_FILE"
                sleep 1
            fi
        done
        sleep 1
    fi
}
#
# Select to print.
#
select_to_print () {
    #
    local DB_FILE="$1"
    local VIEW="$2"
    local WIDTH="$3"
    local DATE=`date`
    local FONT_W=0
    local FONT_H=0
    #
    echo "SELECT * FROM $VIEW;" \
         | sqlite3 -nullvalue "NULL" -header -column "$DB_FILE" \
         > "$TEMPORARY.print"
    #
    dialog --title "$VIEW" --textbox "$TEMPORARY.print" 0 0
    #
    #
    if dialog                               \
        --clear                             \
        --title "$VIEW"  \
        --yesno "Stampo?\n" \
        0 0                                 \
        2> $TEMPORARY
    then
        echo "" > "$TEMPORARY"
        #
        # Font calculation.
        #
        FONT_W=`echo "1140 / $WIDTH"  | bc -l`
        FONT_H=`echo "$FONT_W * 1.5" | bc -l`
        #
        (echo "Stampato da $USER il giorno $DATE";
         cat "$TEMPORARY.print") \
            | /usr/bin/enscript -1 \
                                -M a4 \
                                -r \
                                -f Courier@$FONT_W/$FONT_H -B \
                                --margin=72:72:72:72 \
                                -o - | lpr
    fi
    #
    # Remove extra temporary file.
    #
    rm -f "$TEMPORARY.print"
    #
}
##
##
## Start of program.
##
##
#
# Check arguments.
#
if   [ $# = 1 ] && [ -f "$DB_FILE" ]
then
    #
    # Ok.
    #
    main_menu
    #
elif [ $# = 1 ]
then
    #
    # Try to create the database.
    #
    sqlite3 "$DB_FILE" < $PROGRAM_DIR/$PROGRAM_EXE.sql
    if   [ -f "$DB_FILE" ]
    then
        main_menu
    fi
else
    #
    #
    #
    help_message
fi
#
#
#
end_of_work
#

Figura 736.3. Lo script SQL nmag.sql che dovrebbe essere ottenibile da <allegati/a2/nmag.sql>.

-- =====================================================================
--
-- nanoMAG
--
-- Gestione di un magazzino didattico.
--
-- =====================================================================
--
-- Creazione della relazione "Articoli", contenente l'anagrafica
-- degli articoli di magazzino.
--
CREATE TABLE Articoli (articolo    INTEGER        NOT NULL,
                       descrizione CHAR(30)       NOT NULL,
                       um          CHAR(2)        DEFAULT 'pz',
                       listino     NUMERIC(8,2)   DEFAULT 0,
                       scorta_min  NUMERIC(12,3)  DEFAULT 0,
                       PRIMARY KEY (articolo));
--
-- Creazione della relazione "Causali", contenente l'elenco delle
-- causali di magazzino, ovvero le descrizioni dei movimenti,
-- con la specificazione se trattasi di carico o di scarico.
--
CREATE TABLE Causali (causale     INTEGER        NOT NULL,
                      descrizione CHAR(20)       NOT NULL,
                      var         NUMERIC(1)     DEFAULT 0,
                      PRIMARY KEY (causale));
--
-- Creazione della relazione "Fornitori", contenente l'anagrafica
-- dei fornitori.
--
CREATE TABLE Fornitori (fornitore       INTEGER   NOT NULL,
                        ragione_sociale CHAR(30)  NOT NULL,
                        indirizzo       CHAR(30)  NOT NULL,
                        cap             CHAR(9),
                        citta           CHAR(30)  NOT NULL,
                        pr              CHAR(2)   DEFAULT '',
                        telefono        CHAR(20)  DEFAULT '',
                        fax             CHAR(20)  DEFAULT '',
                        cf_pi           CHAR(30)  DEFAULT '',
                        PRIMARY KEY (fornitore));
--
-- Creazione della relazione "Clienti", contenente l'anagrafica
-- dei clienti.
--
CREATE TABLE Clienti (cliente         INTEGER    NOT NULL,
                      ragione_sociale CHAR(30)   NOT NULL,
                      indirizzo       CHAR(30)   NOT NULL,
                      cap             CHAR(9),
                      citta           CHAR(30)   NOT NULL,
                      pr              CHAR(2)    DEFAULT '',
                      telefono        CHAR(20)   DEFAULT '',
                      fax             CHAR(20)   DEFAULT '',
                      cf_pi           CHAR(30)   DEFAULT '',
                      PRIMARY KEY (cliente));
--
-- Creazione della relazione "Movimenti", contenente i carichi
-- e gli scarichi del magazzino.
--
CREATE TABLE Movimenti (movimento    INTEGER        NOT NULL,
                        articolo     INTEGER        NOT NULL,
                        causale      INTEGER        NOT NULL,
                        data         DATE           NOT NULL,
                        cliente      INTEGER,
                        fornitore    INTEGER,
                        quantita     NUMERIC(12,3),
                        valore       NUMERIC(11,2),
                        PRIMARY KEY (movimento));
--
-- Creazione della vista "Movimenti_extra"
--
CREATE VIEW Movimenti_extra AS
    SELECT Movimenti.movimento                       AS movimento,
           (Movimenti.valore / Movimenti.quantita)   AS valore_un,
           (Movimenti.quantita * Causali.var)        AS quantita
           FROM Movimenti, Causali
           WHERE Movimenti.causale = Causali.causale;
--
-- Creazione della vista "Situazione_magazzino"
--
CREATE VIEW Situazione_magazzino AS
    SELECT Movimenti.articolo                    AS articolo,
           SUM(Movimenti_extra.quantita)         AS esistenza,
           SUM(Movimenti_extra.quantita * Movimenti_extra.valore_un)
                                                 AS valore,
           (SUM(Movimenti_extra.quantita * Movimenti_extra.valore_un)
            / SUM(Movimenti_extra.quantita))
                                                 AS costo_medio
           FROM Movimenti, Movimenti_extra, Articoli
           WHERE Movimenti.movimento = Movimenti_extra.movimento
             AND Movimenti.articolo  = Articoli.articolo
             AND Movimenti.valore IS NOT NULL
           GROUP BY Movimenti.articolo;
--
-- Creazione del grilletto relativo alla relazione "Articoli",
-- in fase di inserimento.
--
CREATE TRIGGER Articoli_ins
       BEFORE INSERT ON Articoli
       FOR EACH ROW
       BEGIN
            SELECT CASE
            WHEN (NEW.articolo <= 0)
            THEN
                RAISE (ABORT, 'ERR: articolo <= 0!')
            WHEN (NEW.listino <= 0)
            THEN
                RAISE (ABORT, 'ERR: listino <= 0!')
            WHEN (NEW.scorta_min < 0)
            THEN
                RAISE (ABORT, 'ERR: scorta_min < 0!')
            END;
       END;
--
-- Creazione del grilletto relativo alla relazione "Articoli",
-- in fase di aggiornamento.
--
CREATE TRIGGER Articoli_upd
       BEFORE UPDATE ON Articoli
       FOR EACH ROW
       BEGIN
            SELECT CASE
            WHEN (NEW.articolo <= 0)
            THEN
                RAISE (ABORT, 'ERR: articolo <= 0!')
            WHEN (NEW.listino <= 0)
            THEN
                RAISE (ABORT, 'ERR: listino <= 0!')
            WHEN (NEW.ScortaMin < 0)
            THEN
                RAISE (ABORT, 'ERR: scorta_min < 0!')
            END;
       END;
--
-- Creazione del grilletto relativo alla relazione "Articoli",
-- in fase di cancellazione.
--
CREATE TRIGGER Articoli_del
       BEFORE DELETE ON Articoli
       FOR EACH ROW
       BEGIN
            SELECT CASE
            WHEN ((SELECT articolo FROM Movimenti
                   WHERE articolo = OLD.articolo) IS NOT NULL)
            THEN
                RAISE (ABORT, 'ERR: articolo ancora usato in Movimenti!')
            END;
       END;
--
-- Creazione del grilletto relativo alla relazione "Causali",
-- in fase di inserimento.
--
CREATE TRIGGER Causali_ins
       BEFORE INSERT ON Causali
       FOR EACH ROW
       BEGIN
            SELECT CASE
            WHEN (NEW.causale <= 0)
            THEN
                RAISE (ABORT, 'ERR: causale <= 0!')
            WHEN (NEW.var > 1)
            THEN
                RAISE (ABORT, 'ERR: attributo ''var'' non valido!')
            WHEN (NEW.var < -1)
            THEN
                RAISE (ABORT, 'ERR: attributo ''var'' non valido!')
            WHEN (NEW.var = 0)
            THEN
                RAISE (ABORT, 'ERR: attributo ''var'' non valido!')
            END;
       END;
--
-- Creazione del grilletto relativo alla relazione "Causali",
-- in fase di aggiornamento.
--
CREATE TRIGGER Causali_upd
       BEFORE UPDATE ON Causali
       FOR EACH ROW
       BEGIN
            SELECT CASE
            WHEN (NEW.causale <= 0)
            THEN
                RAISE (ABORT, 'ERR: causale <= 0!')
            WHEN (NEW.var > 1)
            THEN
                RAISE (ABORT, 'ERR: attributo ''var'' non valido!')
            WHEN (NEW.var < -1)
            THEN
                RAISE (ABORT, 'ERR: attributo ''var'' non valido!')
            WHEN (NEW.var = 0)
            THEN
                RAISE (ABORT, 'ERR: attributo ''var'' non valido!')
            END;
       END;
--
-- Creazione del grilletto relativo alla relazione "Causali",
-- in fase di cancellazione.
--
CREATE TRIGGER Causali_del
       BEFORE DELETE ON Causali
       FOR EACH ROW
       BEGIN
            SELECT CASE
            WHEN ((SELECT causale FROM Movimenti
                   WHERE causale = OLD.causale) IS NOT NULL)
            THEN
                RAISE (ABORT, 'ERR: causale ancora usata in Movimenti!')
            END;
       END;
--
-- Creazione del grilletto relativo alla relazione "Fornitori",
-- in fase di inserimento.
--
CREATE TRIGGER Fornitori_ins
       BEFORE INSERT ON Fornitori
       FOR EACH ROW
       BEGIN
            SELECT CASE
            WHEN (NEW.fornitore <= 0)
            THEN
                RAISE (ABORT, 'ERR: fornitore <= 0!')
            END;
       END;
--
-- Creazione del grilletto relativo alla relazione "Fornitori",
-- in fase di aggiornamento.
--
CREATE TRIGGER Fornitori_upd
       BEFORE UPDATE ON Fornitori
       FOR EACH ROW
       BEGIN
            SELECT CASE
            WHEN (NEW.fornitore <= 0)
            THEN
                RAISE (ABORT, 'ERR: fornitore <= 0!')
            END;
       END;
--
-- Creazione del grilletto relativo alla relazione "Fornitori",
-- in fase di cancellazione.
--
CREATE TRIGGER Fornitori_del
       BEFORE DELETE ON Fornitori
       FOR EACH ROW
       BEGIN
            SELECT CASE
            WHEN ((SELECT fornitore FROM Movimenti
                   WHERE fornitore = OLD.fornitore) IS NOT NULL)
            THEN
                RAISE (ABORT, 'ERR: fornitore ancora usato in Movimenti!')
            END;
       END;
--
-- Creazione del grilletto relativo alla relazione "Clienti",
-- in fase di inserimento.
--
CREATE TRIGGER Clienti_ins
       BEFORE INSERT ON Clienti
       FOR EACH ROW
       BEGIN
            SELECT CASE
            WHEN (NEW.cliente <= 0)
            THEN
                RAISE (ABORT, 'ERR: cliente <= 0!')
            END;
       END;
--
-- Creazione del grilletto relativo alla relazione "Clienti",
-- in fase di aggiornamento.
--
CREATE TRIGGER Clienti_upd
       BEFORE UPDATE ON Clienti
       FOR EACH ROW
       BEGIN
            SELECT CASE
            WHEN (NEW.cliente <= 0)
            THEN
                RAISE (ABORT, 'ERR: cliente <= 0!')
            END;
       END;
--
-- Creazione del grilletto relativo alla relazione "Clienti",
-- in fase di cancellazione.
--
CREATE TRIGGER Clienti_del
       BEFORE DELETE ON Clienti
       FOR EACH ROW
       BEGIN
            SELECT CASE
            WHEN ((SELECT cliente FROM Movimenti
                   WHERE cliente = OLD.cliente) IS NOT NULL)
            THEN
                RAISE (ABORT, 'ERR: cliente ancora usato in Movimenti!')
            END;
       END;
--
-- Creazione del grilletto relativo alla relazione "Movimenti",
-- in fase di inserimento.
--
CREATE TRIGGER Movimenti_ins
       BEFORE INSERT ON Movimenti
       FOR EACH ROW
       BEGIN
            SELECT CASE
            WHEN (NEW.movimento <= 0)
            THEN
                RAISE (ABORT, 'ERR: movimento <= 0!')
            WHEN (NEW.quantita <= 0)
            THEN
                RAISE (ABORT, 'ERR: quantità <= 0!')
            WHEN (NEW.valore < 0)
            THEN
                RAISE (ABORT, 'ERR: valore < 0!')
            WHEN ((SELECT articolo FROM Articoli
                   WHERE articolo = NEW.articolo) IS NULL)
            THEN
                RAISE (ABORT, 'ERR: articolo inesistente!')
            WHEN ((NEW.cliente IS NOT NULL)
                  AND ((SELECT cliente FROM Clienti
                        WHERE cliente = NEW.cliente) IS NULL))
            THEN
                RAISE (ABORT, 'ERR: cliente inesistente!')
            WHEN ((SELECT causale FROM Causali
                   WHERE causale = NEW.causale) IS NULL)
            THEN
                RAISE (ABORT, 'ERR: causale inesistente!')
            WHEN ((NEW.fornitore IS NOT NULL)
                  AND ((SELECT fornitore FROM Fornitori
                        WHERE fornitore = NEW.fornitore) IS NULL))
            THEN
                RAISE (ABORT, 'ERR: fornitore inesistente!')
            END;
       END;
--
-- Creazione del grilletto relativo alla relazione "Movimenti",
-- in fase di inserimento, per il calcolo automatico del costo medio.
-- Attualmente il grilletto non è operativo.
--
--CREATE TRIGGER Movimenti_costo_medio
--       BEFORE INSERT ON Movimenti
--       BEGIN
--            UPDATE Movimenti
--                   SET valore =
--                       (SELECT costo_medio * NEW.quantita
--                      FROM Situazione_magazzino
--                        WHERE articolo = NEW.articolo)
--                   WHERE valore IS NULL;
--       END;
--
-- Creazione del grilletto relativo alla relazione "Movimenti",
-- in fase di aggiornamento.
--
CREATE TRIGGER Movimenti_upd
       BEFORE UPDATE ON Movimenti
       FOR EACH ROW
       BEGIN
            SELECT CASE
            WHEN (NEW.movimento <= 0)
            THEN
                RAISE (ABORT, 'ERR: movimento <= 0!')
            WHEN (NEW.quantita <= 0)
            THEN
                RAISE (ABORT, 'ERR: quantità <= 0!')
            WHEN (NEW.valore < 0)
            THEN
                RAISE (ABORT, 'ERR: valore < 0!')
            WHEN (NEW.valore IS NULL)
            THEN
                RAISE (ABORT,
                       'ERR: valore indeterminato in fase di variazione!')
            WHEN ((SELECT articolo FROM Articoli
                   WHERE articolo = NEW.articolo) IS NULL)
            THEN
                RAISE (ABORT, 'ERR: articolo inesistente!')
            WHEN ((NEW.cliente IS NOT NULL)
                  AND ((SELECT cliente FROM Clienti
                        WHERE cliente = NEW.cliente) IS NULL))
            THEN
                RAISE (ABORT, 'ERR: cliente inesistente!')
            WHEN ((SELECT causale FROM Causali
                   WHERE causale = NEW.causale) IS NULL)
            THEN
                RAISE (ABORT, 'ERR: causale inesistente!')
            WHEN ((NEW.fornitore IS NOT NULL)
                  AND ((SELECT fornitore FROM Fornitori
                        WHERE fornitore = NEW.fornitore) IS NULL))
            THEN
                RAISE (ABORT, 'ERR: fornitore inesistente!')
            END;
       END;
--
-- Creazione della vista "Listato_articoli"
--
CREATE VIEW Listato_articoli AS
    SELECT articolo    AS Articolo,
           descrizione AS 'Descrizione                   ',
           um          AS UM,
           listino     AS Listino,
           scorta_min  AS Scorta_min
           FROM Articoli
           ORDER BY articolo;
--
-- Creazione della vista "Listato_causali"
--
CREATE VIEW Listato_causali AS
    SELECT causale     AS Causale,
           descrizione AS 'Descrizione         ',
           var         AS Var
           FROM Causali
           ORDER BY causale;
--
-- Creazione della vista "Listato_fornitori".
--
CREATE VIEW Listato_fornitori AS
    SELECT fornitore       AS Fornitore,
           ragione_sociale AS 'Ragione_sociale               ',
           indirizzo       AS 'Indirizzo                     ',
           cap             AS CAP,
           citta           AS 'Citta                         ',
           pr              AS PR,
           telefono        AS 'Telefono            ',
           fax             AS 'Fax                 ',
           cf_pi           AS 'CF_PI               '
           FROM Fornitori
           ORDER BY fornitore;
--
-- Creazione della vista "Listato_clienti".
--
CREATE VIEW Listato_clienti AS
    SELECT cliente         AS Cliente,
           ragione_sociale AS 'Ragione_sociale               ',
           indirizzo       AS 'Indirizzo                     ',
           cap             AS CAP,
           citta           AS 'Citta                         ',
           pr              AS PR,
           telefono        AS 'Telefono            ',
           fax             AS 'Fax                 ',
           cf_pi           AS 'CF_PI               '
           FROM Clienti
           ORDER BY cliente;
--
-- Creazione della vista "Listato_movimenti".
--
CREATE VIEW Listato_movimenti AS
    SELECT movimento       AS Movimento,
           articolo        AS Articolo,
           causale         AS Causale,
           data            AS Data,
           cliente         AS Cliente,
           fornitore       AS Fornitore,
           quantita        AS Quantita,
           valore          AS Valore   
           FROM Movimenti
           ORDER BY movimento;
--
-- Creazione della vista "Listato_movimenti_dettagliato".
--
CREATE VIEW Listato_movimenti_dettagliato AS
    SELECT Movimenti.movimento       AS Movimento,
           Movimenti.articolo        AS C_articolo,
           Articoli.descrizione      AS 'Articolo            ',
           Movimenti.causale         AS C_causale,
           Causali.descrizione       AS 'Causale             ',
           Movimenti.data            AS Data,
           Movimenti.cliente         AS Cliente,
           Movimenti.fornitore       AS Fornitore,
           Movimenti_extra.quantita  AS Quantita,
           Movimenti.valore          AS Valore,
           Movimenti_extra.valore_un AS Valore_un
           FROM Articoli,
                Causali,
                Movimenti,
                Movimenti_extra
           WHERE Movimenti.articolo  = Articoli.articolo
             AND Movimenti.causale   = Causali.causale
             AND Movimenti.movimento = Movimenti_extra.movimento
           ORDER BY Movimenti.movimento;
--
-- Creazione della vista "Listato_situazione".
--
CREATE VIEW Listato_situazione AS
    SELECT Situazione_magazzino.articolo    AS Articolo,
           Articoli.descrizione             AS 'Descrizione         ',
           Articoli.um                      AS UM,
           Situazione_magazzino.esistenza   AS Esistenza,
           Situazione_magazzino.costo_medio AS Costo_medio
           FROM Situazione_magazzino, Articoli
           WHERE Situazione_magazzino.articolo = Articoli.articolo
           ORDER BY Situazione_magazzino.articolo;
--
--
--

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome nanomag_preparazione.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!