Newsgroup: it.comp.appl.access
Titolo: self join

ciao,
avrei una domanda da fare a chi volesse rispondermi:
sto generando una database per una piccola azienda di impiantistica,
c'è la necessità di includere una tabella che contenga la defnizione
dei semilavorati prodotti dall'azienda (che non sono i prodotti
finali, ma solo i prodotti intermedi). il problema è che ogni
semilavorato è composto da altri semilavorati e/o materie prime e se
ne vorrebbe tenere traccia. mi viene in mente una self join, nel senso
che esiste una relazione di gerarchia all'interno dei semilavorati (ci
sono semilavorati di "base" e semilavorati più "evoluti" composti da
più semilavorati di base). fino ad oggi mi sono sempre imbattuto in
self join m-1 cioè più record in una tebella erano correlati ognuno
con un solo record della stessa tabella (caso tipico del superiore di
un gruppo di dipendenti che a sua volta è dipendente). in questo caso
è l'inverso cioè un record nella tabella è correlato con più record
della tessa tabella (e fra l'altro uno stesso semilavorato di base può
essere il componente di più semilavorati evoluti, quindi la self join
diventa una m-m).
che cosa mi è venuto in mente? di generare una tabella di collegamento
fra la tabella dei semilavorati e una sua alias e creare una relazione
m-m. fin qui la cosa sta anche in piedi, ma ho un grosso problema: non
riesco a pensare ad un modo per creare una maschera di input dei
semilavorati: avrei la necessità di avere una cosa come segue.
quando nella maschera inserisco un nuovo semilavorato evoluto vorrei
avere anche la possibilità di inserire in una sottomaschera i
semilavorati di base che lo compongono (solo quelli già esistenti e
non di nuovi), cioè una sottomaschera in cui avere la possibilità di
inserire più record (ognuno che identifichi i semilavorati di base),
ma questo inserimento deve avvenire tramite un menù a discesa in cui
compaiono tutti i record già esistenti della tabella semilavorati.
che macello...
Saluti
Roberto

 diventa una m-m).
Qualcosa non mi torna... praticamente hai alcuni record che contengono
dei riferimenti ad altri record, e fin qui nulla di strano. Ma come
fai a gestire piu' riferimenti? L'unico sistema che mi viene in mente
e' avere piu' campi (Componente1, Componente2, Componente3...)... non
ho idea di che complessita' siano i tuoi semilavorati, ma se un giorno
metti in produzione un prodotto costituito da 37 componenti elementari
che fai, allarghi la tabella? Naaah...
IMO ti conviene fare la tabella "Prodotti" e una tabella "Componenti".
Nella "ComposizioneProdotti" metti due campi: uno il "prodotto", e
l'altro "componenti".
Per un semilavorato XY01 composto da N componenti, avrai N record in
"ComposizioneProdotti" con "XY01" nel campo "Prodotto" e i codici di
ciascun componente nel campo "Componenti"
Magari puoi anche prevedere un campo tipo "Complessita'" nella
Prodotti, che valga 0 per i prodotti basilari, e valga N+1 per i
prodotti composti (dove N e' la complessita' piu' alta tra quelle dei
componenti), in modo da sapere subito quante ricorsioni devi fare per
smontare un prodotto finito nei suoi componenti elementari.
Ovviamente puoi fare anche il contrario, ovvero prendere un prodotto,
cecarlo nel campo "Componenti"  della tabella "composizioneprodotti" e
vedere nel campo "Prodotto" di cosa e' componente.
Cia' 
Max

 ciascun componente nel campo "Componenti"
hummm.. ma allora un componente può anche essere presente nella tebella
prodotti, quello che voglio dire è che se un prodotto di primo livello è
anche un componente di secondo livello, allora il suo record è anche
presente nella tabella comonenti. o no?
ciao e grazie della risposta.
Roberto

On 21 Mar 2002 02:41:23 -0800, 
rob...@hotmail.com
 (Roberto Messora)
wrote:
cUT
stai realizzando un magazzino insustriale quindi..... purtroppo non ho
mai avuto occasione di farlo prova a vedere in rete , sono cose che si
insegnano anche a scuola (la struttura del database intendo)
Saluti.
Emanuele.

 presente nella tabella comonenti. o no?
Mi sa che ho fatto casino e ho cambiato i nomi a meta' post... 
intendevo suggerire una tabella contenente tutti i semilavorati (Dal
piu' semplice, livello 0, fino a quelli piu' complicati, di livello N,
composti da altri semilavorati di livello da 0 a N-1), e una tabella
che, ad ogni semilavorato (evidentemente di livello superiore a 0) 
associa l'elenco di tutti i componenti. Ad esempio:
Tabella PRODOTTI 
Prodotto         Complessita'
Pistone          0
Albero motore    0
Monoblocco       0 
Testata          0
Blocco motore    1
Carburatore      0
Centralina       0
Motore completo  2
Tabella COMPONENTI
Prodotto         Componente
Blocco motore    Pistone
Blocco motore    Albero motore
Blocco motore    Monoblocco
Blocco motore    Testata
Motore completo  Blocco motore
Motore completo  Carburatore
Motore completo  Centralina
In questo modo, selezionando "Motore completo" (liv. 2) nella tabella
Componenti - campo Prodotto vedi che ti servono un blocco motore 
(liv.1, a sua volta composto da pistoni, albero, monoblocco e
testata), un carburatore (liv.0, quindi componente base) e una
centralina (0).
Viceversa, se selezioni "Pistone" nella tabella componenti - campo
COmponente vedi che i pistoni ti servono per costruire il blocco
motore, che a sua volta ti serve per costruire il motore completo.
Cia' 
Max

 centralina (0).
in effetti è molto vicino a quello che avevo pensato anche io, ti lascio
immaginare il casino che mi sta uscendo per generare la maschera di
inserimento prodotti, un esempio su tutti: maschera principale in cui
inserire nome prodotto, descrizione e altre amenità, sottomaschera in cui
indicare tutti i prodotti (già esistenti, almeno quello...) che lo
compongono, questo solo se la sua complessità è maggiore di zero (altrimenti
non ha componenti e quindi va disabilitata la sottomaschera), ma
nell'indicare i componenti devo fare in modo che 1) non si possa selezionare
lo stesso prodotto di cui si stanno scegliendo i componenti (un prodotto non
può essere componente di se stesso) 2) non si possa selezionare più di una
volta lo stesso componente in quanto quando se ne seleziona uno se ne deve
indicare anche la quantità (ad esempio nel motore ci vanno 16 valvole), e
forse fino a qui ho risolto . per non parlare del fatto che il prezzo
complessivo del prodotto è la somma dei prezzi unitari per la quantità dei
componenti e questo non l'ho ancora risolto in quanto sono si riuscito a
generare un campo che lo calcoli, ma non sono ancora riuscito a far si che
tale risultato venga scritto nella tabella prodotti alla voce prezzo.
insomma un macello....
Saluti
Roberto

 contengono.... IMO e' fattibilissimo.
questa domanda non ho osato farla in effetti.... quando ci sono sopra e non
so come risolverla magari vengo qui  te lo chiedo :-)
grazie
ciao
Roberto