Riferimenti semi-bibliografici:



Похожие документы
Creazione manuale delle tabelle (mediante scrittura del codice SQL corrispondente)

Basi di dati. Il Linguaggio SQL. K. Donno - Il Linguaggio SQL

SQL SQL. Definizione dei dati. Domini. Esistono 6 domini elementari:

Insegnamento di Informatica CdS Scienze Giuridiche A.A. 2006/7. Il trattamento dei dati

Appunti di MySql. Evoluzione di un tutorial di base di mysql, scritto da Etel Sverdlov.

I comandi del linguaggio DDL (Data Definition Language): CREATE E ALTER

Introduzione a MySQL

Concetti fondamentali dei database database Cos'è un database Principali database

Corso sul linguaggio SQL

Access. P a r t e p r i m a

Laboratorio di Basi di Dati e Web

Corso sul linguaggio SQL

Organizzazione degli archivi

Data Base. Master "Bio Info" Reti e Basi di Dati Lezione 6

Preparazione. Introduzione a MySQL: costruzione di una base di dati e gestione degli accessi. Accesso all area condivisa. Avvio Server MySQL

Corso Sistemi Informativi Avanzati. Programma 30 set Installazione Macchina Virtuale. Introduzione alla BI nelle Aziende.

Le query. Lezione 6 a cura di Maria Novella Mosciatti

Il linguaggio SQL. è di fatto lo standard tra i linguaggi per la gestione di data base relazionali.

EXCEL PER WINDOWS95. sfruttare le potenzialità di calcolo dei personal computer. Essi si basano su un area di lavoro, detta foglio di lavoro,

Database 1 biblioteca universitaria. Testo del quesito

Definizione di domini

DBMS (Data Base Management System)

Il sofware è inoltre completato da una funzione di calendario che consente di impostare in modo semplice ed intuitivo i vari appuntamenti.

Lezioni di Laboratorio sui Data Base

. A primi passi con microsoft a.ccepss SommarIo: i S 1. aprire e chiudere microsoft access Start (o avvio) l i b tutti i pro- grammi

Basi di Dati: Corso di laboratorio

ECDL - Database. European Computer Driving Licence - Modulo 5 - Database LEZIONE 2

User Tools: DataBase Manager

Università degli Studi di Verona. Laboratorio di Basi di Dati

Esercizio data base "Biblioteca"

Esercitazione query in SQL L esercitazione viene effettuata sul database viaggi e vacanze che prevede il seguente modello E/R:

Abilità Informatiche A.A. 2010/2011 Lezione 9: Query Maschere Report. Facoltà di Lingue e Letterature Straniere

Giovanna Rosone 04/03/ /03/2010 SQL, Istruzioni per la modifica dello schema

Corso di Access. Prerequisiti. Modulo L2A (Access) 1.1 Concetti di base. Utilizzo elementare del computer Concetti fondamentali di basi di dati

Lezione V. Aula Multimediale - sabato 29/03/2008

Volumi di riferimento

Basi di Da( MySQL & MySQL Workbench. Anna Monreale

2.0 Gli archivi. 2.1 Inserire gli archivi. 2.2 Archivio Clienti, Fornitori, Materiali, Noleggi ed Altri Costi. Impresa Edile Guida all uso

Registratori di Cassa

Unità 2.1 Comandi sui database

Dispensa di database Access

Telerilevamento e GIS Prof. Ing. Giuseppe Mussumeci

Esercitazione 1. Sistemi Informativi T. Versione elettronica: L01.2.DDLDMLbase.pdf

SQL: concetti base SQL. Definizione dei dati in SQL. SQL: "storia"

5.3 TABELLE RECORD Inserire, eliminare record in una tabella Aggiungere record Eliminare record

MySQL Database Management System

I database relazionali sono il tipo di database attualmente piu diffuso. I motivi di questo successo sono fondamentalmente due:

Sviluppata da: Lo Russo - Porcelli Pag. 1 di 6 6FRSR utilizzare il DBMS Postgresql per imparare il linguaggio SQL.

ARCHIVI E DATABASE (prof. Ivaldi Giuliano)

Excel. A cura di Luigi Labonia. luigi.lab@libero.it

GESGOLF SMS ONLINE. Manuale per l utente

DATABASE RELAZIONALI

Informatica per le discipline umanistiche 2 lezione 10

Punto Print Il programma per stampare. Documentazione Tecnica

Progettazione di un Database

Esercitazione 01: DDL e DML di base

CREAZIONE DI UN DATABASE E DI TABELLE IN ACCESS

DDL, VINCOLI D INTEGRITÁ, AGGIORNAMENTI E VISTE. SQL è più di un semplice linguaggio di interrogazione

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti

Sistemi di Elaborazione delle Informazioni (C.I. 15) Access

Capitolo 13. Interrogare una base di dati

Per chi ha la Virtual Machine: avviare Grass da terminale, andando su Applicazioni Accessori Terminale e scrivere grass

I Codici Documento consentono di classificare le informazioni e di organizzare in modo logico l archiviazione dei file.

Archivi e Basi di Dati

INDICI. Prevediamo di effettuare spesso interrogazioni simili alle seguenti:

Istituto Centrale per il Catalogo Unico delle Biblioteche Italiane. e per le Informazioni bibliografiche. Manuali utente per SBN WEB. Versione 1.

Database. Si ringrazia Marco Bertini per le slides

Laboratorio di Basi di Dati

LA GESTIONE DELLE VISITE CLIENTI VIA WEB

Airone Gestione Rifiuti Funzioni di Esportazione e Importazione

Regione Toscana. ARPA Fonte Dati. Manuale Amministratore. L. Folchi (TAI) Redatto da

Uso delle basi di dati DBMS. Cos è un database. DataBase. Esempi di database

Corso di Informatica (Basi di Dati)

I file di dati. Unità didattica D1 1

INFORMATICA PER L IMPRESA (Docente Prof. Alfredo Garro)

19. LA PROGRAMMAZIONE LATO SERVER

Amministrazione Trasparente

Access. Microsoft Access. Aprire Access. Aprire Access. Aprire un database. Creare un nuovo database

Progettazione di una base di dati Ufficio della Motorizzazione

CORSO ACCESS PARTE II. Esistono diversi tipi di aiuto forniti con Access, generalmente accessibili tramite la barra dei menu (?)

Database 3 affitto veicoli. Testo del quesito

Il linguaggio SQL: DDL di base

Gestione delle tabelle

Come modificare la propria Home Page e gli elementi correlati

IL LINGUAGGIO SQL IDENTIFICATORI E TIPI DI DATI COMANDI E ISTRUZIONI

PROGRAMMA GESTIONE TURNI MANUALE UTENTE. Programma Gestione Turni Manuale Utente versione 1.1

I Sistemi Informativi

Introduzione alla teoria dei database relazionali. Come progettare un database

Capitolo 4 Pianificazione e Sviluppo di Web Part

MANUALE PARCELLA FACILE PLUS INDICE

RISOLUTORE AUTOMATICO PER SUDOKU

Dispensa DB Mercato del Lavoro

Utilizzando Microsoft Access. Si crea la tabella Anagrafica degli alunni,le Materie e i voti si mettono alcuni campi

Progettazione di Basi di Dati

Istruzioni di installazione di IBM SPSS Modeler Text Analytics (licenza per sito)

Introduzione ai database relazionali

Транскрипт:

Università degli Studi di Modena e Reggio Emilia Facoltà di Scienze della Comunicazione e dell Economia Corso di Laurea in Comunicazione e Marketing Anno Accademico 2005/06 Metodi per la Gestione dei Dati (lezioni di laboratorio) Titolare del corso: ing. Stefano SETTI Lezioni di laboratorio (gruppo A-K): dott. Fabio RUINI Riferimenti semi-bibliografici: MySQL Reference Manual disponibile in versione PDF su Dolly e, in vari formati, all indirizzo: http://dev.mysql.com/doc/ In particolare: Chapter 3 MySQL Tutorial estratti pubblicati su Dolly numerati e richiamati, dove necessario, con la sigla [RIFxx] 1 2 Il linguaggio SQL (Structured Query Language) L SQL non è semplicemente un linguaggio utile per scrivere interrogazioni, ma contiene al suo interno due diverse sottofamiglie di linguaggi: DDL Data Definition Language Insieme di comandi per la definizione dello schema di una base di dati relazionale Alter table Create Drop DML Data Manipulation Language Insieme di comandi per la modifica ed il reperimento (interrogazione) di istanze di una base di dati Insert Select Update Delete Connessione a MySQL step 1 Una volta entrati nel prompt dei comandi, occorre spostarsi all interno della directory nella quale è stato installato il client per accedere al DBMS. Se durante l installazione non sono stati variati i parametri di default, per accedere alla cartella dovrebbe essere sufficiente digitare l istruzione: Promemoria C:\>cd \Programmi\EasyPHP1-8\mysql\bin seguita dalla pressione del tasto INVIO 3 4

Promemoria Connessione a MySQL step 2 Per comodità possiamo accedere a MySQL con le credenziali di root : C:\Programmi\EasyPHP1-8\mysql\bin\>mysql u root (il parametro -u indica a MySQL che la stringa seguente rappresenta il nome dell utente che sta tentando di collegarsi al DBMS). Visualizzazione dell elenco dei Data Base presenti nel DBMS Una volta connessi al DBMS, possiamo ottenere un elenco dei Data Base presenti al suo interno, con il comando: mysql>show DATABASES; L output che otteniamo è in forma tabellare e ci fornisce un elenco dei DB presenti nel DBMS (o, meglio, di quelli che possiamo vedere con l utente attuale, perché in possesso dei privilegi necessari [RIF01]). 5 6 Selezione di un particolare DB ed elencazione delle sue tabelle Prima di iniziare a lavorare su di uno specifico Data Base, occorre indicare a MySQL di quale DB si tratta. Per farlo si può ricorrere all istruzione: mysql>use nome_database; Una volta selezionato il Data Base di interesse, l istruzione che consente di visualizzare l elenco completo delle tabelle ivi contenute è: mysql>show TABLES; Creazione di un nuovo DB A seconda del tipo di lavoro da svolgere, si può utilizzare un Data Base già esistente, oppure crearne uno ex novo. L istruzione per compiere questa seconda operazione è: mysql>create DATABASE nome_nuovo_database; (per un breve approfondimento delle istruzioni USE e CREATE DATABASE, [RIF02]) 7 8

Selezionare il nuovo DB Ora che abbiamo creato il nuovo Data Base, per iniziare ad utilizzarlo occorre innanzitutto selezionarlo, seguendo la modalità vista in precedenza: mysql>use nome_nuovo_db; In alternativa, è possibile preselezionare il DB da utilizzare direttamente all avvio di MySQL, con l istruzione: C:\Programmi\EasyPHP1-8\mysql\bin\>mysql u root nome_nuovo_db; Creazione di una nuova tabella Per creare una nuova tabella, si fa riferimento all istruzione CREATE TABLE [RIF03], la cui sintassi è la seguente: mysql> CREATE TABLE nome_tabella ( nome_campo_1 tipo_campo_1 attributi_campo_1, nome_campo_2 tipo_campo_2 attributi_campo_2,... ); 9 10 Tipi di dati Ogni attributo all interno di una relazione è associato ad un tipo di dato (datatype) o dominio. Tipi di dati numerici I tipi di dati si distinguono in: - numerici; - date e orari; - stringhe; I: display width - D: number of significant digits 11 12

Float, double e decimal float: i campi di tipo float possono contenere piccoli numeri floating-point. I valori che può assumere un campo float sono: quelli compresi tra -3.402823466E+38 e -1.175494351E-38, lo 0, e quelli appartenenti all intervallo 1.175494351E-38 e 3.402823466E +38; double: come i float, ma con un intervallo più esteso. Essi spaziano da 1.7976931348623157E+308 a -2.2250738585072014E-308, comprendono lo 0 ed ancora hanno dalla loro il range con estremi 2.22507385850720E-308 e 1.7976931348623157E+308; decimal(m,d): numeri lunghi fino a 64 cifre, con un massimo di 30 di queste facenti capo alla parte decimale. Date e orari I tipi di campi data/orario possono contenere al loro interno valori corrispondenti ad una data (espressa in vari formati) e/o un orario (che può includere, o meno, anche la notazione dei secondi). 13 14 DATETIME E' il formato più completo e preciso a nostra disposizione. Varia nel range: 1000-01-01 00:00:00, 9999-12-31 23:59:59. DATE Uguale al precedente, ma privo di indicazioni relative all'orario. Ammette valori compresi tra 1000-01-01 e 9999-12-31. Date e orari Si noti come i separatori utilizzati da MySQL siano: il trattino ( - ) per discriminare tra le date (solitamente in formato YYYY- MM-DD), i due punti ( : ) per dividere un orario tra le ore, i minuti ed i secondi (hh:mm:ss). Stringhe di testo Un campo cui viene assegnato un tipo stringa, può contenere al suo interno un insieme di caratteri di qualsiasi tipo: numerici, alfanumerici, ecc. TIME Contiene esclusivamente un orario. I valori che è possibile inserire in un campo di questo genere variano da 00:00:00 a 23:59:59. 15 16

Char e Varchar Questi due tipi di campi, nonostante la somiglianza nel nome, si comportano in maniera molto diversa: il primo ha un occupazione di memoria fissa, indipendente dal contenuto del campo, mentre quella del secondo è variabile. Ciò significa che se creassimo ad esempio un campo CHAR(9) ed al suo interno inserissimo la stringa "ciao", questo campo occuperebbe comunque 9 byte invece di 4. Con VARCHAR(9) invece, scrivendo all interno "ciao" il campo occuperebbe solo 5 byte (si veda la piccola equazione contenuta nella tabella della slide precedente: X+1 dove in questo caso X=4 e, quindi, X+1=5). La memoria non utilizzata, con VARCHAR, viene dunque immediatamente disallocata. NB: all interno di una tabella non è possibile utilizzarli assieme, automaticamente il sistema li renderà tutti e due varchar. TEXT e BLOB TEXT e BLOB sono i campi di MySQL dedicati a contenere grandi quantità di dati (65 kb nella versione base, fino a 4,2 GB con le loro estensioni LONGTEXT e LONGBLOB). Il campo di tipo BLOB (acronimo di Bynary Large Object) é molto interessante, poichè consente il salvataggio di interi file, in formato binario, all interno di un Data Base. 17 18 Altri tipi di dati ENUM: é l utente a creare il dominio del campo. Ad esempio, con: ENUM 'mare','montagna','lago') si impone al futuro utente la scelta di una (e solo una) di queste tre possibilità. Altri valori eventualmente inseriti verranno trattati da MySQL come valori vuoti (NULL), a meno che chi ha progettato il DB non abbia definito un valore di default. SET: questo tipo è uguale ad ENUM, con la differenza di poter effettuare una scelta multipla. Il campo ENUM infatti, consente di scegliere un solo valore. (per un ulteriore approfondimento dei tipi di dati supportati da MySQL, si veda [RIF04]) Vincoli sui tipi Durante la fase di creazione delle tabelle è possibile impostare diversi vincoli sui vari campi. Quelli universali e che utilizzeremo più spesso sono: NOT NULL: ammesso da tutti i tipi di campi, fa sì che il campo sul quale è specificato tale vincola non possa essere lasciato vuoto. NULL: ammesso da tutti i tipi di campi (ma non si può ovviamente usare su quei campi che costituiscono nel loro insieme la chiave primaria), se nel campo non viene inserito un input, esso assumerà il valore NULL. DEFAULT: ammesso da tutti i tipi di campi: imposta un valore predefinito (coerente con il dominio) nel caso in cui il campo fosse stato lasciato vuoto dall utente durante la fase di inserimento. 19 20

Valori nulli In qualunque tabella del DB possono essere presenti campi particolari, per i quali non è obbligatorio che sia inserito un valore sensato. Con il termine valore nullo si intende la mancanza di dati. E un concetto diverso rispetto allo 0 (zero) dei tipi numerici ed alla stringa vuota ( ) dei tipi stringa. Ancora sul vincolo NULL... Rappresentando una generica mancanza di dati, il valore NULL può assumere tre possibili significati: 1. Valore sconosciuto; 2. Valore inesistente; 3. Mancanza di informazione (rappresenta un OR logico tra le due possibilità precedenti). (per un approfondimento del concetto di valore nullo e sui problemi che possono conseguire dal suo utilizzo, si vedano [RIF05] e [RIF06]). 21 22 Proprietà AUTO_INCREMENT La proprietà AUTO_INCREMENT di un campo (applicabile solo se quest ultimo è di tipo numerico) può essere utilizzata per attribuire un identità univoca alle nuove righe (records) inserite nelle tabelle del Data Base. NB: attribuire ad un campo la proprietà AUTO_INCREMENT implica che questo campo dovrà essere impostato come chiave. Non è possibile impostare la proprietà AUTO_INCREMENT a più di un campo, all interno della medesima tabella. La proprietà AUTO_INCREMENT renderà leggermente più agevole la successiva fase di inserimento dei dati. 23 Chiavi primarie Ogni relazione può (deve) avere una ed una sola CHIAVE PRIMARIA, ossia un insieme (possibilmente minimo) degli attributi che individuano univocamente una riga della relazione. In MySQL il vincolo PK può essere definito direttamente su di uno o più attributi che definiscono la chiave primaria. Gli attributi che fanno parte della chiave primaria ovviamente non possono assumere valore NULL. NB: quando è difficile (se non impossibile) identificare un insieme di attributi che insieme compongano la chiave primaria, è abitudine inserire all interno delle relazioni un attributo ID che non ha un valore semantico particolare se non quello di servire da identificativo univoco dei records. 24

Chiavi esterne (foreign keys) Una chiave esterna (foreign key) è costituita da uno o più attributi della relazione che rappresentano la chiave primaria di un altra relazione. NB: Con MySQL non è possibile definire la chiave esterna direttamente nel momento in cui si crea la relazione. La FK andrà a definirsi implicitamente nel momento in cui saranno scritte interrogazioni che prevedono al loro interno un unione (join) tra relazioni diverse. Un esempio completo - teoria Per chiarire i concetti appena esposti, proviamo a creare, all interno di un database chiamato scuola, una tabella di nome studente con la seguente struttura : id nome cognome data_di_nascita crediti_ conseguiti Secondo il modello relazionale, la formalizzazione di questo schema di relazione è: studente = {id,nome,cognome,data_di_nascita,crediti_conseguiti} 25 26 Un esempio completo - pratica Un esempio di codice SQL che implementa lo schema visto nella slide precedente potrebbe essere: mysql>create DATABASE scuola; mysql>use scuola; mysql>create TABLE studente ( id int NOT NULL AUTO_INCREMENT, nome text NOT NULL, cognome text NOT NULL, data_di_nascita date NOT NULL, crediti_conseguiti int, primary key(id) ); Ottimizzare sempre! Il codice SQL che abbiamo appena visto è funzionante, ma vi si potrebbero apportare innumerevoli modifiche. In particolare, per i vari campi, si sarebbe potuta effettuare una scelta più oculata dei tipi, in modo tale da risparmiare la memoria allocata! 27 28

Popolamento di un Data Base Ora che abbiamo creato un nuovo Data Base ed abbiamo inserito al suo interno una tabella, possiamo passare alla fase di popolamento. Per inserire nuovi records (o tuple, in accordo al formalismo del modello relazionale) si utilizza l istruzione: mysql>insert INTO nome_tabella (campo1,campo2, ) VALUES (valore1,valore2, ); (per ulteriori informazioni sull istruzione INSERT, si veda [RIF07]) Uno studente dentro al Data Base A titolo esemplificativo, vediamo come inserire un record all interno della tabella creata in precedenza. Una sintassi per farlo può essere: mysql>insert INTO studente (id,nome,cognome,data_di_nascita,crediti_conseguiti) VALUES(1, Mario, Bianchi, 1982-08-28,16); NB: per verificare la correttezza dell inserimento del record, si può utilizzare, una volta elaborata l istruzione INSERT, la query: mysql>select * FROM studente; Il costrutto select qui introdotto verrà comunque analizzato nelle prossime lezioni. 29 30 Il vantaggio di un campo AUTO_INCREMENT Ancora una volta, seppur la sintassi utilizzata porti al risultato atteso (inserimento di un record all interno del Data Base), vi è lo spazio per (almeno) un miglioramento. Dimenticavamo la proprietà AUTO_INCREMENT? mysql>insert INTO studente (nome,cognome,data_di_nascita,crediti_conseguiti) VALUES( Mario, Bianchi, 1982-08-28,16); Drop [RIF08] e [RIF09] Ora che abbiamo visto come creare Data Base e tabelle, nonché come popolarle, non ci resta che vedere come fare per eliminarle. Per rimuovere una tabella da un Data Base (una volta selezionato), si utilizza l istruzione: mysql>drop TABLE nome_tabella; Per eliminare interamente un database (indipendentemente dal fatto che questo sia o meno selezionato), si utilizza invece l istruzione: mysql>drop DATABASE nome_database; 31 32

Eseguire l SQL contenuto in un file Spesso può rivelarsi comodo utilizzare un editor esterno, invece della cruda consolle, per scrivere codice SQL. La shell di MySQL dispone di una funzione per eseguire i comandi contenuti all interno di un file. La sua sintassi è: mysql>source nome_file; NB: deve essere specificato anche il percorso completo del file che si vuole eseguire (es: mysql>source c:\documenti\miofile.sql). (per ulteriori informazioni sull esecuzione di codice contenuto in files plain-text si veda [RIF10]) Le stesse operazioni in phpmyadmin Tutte le operazioni che abbiamo visto in questa lezione (creazione di Data Base e tabelle, popolamento, drop) possono essere comodamente effettuate attraverso l interfaccia grafica di phpmyadmin. Una peculiarità di questo strumento è che, in seguito ad ogni operazione svolta, mostra all utente il codice SQL che é stato generato automaticamente per svolgere l operazione richiesta. 33 34 Salvare il proprio lavoro phpmyadmin dispone inoltre di un efficace funzione, che consente di esportare un intero Data Base (comprensivo sia della sua struttura, sia dei dati in esso contenuti) all interno di un file di testo. In questo modo risulta possibile salvare il proprio lavoro (ad esempio quello svolto durante le lezioni di laboratorio), copiando il file di testo risultante su un dispositivo di archiviazione portatile (quale può essere una chiavetta USB). Per effettuare l esportazione, dall interfaccia principale di phpmyadmin è necessario eseguire le operazioni elencate nel dettaglio nella slide seguente. Esportare un Data Base da phpmyadmin ad un file SQL scegliere il database da esportare; fare clic su esporta ; alla voce Struttura selezionare: Struttura, Aggiungi DROP TABLE, Aggiunge IF NOT EXISTS, Aggiungi valore AUTO_INCREMENT, Usa i backquotes con i nomi delle tabelle e dei campi ; alla voce Dati selezionare: Dati, Inserimenti completi, Inserimenti estesi, Usa l'esadecimale per i dati binari ; selezionare Salva con nome (nessuna compressione) e scegliere il nome del file in cui esportare tutto il contenuto del Data Base; fare clic sul pulsante Esegui per avviare l operazione di backup. 35 36

Esercizio 1 Proviamo adesso a modificare la tabella studente vista in precedenza in modo da ottimizzarla. Una possibile soluzione Uno dei risultati potrebbe essere questo: Ci bastano numeri fino a 65535 30 caratteri ci bastano Usare un tinyint era poco (max 255) ma un int era troppo 37 38 Esercizio 2 Dopo aver creato la tabella studente si potrebbe pensare di aggiungere anche altre tabelle al Data Base di un ipotetica segreteria didattica. Le tabelle potrebbero essere: facolta = {id, nome, indirizzo, città}; cdl = {id, id_facolta, nome, classe_di_laurea, numero_chiuso}; studente = {id, id_cdl, nome,cognome,data_di_nascita,crediti_conseguiti}; insegnamento = {id, id_cdl, nome, crediti, anno}; appello = {id, id_ins, id_stu, data}; propedeuticita = {id, id_ins, id_ins_prop}; //qui abbiamo una relazione ricorsiva Scrivere il codice SQL che permette la creazione di queste tabelle. Esercizio 3 da fare a casa In base alle indicazioni riportate qua sotto, preparare lo schema ERD di un Data Base che permetta di immagazzinare tutte le informazioni cui si fa riferimento. Dopo aver creato tale schema, si proceda alla realizzazione fisica (in SQL) delle tabelle del DB. Le relazioni coinvolte nell esempio sono: Le officine, con nome, indirizzo, telefono. Le automobili, con targa, modello e proprietario. I clienti (proprietari di automobili) con codice fiscale, cognome, nome, telefono. Ogni cliente può essere proprietario di più automobili. Gli interventi di manutenzione, ciascuno effettuato presso una officina e con un numero di identificazione progressivo (unico nell ambito della singola officina), data d inizio e di fine dei lavori, pezzi di ricambio utilizzati (con le quantità) e numero di ore di manodopera. I pezzi di ricambio, con codice, nome e costo unitario. 39 40

Fine della seconda lezione 41