Eu fiz uma consulta no banco de dados usando o comando LIKE passando 3 parametros(JtextField).
O problema é que quando eu deixo um dos campos em branco da erro.
e na verdade eu queria que se o campo ficasse em branco ele listasse todos.
Por exemplo: eu consulto o cliente por codigo, nome e cpf. se eu deixar o campo codigo em branco ele consultaria por nome e cpf e todos os codigos.
tipo:
tenho os clientes
Codigo----------Nome-----------------CPF
-------7----------José Silva------------654321
------12---------José Santos----------321654
------13---------José Souza-----------987654
se eu passar os parametro (codigo,nome,cpf) como (1,josé,654)
ele lista os josés de codigo 12 e 13.
mas se eu passo os parametros (null,josé,654) ele não lista nenhum, o que eu quero é saber que parametro eu jogo no lugar do null para listar os 3 josés neste caso.
se ficar mais clara minha duvida, eu quero que funcione como o LIKE do Access.
[quote=javax.swing.Daniel]Fiz uma linha de comando como exemplo:
rs = state.executeQuery("SELECT * FROM Cliente WHERE id LIKE '%_%' AND cpf LIKE '%654%' ORDER BY id");
Procedimento técnico não homologado, também conhecida como gambiarra.
Não é preciso fazer isso, ele pode controlar pelo java mesmo, basta realizar uma verificação, validando se o parâmetro é nulo ou não.
CREATE DEFINER=‘root’@‘localhost’ PROCEDURE ‘sp_conscliente’ (IN codigo int, IN nome VARCHAR(100), IN cpf BIGINT)
BEGIN
SELECT * FROM cliente WHERE codcliente LIKE CONCAT(’%’,codigo,’%’) AND nomecliente LIKE CONCAT(’%’,nome,’%’) and cpfcliente LIKE CONCAT(’%’,cpf,’%’);
END
DELIMITER ;
essa é minha procedure criada no mysql
no java eu “seto” a query assim:
query = “CALL sp_conscliente(”+Integer.ParseInt(txCodCliente.getText())+","+txNomeCliente.getText()+","+Long.ParseLong(txCPFCliente.getText())+")";
e uso o executequery
se eu passo os 3 parametros funciona, mas se eu deixar um campo em branco não aparece nenhum resultado.
Obs.: não sei se faz diferença, mas eu utilizo netbeans
CREATE DEFINER=‘root’@‘localhost’ PROCEDURE ‘sp_conscliente’ (IN codigo int, IN nome VARCHAR(100), IN cpf BIGINT)
BEGIN
SELECT * FROM cliente WHERE codcliente LIKE CONCAT(’%’,codigo,’%’) AND nomecliente LIKE CONCAT(’%’,nome,’%’) and cpfcliente LIKE CONCAT(’%’,cpf,’%’);
END
DELIMITER ;
essa é minha procedure criada no mysql
no java eu “seto” a query assim:
query = “CALL sp_conscliente(”+Integer.ParseInt(txCodCliente.getText())+","+txNomeCliente.getText()+","+Long.ParseLong(txCPFCliente.getText())+")";
e uso o executequery
se eu passo os 3 parametros funciona, mas se eu deixar um campo em branco não aparece nenhum resultado.
Obs.: não sei se faz diferença, mas eu utilizo netbeans
[/quote]
1 - Use a tag [code]
2 - Isso tá meio gambiarrístico demais, não?
O problema é que ao faze concat, você não analisa se o parâmetro passado está ou não vazio. Esse controle não é do banco de dados, efetivamente. Porém, como você está usando um padrão orientado a banco de dados, que é com stored procedure, deve validar o conteúdo das variáveis.
Quando abro um tópico:
Há uma lista de rich buttons acima da caixa de texto, dentre eles, o Code.
Clicado uma vez, ele será marcado com um * e colocará na caixa de texto uma marcação [code]
Clicado uma segunda vez, a marcação * desaparece e ele fecha a tag anterior.
Quando respondendo - resposta rápida:
Pressione CTRL + C uma vez e terá a tag code aberta. Uma segunda vez, ela será fechada.
Quando respondendo - resposta/citação/edição:
O mesmo de quando abre tópico, botão code.