Newsgroup: it.comp.appl.access
Titolo: FilterOn ed OrderByOn e' possibile farli andare in un 'colpo solo'

Solita form testate fatture
Alcuni campi per la selezione data documento, numero e cosi via
Alcuni campi per scegliere l'ordinamento desiderato, ditta, data doc, 
num.doc. e via
Ora, il problema sta nel fatto che, inserisco il criterio di selezione nella 
proprieta' Filter e parte l'aggiornamento form continua
Poi, il codice va a leggere il campo da usare come ordinamento e ri-lancia 
una seconda interogazione al db per restituire il recordset ordinato
Insomma il doppio del tempo che ci metterebbe se selezione+ordinamento 
fossero eseguite in un sol colpo
La mia domanda e':
- e' possibile usare le priprieta' Filter per impostare una selezione ed 
OrderBy per impostare l'ordinamento di un recordset, senza lanciare due 
volte l'interrogazione ad db ?
Ho gia' provato a disattivare sia il FilterOn che l'OrderByOn ma appena si 
riattiva l'uno, parte l'interrogazione, e bisogna attendere fino al suo 
completamento, per attivare la seconda ed attendere il completamento della 
nuova interrogazione
Ciao e grazie
RobertoA

 ha scritto nel messaggio 
news:484a...@newsgate.x-privat.org...

Puoi modificare l'origine dati della form includendo la condizione Where e 
l'Order By costruito ad-hoc...
Ciao.
-- 
Sergio MAZZA 


Si, potrei
Rinunciando pero' alla comodita' del Filter ed OrderBy
Volevo capire se si potevano prendere i due piccioni con una fava
Ma mi sembra nun se pozza
Ciao e grazie
RobertoA

RobertoA ha scritto:

Ciao roberto, non so se ho capito bene ma mi sembra che tu abbia bisogno di applicare un filtro 'al volo' in una maschera continua. Io personalemnte uso questa sub generica da applicare ad una qualsivoglia maschera continua cliccando sull'etichetta del campo
Public Sub OrdCres(ByRef MASCHERA As Form, ByRef CAMPO As String, ByRef Etichetta As String)
 
    DoCmd.Hourglass (True)                           ' Clessidra. Il filtro stà lavorando
 
    With MASCHERA
 
        .Controls(Etichetta).SpecialEffect = 2       ' Premo il "PULSANTE"
        .Controls(Etichetta).BackColor = 26367       ' Cambio colore
        .OrderBy = CAMPO                             ' Ordino
        .OrderByOn = True                            ' Effettuo l'ordinamento
        .Controls(Etichetta).SpecialEffect = 0       ' Rilascio il "PULSANTE"
        .Controls(Etichetta).BackColor = 16777164    ' Colore originale
 
    End With
 
    DoCmd.Hourglass (False)                          ' Rimuovo clessidra
 
End Sub
Ti permette di ordinare in ordine crescente (o decrescente con poche modifiche) una qualunque form richiamandola dall'evento click
Si può anche impostare alla prima pressione = crescente, alla seconda=decrescente. Se ti interessa te la posto
Ciao
-- 
Questo articolo e` stato inviato dal sito web 
http://www.nonsolonews.it

 RobertoA
La "comodità" è la stessa; se basi la form solo sulla Select "nuda e cruda" 
con la proprietà RecordSource ottieni l'istruzione SQL (es. SELECT prova.* 
FROM prova;).
Con la fuzione Replace sostituisci il ";" finale, con la Where e l'Order By; 
giocando con le funzioni per manipolare le stringhe puoi rimuovere la 
"Where" fino alla parola "Order".
Praticamente te la ricrei tu la Filter...
Ciao.
-- 
Sergio MAZZA 


Interessante, grazie
Ma il mio problema era poter lanciare l'interrogazione sul db una sola volta 
e non una dopo l'OrderBy ed una seconda dopo la FilterOn
Ciao
RobertoA 

 Praticamente te la ricrei tu la Filter...
Si, e' vero
Pero' mi sembrava piu' comodo usare la proprieta' di Access Filter ed 
OrderBy piuttosto che mantenermi sempre un paio di variabili per ricostruire 
al volo la stringa da inviare al db
Ciao
RobertoA

 RobertoA
Giuro che la Stele di Rosetta mi è più chiara di: "...mantenermi sempre un 
paio di variabili...".
Le variabili le utilizzi e poi muoiono all'uscita della Sub; a meno di 
utilizzare delle Public, ma non ne vedo il motivo...
Ciao.
-- 
Sergio MAZZA 

 utilizzare delle Public, ma non ne vedo il motivo...
Solitamente tengo, per ogni recordset, quattro variabili, con lo scope 
solitamente ridotto al modulo della form:
dtaArticoli_curselect
dtaArticoli_curfrom
dtaArticoli_curwhere
dtaArticoli_cursort
sommando le quali ottengo la mia bella stringa da passare al db
Questo per la comodita' di cambiare solo l'ordinamento o solo la where senza 
toccare le altre parti
Nel caso dell'ambiente Access, la proprieta' Filter e la proprieta' OrderBy 
del recordset attuale sono esattamente le mie variabili dtaArticoli_curwhere 
e dtaArticoli_cursort ("...mantenermi sempre un  paio di variabili...")
Purtroppo non riesco a sfruttare la Filter e la OrderBy perche' mi 
rinfrescano il recordset appena le tocco e questo volevo evitarlo
Volevo avviare l'aggiornamento recordset "...quando lo dico io...."
Ciao
RobertoA

 paio di variabili...".
Sergio sei un mito ;<))))))))))))))))))))))
Dopo una giornata a base di una cattiva imitazione di cioccolata un 
sorrisino ci voleva.
-- 
ac
y-1=x

 RobertoA
Ok; ma non capisco se hai provato il suggerimento e hai riscontrato "un 
problema", o è solo un presentimento, o cosa?
Comunque io avevo in mente una cosa del tipo:
Sub SplittaStrSQL()
Dim strSQL As String
strSQL = "Select * From Tabella Where nomeCAmpo='ciccio' Order By nomeCampo"
Debug.Print rimuoviFiltro(strSQL)
Debug.Print rimuoviOrdinamento(strSQL)
End Sub
Function rimuoviFiltro(strSQL As String) As String
If InStr(1, UCase(strSQL), "WHERE") = 0 Then
    Exit Function
End If
Dim inizio As Integer, fine As Integer, tmp_strSQL As String
tmp_strSQL = strSQL
inizio = InStr(1, tmp_strSQL, "where") - 1
If InStr(1, tmp_strSQL, "order") > 0 Then
    fine = InStr(1, tmp_strSQL, "order") - 1
Else
    fine = Len(tmp_strSQL) + 1
End If
Mid(tmp_strSQL, inizio, fine) = String$(fine - inizio, "|")
rimuoviFiltro = Replace(tmp_strSQL, "|", "")
End Function
Function rimuoviOrdinamento(strSQL As String) As String
If InStr(1, UCase(strSQL), "ORDER") = 0 Then
    Exit Function
End If
rimuoviOrdinamento = Left(strSQL, InStr(1, strSQL, "Order") - 1)
End Function
E volendo puoi ottenere la Select:
Dim strSQL As String
strSQL = "Select * From Tabella Where nomeCAmpo='ciccio' Order By nomeCampo"
strSQL = rimuoviFiltro(strSQL)
strSQL = rimuoviOrdinamento(strSQL)
Debug.Print strSQL
Ciao.
-- 
Sergio MAZZA 

 y-1=x
Ma lui mi fa l'assist!!
Ciao.
-- 
Sergio MAZZA