View Full Version : [JAVA] risultati query in una combobox e jtextfield
serpico84
29-03-2009, 21:28
espongo i due problemi sperando in una vostra risposta:
1) voglio elencare in OGNI RIGA di una combobox cognomi e nomi relativi a dei medici. Sono riuscito a farlo per i cognomi soltanto (o nomi soltanto) ma non entrambi. Questo è quello che dovrei modificare:
//dal form dove ho la combobox faccio la chiamata alla classe Database che contiene le funzioni (penso che vada bene)
Database db = new Database();
Public Vector medico;
.....
medico= db.elenco_medici();
for (int i=0; i<medico.size();i++){
Combo_dottori.addItem(medico.get(i));}
//questa è la funzione nella classe Database
Vector elenco_medici (){
Vector ris = new Vector();
ris.add("vuoto");
String q = null;
String errore = avvia();
q = "SELECT `cognome_medico` FROM `medico`";
try {
Statement st = connessione.createStatement();
ResultSet rs = st.executeQuery(q);
if (rs.isBeforeFirst()) {
ris.removeAllElements();
ris.add("Tutti i medici");}
else {
ris.removeAllElements();
ris.add(errore);
}
while (rs.next()) {
ris.add(rs.getString("cognome_medico"));
} }catch (Exception e) {
//SE VIENE GENERATA UN SQLException LA RESTITUISCO AL CLIENT PER INFORMARLO
ris.removeAllElements();
ris.add(e.toString());
}
return ris;
}
La query per restituire anche i nomi dei medici è semplice (basta aggiungere `nome_medico` dopo il SELECT) ma come modifico la funzione per mettere nome e cognome nella stessa riga???
2)Devo settare come testo di alcune jTextField i risultati di una query...in pratica mi serve il corrispettivo per le query di quello ke faccio nella combobox cosi:
for (int i=0; i<medico.size();i++){
Combo_dottori.addItem(medico.get(i));}
spero di essere stato chiaro.....altrimenti chiedete pure...
banryu79
30-03-2009, 09:07
Una volta recuperato da database il resultset con i nomi e cognomi dei dottori, nella combobox non dovrai fare altro che inserire la stringa corrispondente a nome + cognome.
Non ho capito bene dove hai difficoltà, nel codice.
serpico84
30-03-2009, 17:11
io ho provato cosi:
Vector elenco_medici (){
Vector ris = new Vector();
ris.add("vuoto");
String q = null;
String errore = avvia();
q = "SELECT `cognome_medico` `nome_medico` FROM `medico`";//NUOVA QUERY
try {
Statement st = connessione.createStatement();
ResultSet rs = st.executeQuery(q);
if (rs.isBeforeFirst()) {
ris.removeAllElements();
ris.add("Tutti i medici");}
else {
ris.removeAllElements();
ris.add(errore);
}
while (rs.next()) {
ris.add(rs.getString("cognome_medico"));
ris.add(rs.getString("nome_medico"));//AGGIUNTA
} }catch (Exception e) {
//SE VIENE GENERATA UN SQLException LA RESTITUISCO AL CLIENT PER INFORMARLO
ris.removeAllElements();
ris.add(e.toString());
}
return ris;
}
ma non va
banryu79
30-03-2009, 17:23
"Non va" non è molto specifico...
Cos'è che non va?
Posta almeno gli errori che ti sputa in output e proviamo a capire cosa c'è che "non va"
serpico84
30-03-2009, 20:11
scusa non avevo il programma sotto....mi da errore javaSQLException...non trova la colonna `cognome_medico`, eppure con la funzione scritta nel primo post la trova, con solo cognome_medico nella query.
edit:spostando il nome prima del cognome nella query e in ris.add non trova la colonna `nome_medico`
banryu79
31-03-2009, 08:16
...mi da errore javaSQLException...non trova la colonna `cognome_medico`, eppure con la funzione scritta nel primo post la trova, con solo cognome_medico nella query
Perfetto, se hai capito che ti solleva quell'eccezione perchè c'è un errore dovuto a un'errata sintassi della query quando la trasformi per recuperare i valori di due campi invece che di uno solo praticamente hai quasi risolto il problema.
Il passo che ti manca sarebbe, documentazione alla mano (o a video:D ), quello di verificare la sintassi SQL corretta per una SELECT.
q = "SELECT `cognome_medico`, `nome_medico` FROM `medico`";//NUOVA QUERY
Manca la virgola?
serpico84
31-03-2009, 11:33
si!! grazie mille come al solito errori banali....x quanto riguarda il punto 2)??
banryu79
31-03-2009, 12:07
si!! grazie mille come al solito errori banali....x quanto riguarda il punto 2)??
Potresti spiegare meglio quel punto?
Con calma e in modo chiaro, postando anche del codice se lo ritieni opportuno (nel qual caso ti invito ad usare gli appositi tag CODE, per non perdere l'identazione).
serpico84
31-03-2009, 19:22
non ho ancora fatto codice perchè non so come fare. Quello che devo fare è ricevere in varie jtextfield il risultato di una query (salvata sempre su vettore, tramite relativa funzione), un po come ho fatto con la combo medico
for (int i=1; i<medico.size();i=i+2){
Lista_dottori.addItem((String)medico.get(i-1)+" "+medico.get(i));}
potrebbe essere banale ma molte cose di java ahimè l'ho dimenticate!
banryu79
01-04-2009, 08:43
Quindi hai già:
il vettore di oggetti (String?) generato a partire dal result set della query.
Vuoi fare questo:
tramite diversi JTextField visualizzare tutti gli oggetti (String?) presenti nel vettore.
Domanda:
Se devi utilizzare un JTextField per ogni oggetto nel vettore dei risultati della query, significa che devi istanziarne dinamicamente il numero? (nel senso che a priori non sai quanti oggetti hai nel vettore risultato, e in base a quel numero devi creare il corrispettivo numero di JTextField)?
Ho capito bene?
Nel caso la risposta fosse affermativa, ti chiedo ma ha senso usare proprio dei JTextField?
1) Se devo solo visualizzare i risultati (String) di una query e non devo permettere all'utente di editare i risultati mostrati JTextField non è neccessario; si potrebbe usare invece JLabel.
2) se devo visualizzare una lista di risultati di una query forse è meglio usare un componente che prenda in input il contenuto di tutto il vettore di risultati e li mostri tutti, invece che instanziare un componente per ogni risultato.
Anche perchè facciamo questa considerazione: se la query genera 350 String come risultato, cosa facciamo? Istanziamo dinamicamente nella finestra 350 JTextField per mostrarle all'utente? E se le String fossero 1000?
Detto questo, potresti invece anche avere buone ragioni che ti hanno spinto a fare questa scelta, nel qual caso ignora completamente le osservazioni che ho postato.
Ciao :)
serpico84
01-04-2009, 10:45
ti rispondo in modo breve poichè ho poco tempo ora....inserisco il codice fiscale su una text field, tramite un bottone faccio partire la query che controlla se quel codice fiscale è già presente nel DB, se si riempe i campi textfield dei dati del paziente (rimangono però oscurati cioè non editabili), se no i campi si attivano e quindi posso inserire i dati del paziente (che è un paziente nuovo). Per le altre cose ti rispondo stasera. Grazie per il supporto!!:)
banryu79
01-04-2009, 11:46
ti rispondo in modo breve poichè ho poco tempo ora....inserisco il codice fiscale su una text field, tramite un bottone faccio partire la query che controlla se quel codice fiscale è già presente nel DB, se si riempe i campi textfield dei dati del paziente (rimangono però oscurati cioè non editabili), se no i campi si attivano e quindi posso inserire i dati del paziente (che è un paziente nuovo). Per le altre cose ti rispondo stasera. Grazie per il supporto!!:)
Ok adesso la sistuazione è chiara.
Allora la cosa è semplice:
- numero di JTextField fisso, uno per ogni campo di un record/result della query.
La query torna un result set;
Il result set o contiene 1 record/result, oppure ne contiene zero;
Siccome dobbiamo popolare il testo di JTextField a noi interessano oggetti String quindi quando leggi ogni campo del result set trasformi il valore letto in String che piazzi in un vettore [metodo più banale: String s = "" + valoreResultSet.getQualcosa()].
Finito di leggere il result set hai un vettore di string che contiene:
- zero elementi se la query non ha trovato nessun risultato con quel codice fiscale.
- un numero di elementi pari al numero di campi del result set letto se la query ha trovato l'unico result possibile per quel codice fiscale.
Nel primo caso (vettore di string di lunghezza zero) abiliti tutti i JTextField [metodo .setEnable(true)]; nel secondo caso (vettore di string di lunghezza maggiore di zero : [vector.size() > 0]) disabiliti tutti i JTextField [metodo .setEnable(false)] e li popoli con i valori del vettore [metodo .setText(String) da chiamare sul JTextField desiderato passandogli la String appropriata]
Ciao :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.