Ajuda pra fazer um select e atualizar comboBox com o banco em tempo de execução

5 respostas
S

Pessoal eu estou com duas dúvidas aqui. A primeira é que eu queria atualizar a comboBox em tempo de execução. Assim que eu gravar os dados no banco, eu gostaria de selecionar na comboBox o nome que eu gravei no banco mas sem ter que fechar o formulário. Esse é o código que eu coloquei dentro da Combo:

jComboBoxCliente.addItem("");
			
			
			try{
				 
				st = conexao.conectar().createStatement();
				sql = "select * from lancamentocliente";
				rs = st.executeQuery(sql);
				
				
				while (rs.next()){
									

					jComboBoxCliente.addItem(rs.getString(2));
					jComboBoxCliente.setSelectedItem(null);
					
					
					
				}st.close();
				
				
					
												 
			}catch (Exception ex){
				ex.printStackTrace();
			}

			}

Eu já coloquei o código dentro do evento do Action Performed mas ainda sem sucesso. O que eu devo fazer?

Agora a segunda dúvida. Eu tenho uma classe que cadastra as contas de entrada e saída do mês. Até aí tudo bem, está gravando normal no banco. Mas é pra pra fazer a consulta que eu estou com problemas. Antes de eu explicar melhor vou mostrar um print da tela de consulta.

[img]http://img194.imageshack.us/img194/4927/imagemef.jpg[/img]

Conforme na foto da tela, eu quero fazer uma consulta pelo nome do cliente, selecionando o nome na comboBox pra exibir o resultado referente aos campos da tabela; fazer a busca pela data atual ou de uma data até a outra mas sem o nome estar selecionado ou com o nome selecionado.

Ex: seleciono um nome na comboBox pra exibir todas as contas cadastradas, o pagamento efetuado desse cliente. Ou exibir as contas desse cliente em determinada data ou de uma data até a outra ou exibir as contas de uma data até a outra sem selecionar o cliente.

E ainda exibir o total somado do campo Pagamento. O total não é gravado no banco, a soma seria feita através de um select e exibir o resultado no campo Valor Total.

No código abaixo eu consigo exibir o resultado digitando apenas a data no campo inicial.

try{     
Connection conn = null;                          
 PreparedStatement st = null;  
try {  

String pesquisaC = jComboBoxCliente.getSelectedItem();
String DataInicial = jTextFieldDTI.getText();
String DataFinal = jTextFieldDTF.getText();

conn = (Connection) conexao.conectar();  
st = conn.prepareStatement("select * from lancamentocliente where Cliente like ?");
st = conn.prepareStatement("select * from lancamentocliente where Data like ?");
st.setString(1, "%" + pesquisaC + "%"); 
st.setString(2, "%" + DataInicial + "%");  
LancamentoClienteModel modelo = (LancamentoClienteModel) jTable.getModel();    
					         rs = st.executeQuery();    
					         modelo.clear(); 
					          
					         while(rs.next()) {    
					            modelo.add(new LancamentoCliente(rs));  
					      }}  finally {  
					          if (st != null) st.close();  
					          if (conn != null) conn.close();  
					      }  
					   }catch (Exception ex) {    
					        throw new RuntimeException(ex);  
					   }

Quando eu seleciono o nome na combo, a pesquisa não quer funcionar. Só está pesquisando por data mesmo.

O que será que eu to fazendo de errado? Mas isso que eu to tentando é só pra começar mesmo pois eu sei que vou ter que implementar várias coisas ainda. Acho que vai ter que ter vários selects dentro de ifs para cada condição não é?

5 Respostas

gqferreira
Assim que eu gravar os dados no banco, eu gostaria de selecionar na comboBox o nome que eu gravei no banco mas sem ter que fechar o formulário.
Você pode pegar o valor que acabara de inserir no banco e fazer o seguinte:
seuCombo.addIten("String");

ou...

seuCombo.clean();

//Faz a consulta no banco....
//carrega o resultset com a pesquisa...

//Encquanto houver registros...
while(resultset.next())
{
      //Adicionando um a um ao combo...
     seuCombo.add(resultSet.getString(indice da coluna).toString());
}
A segunda duvida não entendi muito bem mas encontrei um problema...
"select * from lancamentocliente where Data like ?"
Se o seu campo de data for Varchar não vai ser possivel fazer pesquisa de periodo de data e sim de uma data especifica, ou coloca-las em ordem alfabéticas. Utilize campo Date no banco, o formato de data no banco é "yyyy-mm-dd" com essa mascara mesmo. Sendo assim, voce pode montar a seguinte sql para retornar um periodo de tada:
"SELECT * FROM lancamento WHERE Data >= '2005-10-24' AND Data <= '2009-10-24'";
Não sei se essa é uma das suas duvidas mas lembre-se que você pode usar sql interna:
"SELECT * FROM lancamentocliente WHERE Cliente LIKE '%Joao% AND id_fornecedero = (SELECT id FROM fornecedores WHERE fornecedor LIKE '%Maria%)'"

Espero ter ajudado. :thumbup:

S

gqferreira, sobre a comboBox:

seuCombo.addIten("String");

Esse “String” que é o valor que acabou de ser inserido no banco, como que eu pego esse valor específico pra poder passar como parâmetro do addItem? E isso eu devo colocar dentro do método construtor da comboBox?

Deixa eu explicar melhor sobre essa classe. Na tela de cadastro eu vou cadastrar 3 tipos de contas: cliente, fornecedor e funcionário. Quando eu selecionar “cliente” num Radio Button, vai mostrar a lista de clientes numa comboBox, aí o nome que eu selecionar, vai ser o nome que vai ser gravado no banco. Veja a foto:

Então esse valor (nome do cliente) que eu selecionar nessa combo já está gravado em um banco (tabela de clientes). E quando eu selecionar ele nessa combo e preencher o campo Pagamento, vai gravar em outra tabela do banco que é “lancamentocliente”. Aí pra fazer a consulta, eu quero selecionar na combo esse mesmo valor que foi gravado que é o nome do cliente.

Sobre o seu segundo exemplo, o método .clear() nao dá certo. Aparece a mensagem que não funciona pra essa comboBox. Aí acabou não funcionando também o segundo exemplo.

Sobre a minha segunda dúvida, vou explicar melhor.

Eu quero fazer a consulta da seguinte maneira:

  • apenas por nome selecionando um nome na ComboBox;
  • selecionando um nome na combo e colocando uma data no campo Data Inicial;
  • selecionando um nome na combo e colocando uma data no campo Data Inicial e Data Final;
  • Data inicial sem selecionar o nome;
  • Data inicial até data final sem selecionar nome.

No banco eu deixei sim a data como tipo Varchar e a busca funciona normal com a minha sintaxe.

gqferreira

Foi mau cara… é jComboBox1.removeAllItems();

Você não tinha uma variável que continha o valor antes de inserir no banco? coloque o valor dessa variavel no “combo.addItem(suaVariavel);” voce não vai precisar consultar nada.

Sobre a data, como te falei, não vai ser possivel pesquisar um intervalo de data se elas forem varchar, pode testar. Para você pesquisar uma data maior que algo e menor que algo, ela vai precisar ser do tipo Date porque se trata de uma subtracao de data e não uma comparação literal.

Passa o esquema da sua tabela de cliente que te mostro como eu faria pq se eu ficar só falando vou acabar te confundindo, comento tudo e explico.

Sobre as sql, você não tera outra alternativa, tera que ser uma sql para cada ocasião, faz sim um if-else para ver qual a ocasião de usar uma ou outra.

S

gqferreira:
Foi mau cara… é jComboBox1.removeAllItems();

Você não tinha uma variável que continha o valor antes de inserir no banco? coloque o valor dessa variavel no “combo.addItem(suaVariavel);” voce não vai precisar consultar nada.

Sobre a data, como te falei, não vai ser possivel pesquisar um intervalo de data se elas forem varchar, pode testar. Para você pesquisar uma data maior que algo e menor que algo, ela vai precisar ser do tipo Date porque se trata de uma subtracao de data e não uma comparação literal.

Passa o esquema da sua tabela de cliente que te mostro como eu faria pq se eu ficar só falando vou acabar te confundindo, comento tudo e explico.

Sobre as sql, você não tera outra alternativa, tera que ser uma sql para cada ocasião, faz sim um if-else para ver qual a ocasião de usar uma ou outra.

Deu certo agora!! Está adicionando na Combo em tempo de execução. :smiley: Passei a variável como parâmetro do addItem. Só que eu ainda deixei fazendo a consulta no banco pois sem isso nem aparece nada na Combo.

Sobre a data eu entendi. E o esquema da tabela de cliente que você disse eu não entendi. Você quer o arquivo do My SQL pra você dar uma olhada?

Esse select aqui que você me passou sobre a data poderia ficar assim então?

st = conn.prepareStatement ("select * from lancamentocliente where Data >= ? and Data <=?"); st.setString(1, DataInicial);

Eu to meio confuso ainda quanto ao uso do setString. Onde eu usaria a variavel DataFinal?

S

Dei uma mudança nos planos aqui, acho que vai facilitar um pouco pelo menos. Eu estava pensando, não tem necessidade de filtrar a pesquisa selecionando o nome do cliente em uma respectiva data, pois não vai ter assim tantas contas diferentes de um único cliente. Só se por exemplo fosse mais de 200 contas apenas de um único cliente aí seria ideal fazer isso. Mas se tiver 3 contas diferentes de cada cliente é muito. Então eu pensei assim: mandar buscar por nome, data inicial ou data inicial até data final. Apenas essas 3 buscas.

Selecionando um nome na ComboBox. Fiz dessa maneira:

st = conn.prepareStatement("select * from lancamentocliente where Cliente = ?"); st.setString(1, pesquisaC);

Informando a data:

st = conn.prepareStatement("select * from lancamentocliente where Data = ?"); st.setString(1, DataInicial);

Buscar por nome ou pela data inicial já está ok. Agora falta buscar de uma data até a outra que eu não estou conseguindo. Eu fiz essa sintaxe no My SQL e funcionou:

Select Data from lancamentocliente where Data BETWEEN '17/10/2009' AND '20/10/2009' ORDER BY Data;

Só que eu não sei como fazer assim no meu código. Eu não posso colocar assim porque eu vou informar a data nos campos de Data Inicial e Data Final. Veja:

st = conn.prepareStatement("Select Data from lancamentocliente where Data BETWEEN ? AND ? ORDER BY Data"); st.setString(1, DataInicial); st.setString(2, DataFinal);

Eu mandei buscar pelas datas: 17/10/2009 até 20/10/2009 mas está gerando essa exceção:

Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: java.sql.SQLException: Invalid value for getInt() - '17/10/2009' in column 1 at lancamento.CadastroLancamento$9.actionPerformed(CadastroLancamento.java:987) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) Caused by: java.sql.SQLException: Invalid value for getInt() - '17/10/2009' in column 1 at com.mysql.jdbc.ResultSet.getIntFromString(ResultSet.java:4951) at com.mysql.jdbc.ResultSet.getNativeInt(ResultSet.java:6288) at com.mysql.jdbc.ResultSet.getInt(ResultSet.java:1335) at jTable.LancamentoCliente.<init>(LancamentoCliente.java:24) at lancamento.CadastroLancamento$9.actionPerformed(CadastroLancamento.java:981) ... 25 more

O que será que eu fiz de errado?

E mais uma coisinha, eu preciso colocar junto em todos os select a sintaxe pra exibir a soma do campo Pagamento do banco. No MY SQL funciona essa sintaxe:

select sum(Pagamento) as Total from lancamentocliente

Ele informa o campo Total com a soma de todas as linhas do campo Pagamento. Como que eu coloco isso junto com os outros selects?

Aguardo a ajuda de vocês. Só falta isso pra terminar esse TCC. POr favor galera me dê essa ajuda. Falta pouco! :smiley:

Criado 24 de outubro de 2009
Ultima resposta 26 de out. de 2009
Respostas 5
Participantes 2