Dois while com select no banco

11 respostas
colosos_colossus
public Statement stam, stam2;
    public ResultSet resultado, resultado2;
    javax.swing.table.DefaultTableModel dtm;

public void conectarBancoSupermercado1() {
        try {
            Class.forName(driverLSoft);
            Connection MinhaConexao = DriverManager.getConnection(urlLSoft);
            stam = MinhaConexao.createStatement();
            System.out.println("Sucesso banco Produtos foi conectado");
        } catch (ClassNotFoundException ex) {
            System.out.println("Driver para Produtos não encontrado ");
        } catch (SQLException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(null, "Problemas na conexao com a fonte de dados: produto:|:\n" + ex.getLocalizedMessage());
        }
    }

    public void conectarBancoIntegrado() {
        try {
            Class.forName(driverIntegrado);
            Connection MinhaConexao = DriverManager.getConnection(urlIntegado);
            stam2 = MinhaConexao.createStatement();
            System.out.println("Sucesso banco INTEGRADO foi conectado");
        } catch (ClassNotFoundException ex) {
            System.out.println("Driver para INTEGRADO não encontrado ");
        } catch (SQLException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(null, "Problemas na conexao com a fonte de dados: INTEGRADO:|:\n"
                    + ex.getLocalizedMessage());
        }
    }
resultado = stam.executeQuery("select * from produto where lojcod = 1");

            while (resultado.next()) {
                int cod = resultado.getInt("procod");
                codpro = formatar6.format(cod);       
           
                resultado2 = stam.executeQuery("select * from pro2 where lojcod = 1 and procod = " + cod);

                while (resultado2.next()) {
                    prvapro = resultado2.getDouble("propreaq");//pro2
                    detalhe = resultado2.getString("proref");//pro2
                    double codbar = resultado2.getDouble("probard");//pro2
                    codbarun = formatar2.format(codbar);
                }
                   dtm.addRow(new Object[]{codpro,descpro,detalhe,prvapro});
            }return;
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Cadastro nao Encontrado!");
            System.out.println("SQLException: " + ex.getLocalizedMessage());
        }

[color=red]ERRO: |||[/color]ResultSet is closed[color=red]|||[/color]
[list]Por que parou no : [color=green]resultado[/color].next() ?[/list]
[list]Como faço para continuar o laço ?[/list]

11 Respostas

pmlm

Já experimentaste usar Statements diferentes?

luciano2

Ao executar uma nova query o resultSet anterior é fechado.

Abre ResultSet resultado

resultado = stam.executeQuery("select * from produto where lojcod = 1");

Fecha ResultSet resultado e abre ResultSet resultado2

resultado2 = stam.executeQuery("select * from pro2 where lojcod = 1 and procod = " + cod);
luciano2

Na verdade acho que isso é um problema de Query mal feita.

se ele usar um join ele consegue pegar os dados com apenas uma query.

colosos_colossus

luciano@@:
Na verdade acho que isso é um problema de Query mal feita.

se ele usar um join ele consegue pegar os dados com apenas uma query.

ñ posso o join resultará em valores repetidos e outros problemas

o stam é pq esse ele é o responsavel por conectar com o mesmo boanco dos select

e como abro novamente o resultSet?

tipo eu poderia fechar resultado.close ok?

ñ posso tirar o segundo laço pq ele vai fazendo o select de acordo com o código que pega no primeiro

luciano2

Você pode colocar o resultado do primeiro select em uma Collection e iterar para fazer o segundo while.

Mas provavelmente deve existir uma forma pura e simples de fazer isso com SQL.

pmlm

De facto, esse código só vai buscar o último detalhe para cada produto. É isso o pretendido? E dá sim para fazer com um único sql.

colosos_colossus
objetivo é maior
dtm = (javax.swing.table.DefaultTableModel) jTableSupermercado.getModel();
        try {
            Date data = new Date();
            DecimalFormat formatar6 = new DecimalFormat("000000");
            DecimalFormat formatoDecimal = new DecimalFormat("#0.00");
            DecimalFormat formatar2 = new DecimalFormat("00");
            DecimalFormat formatar4 = new DecimalFormat("0000");
            DecimalFormat formatarSem = new DecimalFormat("");
            SimpleDateFormat formatData = new SimpleDateFormat("dd/MM/yyyy");
            System.out.println("data : " + formatData.format(data));
            resultado = stam.executeQuery("select * from produto where lojcod = 1");

            while (resultado.next()) {
                int cod = resultado.getInt("procod");
                codpro = formatar6.format(cod);
                descpro = resultado.getString("pronom").trim();
                int grucod = resultado.getInt("grucod");
                String gru = formatar2.format(grucod);
                int grusubcod = resultado.getInt("grusubcod");
                String subgru = formatar4.format(grusubcod);
                grupro = gru + subgru;
                //qtdpro = resultado.getDouble("proqtest");
                //prcupro = resultado.getDouble("");
                prvapro = resultado.getDouble("proultpaq");
                //prcustocom = resultado.getDouble("");
 
                forpro01 = resultado.getInt("Forcod");
                unidade = resultado.getString("prouni").substring(0, 2);
                unemb = unidade;
                unid = unemb;
                resultado2 = stam.executeQuery("select * from pro2 where lojcod = 1 and procod = " + cod);
                while (resultado2.next()) {
                    prvapro = resultado2.getDouble("propreaq");//pro2
                    detalhe = resultado2.getString("proref").trim();//pro2
                    double codbar = resultado2.getDouble("probard");//pro2
                    codbarun = formatar2.format(codbar);
                }
                stam2.executeUpdate("insert into tabpro (codpro,descpro,detalhe,grupro,unidade,unemb,codbarun,prcustocom,fabpro,forpro01,contrrefer,icms,indcomp,qtdemb,rgcodusu,rgusuario,rgevento) values ('" + codpro + "','" + descpro + "','" + detalhe + "','" + grupro + "','" + unidade + "','" + unemb + "','" + codbarun + "'," + formatar2.format(prcustocom).replace(",", ".") + "," + fabpro + "," + forpro01 + ",'" + contrrefer + "'," + icms + ",'" + indcomp + "'," + qtdemb + "," + rgcodusu + ",'" + rgusuario + "','" + rgevento + "')");
                stam2.executeUpdate("insert into tabprofil (codpro,codfil,qtdpro,prcupro,prvapro,rgcodusu,rgusuario,rgevento) values ('" + codpro + "'," + 1 + "," + formatar2.format(qtdpro).replace(",", ".") + "," + formatar2.format(prcupro).replace(",", ".") + "," + formatoDecimal.format(prvapro).replace(",", ".") + "," + rgcodusu + ",'" + rgusuario + "','" + rgevento + "')");

                stam2.executeUpdate("insert into tabprocod (codpro,codigo,unid,qtdun) values ('" + codpro + "','" + codigo + "','00'," + 1 + ")");
                try {
                stam2.executeUpdate("insert into tabprocod (codpro,codigo,unid,qtdun) values ('" + codpro + "','" + codbarun + "','UN'," + 1 + ")");
                } catch (Exception e) {
                }
                dtm.addRow(new Object[]{codpro,descpro,detalhe,prvapro});                
            }
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Erro!");
            System.out.println("SQLException: " + ex.getLocalizedMessage());
        }
isso é um conversor
luciano2

Cara cuidado,

Você pode estar fazendo uma montanha russa ao invês do escorregador que foi solicitado.

Uma solução generica em um sistema especifico pode matar a performance do seu sistema. Já tive um problema com isso, um sistema com 10 telas 15 relatórios e uma abstração monstruosa para fazer as consultas, isso gerou um grande extress com o cliente e poderia ter sido evitado.

colosos_colossus

ResultSet e Statement.
pelo visto tenho que abrir e fechar na hora certa …
voce pode me dar um exemplo ?

e esse meu código é um conversor, sabe quando agente tem que ficar interpretando esses banco mal estruturados de programado Fresco…
isso é pra converter os dados do cliente para um novo banco ( do novo sistema dele).

luciano2

Bem o resultSet você vai fazer a consulta, iterar o resultSet e preencher objetos de um tipo expecifico e adicionar em uma Collection, arrayList, map ou qualquer outra.

FEito isso você pode executar outra consulta usando o statment isso vai fechar o resultset antigo e iniciar o novo. Não tem segredo.

gregorioarthur

Posso dar um opnião?

substitui tudo por PreparedStatement, e revisa os SQL’s, pq como o luciano@@ (e se eu intendi seu problema) uma query melhor montada resolve seu problema.

Falow

Criado 28 de maio de 2010
Ultima resposta 29 de mai. de 2010
Respostas 11
Participantes 4