Newsgroup: it.comp.appl.access
Titolo: combobox text

Ciao,
su una maschera ho una combobox, prova,  che vorrei alimentare con una query q_rowsource_nascita.
Sull'evento enter ho inserito il seguente codice:
 
    CurrentDb.QueryDefs("q_rowsource_nascita").SQL = "SELECT " _
    & " codici_catastali.id_codici_catastali, codici_catastali.denominaizone, " _
    & " codici_catastali.Provincia, codici_catastali.Codice " _
    & " FROM codici_catastali " _
    & " WHERE codici_catastali.denominaizone LIKE " & Chr(34) & Me.prova.Text & "%" & Chr(34) _
    & " ORDER BY codici_catastali.denominaizone ASC "
 
    Me.prova.RowSourceType = "Table/Query"
    Me.prova.rowsource= "q_rowsource_nascita"
    Me.prova.Dropdown
 
come vedete la query riceve come parametro il testo immesso nella combobox.
Quando premo invio però viene visualizzato l'errore "il testo immesso non corrisponde a nessuna voce nell'elenco.
Dove sbaglio?
Grazie e buon lavoro a tutti voi
 
Remigio


Non credo che ci sia un errore... l'errore segnala che hai inserito una voce non presente in elenco...
Devi definire se vuoi usare SOLO le voci in elenco ed eventualmente gestire l'evento NOTINLIST di conseguenza.
 
@ALex

 Sull'evento enter
 
?!? 
 
... Aspetta scusa : 
 
"enter" di quale controllo ? Del combobox stesso ?  
Ossia tu fai enter sul combo (ossia scegli uno dei dati che il 
combo possiede) e cosi facendo il combo si cambia i dati ? 
 
Perchè ?  No ... o non ho capito un tubo io (probabile) o questa
cosa non ha senso.  
 
Qual' è il tuo obiettivo ? Ossia cosa vuoi mettere a disposizione
dell' utente ? Che deve fare 'sta maschera ?

Eheh,
hai ragione Radica, è un'idea un po' contorta e malsana.
Il db che uso ha le tabelle collegate ad un server esterno e su alcune postazioni remote accade che quando l'utente apre la maschera che usa la combo in questione, deputata alla ricerca del comune di nascita, viene caricata l'intera tabella dei comuni italiani e la cosa porta via diversi secondi.
Stavo pensando di velocizzare l'apertura e il caricamento della maschera mettendo come origine dati della combo unha query filtrata con il testo della combo stessa.
Non so se mi rendo conto di quello che dico :-D
Grazie e buon lavoro
 
Remigio

 Non so se mi rendo conto di quello che dico :-D
 
Ho capito, ma è inutile : dal momento che anche quando fai una 
query filtrata il server  ti  manda *tutta* la tabella che poi
ti filtri  sulla memoria locale, indi  te  se rallenta peggio, 
al limite, perchè gli fai fare DUE lavori (trasferisci tabella
AND filtrala);  
 
Invece  dovresti usare una connessione ADO asincrona al server 
in  modo  tale  che  quando  l' utente apre il DB (proprio all' 
inizio) si carica in locale questa tabella dei comunazzi; 
 
siccome  è  asincrona il processo si svolge in back ground e l' 
utente se ne accorge a stento; 
 
Oppure se è troppo difficile semplicemente ti scarichi in locale 
la  tabella   (come  sai  fare tu)  all'  apertura del DB , e il 
combo a quel punto lo sistemi in modo che i dati li prende dalla
tabella locale. 
 
Ci vorrà più tempo ad aprire il DB (ma l' utente generalmente 
tollera di più all' apertura dell' applicazione, come se ... 
capisse che aoh ... l' applicazione è grossa è normale che x 
aprirla ci vuole qualche secondazzo in piu) ma poi corre come
una spada.
 
Tanto la tabella dei comuni (se ho capito di che si tratta) 
non viene aggiornata di continuo e quindi anche se sta in 
locale per qualche ora (il tempo i cui l' utente si connette)
non succede che gli si cambino i dati sotto il sedere. 
 
Ok ? 
 

Non è così se il server è un vero RDBMS... se è Jet invece è vero, ma ricordiamoci che gli indici se ben usati servono.
Se il server è SqlServer restituisce solo la tabella con i dati corrispondenti se la query è risolvibile lato server.
 
Per il resto è una cosa che può essere utile se parliamo di decine migliaia di items...
 
@Alex

 AND filtrala);
 
Se fosse cosi' sai che traffico di tabelle in giro per il mondo
Ma cosi' non fosse (se parliamo di  db server) per fortuna
 

 T' ho "beccato" mascherina ! :D 
...
 
In verità, 
in verità ti dico che stavo pensando ad una query passthrough che popola la combobox e che utilizza come parametro il text della combo stessa, in questo modo il server non mi manda tutta la tabella dei comuni italiani ma sono quelli che iniziano con.
Però non riesco a farla funzionizzare 'sta cacchio di combo.
Mi indicate qualche esempio da cui trarre ispirazione?
Grazie a tutti voi per le risposte.
 
Remigio
 


credevo di collegasse ad un "server" (diciamo) Access. Non è cosi ?


Ma sei collegato a un DB SqL ? Io credevo che fossi collagato a
un DB access ... 
 


E che de' un "server Access" ?
 


Dicci per cortesia cosa intendi quando scrivi 'server'
 


E  dai, me so sbagliato ! Me credevo che il client aveva tabelle 
collegate a un DB Access. Che voi fà, me voi menà ? Me voi sputà
in faccia ? :-) 
 
Poi dice che non sei teso. NoO ! Mica ! :-) 
 
 
 
 


Server o non server io te l' ho detto come dovresti fare
 
 
 


E' la strada giusta, seguila non ascoltare cose strane che non si sono mai sentite...
 
Valuta solo, come ti ho detto, se ne vale la pena..., in base al NUMERO di Items.
 
@Alex

 decine migliaia di items...
 
Cosa  potrebbe essere utile ? Scusami, forse ho perso il filo 
della discussione. Non sono nemmen sicuro che stai rispondendo
a me :-) 
 
E francamente non sono sicuro nemmeno di aver ben compreso il 
problema dell' OP : lui vuole popolare un combo con i dati di
una tabella remota dopo però  che l' utente ha scelto un item 
facendo ENTER sul combo stesso, ossia selezionando un  item :  
 
Il che implica, però,  che il combo sia già popolato. E questo
per me è del tutto privo di senso ma ripeto : è molto probabile
che non abbia capito come stanno le cose. 
 
Ciao

 Ciao
 
Ciao
@Alex


Se ognuno che ti chiede qualcosa lo consideri "bello teso" pare chiaro 
che il problema non sta nel tuo interlocutore
 

...
Ciao,
intanto grazie a tutti per la notevole discussione.
Si tratta di un sqlserver, mysql.
La mia idea è questa, ditemi se è fattibile altrimenti seguo i vostri consigli:
 
- query PT q_rowsource_nascita inizialmente vuota (SELECT null)
- l'utente scrive sulla combo il nome del comune che gli interessa e dà invio;
- sulevento ENTER della combo c'è il codice qui sotto:
 
    Dim strsql As String
    strsql = "SELECT " _
    & " codici_catastali.id_codici_catastali, codici_catastali.denominaizone, " _
    & " codici_catastali.Provincia, codici_catastali.Codice " _
    & " FROM codici_catastali " _
    & " WHERE codici_catastali.denominaizone LIKE " & Chr(34) & Me!prova.Text & "%" & Chr(34) _
    & " ORDER BY codici_catastali.denominaizone ASC "
 
    CurrentDb.QueryDefs("q_rowsource_nascita").SQL = strsql
    Me.prova.RowSourceType = "Table/Query"
    Me.prova.RowSource = "q_rowsource_nascita"
    Me!prova.Requery
    Me.prova.Dropdown
 
- viene generata la query con parametro il nome del comune inserito dall'utente e viene fatto il requery della combo ed il dropdown
 
Potrebbe funzionare?
A me no
 
Grazie ancora e buon lavoro a tutti voi
 
Remigio

Hai inserito nella Proprietà CONNECT della Query la ConnectionString del Server...? Non la vedo...
 
CurrentDb.QueryDefs("q_rowsource_nascita").Connect="Tua StringConnection MYSQL"
 
Ovviamente la Connection string la puoi anche mettere da QBE in modo Visuale...!
 
Potresti anche valutare di fare una SP lato server...?
 
Vedi questo:
https://msdn.microsoft.com/en-us/library/office/ff192701.aspx
 
https://support.microsoft.com/en-us/kb/184749
 
 
Puoi ottenere un Recordset di ritorno ed associarlo alla Combo...
 
Set RsSP=MyDB.OpenRecordset(SQL, dbOpenSnapshot, dbSQLPassThrough)
Set Me!TuaCBO.Recordset=RsSP
 
 
@Alex


scherzavo, c' ho anche piazzato due faccette sorridenti ... 

 preoccuparsene.
 
Certo
 
Ti ringrazio, sei stato chiarissimo (e paziente)
 
Cmq a me personalmente non mi è ancora chiaro il discorso dell' OP.
 
Mi getta  in  confusione  perchè, a  quanto ho capito, lui vorrebbe 
popolare il combo *dopo* che l' utente  ha  selezionato un item dal 
combo stesso. Il che implica  che il combo è GIA' popolato, per cui 
non riesco a trovare il senso dell' operazione.
 
Tu invece  hai capito  cosa intende ?  Cosi, te  lo chiedo solo per
curiosità, non ... 
 
 

 curiosità, non ...
 
Credo di aver capito che voglia FILTRARE, quindi ridurre il numero di ITEMS esposti dalla combo man mano che digita, e trovare quelli che corrispondono alla digitazione.
 
Ha un senso funzionale per l'utente, dal punto di vista concettuale è una cosa di dubbia INUNTILA', dal momento che la Combo è popolata l'intero Set di dati ha fatto il suo giro in rete...
Tecnicamente genera traffico dati inutile visto che il pacchetto intero è stato inviato alla prima richiesta(che li conteneva tutti) ed ad ogni digitazione viene richiesto un nuovo invio.
 
Ora rifletto invece su questo, sapendo che gli Oggetti DATABOUND come Combo/List ecc... espongono l'oggetto Recordset... e dal momento che ha già un RS popolato in LOCALE, non potrebbe essere più furbo usare il metodo FILTER dell'oggetto Recordset e riassegnarlo alla COMBO.
Traffico dati in rete=0 ed ottiene lo stesso.
 
https://msdn.microsoft.com/en-us/library/office/ff837300.aspx
 
 
Ovviamente questo richiede di avere il RS PADRE dichiarato a livello di Form sempre PIENO, ma questo non è un problema viene fatto in tutti i casi la 1° volta, poi man mano si usa un RS interno al ciclo CHANGE per Fitlrare e riassegnare...
 
 
Boh non so se funziona bene, non l'ho provato, a livello teorico SI.
 
Saluti
 
@Alex

 Saluti
 
Ciao :-) 
 
 

 Ha un senso funzionale per l'utente, dal punto di vista concettuale è una cosa di dubbia INUNTILA'
 
Ciao,
in effetti l'intenzione è quella di filtrare in modo da ridurre il numero di record che poi andranno a popolare la combo, però il meccanismo che ho pensato (e che non so se si può realizzare, per questo chiedevo il vostro aiuto) è il seguente:
- l'utente DIGITA (e non sceglie) il nome o parte di esso nella combo (che in questo caso viene usata come una normale casella di testo) e preme invio;
- viene generata la query pass-through con parametro di filtro il testo immesso nella combo e viene inviata al server sql;
- il server risponde con un recordset GIA' FILTRATO (e quindi più leggero dell'intera tabella);
- alla combo viene assegnato come origine dati il recordset ricevuto in risposta dal server e viene così popolata;
- l'utente infine sceglie uno dei record presenti nella combobox e tutti siamo più felici (soprattutto io) :-)
Si può fare secondo voi?
Ho provato, ma quando do' invio un errore mi dice che il testo immesso non corrisponde a ecc. ecc.
Grazie ancora a tutti voi
 
Remigio

 invio;
 
Oh ! Adesso si che ho capito. E non potevi dirlo così da subito ? :-) 
Deve funzionare per forza, se la query è scritta bene. 
 
Ma continuo IMPERTERRITO a pensare che  se  ti porti tutta la tabella 
in locale e poi invece che la query usi un recordset filtrato è molto
meglio : 
 
perche' se l' utente fa altre scelte inondi la rete di queries.
 
perche' se vuoi  permettere  all' utente di digitare quello che 
vuole molte di quelle queries andranno a vuoto perchè richiesta
dati inesistenti => utenti frustrati, utenti incazzati :-) 
 
perchè  come ti dico io (e Alex, per quanto riguarda l' uso del 
recordset) velocizzeresti MOOOOOLTO di piu' l' applicazione


Forse volevi dire E' MOLTO PEGGIO
Come fai a dare per scontato che portare tutta la tabella in locale non 
gli porti via tutta la mattina (o il pomeriggio)?
I sistemi client/server sono nati per ottimizzare le prestazioni, 
facendo correre poca roba in rete, e passando ai client solo con i dati 
necessari, non e' che fanno altro
L'unica cosa che deve fare, e che forse non gli e' ben chiara, e' 
consentire alla combo di accettare stringhe anche non appartenenti 
all'attuale selezione (proprieta LimitToList=false) e poi quando 
l'operatore preme Enter, intercettare l'evento NotInList, creare la 
query che gli serve, aggiornare il recordset collegato alla combo, fine
Se la selezione restituisce 10 record, solo quelli passeranno dal db 
server al client
Caricando pochissimo la rete e pochissimo il client
 
 

 Caricando pochissimo la rete e pochissimo il client
 
Grazie ad Ale e a Radica, 
però trovo RobertoA d'accordo con quello che pensavo fin dall'inizio, cioè far arrivare al client solo i dati che gli servono. Mi sembra che le query PT servano anche a questo in Access.
Potresti spiegare meglio per favore cosa vuoi dire con intercettare l'evento notinlist? Cosa faresti di preciso? (scusa la tondaggine)
Grazie ancora
 
Remigio

 Caricando pochissimo la rete e pochissimo il client
 
Ma tu hai tutte le ragioni di questo mondo, intendiamoci.
 
Ma in questo modo se l' utente seleziona varie volte avremo tante queries
che viaggiano in rete. L' ho scritto.
 
Ora :
quello che dico io è : ok, la  tua teoria è corretta e indiscutibile.
Ma se i dati sono sempre gli stessi a che serve metterli in remoto ? 
 
Va bene la regola e la teoria, ma un occhio al caso concreto io ogni
tanto ce lo butterei.  
 
Poi non so ... 


Io farei cosi:
1) apertura form con recordsource combo a ""
2) l'utente scrivera' il testo che desidera nella combobox
3) quando preme ENTER verra' attivato l'evento NotInList
4) dentro l'evento NotInList della combobox ci dovra' essere il codice 
che prende quanto scritto dall'utente e lo usa per settare la proprieta' 
recordsource con la selezione che desidera (supponiamo la combobox debba 
visualizzare i comuni di una certa regione, se il testo digitato 
dall'utonto fosse 'lombardia' allora l'istruzione sara' 
cmbMiaComboComuni.recordsource="select NOME from COMUNI where REGIONE='" 
& cmbMiaComboComuni.value & "' "  )
Fine
Da questo momento in poi dentro la combobox si vedranno solo i nomi dei 
comuni della Lombardia
Se l'utonto digitasse un'altra regione ad esempio Sicilia, alla 
pressione dell'ENTER verrebbe aggiornato il recordsource della combobox 
per contenere solo i nomi comuni della regione indicata
Ovviamente do' per scontato che nella tabella COMUNI ci sia indicazione 
della regione su ogni riga
 


Si, avremo varie query, ognuna da qualche decimo di secondo
Ad una distanza minima l'una dall'altra del tempo minimo che l'utonto 
impiega per scrivere la nuova regione, quindi parliamo di secondi
A mio avviso, meglio attendere qualche frazione di secondo ogni volta 
che si cambia regione piuttosto che far frezzare tutto per secondi o 
decine di secondi la prima volta
 
 

 decine di secondi la prima volta
 
Boh 
Magari c' hai ragione. Io però pe non sapè ne legge ne scrive tutte
le volte che è possibile tendo a dare ai clients in locale piu' roba 
che posso. 
 
Il limite (ovviamente non raggiungibile che però mi guida) è che 
i clients devono essere del tutto indipendenti dalla rete. 
 
Anche qui, come diceva Toto della moglie brutta : i clients meno
la vedono (la rete) è meglio è :-) 
 
Prometti di non incazzarti adesso ? Vado eh ... Bono. Calmo :-)
 
Ad esempio supponiamo che sul  server  vi  siano  N tabelle  che 
vengono si modificate, ma non  molto  spesso.  Che ne so ... una 
volta a settimana. Per dire.    
 
Sai che  farei  in tal caso ? Gli faccio una tabella che porta i 
nomi delle tabelle e un flag che dice  che  sono  (o  no)  state 
cambiate; Sul server, dico. 
 
Quando il client si apre gli  faccio  fare  una  query su questa 
tabella e poi in base a questa e gli faccio caricare in locale solo
le tabelle cambiate.
 
Il client si rallenta, si : ma una volta ogni morte de Papa. In 
compenso per tutto il tempo residuo corre come un matto, e la 
rete è stressata al minimo. 
 
Che ne dici ? :-) 
 
 
 
 
 
 
 
 


M'è venuto in mente solo ora : 
 
che  poi, scava scava, mi *pare* (ma correggimi se sbaglio) che l'
Access (che non è un server, d' accordo) abbia alcune  tabelle di 
sistema nascoste ma accedibili in sola lettura che tengono precisa 
e puntuale  traccia  delle  modifiche  fatte  alle  tabelle non di 
sistema. 
 
Visto che ci sono, dunque, e che ci pensa l' Access a tenerle sempre
aggiornate, perchè non sfruttarle al massimo ? No ? Che ne pensi ? 


...
provato:
 
    Dim strsql As String
 
    strsql = "SELECT " _
    & " codici_catastali.id_codici_catastali, codici_catastali.denominaizone, " _
    & " codici_catastali.Provincia, codici_catastali.Codice " _
    & " FROM codici_catastali " _
    & " WHERE codici_catastali.denominaizone LIKE " & Chr(34) & Me!prova.Text & "%" & Chr(34) _
    & " ORDER BY codici_catastali.denominaizone ASC "
 
    Me.prova.RowSourceType = "Table/Query"
    Me.prova.RowSource = strsql
    Me.prova.Dropdown
 
dopo l'invio compare il messaggio "Il testo immesso non corrisponde.....", dando ok poi in effetti la combo è popolata solo dai nomi di città che iniziano con il testo immesso, quindi funziona.
C'è modo di eliminare il messaggio di cui sopra?
Grazie molte
 
Remigio


LimitToList=false


Magari le informazioni che tiene sono relative ad operazioni che 
lui/esso ha eseguito
Non credo possa vedere se altri vanno a 'toccare' i dati