Tenho um código que importa arquivo xls, estou tentando implementar um tratamento para não importar dados que já existem no banco, para isso Abri uma ResultSet dentro do laço for que dispara a contagem de linhas do arquivos, essa result set eu pego um campo do banco, e comparado com uma String de coluna, se já existe o dados no banco eu preciso que pule/ vá para próxima…
Fiz assim, mas não deu certo!
for(i=1;i<linhas;i++){/* pega os valores das células como se numa matriz */Cella1=sheet.getCell(0,i);Cellc3=sheet.getCell(2,i);Celle5=sheet.getCell(4,i);/* pega os conteúdos das células */St1=a1.getContents();//TENTEI VERIFICAR SE O DADOS JÁ EXISTE E NÃO DEU CERTO, CONTINUAR StatementPs_Tb=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSetCliente_veiculo=Ps_Tb.executeQuery(clt);while(Cliente_veiculo.next()){StringA=Cliente_veiculo.getString("ID_ERP");if(A.contains(St1)){System.out.print(A);continue;// Pula para o próximo laço do for.}}St2=c3.getContents();St3=e5.getContents();/*Executa o insert para inserir os dados no banco de testes MySQL*/PreparedStatementps=conn.prepareStatement("INSERT INTO cliente__veiculo (cliente__veiculo.ID_ERP, cliente__veiculo.CLIENTE) VALUES"+"('"+St1+"','"+St2+"')");ps.executeUpdate();ps.close();
O If que fiz identifica mais somente pula um registro, depois da o erro de Primary key Duplicada, afinal eu coloquei a primary Kei como código ERP para que eu possa identificar quando a condição não for respeitada.
Portanto o If não verifica, ou verifica somente 1 linha, me faz acreditar que a while não esta funcionando corretamente.
D
darlan_machado
Sim, é o comportamento do continue, passar para a próxima iteração.
Se quer quebrar o andamento do bloco de repetição, use break (ou um break com alias).
Agora, eu acho essa abordagem meio complicada.
Eu faria o select, armazenaria os ids (ou o que quer que seja o elemento que identifica que algum dado está no banco) em hashmaps. Bastaria invocar um: map.get(OBJ_PK) e checar se o retorno é nulo ou não, aí você já eliminaria esse while dentro do for.
D
Daniel95
E pelo o que eu entendi, você quer pular a execução do seu for que faz o insert e não somente do while que é o que o código está fazendo:
while(Cliente_veiculo.next()) {
String A = Cliente_veiculo.getString("ID_ERP");
if(A.contains(St1)){
System.out.print(A);continue; // Pula para o próximo laço do for.}
}
O seu continue está pulando só a execução do resto do código do seu while até ele acabar e então seu for continua normalmente como se nada tivesse acontecido, ou seja, seu while não está servindo pra nada no código senão fazer o println.
Acredito que o que você quer fazer seja mais ou menos isso:
St2=c3.getContents();St3=e5.getContents();PreparedStatementps=conn.prepareStatement("INSERT INTO cliente__veiculo (cliente__veiculo.ID_ERP, cliente__veiculo.CLIENTE) VALUES"+"('"+St1+"','"+St2+"')");ps.executeUpdate();ps.close();
J
Juliano5
Amigo é justamente isso, preciso que cada linha importada seja verificada, e caso já exista no banco de dados, pule e passe para a próxima, até percorrer todo arquivo, inserindo somente quando não existir na base de dados.
D
Solucao aceita
Daniel951 like
Então, eu sugeri para o seu código deste trecho:
Para este que postei acima:
Eu não testei o código mas deve ser esta a sua ideia inicial não? Você testou o código?
J
Juliano5
Observação, se eu passo o segundo if para dentro do while, o primeiro é ignorado… se eu passo ele para fora da while, o insert não ocorre.
D
Daniel95
Por favor, formate o código deste Post para ficar mais fácil de visualizar.
Não entendi bem o que acontece, ele não faz nenhum insert? Ele não faz insert após a identificação de um código repetido? Ele pula a inserção de uma iteração? De todas?
J
Juliano5
Daniel, a Insert não funciona… á condição identifica o registro, pula a linha mas á INSERT não funciona…
J
Juliano5
Amigo Depurei o código, linha á linha, descobri que sua função esta funcionando, mas com um problemas, quando ela encontra o primeiro registro que não esta no banco de dados, ela insere e depois entra num Loop infinito, ela não consegue concluir os próximos registros, fica viajando entre os registros existentes.
J
Juliano5
Mano, descobri o erro… o seu método funciona perfeitamente … a questão é… Estava comparando o valor do da String St1 com o banco de forma errada!!!
Utilizando Contains… e tipo o código ERP tem 6 dígitos ou mais, e por coincidência eles continham valores do banco, afinal o método contiver é isso, se contem dentro do valor completo um valor correspondente!
Com método equals, ele compara somente valor IGUAIS, assim ele identificou perfeitamente os registros que não existiam .
ficando assim por conhecimento!
//CHAMANDO RESULT SET PARA CONSULTAR A BASE DE DADOS
{StatementPs_Tb=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSetCliente_veiculo=Ps_Tb.executeQuery(clt);// CHAMANDO UM BOOLEAN PARA PULAR AS LINHASbooleanjaExiste=false;while(Cliente_veiculo.next()){
StringA=Cliente_veiculo.getString("ID_ERP");// CONDIÇÃO QUE COMPARA O VALOR DO XLS COM O BANCOif(St1.equals(A)){System.out.print(A);// INFORMA QUE A CONDIÇÃO FOI ENCONTRADAjaExiste=true;//TRAVA O TRATAMENTO break;}}if(jaExiste){//CONTINUA O LAÇO FOR PARA OS DEMAIS REGISTROS. continue;}