Help access - Generare un codice numerico

mercoledì 17 ottobre 2007 - 17.26

miccof Profilo | Newbie

Inizio col ringraziare tutti coloro che mi leggeranno.
Ho un piccolo problema con un database access.
Sto creando un database per gestire una piccola biblioteca che sta per nascere.
Ho la necessita che, nell'inserire un libro nel database, venga creato un codice identificativo del libro dato dal numero id della tabella genere seguito dal numero id della tabella libro. Faccio un esempio:
Inserisco il libro col titolo "mio libro" (che avrà l'id 12) assegnandogli dalla tabella genere "Fantastico" (che avrà id 3).
L'ultimo campo della tabella libro deve essere generato automaticamente come 030012 (dove 03 è l'id del genere e 0012 è l'id del libro in migliaia).

Spero che qualcuno possa aiutarmi, e vi ringrazio nuovamente per questo.

lbenaglia Profilo | Guru

>Ho la necessita che, nell'inserire un libro nel database, venga
>creato un codice identificativo del libro dato dal numero id
>della tabella genere seguito dal numero id della tabella libro.
>Faccio un esempio:
>Inserisco il libro col titolo "mio libro" (che avrà l'id 12)
>assegnandogli dalla tabella genere "Fantastico" (che avrà id
>3).
>L'ultimo campo della tabella libro deve essere generato automaticamente
>come 030012 (dove 03 è l'id del genere e 0012 è l'id del libro
>in migliaia).

Ciao Carlo,

Per quale motivo hai una esigenza così singolare utilizzata in passato su sistemi "poco evoluti"?
Microsoft Access è un database relazionale (RDBMS), quindi implementa nativamente la logica relazionale definita dal Dott. Edgar Frank Codd nel lontano 1970:
http://en.wikipedia.org/wiki/Edgar_F._Codd

In base a tale logica è possibile "mettere in relazione" due tabelle tra di loro.
Vediamo un esempio concreto.
Supponiamo che ogni libro appartenga ad 1 solo genere.
L'entità libro e l'entità genere possono essere "tradotte" in due tabelle: Libri e Generi.
Dato che ad 1 libro corrisponde 1 solo genere, ma 1 genere può essere attribuito a più libri possiamo dire che le tabelle Generi e Libri sono in relazione 1 a molti.
Ormai al giorno d'oggi ogni libro è accompagnato da un codice ISBN (International Standard Book Number) che lo identifica univocamente nel mondo:
http://it.wikipedia.org/wiki/Codice_ISBN

Quindi potremmo utilizzare tale codice per identificare univocamente ogni libro nella tabella Libri. Su questa colonna andremo a definire un vincolo di Chiave Primaria (Primary Key Constraint).
Dato che non mi viene in mente una "chiave naturale" (Natural Key) per identificare univocamente un genere, potremmo affidarci ad una colonna autoincrementante, definendo su di essa una Primary Key.

Proviamo a disegnare una bozza di diagramma:

+-------------+ +------------+ | Generi | | Libri | +-------------+ 1 +------------+ PK | GenereID |---+ | ISBN | PK | Descrizione | +--> | GenereID | FK +-------------+ molti| Titolo | | Editore | +------------+

Sulla colonna GenereID della tabella Libri ho definito un vincolo di Chiave Esterna (Foreign Key Constraint) che vincola tale colonna ad assumere solo ed esclusivamente i valori relativi alla corrispondente colonna della tabella Generi.
In questo modo non posso inserire o aggiornare un libro con un genere che non sia già stato precedentemente inserito nella tabella Generi.

OK, va bene, ma come si fa a realizzare tutto questo con Microsoft Access?
Guarda, è molto più difficile spiegarlo che farlo, pertanto sarò telegrafico.
Prima di tutto definisci le due tabelle (e qua sono sicuro che sarai più bravo di me nel farlo ).
Definisci le due chiavi primarie (seleziona le colonne GenereID e premi il bottoncino con la chiavetta).
Definisci il constraint Foreign Key (Seleziona Database Tools -> Relationship, aggiungi le due tabelle ed esegui il Drag & Drop della colonna GenereID della tabella Generi sulla colonna GenereID della tabella Libri e seleziona la check box Enforce Referential Integrity).

Fatto

Ti allego un esempio realizzato in Access 2007.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

miccof Profilo | Newbie

Non so come ringraziarti del tempo dedicatomi per la risposta. Dall'alto della mia ignoranza non ero a conoscenza dell'esistenza di un codice ISBN (ed ho fatto il servizio civile nella Biblioteca Nazionale di Roma.... ma tu non dirlo in giro ), ma anche li a parte il codice ISBN esisteva una catalogazione create ad hoc per poter posizionare il libro su uno scaffale e ritrovarlo facilmente. Inserirò sicuramente il codice ISBN nel db ma devo comunque generare un codice numerico per posizionare i libri sugli scaffali.
Diciamo che studiando un po' sono riuscito in parte a fare quello di cui avevo bisogno utilizzando nel generatore di espressioni il comando str di conversione in stringa per l'id del genere e per l'id del libro. Tutto questo teoricamente perchè devo metterlo in pratica e vedere se funziona a dovere. Se hai comunque informazioni da darmi in merito io le accetto sicuramente... a mo' di spugna. Grazie ancora e ti farò sapere se tutto funge a dovere.
Saluti

lbenaglia Profilo | Guru

>sicuramente il codice ISBN nel db ma devo
>comunque generare un codice numerico per posizionare i libri
>sugli scaffali.
Definisci la tabella Scaffali con un ID e descrizione, e aggiungi una colonna ScaffaleID nella tabella Libri, esattamente come ti ho mostrato per le categorie.

>Diciamo che studiando un po' sono riuscito in parte a fare quello
>di cui avevo bisogno utilizzando nel generatore di espressioni
>il comando str di conversione in stringa per l'id del genere
>e per l'id del libro.
No, no, non ci siamo
Con un RDBMS quello che stai facendo ha veramente poco senso

>Grazie ancora e ti farò sapere se tutto funge a dovere.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5