Bicicletta
\____TELAIO
\_______CANOTTO
\_______STERZO
\____MECCANICA
\_______CORONA
\_______CATENA
\_______PIGNONE
\______FASCETTA
\______VITE
e cosi via..
Mi consigliate come creare le tabelle o tabella del DB in modo da poter
lavorare alla stesura del mio programma?
So che non è facile, per questo ho chiesto a voi che siete dei mostri :-)
Grazie!
D.
Ciao Dreamer,
quella che mostri è una struttura ricorsiva e quindi la soluzione passa
attraverso un semplice auto-riferimento del tipo:
create table Articoli(ID_Articolo, ID_ArticoloPadre, Descrizione)
Ma se immagino una bicicletta come chiedi o in generale un prodotto
composto da altri prodotti allora quella cosa non basta e serve quella
che, nelle aziende di produzione, si chiama distinta base.
Considera il seguente caso:
Bicicletta
\____TELAIO
\_______CANOTTO
\_______VITE
\____MECCANICA
\_______CORONA
\_______CATENA
\_______VITE
Come vedi, in questo caso VITE non ha un solo padre, ma partecipa alla
costruzione di più componenti. Quello che serve allora è una sorta di
auto-riferimento molti a molti, tipicamente:
Una tabella di prodotti:
create table Prodotti(ID_Prodotto, Descrizione)
E una tabella che specifica la composizione del porodotto:
create table DistintaBase(ID_DistintaBase, ID_Prodotto, ID_Componente)
Dove sia ID_Prodotto he ID_Componente sono in relazione con ID_Prodotto
della tabella Prodotti.
Tipicamente si usa anche un campo quantitativo per specificare Quanto
del componente X è richiesto per produrre il prodotto Y.
nell'esempio che posti i prodotti saranno:
insert into Prodotti(1, Bicicletta)
insert into Prodotti(2, Telaio)
insert into Prodotti(3, Canotto)
insert into Prodotti(4, Sterzo)
insert into Prodotti(5, Meccanica)
insert into Prodotti(6, Corona)
insert into Prodotti(7, Catena)
insert into Prodotti(8, Pignone)
insert into Prodotti(9, Fascetta)
insert into Prodotti(10, Vite)
La distinta base specifica invece le relazioni tra i prodotti:
La Bicicletta è fatta dal telaio e dalla meccanica:
Insert into DistintaBase values(1,1,2)
Insert into DistintaBase values(2,1,5)
Il telazio è fatto dal canotto e dallo sterzo:
Insert into DistintaBase values(3,2,3)
Insert into DistintaBase values(4,2,4)
La meccanica è fatta da Corona, Catena e Pignone:
Insert into DistintaBase values(5,5,6)
Insert into DistintaBase values(6,5,7)
Insert into DistintaBase values(7,5,8)
Il Pignone è fatto da Fascetta e vite:
Insert into DistintaBase values(8,8,9)
Insert into DistintaBase values(9,8,10)
Come si diceva, con questa struttura la VITE potrebbe partecipare anche
alla definizione dello STERZO:
Insert into DistintaBase values(10,4,10)
> Mi consigliate come creare le tabelle o tabella del DB in modo da poter
> lavorare alla stesura del mio programma?
> So che non è facile, per questo ho chiesto a voi che siete dei mostri :-)
Lavorare con la distinta base è effettivamente un pochino rognoso.
Per partire bene crea le due tabelle in una forma più semplice
possibile, logica e lineare.
> Grazie!
> D.
mar.
"Marcello" wrote:
Ok, giustamente sono stato poco preciso nell'esposizione dei dati.
Un articolo può giustamente essere inserito in tanti KIT.
Ma a sua volta un KIT può essere dentro un altro kit (non dentro se stesso
ovviamente).
Quindi tu diresti di creare una prima tabella cosi:
create table Prodotti(ID_Prodotto, Descrizione) dove descrivo i prodotti del
mio magazino diciamo.
Poi una seconda tabella cosi:
create table DistintaBase(ID_DistintaBase, ID_Prodotto, ID_Componente) dove
andrò a inserire i vari prodotti ma qui mi manca un pezzetto che non capisco.
Non ho capito come scrivere il comando per creare la relazione molti a molti
ma non importa..
L'ID della distinta base a me viene da pensare che si tratti di un codice
univoco che rappresenta TUTTA la distinta base e che sia univoca, come mai la
fai incrementare ad ogni oggetto che inserisci?
Cosi, se ho capito, torna una tabella molto semplice e di facile lettura
ma, con gli insert che tu mi hai suggerito vado a "costruire" i kit fino al
componente spicciolo diciamo cosa utile, ma solo la prima volta perchè dopo
in una fase successiva l'operatore che deve costruire una distinta base
richiamerà i KIT già composti e dirà es:
Crea nuova biciletta, inserire TELAIO e MECCANICA, stop, STAMPA.
Nella stampa devono essere richiamati TUTTI gli oggetti che compongono la
distinta.
Come li richiamo in quel caso?
Scusa se non mi esprimo bene, sono concetti abbastanza complicati per me che
sono alle prime armi in SQL e in programmazione.
Il punto è che Kit e Articolo sono la stessa cosa.
Ci sono N articoli, Alcuni questi possono essere composti da altri, a
loro volta eventualmente composti da altri e così via a cascata.
Osserva che anche La bicicletta può essere usata per comporre un set di
due biciclette.
> Quindi tu diresti di creare una prima tabella cosi:
> create table Prodotti(ID_Prodotto, Descrizione) dove descrivo i prodotti del
> mio magazino diciamo.
Esatto. Ci saranno poi altre specifiche che andranno usate a seconda dei
casi.
Se stai scrivendo il gestionale per la Barilla avrai prodotti quali:
- Rigatoni
- Farina
- Uova
ma i Rigatoni avranno anche un attributo che specifica che un prodotto
Vendibile mentre Farina e Uova esisteranno solo internamente come
Componenti.
> Poi una seconda tabella cosi:
> create table DistintaBase(ID_DistintaBase, ID_Prodotto, ID_Componente) dove
> andrò a inserire i vari prodotti ma qui mi manca un pezzetto che non capisco.
Con questa tabella vai a specificare le composizioni.
Bicicletta = Telaio + Pedali + Ruote + Sella
E la cosa avviene a cascata:
Pedali = Pignone + 3 Viti
> Non ho capito come scrivere il comando per creare la relazione molti a molti
> ma non importa..
La relazione, per come l'abbiamo descritta, è di tipo architetturale.
Praticamente, in Tsql, la cosa avrà una forma del tipo:
use tempdb
go
create table t_Ap_Prodotti(
ID_Prodotto int identity primary key,
Descrizione varchar(100) not null unique)
go
create table t_Ap_DistintaBase(
ID_DistintaBase int identity primary key,
ID_Prodotto int not null references t_Ap_Prodotti(ID_Prodotto),
ID_Prodotto#Componente int not null references t_Ap_Prodotti(ID_Prodotto),
Quantità int not null,
unique(ID_Prodotto, ID_Prodotto#Componente),
check(Quantità>0))
go
drop table t_Ap_DistintaBase, t_Ap_Prodotti
> L'ID della distinta base a me viene da pensare che si tratti di un codice
> univoco che rappresenta TUTTA la distinta base e che sia univoca, come mai la
> fai incrementare ad ogni oggetto che inserisci?
E' il Prodotto che è "Una cosa", la distinta base specifica da cosa è
composto.
Un prodotto HA una distinta base.
Vuta se si tratta di una Materia Prima [o meglio Componente Primo]
altrimenti piena.
> Cosi, se ho capito, torna una tabella molto semplice e di facile lettura
> ma, con gli insert che tu mi hai suggerito vado a "costruire" i kit fino al
> componente spicciolo diciamo cosa utile, ma solo la prima volta perchè dopo
> in una fase successiva l'operatore che deve costruire una distinta base
> richiamerà i KIT già composti e dirà es:
> Crea nuova biciletta, inserire TELAIO e MECCANICA, stop, STAMPA.
No, fermati.
Creare una nuova bicicletta significa creare proprio una distinta base.
Parlimao di cose più reali. La bicicletta Bianchi di codice 123 HA l
distinta base:
- 1 Sellino Shimano 234
- 2 Pedali CheNeSò 456
- 1 Cambio AltraMarca 1234
Quando tu dici:
"in una fase successiva l'operatore che deve costruire una distinta base
richiamerà i KIT già composti e dirà es:
Crea nuova biciletta, inserire TELAIO e MECCANICA, stop, STAMPA."
Sembra quasi che voglia invece uno "Schema di Distinta Base" che dica:
Una GENERICA bicicletta è formata da un telaio e una Meccanica.
Questa è una cosa leggermente diversa.
Non tratta di prodotti ma di CLASSI DI PRODOTTI, quindi, per esempio:
use tempdb
go
create table t_Ap_CategoriaProdotti(
ID_CategoriaProdotto int identity primary key,
Descrizione varchar(100) not null unique)
go
create table t_Ap_DistintaBaseGenerica(
ID_DistintaBaseGenerica int identity primary key,
ID_CategoriaProdotto int not null references
t_Ap_CategoriaProdotti(ID_CategoriaProdotto),
ID_CategoriaProdotto#Componente int not null references
t_Ap_CategoriaProdotti(ID_CategoriaProdotto),
Quantità int not null,
unique(ID_CategoriaProdotto, ID_CategoriaProdotto#Componente),
check(Quantità>0))
go
drop table t_Ap_DistintaBaseGenerica, t_Ap_CategoriaProdotti
E' tutto uguale al primo esempio, ma non si stanno più trattando
prodotti ma categorie di prodotti.
La tabella prodotti a quel punto conterrà un campo ID_CategoriaProdotto
e l'operatore, dato una Distinta Base Generica sceglierà i prodotti
specifici per riempirla.
In questo caso puoi specificare altri campi come: Prodotto Obbligatorio
o No, Quantità Minima e Massima, che rendano conto della natura
potenziale e non fattuale di quella Distinta Base.
> Nella stampa devono essere richiamati TUTTI gli oggetti che compongono la
> distinta.
> Come li richiamo in quel caso?
Con una select :-)
Data la natura ricorsiva servirà una select ricorsiva, per esempio:
Declare @ID_Prodotto int;
with r as(
select ID_Prodotto, ID_ProdottoPadre = null
from dbo.t_Ap_Prodotti
where ID_Prodotto = @ID_Prodotto
union all
select db.ID_Prodotto#Componente, x.ID_Prodotto
from x
innser join dbo.t_Ap_DistintaBase db
on db.ID_Prodotto = x.ID_Prodotto
)
select r.ID_Prodotto, r.ID_ProdottoPadre, p.Descrizione
from r
inner join dbo.t_Ap_Prodotti p
on p.ID_Prodotto=r.ID_Prodotto
> Scusa se non mi esprimo bene, sono concetti abbastanza complicati per me che
> sono alle prime armi in SQL e in programmazione.
marc.
Considera però che uno "Schema di Distinta Base Generico" è utile molto
raramente. Infatti mentre una:
Crostata di Pere è FATTA da
- 3 uova
- 100gr di Farina
- Mezzo litro d'acqua
- 2 Pere
La genrica TORTA si PUO' FARE con:
- delle Uova
- della Farina
- della frutta
- del latte
Ma la seconda definizione:
1) E' debole perchè esclude le torte al cioccolato
2) Non serve a niente perchè non specifica le relazioni tra gli ingredienti!
> marc.
rimarc.