Newsgroup: it.comp.appl.access
Titolo: Come fare restituire ad una query i campi vuoti?

Salve a tutti,
Sto cercando di inserire in una query i dati provenienti da quattro tabelle,
tConsuntivo, tBudget e tForecast. I campi di queste tabelle sono uguali e
cioè Codice contabilità, codice centro di costo, esercizio (cioè una data) e
importo. Ho poi una quarta tabella "abbinamenti" che, dato il codice
contabilità e il centro di costo, mi individua la riga di Conto Economico.
Il grosso problema è che, ad es. in alcune tabelle potrebbero "mancare" dei
record e cioè nella tabella budget potrebbe non esserci un conto contabilità
(e il relativo valore 0) che è stato creato successivamente. In questo modo,
quando lancio la query, non trovando il corrispondente conto di contabilità
generale nella tabella budget, la query mi nasconde tutto il record, anche
se, ad es., il dato è presente nelle altre due tabelle. A me servirebbe
dunque una query che, dato il conto X di contabilità generale, mi faccia
vedere che tale conto valeva X a consuntivo, X a forecast e, se non
previsto, 0 a budget.
Mi sto perdendo in un bicchier d'acqua? Come fare?
Ciao
Massimo

 
Cambia il tipo di join fra le tabelle della query.
Devi fare in modo che la freccia punti la tabella dove i dati possono 
mancare.
Per visualizzare uno 0 quando il campo e' vuoto puoi utilizzare la 
funzione nz, es. 
Budget : Nz([valBudget];0)
Ciao
-- 
JBad

 wrote in message
MPG.1447bfd25...@news.tin.it...



Ho costruito le 4 tabelle come da te indicato ed ho provato con i LEFT JOIN
(come suggerito da JBad) e  funziona.
SELECT ContoGenerale.CodiceCont, ContoGenerale.CodiceCentro,
ContoGenerale.Descrizione, tConsuntivo.Importo, tForecast.Importo,
Tbudget.Importo
FROM ((ContoGenerale LEFT JOIN Tbudget ON (ContoGenerale.CodiceCont =
Tbudget.CodiceCont) AND (ContoGenerale.CodiceCentro = Tbudget.CodiceCentro))
LEFT JOIN tConsuntivo ON (ContoGenerale.CodiceCont = tConsuntivo.CodiceCont)
AND (ContoGenerale.CodiceCentro = tConsuntivo.CodiceCentro)) LEFT JOIN
tForecast ON (ContoGenerale.CodiceCont = tForecast.CodiceCont) AND
(ContoGenerale.CodiceCentro = tForecast.CodiceCentro)
WHERE (((tForecast.DataEsercizio)=#1/1/00# Or (tForecast.DataEsercizio) Is
Null) AND ((tConsuntivo.DataEsercizio)=#1/1/00# Or
(tConsuntivo.DataEsercizio) Is Null) AND ((Tbudget.DataEsercizio)=#1/1/00#
Or (Tbudget.DataEsercizio) Is Null));
Un 'altra possibilità (provata e funzionante) è quella di mettere il
contenuto delle 3 tabelle in una sola con un un nuovo campo che indichi la
tipologia del record (BUDGET,CONSUNTIVO...)
Crei una query tra questa nuova tabella e la tabella ABBINAMENTI ed infine
su questa query fai una bella query a campi incrociati dove le colonne
saranno ovviamente Budget,Consuntivo...
Ciao Nicola
email: metti inwind al posto  di NOSPAM


[CUT]
Chiedo scusa per l'intrusione.
Caro Massimo,
dove è scritto che devi realizzare il tuo progetto con un'UNICA query nella
quale entrano contemporaneamente in join le tue 4 tabelle?
Poiché è vero, come tu dici, che potresti avere il Consuntivo e non il
Budget, ma sicuramente è vero anche il contrario, ma è una realtà che i tipi
di join sono solo 3 e ben definiti e non sono un numero indefinito e
personalizzabili, mi sembra chiaro che con un unica query non se ne esce
fuori.
Inoltre tu precisi che la tabella "con i dati a consuntivo sono costretto a
farla comparire + volte...." ; e questo è comprensibile, visto che del
consuntivo ti serviranno oltre agli importi dell'esercizio in corso almeno
quelli dell'esercizio precedente per metterli a confronto. Questo avvalora
ancora di più il fatto che il tutto non può essere realizzato con un'unica
query a meno di scriverla in SQL adoperando select nidificate.
La soluzione più semplice, secondo me, sta in un'altra tua affermazione che
dice "L'ho già fatto ma funzionerebbe solo se in quella query ci fossero
solo due tabelle.". Ciò significa che puoi risolvere il problema creando più
queries a cascata, ognuna delle quali è basata solamente su due oggetti;
ovvero la prima query (Query1) sarà basata su due delle quattro tabelle; la
seconda query (Query2) avrà in join Query1 e la terza tabella e così via
sino ad ottenere con la quarta query il risultato agognato; parlo di quattro
e non di tre query in quanto, come detto sopra, la tabella consuntivo
entrerà in join su due query: una volta per ricavare i dati dell'esercizio
in corso e una seconda volta per ricavare i dati dell'esercizio precedente.
Naturalmente il problema degli importi con valore Null dovrai affrontarlo
solo per l'ultima query; nelle query intermedie non ti crea alcun problema,
anzi potrebbe servirti alla fine per filtrare le righe con tutti gli importi
nulli e che abbiano significativi solo i codici. Comunque di questo problema
ti è già stata data la soluzione.
E' anche evidente che alle relazioni uno-a-uno fra le tabelle non devi
applicare l'integrità referenziale.
Se sei d'accordo che questa è la soluzione, il giocattolo funzionerà solo a
condizione che nella prima query sia in join la tabella che ha tutti i
record, ovvero, secondo me, la tabella Abbinamenti; naturalmente, per questa
query, sceglierai il tipo di join che ti include tutti i record di questa
tabella.
--
Roberto
---------------------------------------------
il sito comune di it.comp.appl.access:
http://members.xoom.it/it_db_access/
---------------------------------------------


Perché non fai un SQL Unione del tipo
SELECT campo1, campo2,........
FROM tabella1(o query1)
UNION SELECT campo1,campo2,.....
FROM tabella2(o query2);
Ciao Giorgio

 wrote in message
8ro5hp$ahe$1...@news1.sunrise.ch...
