Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
help per una query in ACCESS
Nuovo argomento   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
maraggos
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 05/05/06 18:30
Messaggi: 97
Residenza: Trieste

MessaggioInviato: 08 Feb 2008 20:02    Oggetto: help per una query in ACCESS Rispondi citando

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 ... Sad
Top
Profilo Invia messaggio privato
GrayWolf
Dio maturo
Dio maturo


Registrato: 03/07/05 17:24
Messaggi: 2325
Residenza: ... come frontiera i confini del mondo...

MessaggioInviato: 15 Feb 2008 07:44    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
maraggos
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 05/05/06 18:30
Messaggi: 97
Residenza: Trieste

MessaggioInviato: 15 Feb 2008 10:45    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
GrayWolf
Dio maturo
Dio maturo


Registrato: 03/07/05 17:24
Messaggi: 2325
Residenza: ... come frontiera i confini del mondo...

MessaggioInviato: 15 Feb 2008 12:25    Oggetto: Rispondi citando

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


Very Happy
Top
Profilo Invia messaggio privato
maraggos
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 05/05/06 18:30
Messaggi: 97
Residenza: Trieste

MessaggioInviato: 15 Feb 2008 15:14    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
GrayWolf
Dio maturo
Dio maturo


Registrato: 03/07/05 17:24
Messaggi: 2325
Residenza: ... come frontiera i confini del mondo...

MessaggioInviato: 15 Feb 2008 21:04    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
maraggos
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 05/05/06 18:30
Messaggi: 97
Residenza: Trieste

MessaggioInviato: 17 Feb 2008 23:28    Oggetto: Rispondi citando

grazie, grazie: gentilissimo !
Top
Profilo Invia messaggio privato
maraggos
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 05/05/06 18:30
Messaggi: 97
Residenza: Trieste

MessaggioInviato: 21 Feb 2008 17:54    Oggetto: Rispondi citando

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 Embarassed 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
Profilo Invia messaggio privato
GrayWolf
Dio maturo
Dio maturo


Registrato: 03/07/05 17:24
Messaggi: 2325
Residenza: ... come frontiera i confini del mondo...

MessaggioInviato: 21 Feb 2008 21:55    Oggetto: Rispondi citando

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 Embarassed 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


La subselect legata alla clausola NOT EXISTS, non contiene la tabella anagrafe.


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


Per quale perverso e oscuro disegno vuoi far pagare quelli che sono cessati??? Very Happy
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 Wink
Top
Profilo Invia messaggio privato
maraggos
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 05/05/06 18:30
Messaggi: 97
Residenza: Trieste

MessaggioInviato: 22 Feb 2008 00:37    Oggetto: Rispondi citando

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 ... Rolling Eyes

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 ... Very Happy Very Happy Very Happy

Mi sei stato di grandissimo aiuto: grazie 1000, non è così facile trovare uno con tanta pazienza !

Alberto
Top
Profilo Invia messaggio privato
GrayWolf
Dio maturo
Dio maturo


Registrato: 03/07/05 17:24
Messaggi: 2325
Residenza: ... come frontiera i confini del mondo...

MessaggioInviato: 22 Feb 2008 01:10    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
maraggos
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 05/05/06 18:30
Messaggi: 97
Residenza: Trieste

MessaggioInviato: 22 Feb 2008 10:00    Oggetto: Rispondi

muy bien chaval, no lo olvidaré, muchas gracias !
Hasta el pròximo follòn ! Razz
Top
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 2 ore
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi