Duvida- Pular laço for com while

Pessoal,

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 */
    Cell a1 = sheet.getCell(0,i);
    Cell c3 = sheet.getCell(2,i);
    Cell e5 = 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 
    Statement Ps_Tb = conn.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE,
    ResultSet.CONCUR_UPDATABLE);
    ResultSet Cliente_veiculo = Ps_Tb.executeQuery(clt);
    
    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.
        }
    }
    
    St2 = c3.getContents();
    St3 = e5.getContents();

    /*Executa o insert para inserir os dados no banco de testes MySQL*/
    PreparedStatement ps = conn.prepareStatement("INSERT INTO cliente__veiculo (cliente__veiculo.ID_ERP, cliente__veiculo.CLIENTE) VALUES" + "('"+St1+"','"+St2+"')");
    ps.executeUpdate();
    ps.close();

O que não deu certo?

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.

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.

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:

for(i = 1; i < linhas; i++) { Cell a1 = sheet.getCell(0,i); Cell c3 = sheet.getCell(2,i); Cell e5 = sheet.getCell(4,i);
St1 = a1.getContents();

Statement Ps_Tb = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet Cliente_veiculo = Ps_Tb.executeQuery(clt);

boolean jaExiste = false;

while(Cliente_veiculo.next()) {
    String A = Cliente_veiculo.getString("ID_ERP");
    
    if (A.contains(St1)) {
        System.out.print(A);
        jaExiste = true;
        break; 
    }
}

if (jaExiste) {
continue;
}

St2 = c3.getContents();
St3 = e5.getContents();

PreparedStatement ps = conn.prepareStatement("INSERT INTO cliente__veiculo (cliente__veiculo.ID_ERP, cliente__veiculo.CLIENTE) VALUES" + "('"+St1+"','"+St2+"')");
ps.executeUpdate();
ps.close();

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.

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?

1 curtida

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.

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?

Daniel, a Insert não funciona… á condição identifica o registro, pula a linha mas á INSERT não funciona…

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.

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

{
Statement Ps_Tb = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet Cliente_veiculo = Ps_Tb.executeQuery(clt);
// CHAMANDO UM BOOLEAN PARA PULAR AS LINHAS
boolean jaExiste = false;
while(Cliente_veiculo.next()) {

String A = Cliente_veiculo.getString("ID_ERP");
  // CONDIÇÃO QUE COMPARA O VALOR DO XLS COM O BANCO
  if (St1.equals(A)) {
   System.out.print(A);
   // INFORMA QUE A CONDIÇÃO FOI ENCONTRADA
    jaExiste = true;
    
   //TRAVA O TRATAMENTO 
    break;
    
    
    }  
       
   
      }            
            
            
if(jaExiste){
          
  //CONTINUA O LAÇO FOR PARA OS DEMAIS REGISTROS.  
    continue;      
            
            
    }