Newsgroup: it.comp.lang.delphi
Titolo: Problema con componente DBComboLookup

Salve a tutti, vi espongo il problema.
Database:   Access
Tecnologia: ADO
Ho il componente DBComboLookup nel quale visualizzo i dati di un campo di una certa tabella, per utilizzarli nel mio programma...
la tabella "Anni" ha la seguente struttura:
 
id     condominio     anno    corrente
 
1      condominio1    2012     true
2      condominio1    2011     false
3      condominio2    2010     true
4      condominio2    2011     false
5      condominio3    2011     true
6      condominio3    2012     false
 
la connessione al componente è effettuata nel seguente modo:
 
  ADOTable1.TableName:='Anni';
  ADOTable1.Active:=True;
 
  ADOTable1.Filter:='condominio='+QuotedStr(CondominioSelezionato);
  ADOTable1.Filtered:=True;
 
  DBComboLookup1.ListField:='anno';
  DBComboLookup1.KeyField:='anno';
 
quindi il componente mi visualizza gli anni di un certo condominio.
 
PROBLEMA: quando seleziono un anno dalla tendina, il valore non viene visualizzato nel campo di testo del combo, rimane vuoto! questo dipende dal fatto che il campo "anno" contiene valori uguali tra di loro (dico questo perchè con valori tutti diversi questo problema non salta fuori). Anche se è strano perche la tabella è filtrata, non capisco perchè gli danno fastidio quei valori uguali visto che al momento del filtro è come se non ci fossero. Ho provato anche "DBComboLookup1.ListField:='anno; condominio';" cosi da rendere univoco il record...niente da fare.
 
Perchè questo problema?? Come posso risolverlo??
 
Grazie, se ho omesso qualche info chiedete pure!!


Nessuno riesce a darmi una risposta? Premesso che nel campo ci sono dati uguali, premesso che ho fatto un filtro in modo che i valori mostrati col filtro siano solo dati diversi tra di loro...perchè il lookup allora si comporta come se non riuscisse ad identificare il record che seleziono nella tendina??? Quando seleziono un qualsiasi elemento della tendina il cursore del dataset torna sempre sul primo record, non mostrandomi quindi il valore che ho selezionato! Eppure i dati che ha a disposizione sono univoci, non riesco a capire questo comportamento! Spero che qualcuno di voi possa darmi una risposta perchè non riesco proprio a capire...

Il giorno venerdì 26 ottobre 2012 18:37:32 UTC+2, Riddick ha scritto:

Inoltre quando il dataset non è filtrato, quindi ho tutti i dati compresi quelli uguali, quando seleziono uno di questi ultimi il cursore scatta sulla prima occorrenza del valore...ossia, se ho nell'ordine:
1   2012
2   2012
3   2012
se seleziono il secondo o il terzo 2012 il cursore comunque seleziona il primo! posso anche capire il perchè di questo comportamento quando il dataset non è filtrato quindi ci sono valori uguali nel campo...ma quando è filtrato il dataset??? Perche???

Hai le idee confuse.....
Il filtro non c'entra un kazzen.
Il problema è che lista che dai in pasto al componente è SBAGALIATA.
Se devi selezionare un anno, devi avere UNA RIGA PER ANNO, punto.
 
A.

Il giorno venerdì 26 ottobre 2012 18:37:32 UTC+2, Riddick ha scritto:

Intanto grazie per la risposta alberto...quindi è sbagliato concettualmente il modo di usare il dblookupcombobox in questo caso?
 
id     condominio     anno    corrente 
 
1      condominio1    2012     true 
2      condominio1    2011     false 
3      condominio2    2010     true 
4      condominio2    2011     false 
5      condominio3    2011     true 
6      condominio3    2012     false
 
tu dici che con la tabella strutturata in questo modo non posso passargli il campo "anno" perchè, ad es., il valore 2011 non corrisponde ad un solo record ma a 3! Giusto??

 
Si.
 
A.

Il giorno venerdì 26 ottobre 2012 18:37:32 UTC+2, Riddick ha scritto:

Va bene, grazie mille per il chiarimento! Ci sono altre strade per ottenere quello che voglio, ma ora so per certo che questa non è una di quelle ;) grazie ancora.

Il giorno venerdì 26 ottobre 2012 18:37:32 UTC+2, Riddick ha scritto:

Alberto devo rettificare! Ho risolto il mio problema con il DBComboLookup! La soluzione al mio problema, come tu hai detto, è di avere valori per il campo collegato che siano univoci...pensando a questo ho impostato il DBComboLookup nel seguente modo: 
 
DBComboLookup1.ListField:='Anno'; 
DBComboLookup1.KeyField:='Id'; 
 
questo è quanto! In ListField ho il campo di cui voglio visualizzare i valori, in KeyField ho il campo sul quale il DBComboLookup1 lavora davvero. Essendo Id un campo dai valori univoci il gioco è fatto...seleziono i miei anni nella tendina,   anche uguali tra di loro, ma il componente lavora con gli id in modo univoco senza dare problemi ;-)

Cosi' non tieni conto della CONFUSIONE per l'utente che si trova più volte lo stesso anno. Davanti ad una cosa del genere la domanda ovvia (ma non per tutti) è "cosa succede se invece del primo 2011 prendo il secondo o il terzo?".
 
Ancora, immagina di essere TU l'utente del software....
Non ti romperebbe il kaz di vedere piu' volte lo stesso anno in lista?
Io, uno che mi proponesse un  sw che fa cose di questo tipo lo manderei via.
 
 
Su, usa la testa e pensaci un attimo....
 
1) Hai una lista nella quale lo stesso elemento si ripete piu' volte.
2) Devi dare all'utente la possibilità di selezionare uno di questi elementi
3) Ogni elemento deve essere presnete al piu' una sola volta nella lista di selezione proposta all'utente
 
Ci sono almeno 2 modi veloci semplici e sopratutto puliti per risolvere il tuo problema.
 
A
 
 
 
 
 

Il giorno venerdì 26 ottobre 2012 18:37:32 UTC+2, Riddick ha scritto:

Alberto io tengo conto dell'usabilità per l'utente e quindi non mi sognerei mai di creargli confusione. Se guardi la tabella che utilizzo, nel post originale, ti renderai conto che c'è il campo "condominio" sul quale io a monte di tutto, ovviamente, vado a fare un filtro. In questo modo nella tendina del lookup non ci saranno mai anni ripetuti ma soltanto gli anni inerenti a QUEL condominio e basta. I dati sono ripetuti rispetto all'intera tabella, ma con il filtro tutti gli anni sono diversi. Il lookup dava problemi perchè, come hai detto, nel KeyField non può lavorare su un campo con valori uguali tra di loro, che siano filtrati o meno. Quindi l'uso che ne faccio io è:
 
Collego il BDLookupComboBox con FieldList="Anno" e KeyField="Id";
Da form seleziono il condominio;
La tabella viene filtrata su quel condominio;
I dati mostrati nel DBLookupComboBox saranno gli anni relativi solo a quel condominio che io stesso ho selezionato;
 
Comunque se la soluzione non ti convince in qualche modo, accetto volentieri consigli e suggerimenti per migliorarla, questo è ovvio ;-)

Mi era sfuggito il filtro "a monte" (non "a montI"..).
Se ogni anno è presente solo una volta è tutto ok.
 
 
A.

Il giorno venerdì 26 ottobre 2012 18:37:32 UTC+2, Riddick ha scritto:

Magari fossero solo quelli a non sfuggirgli a monti...! D sto passo a breve non ci sarà più nulla che potrà prendere...