Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] Problema completamento automatico testo in Textbox

Salve..
Avevo bisogno di creare una specie di completamento automatico del testo in 
dei TextBox e dei ComboBox prendendo dei dati da un DB Access..
Ho fatto questo:
code:Private Sub cmbint_KeyUp(KeyCode As Integer, Shift As Integer)
    [ ... ] Parte di connessione al DB
    Dim sql As String
    sql = "SELECT intda FROM azioni WHERE intda LIKE '" & 
Apostrofo(cmbint.Text) & "%' ORDER BY intda"
    rs.Open sql, cn, 3, 3
    If (Not rs.EOF) And KeyCode > 32 And KeyCode <> vbKeyLeft And KeyCode <> 
vbKeyRight Then
        Dim inisel
        inisel = Len(cmbint.Text)
        cmbint.Text = rs("intda")
        cmbint.SelStart = inisel
        cmbint.SelLength = Len(cmbint.Text)
    End If
    rs.Close
End SubIn pratica sull'evento keyUp leggo il textbox e vado a prendere la 
prima occorrenza del DB che inizia con ciò che è stato immesso nel textbox e 
seleziono la parte aggiunta, funziona, ma ha un problema, è lento, troppo 
lento, premenendo velocemente (poi nenache tanto) i tasti sulla tastiera non 
fa in tempo a selezionare il testo e quindi ciò che si scrive va ad 
aggiungersi a ciò che già sta nella textbox invece di sostituirvicisi..
Spero di essere stato chiaro..
Consigli?
Grazie mille..
zoodany.. 

 Ho fatto questo:
[snip]
Non c'è il bell'esempio del Mes nel Zito Comune?
Boh, non sono riuscito a trovarlo...
Prova qui:
http://www.gbcdepot.com/free/vb_esempi/samples_text_ConSuggerimentoParole.zip
bau bau
-> GbC|
www.gbcweb.com

 Consigli?
Se le scelte possibili non sono tantissime, potresti caricare in locale il
recordset, invece di andarlo a leggere tutte le volte dal database.
-- 
Salutoni
Sergio
Per rispondere... togli il group dall'indirizzo
Se i tempi non chiedono la tua parte migliore, inventa altri tempi. 
(Baolian, libro II, vv. 16-17)
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 End Sub
La cosa migliore è ovviamente quella di caricare il recordset una 
tantum e poi eseguire un banale Filter in locale, ma se hai scelto 
questa tecnica di riaggiornare continuamente, evidentemente hai la 
necessità di essere sempre aggiornato con i nuovi inserimenti eseguiti 
da altri utenti.
In tal caso, puoi cercare di velocizzare la cosa in diversi modi (non 
esclusivi):
- Indicizzare clustered (Access lo fa?) la tabella sul campo su cui fai 
l'order by
- Visto che ti serve un solo record, inserire un Top 1 (che poi Access 
lo fa with ties, ma meglio che niente)
- Mantenere aperta la connessione e passarla byref al recordset anzichè 
riaprirla tutte le volte
- Aprire il recordset in maniera statica (non usare quei cancheri 
brutti di 3,3 quando esistono le costanti).
Con questo, e sperando che la rete sia abbastanza veloce e la tabella 
non enorme, dovresti arrivare ad una performance accettabile.
Se invece sei disposto a rinunciare all'aggiornamento in tempo reale 
con i nuovi inserimenti di altri utenti, un filter su un recordset 
preordinato è la cosa migliore.
Ciao
Alberto
-- 
A questo punto hanno trovato un muro,
un muro duro, molto molto duro,
che siamo noi.

 sempre aggiornato con i nuovi inserimenti eseguiti da altri utenti.
Si, ho necessità di essere aggiornato con i nuovi inserimenti però potrei 
farlo ogni tanto e non in tempo reale, quindi la soluzione che mi proponi 
potrebbe anche andarmi bene... potresti però spiegarmi come si fa? :)
Grazie mille..
zoodany.. 

zoodany.. scriveva il 12/12/2005 :

Come si fa... a fare cosa?
Un recordset lo sai già aprire, per il filter basta scriverlo e premere 
F1...
Esattamente, cos'è che non ti è chiaro?


 Esattamente, cos'è che non ti è chiaro?
Allora, io apro il recordset selezionando tutti i record della tabella per 
esempio sul Form_Load in modo da non doverlo aprire ogni volta nell'evento 
KeyUp del textbox, giusto? ma poi come faccio a mantenerlo aperto e fare il 
filter "in locale"?
Grazie ancora...
zoodany.. 

 e fare il filter "in locale"?
RCS.Filter="campo like '" & apicino(txt1.Text) & "%'"
Però di premere F1 te l'ho già detto. Se non sei in grado di usare la 
guida, conviene che ti fermi e impari, come prima cosa, l'uso dello 
strumento principe di apprendimento: MSDN.
Ciao


 strumento principe di apprendimento: MSDN.
E hai anche ragione....... :)
Grazie di nuovo...
zoodany.. 

[OT] Ma tu sei lo Zoodany di IAFD, quello con la A75 ?!?

 [OT] Ma tu sei lo Zoodany di IAFD, quello con la A75 ?!?
Ehm... Si...... :)
zoodany... 

 fare il completamento automatico... È cosa buona e giusta?
Se i textbox devono essere completati con cose diverse, che non siano 
colonne diverse di una stessa selezione (nel caso basterebbe usare un 
filter su una colonna diversa per ogni textbox), allora sì, ti serve un 
recordset per ogni textbox.
Ma un rcs aperto non ingombra niente (a meno che non stiamo parlando di 
decine di migliaia di righe, ma in quel caso andrebbe rivista la scelta 
di Access come strumento dbms), mentre una query su un dbms file-based, 
soprattutto se con un order by, è una cosa spaventosamente 
inefficiente.
Morale: meglio dieci query una-tantum, anche se con molti risultati, 
che cento query da pochi risultati ciascuna.
Con altri strumenti, forse si potrebbe anche ribaltare la convenienza 
(con una SP di Sql-Server potresti farcela anche aprendo ogni volta il 
recordset).



Ho fatto tutto come mi hai consigliato, ma il problema è rimasto....... 
Quando scrivo velocemente con la tastiera non funziona... :-(
zoodany.. 


il codice ora č cosě:
Private Sub cmbint_KeyUp(KeyCode As Integer, Shift As Integer)
    rsintda.Filter = "intda LIKE '" & Apostrofo(cmbint.Text) & "%'"
    If (Not rsintda.EOF) And KeyCode > 32 And KeyCode <> vbKeyLeft And 
KeyCode <> vbKeyRight Then
        Dim inisel
        inisel = Len(cmbint.Text)
        cmbint.Text = rsintda("intda")
        cmbint.SelStart = inisel
        cmbint.SelLength = Len(cmbint.Text)
    End If
End Sub
Private Sub Form_Load()
    [...] Connessione al DB
    Set rsintda = New ADODB.Recordset
    cn.Open stringA
    Dim sql As String
    sql = "SELECT DISTINCT intda FROM azioni ORDER BY intda"
    rsintda.Open sql, cn, 3, 3
End Function
zoodany.. 

 zoodany...
Aha! Beccato! Non sapevo che fossi anche programmatore.