Newsgroup: it.comp.appl.access
Titolo: creare un recordset con i risultati di un filtro

ciao a tutti..
vorrei proporvi un problema  a cui non riesco trovare una soluzione elegante
e soprattutto veloce, che mi eviti una serie "infinita" di "if
isnull(dlookup...)":
supponiamo di avere una form "fatture" e una sub-form "dettagli fattura"
Se faccio un filtro "by form" su un campo della tabella fatture, mi ritrovo
a "navigare" tra i record appartenenti alla tabella "fatture" che soddisfano
il filtro. e fin qui funziona!
se adesso faccio un altro filtro però sulla base di un campo appartenente
alla tabella "dettagli fattura" mi ritrovo a navigare tra TUTTI i record
appartenenti alla tabella Fatture, il filtro infatti mi nasconde solo i
record della sottomaschera non conformi alle specifiche del filtro. La cosa
ha una sua logica.. ma io vorrei eliminare anche tutte le fatture che non
hanno nemmeno un record nei dettagli che mi soddisfa il filtro indicato.
in definitiva cosa devo fare per avere un recordset che contiene solo le
fatture che hanno almeno un'occorrenza che soddisfa il filtro ?
Nota che non mi interessa avere un metodo in-place... cioè posso anche avere
un recordset esterno, una tabella di supporto e posso anche usare qualsiasi
metodo.. query di comando e o codice...
insomma idee eleganti da suggerire?
ciao grazie mille!



 ha scritto nel messaggio
news:newscache$bthiyf$w2a$1...@news.silink.com...

Una domanda: la sottomaschera è "legata" tramite un campo "chiave" con la
maschera principale?
Ciao.


certamente, come da ogni manuale!
nel caso di una fattura i suoi dettagli sono legati da IDFattura! :)
che idea hai in mente?
ciao!


Mi serviva per "orientarmi" nel suggerimento.
Scusa ma non ho ben afferrato il problema; se hai la sottomaschera legata
con la maschera principale vedi solo i dettagli della fattura in quel
momento "attiva". Quindi se fai una ricerca nei dettagli non potrà andare
oltre quei limiti; oppure tu vuoi cercare in tutti i dettagli di tutte le
fatture per arrivare alla fattura che contiene quel o quei dettagli?
Scusa ma vorrei capire bene...
Ciao.

> Scusa ma vorrei capire bene...
non ti preoccupare..
sarò felicissimo di lasciarmi aiutare a risolvere questo problema.. e farò
di tutto per spiegarmi meglio...
l'unica cosa che io voglio è ottenere una lista di fatture che hanno almeno
un record dettagli che soddisfa il filtro della sottomaschera...
supponiamo che la tabella fattura sia
IDFattura
nprogressivo
IDCliente
Data
....
e la tabella dettagli:
IDDettaglio
IDFattura
IDArticolo
Quantità
...
ok?
costruiamo adesso una maschera che rappresenti qeste due tabelle
(il caso classico di una subform all'interno di una form!)
bene
adesso voglio avere la lista di tutte le fatture che hanno almeno un
dettaglio con quantità > 100
come faccio ?
In questo caso specifico è facile costruire una stringa sql, basta basarsi
sulla proprietà filter della form .. ma vorrei soffermare l'attenzione
altrove...
poichè il filtro viene deciso dall'utente con un "filter by form" a priori
non conosco la stringa da generare.. (che non è un problema) però se invece
di fare un filtro facile come " quantità >100" usassi una cosa basata su
"IDarticolo" (notoriamente un numerico) rappresentato con una casella
cambinata con la colonna indice nascosta le cose si complicano non poco..
specie se uso magari dei caratteri jolli.. (fai delle prove e vedrai che la
proprietà filter della subform assume un valore strano, non conforme al
linquaggio sql..) e quindi come faccio io a generare una query adatta?
pensavo di scorrere i recordsetclone con una routine in vba.. fatto pure
questo... ma funziona bene solo con i dati a "livello" di fattura.. per
lavorare a "livello" di dettaglio dovrei prima sincronizzare i bookmark
della form con quello del recordest delle fatture che sto scorrendo... il
che mi porta non pochi problemi.. (oltre a brutti effetti video, mi partono
tutta una serie di eventi (on current ad esempio) che mi rallentano tutto
mostruosamente!)
ci state capendo qualcosa ? :)
in particolare mi serve perchè nel mio db ho associato in relazione uno
molti le fatture :
IDFattura
DataFattura
ecc...
con le ricevute bancarie relative:
IDRicevuta
IDFattura
DataRicevuta
Importo
IDBanca
Come faccio ad avere l'elenco delle fatture le cui ricevute bancarie scadono
il 30/6/00 ?
e l'elenco delle fatture le cui ricevute bancarie hanno come riferimento una
banca XXX or YYY ?
grazie a tutti per l'attenzione


Sei stato chiaro e limpido, speriamo che lo sia anch'io.
Creata la casella combinata (con origine dati la tabella Dettagli)
visualizza e ritorna il valore del campo IDArticolo, nell'evento "dopo
aggiornamento" puoi inserire il codice:
DoCmd.ApplyFilter , "IDFattura in (select IDFattura from Dettagli where
IDArticolo=" & Me.CasellaCombinata14 & ")"
Ciao.

 Ciao.
mmm mi sa che non ti seguo.. :(
ti spiace ripetere lentamente .. sono tordo! :)
oppure non mi sono spiegato bene io...
nel tuo esempio la ricerca è fatta conoscendo sufficientemente bene  la
clausola WHERE.. ma non è il mio caso.. l'utente potrebbe fare "filtri
strani" ovvero usare caratteri jolly in controlli come le caselle combinate
dalle colonne indice nascoste (fai una prova e applica un filtro tipo
"*qualchestringa*" in un controllo combi con l'origine numerica, ma la
colonna nascosta.. e poi vai a leggere il contenuto di me.filter.. troverai
una cosa NON-SQL!!! (mi sembra sia Lookup_IDCliente="*qualchestringa*")
in questo caso non posso usare la proprietà me.filter per costruire un
'altra query o per creare un'altra origine per un altro controllo...
Non potendo usare la prop. filter devo per forza lasciare che la maschera
elabori le sue cose e poi (quando ha finito) usare il recordsetclone per
crearmi una copia dei record che soddisfano il filtro...
a livello di form questo è facile..
le cose si complicano se cerchi di farlo all'interno di una SUB-form
infatti il suo recordset contiene solo i record relazionati al record
corrente della form-genitore.
e la domanda resta come faccio a ottenere la lista dei record della form
(quella genitore) che hanno almeno un record-figlio che soddisfa il filtro
nella subform ?
tieni presente che questa lista mi va bene in ogni forma... tabelle
supplementari, array, in codice sql..
HELP... a forza di sbattere la testa sul muro ho buttato giù il muro...
adesso dove la sbatto?
ciao ciao
grazie ciao

 ha scritto nel messaggio

Se TabellaFatture ha come chiave primaria un campo chiamato NumFattura.
Se TabellaDettagli ha tra gli altri un campo NumFattura  e un campo Codice
il cui Tipo dati è Testo.
Se queste due tabelle sono in relazione uno-a-molti in base al campo
NumFattura.
Se la maschera principale si chiama MascheraFatture ed ha come "Origine
record" TabellaFatture e contiene una sottomaschera che ha come "Origine
record" TabellaDettagli.
Se vuoi vedere tramite MascheraFatture solo le fatture il cui dettaglio
contiene un determinato Codice.
Allora creati una maschera (MASCHERA1) che contiene una casella di testo non
associata di nome Campo1 ed un pulsante di comando.
A fronte dell'evento "Su clic" del pulsante di comando genera il seguente
codice VBA:
Dim strFiltro As String
Dim strCerca As String
strCerca = "[Codice]=" & Chr$(34) & Me!Campo1 & Chr$(34)
strFiltro = "[NumFattura] IN (SELECT NumFattura FROM TabellaDettagli WHERE"
& strCerca & ")"
DoCmd.OpenForm FormName:="MascheraFatture", WhereCondition:=strFiltro
A questo punto apri MASCHERA1, digita nella casella di testo il valore del
campo Codice che stai cercando, premi il pulsante di comando.
Fammi sapere
Roberto

 ha scritto nel messaggio
news:newscache$1abmyf$rmn$1...@news.silink.com...

Probabilmente non avevo capito che volevi continuare ad utilizzare il
"filtro in base alla maschera" anche per la ricerca nella sottomaschera.
Avevo interpretato la tua affermazione: "...poichè il filtro viene deciso
dall'utente con un "filter by form" a priori
non conosco la stringa da generare.. (che non è un problema) però se invece
di fare un filtro facile come " quantità >100" usassi una cosa basata su
"IDarticolo" (notoriamente un numerico) rappresentato con una casella
cambinata con la colonna indice nascosta le cose si complicano non poco..
specie..." come un cercare di risolvere il problema con una casella
combinata e mi sono "concentrato" su quello.
Il filtro in base alla maschera non l'ho mai utilizzato (forse per pigrizia
o per masochismo) e non ho idea di come si "comporti"; mea culpa...
Ciao e buon lavoro.
P.S. E' chiaro che non demordo e cercherò di trovare un'altra soluzione,
stavolta speriamo giusta.


eccomi :)
Ciao, una cosa simile me l'aveva già suggerita Sergio Mazza ( che continuo a
ringraziare) e come lui hai dato per scontato che io conosca la clausola
where.. in effetti io non la conosco poichè la definisce l'utente runtime
creando usando "filter by form".
Certo se access fosse stato progettato meglio sarebbe stato suff. leggere la
proprietà filter della subform.form ma ci sono dei casi che filter usa
codice non sql e che quindi è inadatto per fare una cosa tipo "...WHERE " &
subform.Form.Filter
Non mi credi ? :)  prendi una form qualsiasi, applica un filtro basato su
una casella combinata collegata ad un campo numerico... tipo IDCliente, che
ha due colonne : Idcliente e NomeCliente dove IDCliente ha larghezza 0
Applica il filtro e verdrai che effettivamente la form filtra il proprio
recordset per soddisfare la tua richiesta... ma prova ora a leggere la
proprietà filter e dimmi cosa vedi! :)
troverai una cosa tipo "lookup_IDCliente like 'Ciccio snc'"
se poi usi i caratteri jolli è ancora peggio...
questo significe che, a meno che io non riesca a interpormi tra la form e il
motore di access per spiare il codice sql effettivamente passato, devo
attendere che il filtro venga eseguito e poi scandire, usando codice dao, il
recordset della form...
questo è fattibile per le form di primo livello.. ma per le form contenute
in una Subform le cose cambiano ... infatti il recordset contiene solo i
record figli del record della form principale.. e questo significa che
dovrei applicarla tanti filtri alla subform quanti sono i record della form
principale... e non mi sempra un esempio di ottimizzazione!
mi è venuta in questo momento un'idea...prima di dire boiate la testo e poi
vi faccio sapere...
tornando al discorso di prima, mi sono spiegato?
ti ringrazio ugualmente
Ciao ciao

fatture che hanno almeno un'occorrenza che soddisfa il filtro ?
come sono fatte le tabelle fatture e dettagli?  hai una tabella di
raccordo tra le due?
-------------------------------------
"You're part of the humanity!"
"No, I'm in the marketing."
(tratta da 
www.dilbert.com
)

 raccordo tra le due?
sono fatte nel più semplice dei modi
TabFattura            TabDettagli
IDFattura----|          IDDettagli
IDCliente      |-------IDFattura
Data                        IDArticolo
....                           Quantità
                                ....

IDCliente      |-------IDFattura
un modo potrebbe essere:
SELECT * 
FROM TabFattura
WHERE IDFattura IN (SELECT IDFattura
                                     FROM TabDettagli
                                     WHERE IDArticolo = ...
                                     GROUP BY IDFattura)
--
il sito comune di it.comp.appl.access:
http://members.xoom.it/it_db_access/