Precedente :: Successivo |
Autore |
Messaggio |
maraggos Eroe in grazia degli dei


Registrato: 05/05/06 18:30 Messaggi: 97 Residenza: Trieste
|
Inviato: 08 Feb 2008 20:02 Oggetto: help per una query in ACCESS |
|
|
ciao a tutti. Vado subito al dunque: ho una tabella anagrafe dei soci di un club, ed una sottotabella con i pagamenti delle quote sociali.
Io voglio mandare un bollettino di ccp a tutti quelli che non hanno pagato la quota di quest'anno.
Devo dunque creare una query selezionando tutti i soci che, nella tabella secondaria, NON hanno un record con la stessa ID+ANNO.
Come faccio ?
Grazie
Alberto
P.S. aggiungo che purtroppo NON so programmare in visual basic ...  |
|
Top |
|
 |
GrayWolf Dio maturo


Registrato: 03/07/05 17:24 Messaggi: 2325 Residenza: ... come frontiera i confini del mondo...
|
Inviato: 15 Feb 2008 07:44 Oggetto: |
|
|
Ciao,
supponendo che le tabelle si chiamino "socio" e "pagamento"
questa fornisce i risultati voluti:
Codice: |
SELECT DISTINCT [SOCIO].[NOME]
FROM SOCIO, PAGAMENTO
WHERE NOT EXISTS(SELECT *
FROM PAGAMENTO
WHERE PAGAMENTO.ID = SOCIO.ID AND PAGAMENTO.ANNO = AnnoRichiesto);
|
Note
AnnoRichiesto naturalmente non esiste... Access, quando mandi in esecuzione la query, ti chiede il valore; inserendo l'anno voluto ottieni tutte le righe che NON hanno corrispondenza
DISTINCT SOCIO.NOME serve per avere una sola riga di nominativo
Se poi t'interessa sapere chi ha pagato duplica la query eliminando il NOT dopo la WHERE cioe WHERE EXISTS(...tutto uguale...)
|
|
Top |
|
 |
maraggos Eroe in grazia degli dei


Registrato: 05/05/06 18:30 Messaggi: 97 Residenza: Trieste
|
Inviato: 15 Feb 2008 10:45 Oggetto: |
|
|
grazie Graywolf ! Purtroppo non ho pratica con visual basic, e così ho risolto con un accrocchio di tabelle-query e filtri.
In pratica, creo una tabella partendo dai pagamenti, filtrando quelli relativi all'anno interessato: in questo modo mi ritrovo un tabellone con tutti i soci dove quelli che hanno pagato hanno anche valorizzato l'anno e l'importo. In fase di report, stampo solo quelli where anno = null ... e il gioco è fatto.
Certo, ho bruciato qualche miliardo di neuroni ma ... speriamo ne sia valsa la pena !
Saluti
Alberto |
|
Top |
|
 |
GrayWolf Dio maturo


Registrato: 03/07/05 17:24 Messaggi: 2325 Residenza: ... come frontiera i confini del mondo...
|
Inviato: 15 Feb 2008 12:25 Oggetto: |
|
|
di niente,
ottimo workaround ma...
.1 se apri il database con Access [non so che versione tu abbia, io lavoro con 2000]
.2 scegli query
.3 scegli "crea query in visualizzazione struttura"
.4 chiudi il form "Mostra tabella"
.5 click sul pulsante "SQL" [nella barra sotto a quella del menu principale]
.6 nella finestra che ti appare copi/incolli la query che ti ho esposto
.7 la modifichi con i nomi delle tue tabelle e delle tue colonne
.8 premendo il pulsante con il punto esclamativo per l'esecuzione, ottieni il risultato
.10 chiudi salvando la query con il nome che vuoi
.11 vai su report ne crei uno includendo la query che hai appena salvato e il gioco è fatto
 |
|
Top |
|
 |
maraggos Eroe in grazia degli dei


Registrato: 05/05/06 18:30 Messaggi: 97 Residenza: Trieste
|
Inviato: 15 Feb 2008 15:14 Oggetto: |
|
|
mmmm.... very interesting !
e dimmi una cosa: la sintassi dell'sql usato qui è per caso la stessa di MySql ?
e ancora: in quella (magica) finestrella ci si possono scrivere delle espressioni if/then/else, o dei pezzi di programma visualbasic ?
Come avrai capito, inizio solo ora ad occuparmi di Access ... mi sa che dovrò investire in un manuale !
Grazie ancora.
Alberto |
|
Top |
|
 |
GrayWolf Dio maturo


Registrato: 03/07/05 17:24 Messaggi: 2325 Residenza: ... come frontiera i confini del mondo...
|
Inviato: 15 Feb 2008 21:04 Oggetto: |
|
|
la clausola SQL che ho postato fa parte di SQL-92 e si penso, pur non conoscendo completamente mySQL, che sia supportata anche da quel DBMS.
Nelle queries di Access si possono inserire alcune istruzioni VB perché in realtà l'SQL usato in Access è stato "adattato" per risolvere immediatamente alcuni problemi che comporterebbero una più approfondita conoscenza di SQL;
ad esempio in una query di access si può introdurre l'istruzione iif che non è normalmente supportata da SQL standard.
Comunque nella sezione macro ci sono a disposizione una serie di comandi che implicitamente fanno riferimento a VBA, nella sezione Maschere si possono introdurre delle routine di VBA.
VBA sta per Visual Basic for Application.
Un manuale e lezioni di Access gratuiti e in italiano li puoi scaricare da qui
oppure puoi effettuare una consultazione on-line qui
edit
del buon materiale anche qui |
|
Top |
|
 |
maraggos Eroe in grazia degli dei


Registrato: 05/05/06 18:30 Messaggi: 97 Residenza: Trieste
|
Inviato: 17 Feb 2008 23:28 Oggetto: |
|
|
grazie, grazie: gentilissimo ! |
|
Top |
|
 |
maraggos Eroe in grazia degli dei


Registrato: 05/05/06 18:30 Messaggi: 97 Residenza: Trieste
|
Inviato: 21 Feb 2008 17:54 Oggetto: |
|
|
bene, mi sono un po' acculturato sull'aargomento, e ho cercato di sostituire in mio accrocchio con la più pulita query di lupo grigio però... non mi funzionava Allora ho leggermente modificato il tutto alla luce dei recenti studi in questo modo:
Citazione: | SELECT *
FROM anagrafe
WHERE NOT EXISTS
(SELECT *
FROM pagamenti
WHERE pagamenti.ID = anagrafe.ID AND pagamenti.ANNO = Forms![scegli anno sociale]![data] AND anagrafe.CESSATO = True
);
|
... che tradotto, secondo me, vuol dire:
prendi tutti i campi di ANAGRAFE ...
ma solo se non esiste un record nella tabella PAGAMENTI ...
che soddisfi ai criteri che ti dico tra una parentesi e l'altra.
Da notare che:
- non ho fatto un JOIN tra le due tabelle (a che pro ?);
- quindi non ho usato DISTINCT, visto che le ID di ANAGRAFE sono comunque univoche;
- la seconda tabella (PAGAMENTI) può contenere da zero a più righe con i criteri richiesti;
- la seconda tabella non ha un indice univoco, ma è ordinata per ID e ANNO;
... naturalmente non mi funzia, e considera comunque tutte le righe di ANAGRAFE.
Dov'è l'inghippo ?
Grazie
Alberto |
|
Top |
|
 |
GrayWolf Dio maturo


Registrato: 03/07/05 17:24 Messaggi: 2325 Residenza: ... come frontiera i confini del mondo...
|
Inviato: 21 Feb 2008 21:55 Oggetto: |
|
|
maraggos ha scritto: | bene, mi sono un po' acculturato sull'aargomento, e ho cercato di sostituire in mio accrocchio con la più pulita query di lupo grigio però... non mi funzionava Allora ho leggermente modificato il tutto alla luce dei recenti studi in questo modo:
Citazione: | SELECT *
FROM anagrafe
WHERE NOT EXISTS
(SELECT *
FROM pagamenti
WHERE pagamenti.ID = anagrafe.ID AND pagamenti.ANNO = Forms![scegli anno sociale]![data]
AND anagrafe.CESSATO = True
);
|
... che tradotto, secondo me, vuol dire:
prendi tutti i campi di ANAGRAFE ...
ma solo se non esiste un record nella tabella PAGAMENTI ...
che soddisfi ai criteri che ti dico tra una parentesi e l'altra.
Da notare che:
- non ho fatto un JOIN tra le due tabelle (a che pro ?);
- quindi non ho usato DISTINCT, visto che le ID di ANAGRAFE sono comunque univoche;
- la seconda tabella (PAGAMENTI) può contenere da zero a più righe con i criteri richiesti;
- la seconda tabella non ha un indice univoco, ma è ordinata per ID e ANNO;
... naturalmente non mi funzia, e considera comunque tutte le righe di ANAGRAFE.
Dov'è l'inghippo ?
Grazie
Alberto |
L'inghippo è questo: AND anagrafe.CESSATO = True
1°
La subselect legata alla clausola NOT EXISTS, non contiene la tabella anagrafe.
2°
la query deve essere:
Codice: |
SELECT *
FROM anagrafe
WHERE NOT EXISTS
(SELECT *
FROM pagamenti
WHERE pagamenti.ID = anagrafe.ID AND pagamenti.ANNO = Forms![scegli anno sociale]![data]
)
AND anagrafe.CESSATO = True;
|
AND anagrafe.CESSATO = True questa clausola deve essere "fuori" dalla subselect perché fa riferimento alla tabella principale [anagrafe] dichiarata nel from
3°
Per quale perverso e oscuro disegno vuoi far pagare quelli che sono cessati???
Se ho ben intuito la colonna cessato contiene vero se il socio non è più tale.
Se la mia intuizione è corretta, la clausola dovrebbe essere AND anagrafe.CESSATO = False
A meno di voler far pagare quelli cessati che, malandrini, non hanno pagato la quota prima di andarsene  |
|
Top |
|
 |
maraggos Eroe in grazia degli dei


Registrato: 05/05/06 18:30 Messaggi: 97 Residenza: Trieste
|
Inviato: 22 Feb 2008 00:37 Oggetto: |
|
|
GRANDE, lupo grigio ... c'ero QUASI arrivato anch'io ... per esclusione: avevo infatti notato che, togliendo il test dei cessati, le cose avevano più senso ... ! Ancora due o trecento prove ...
Quanto a far pagare anche a loro ... beh... dovevo ancora verificare se "vero" significa che il quadratino ha la pipa (e quindi il socio non c'è più) oppure no ...
Mi sei stato di grandissimo aiuto: grazie 1000, non è così facile trovare uno con tanta pazienza !
Alberto |
|
Top |
|
 |
GrayWolf Dio maturo


Registrato: 03/07/05 17:24 Messaggi: 2325 Residenza: ... come frontiera i confini del mondo...
|
Inviato: 22 Feb 2008 01:10 Oggetto: |
|
|
De nada Hombre,
es un placer...
si tiene algun problema, yo soy aqui.
Di niente, Uomo
è un piacere
se hai qualche problema sono qui. |
|
Top |
|
 |
maraggos Eroe in grazia degli dei


Registrato: 05/05/06 18:30 Messaggi: 97 Residenza: Trieste
|
Inviato: 22 Feb 2008 10:00 Oggetto: |
|
|
muy bien chaval, no lo olvidaré, muchas gracias !
Hasta el pròximo follòn !  |
|
Top |
|
 |
|