Newsgroup: it.comp.appl.access
Titolo: Che tipo di relazione è ?

Ho queste tre tabelle: con i campi accanto , indico solo quelli più 
significativi:
Tabella TESTE_DOCUMENTI  ( campi IDtesta)
Tabella RIGHE_DOCUMENTI ( campi IDtesta che relaziona la prima tabella , 
Articolo,ESERCIZIO )
Tabella GIACENZE  ( campi Articolo, giacenza , esercizio) .
Quando stampo un documento vorrei far comparire la giacenza accanto 
all'articolo della riga del documento , ma non riesco a scrivere la query 
che legga la giacenza dalla corrispondente tabella!
Infatti nella tabella Giacenze ci sono più record per ogni articolo, uno per 
ogni esercizio !
Come li metto in relazione e li filtro , affinchè nel report  mi stampi la 
anche giacenza  di quell'articolo e dell'esercizio corrispondente 
all'esercizio della riga documento?
Le tabelle Teste e righe sono in INNER JOIN ( ON 
teste.id
 = righe.testa_id ) 
, se aggiungo in sequenza un altro INNER JOIN (oppure LEFT JOIN )sulla 
tabella GIACENZE ( on teste.esercizio = giacenze .esercizio       AND  righe 
.articolo = giacenze.articolo ) ttengo la moltiplicazione delle righe 
stampate , ma sempre con le giacenze errate , perchè mi stampa la prima 
occorrenza che trova della tabella giacenze dell'articolo, che molto spesso 
è errata !
la tabella giacenze ha la chiave univoca ARTICOLO+ESERCIZIO ( è anche 
un'indice ) , ma non riesco a sfruttarla tale chiave!
Ho messo la clausola where  teste.esercizio= giacenze.esercizio  , ma non 
filtra nulla , pasano tutte le righe come se non ci fosse !
grazie dei suggerimenti 

Ciao.
Dunque:
Relazione TESTE_DOCUMENTI <-> RIGHE_DOCUMENTI di tipo 1:N;
Relazione GIACENZE <-> RIGHE_DOCUMENTI di tipo 1:N;
Se la chiave di GIACENZE è Articolo + Esercizio allora il join che devi fare
è il seguente:
SELECT * FROM (TESTE_DOCUMENTI  TD INNER JOIN RIGHE_DOCUMENTI RD ON
TD.IDtesta=RD.IDTesta)
INNER JOIN GIACENZE GG ON GG.Articolo=RD.Articolo AND
GG.esercizio=RD.ESERCIZIO
Quindi per ogni documento (IDtesta) avrai N = (Xa * Xe) record della tabella
GIACENZE, con Xa e Xe numero generico di articoli e esercizi
rispettivamente.
Se non è questo quello che volevi, probabilmente hai strutturato male il
database oppure non ho capito il tuo post.
Ciao e fammi sapere.
--
Simplex2
www.mdenittis.it
"Gabriele" <pip...@gert.iu> ha scritto nel messaggio
news:gvdAe.54588$h5.23...@news3.tin.it...


 rispettivamente.
Ecco il problema!
Io non voglio Xa * Xe righe , perchè l'esercizio di appartenenza del 
documento è uno solo , per cui mi aspetto Xa*1  righe nel report !
Io stampo ad es. un documento del 5 giugno 2005 , quindi vorrei stampare 
accanto alle sue righe la giacenza 2005 , non mi interessa quella del 
2001,2002,2003,2004  etc etc ...
Non riesco a creare una query che faccia proprio questa selezione delle 
righe presenti nella tabelle giacenze.
grazie dell'interessamento 

 grazie dell'interessamento
Non è solo una questione di query ma di strutturazione dello schema del
database.
Mi spiego, riscriviamo le relazioni e le chiavi delle tre tabelle
esemplificative, evidenziando le chiavi primarie in maiuscolo, così come si
evincono dalla tua descrizione :
- TESTE_DOCUMENTI  ( IDTESTA, .....);
- RIGHE_DOCUMENTI ( IDtesta, Articolo, ESERCIZIO, ..... );
- GIACENZE  ( campi ARTICOLO, giacenza , ESERCIZIO);
In base alle chiavi primarie ed ai vincoli di integrità referenziale che hai
descritto, per ogni [TESTE_DOCUMENTI.IDTesta] hai necessariamente N record
nella tabella RIGHE_DOCUMENTI, ovvero più guppi (IDTesta, Articolo,
Esercizio), e quindi  N record della tabella GIACENZE.
Per ottenere i risultati che mi hai descritto devi porre un vincolo in più
nella la tabella RIGHE_DOCUMENTI: devi definire come chiave primaria
il gruppo (IDTESTA, ARTICOLO, ESERCIZIO).
Riscrivo le tabelle:
- TESTE_DOCUMENTI  ( IDTESTA, .....);
- RIGHE_DOCUMENTI ( IDTESTA, ARTICOLO, ESERCIZIO, ..... );
- GIACENZE  ( campi ARTICOLO, giacenza , ESERCIZIO);
In questo modo, per ogni ESERCIZIO hai un solo IDTESTA, cioè un solo
documento, ed N articoli (cioè N record della tabella GIACENZE).
La query è che ho scritto nel precedente post estrae PER OGNI DOCUMENTO, un
solo ESERCIZIO e, per ogni esercizio, N GIACENZE.
Col seguente esempio, dunque, otterrai tutte le giacenze relative
all'ESERCIZIO 2005 ed il relativo unico DOCUMENTO.
SELECT * FROM (TESTE_DOCUMENTI  TD INNER JOIN RIGHE_DOCUMENTI RD ON
TD.IDtesta=RD.IDTesta)
INNER JOIN GIACENZE GG ON GG.Articolo=RD.Articolo AND
GG.esercizio=RD.ESERCIZIO
WHERE ESERCIZIO=2005
Prova.
Facci sapere.
--
Simplex2
www.mdenittis.it

ERRATA CORRIGE
ERRATA CORRIGE
ERRATA CORRIGE
.....
  Per ottenere i risultati che mi hai descritto devi porre un vincolo in più
 nella la tabella RIGHE_DOCUMENTI: devi definire come chiave primaria
 il gruppo (IDTESTA, ESERCIZIO).
Riscrivo le tabelle:
- TESTE_DOCUMENTI  ( IDTESTA, .....);
- RIGHE_DOCUMENTI ( IDTESTA, ESERCIZIO, Articolo ..... );
- GIACENZE  (ARTICOLO, giacenza , ESERCIZIO);
In questo modo, per ogni ESERCIZIO hai un solo IDTESTA, cioè un solo
documento, ed N articoli (cioè N record della tabella GIACENZE).
....
ERRATA CORRIGE
ERRATA CORRIGE
ERRATA CORRIGE
Scusa, capita a tutti di sbagliare.
Ciao.
--
Simplex2
www.mdenittis.it

 - RIGHE_DOCUMENTI ( IDTESTA, ESERCIZIO, Articolo ..... );
Come fa ad  essere primaria la chiave composta "IDTESTA+ESERCIZIO" ?
Se ad es. il documento numero 4 del 2005 ha 8 righe di articoli , nella
tabella RIGHE_DOCUMENTI
ci saranno ben  8 righe aventi lo stesso valore per la chiave "
IDTESTA+ESERCIZIO"  .
Mi pare infatti che la chiave primaria nella tabella RIGHE sia infatti un
campo ID_riga   univoco.
Comunque alla fine otteresti anche così sempre la stampa di troppe  righe
provenienti dalla tabella GIACENZE !
Ecco cosa vorrei io :
stampo il  documento numero 4 del 2005 : nella stampa mi compaiono  le 8
righe costituenti appunto il documento che contiene 8 articoli , e accanto
ad ognuno di essi compare la giacenza dell'esercizio corrente anno 2005 ,
letta dalla tabella giacenze . Possibile che con SQL non riesca ad estrarre
sti dati ?
Il DB non l'ho fatto io , preferirei non modificarlo.
Saluti e grazie 1000!


'Azz! Hai ragione. Mi sono sbagliato al quadrato.
Oh mamma, le cose vengono fuori a rate.
Ricapitoliamo:
- Un documento ha un solo esercizio. Non è vero il viceversa;
- Un documento per un dato esercizio può avere da una ad M righe della
tabella GIACENZW CIOè da uno ad M articoli;
- Non c'è alcun vincolo strutturale che garantisca che per ogni documento vi
possa essere un solo esercizio. Diciamo che a logica deve essere così e ci
fidiamo della logica (ovvio che se non funziona la query, questo punto deve
essere messo in discussione).
La query è questa (che differisce da quella di prima solo per la condizione
di selezione):
SELECT * FROM (TESTE_DOCUMENTI  TD INNER JOIN RIGHE_DOCUMENTI RD ON
TD.IDtesta=RD.IDTesta)
INNER JOIN GIACENZE GG ON GG.Articolo=RD.Articolo AND
GG.esercizio=RD.ESERCIZIO
WHERE TD.IDtesta=4
Ammesso e non concesso che veramente ne tuo DB esista un unico esercizio per
ogni documento (quindi al documento 4 corrisponde unicamente l'esercizio
2005), allora la predetta query seleziona tutte le righe del documento 4,
come volevi.
Prova e fammi sapere.
--
Simplex2
www.mdenittis.it

 2005),
Guarda che l'esercizio di un documento č ad esempio la data della fattura,
hai mai visto una fattura con due date ??
ciau!


Ho capito perfettamente!
Ma lasciamo stare per il momento queste pipe mentali.
L'hai provata la query?
Funziona?
La frase che hai quotato esprime solo taluni miei dubbi sul livello di
coerenza strutturale del database con ciò che è logicamente corretto (es
unicità della data della fattura)!
Miseria, si tratta di una semplicissima query su tre tabelle! Ce la dobbiamo
fare prima delle ferie.
Ciao.
--
Simplex2
www.mdenittis.it

 Funziona?
purtroppo la query non filtra le righe della tabella GIACENZE , malgrado le 
due condizioni legate dall'operatore AND !
Mi stampa 4 giacenze , una per ogni esercizio !( 2002\2003\2004\2005)
Quindi anche la stampa della fattura è sballata , perchè un articolo viene 
quadruplicato !
Fattura 1 del 13 luglio 2005
Articolo 1  qtà1  giac 23
Articolo 1 qtà 1 giac 34
Articolo 1  qtà1  giac 7
Articolo 1 qtà 1 giac 56  ( buono questo)
mentre la fattura contiene SOLO un articolo1 qtà 1.
Il bello è che se tolgo il secondo inner join sulla tabella GIACENZE ( e le 
istruzioni  che lo seguono ) la stampa fattura è giusta ,contiene cioè una 
sola riga , ma senza la giacenza accanto!
Grazie e ciao 

 Grazie e ciao
E' già un passo avanti.
Ricapitoliamo perchè non ci si capisce più niente:
Allora, riprendo la definizione delle tre tabelle dal tuo post originario:
Tabella TESTE_DOCUMENTI  ( campi IDtesta)
Tabella RIGHE_DOCUMENTI ( campi IDtesta che relaziona la prima tabella ,
Articolo,ESERCIZIO )
Tabella GIACENZE  ( campi Articolo, giacenza , esercizio) .
Inoltre:
- IDtesta è una chiave per TESTE_DOCUMENTI ;
- ID_Riga pare essere chiave primaria della tabella RIGHE_DOCUMENTI;
- (Articolo, Esercizio) è una chiave per la tabella GIACENZE.
Sappiamo anche che la query
SELECT * FROM (TESTE_DOCUMENTI  TD INNER JOIN RIGHE_DOCUMENTI RD ON
TD.IDtesta=RD.IDTesta) WHERE TD.IDtesta=4
 produce una sola riga e questo ci conforta sulla coerenza dei dati nella
tabella RIGHE_DOCUMENTI.
Sappiamo anche che la query
SELECT * FROM ((TESTE_DOCUMENTI  TD INNER JOIN RIGHE_DOCUMENTI RD ON
TD.IDtesta=RD.IDTesta)
INNER JOIN GIACENZE GG ON GG.Articolo=RD.Articolo AND
GG.esercizio=RD.ESERCIZIO)
WHERE TD.IDtesta=4
Produce, per uno stesso esercizio (e quindi documento), più giacenze per il
medesimo articolo. Queste giacenze, per uno stesso
articolo, derivano da esercizi diversi.
Siccome la cosa mi pare insolita, ho ricostruito lo schema in un mio db,
l'ho popolato e ho lanciato la query. Funziona!
Dati:
Tabella TESTE_DOCUMENTI :
   IDTesta Testa
      1 Documento 2001
      2 Documento 2002
      3 Documento 2003
      4 Documento 2004
Tabella RIGHE_DOCUMENTI
   ID_Riga Articolo Esercizio IDTesta
      1 1 2001 1
      2 2 2001 1
      3 3 2001 1
      4 1 2002 2
      5 2 2002 2
      6 3 2002 2
      7 1 2003 3
      8 2 2003 3
      9 3 2003 3
      10 1 2004 4
      11 2 2004 4
      12 3 2004 4
Tabella GIACENZE:
   Articolo Esercizio Giacenza
      1 2001 2
      1 2002 3
      1 2003 5
      1 2004 7
      2 2001 4
      2 2002 6
      2 2003 10
      2 2004 14
      3 2001 6
      3 2002 9
      3 2003 12
      3 2004 28
      4 2001 8
      4 2002 12
      4 2003 15
      4 2004 21
Risultato della query
SELECT TD.Testa, RD.Esercizio, GG.Articolo, GG.Giacenza FROM
((TESTE_DOCUMENTI  TD INNER JOIN RIGHE_DOCUMENTI RD ON
TD.IDtesta=RD.IDTesta)
INNER JOIN GIACENZE GG ON GG.Articolo=RD.Articolo AND
GG.esercizio=RD.ESERCIZIO)
WHERE TD.IDtesta=4:
   Testa Esercizio Articolo Giacenza
      Documento 2004 2004 1 7
      Documento 2004 2004 2 14
      Documento 2004 2004 3 28
Ovvero, mettendo l'asterisco nel comanso SELECT
   TD.IDTesta Testa ID_Riga RD.Articolo RD.Esercizio RD.IDTesta GG.Articolo
GG.Esercizio Giacenza
      4 Documento 2004 10 1 2004 4 1 2004 7
      4 Documento 2004 11 2 2004 4 2 2004 14
      4 Documento 2004 12 3 2004 4 3 2004 28
Che mi sembra funzioni.
Torno a ripetere di controllare la consistenza dei dati nel tuo database
perchè mi sembra che lo schema, così come me lo hai descritto, non la
garantisca!
Prova e fammi sapere.
--
Simplex2
www.mdenittis.it
________________
LEGGE DEGLI EQUILIBRI DI SIMPLEX2
Da un grande potere, derivano grandi responsabilità,
da grandi responsabilità, derivano grandi rompimenti di palle,
i rompimenti di palle sono una gran perdita di tempo ma il tempo è denaro,
quindi una gran perdita di denaro comporta una grande perdita di potere.

Scusa Gabriele, ma ho visto che il messaggio ha perso la formattazione delle
tabelle:



Ciao.


 quindi una gran perdita di denaro comporta una grande perdita di potere.
guarda che è il contrario.
rileggi bene:potere>responsabilità>palle>perditempo>perdi denaro
cioè: potere----> perdi denaro.
ciao

  WHERE TD.IDtesta=4:
 la provo e ti fò sapere !
ciao e grazie


Esatto!
E' proprio questa l'essenza della legge.
potere ---> Perdi denaro ---> perdi potere
ed il ciclo si ferma in un punto di equilibrio: quello di chi non è
un'emerita mazza (e due, scusa Sergio)!
Da ciò discende, come corollario, che chi ha potere e denaro scarica la
responsabilità su qualche stronzo di turno.
--
Simplex2
www.mdenittis.it
________________


       4         2004         28 <--- NEW
....come faccio a distinguere le giacenze dell'esercizio 2004 associate al
documento IDTesta=4 da quelle associate a IDTesta 5?
Mi mancano, nella tabella GIACENZE o nella tabella RIGHE_DOCUMENTI, le
informazioni necessarie per associare dei record di questa tabella ad un
particolare IDTesta di un dato ESERCIZIO.
Questo è un problema.
Magari è proprio questo IL problema (che è strutturale e non dipende dalla
query).
Riflettici e tienici informati.


Allora?


 quindi una gran perdita di denaro comporta una grande perdita di potere.
Se è sbagliata tale deduzione , perchè non la correggi?
Ripeto:
potere>responsabilità>palle>perditempo>perdi denaro
cioè: potere----> perdi denaro, il contrario di :


 quindi una gran perdita di denaro comporta una grande perdita di potere.
Vabbè, la vediamo lunedì.
Ciao.
--
Simplex2
www.mdenittis.it
________________


 quindi una gran perdita di denaro comporta una grande perdita di potere.
Che, conseguentemente, ti fa perdere meno denaro. Ci sarà un punto di 
sella... (=di equilibrio :-) )
-- 
Jonathan Canova
infoCHIOCCIOLAaladinoinformatica.com
www.aladinoinformatica.com