Verificar cadastro do Veiculo antes de inserir uma Ocorrencia

Queria saber como posso fazer uma validação, quando ao inserir uma Ocorrencia ele verificar se o cpf do cliente esta cadastrado na tabela Cliente.

Estou usando swing

Teria que passar uma parametro…
EX:
no DAO seria…
o meu metodo inserir :

[code]
public boolean inserir (DomainObject domainOBject) throws RemoteException

//para validar
public boolean validacpf (String parametro) throws RemoteException// “estou usando rmi”[/code]

Como eu poderia fazer no meu pacote controle para chamar os 2 metodos, fazer a verificação e dps la na visão exibir se o cpf não foi cadastrado… e se for cadastrado ele insere normal.

Dispare uma exceção e propague ela pelas camadas até a interface gráfica caso o cpf não seja válido…

no metodo do validação, no DAO, eu fiz a pesquisa passando por parametro a placa digitada… se ele não localizar a placa na consulta ele cai na exceção…

mais na hora de validar ele executa o try normal…

Pq vc nao altera o BD para que o cpf seja um índice único, sem direito a duplicação?

Cerque seu código com try catch e vc captura sempre que o cara quiser inserir um cpf que já exista.

estava tentando fazer assim:
meu controle:

[code]public boolean ValidaCampo(String parametro) throws RemoteException, SQLException{

IDAO dao = new DaoOcorrencia();
JOptionPane.showMessageDialog(null, "antes do lokk");
    try {
        Naming.lookup("rmi://localhost/ocorrencia");


        JOptionPane.showMessageDialog(null, "dps do do look");
if(dao.ValidaCampo(parametro)){
    return true;}
else{

return false;}}
 catch(Exception e){}
return true;
}

[/code]

dao:

[code]

public boolean ValidaCampo(String parametro) throws RemoteException, SQLException{

try {

Connection conn = Conexao.getConnection();

String sql = null;
// sql = "select descricao,data_ocorrencia,servico,placa,nomecliente,nomeveiculo from ocorrencia where idocorrencia=? ";
sql = "select placaveiculo from veiculo where placaveiculo =?";





PreparedStatement pst = conn.prepareStatement(sql);
pst.setString(1,parametro);
ResultSet rs = pst.executeQuery();}




catch (Exception erro){
return false;
}
return true;
}[/code]

view:

[code] if (fachadaoco.ValidaCampo(tfplaca.getText())){

       // fachadaoco.inserir(ocorrencia);
            JOptionPane.showMessageDialog(null, "ok salvo");

        } else {
            JOptionPane.showMessageDialog(null, "erro");
        }





    } catch (Exception error) {
        error.printStackTrace();
        JOptionPane.showMessageDialog(null, error.getMessage());
    }
}                                        [/code]

ele exibe a mensagem salvo… msm não tendo a placa cadastrada na tabela veiculo

No seu código abaixo, corrija de acordo com as dicas.

[code]public boolean ValidaCampo(String parametro) throws RemoteException, SQLException{

try {

Connection conn = Conexao.getConnection();

String sql = null;
// sql = "select descricao,data_ocorrencia,servico,placa,nomecliente,nomeveiculo from ocorrencia where idocorrencia=? ";
sql = "select placaveiculo from veiculo where placaveiculo =?";

PreparedStatement pst = conn.prepareStatement(sql);
pst.setString(1,parametro);
ResultSet rs = pst.executeQuery();}




catch (Exception erro){
return false;
}
return true;
}[/code]

Dicas:

  1. Aprenda uma coisa: try…catch serve pra capturar ERROS. Não existir a tal placa no BD não é um erro! Apenas não existe e pronto. Sendo assim, depois da linha ResultSet rs = pst.executeQuery();, faça um tratamento verificando se o ResultSet está vazio e então retorne o que deseja na sua validação.

  2. O catch serve pra tratar erros, dentro dele vc pode colocar algum retorno, mas é importante que vc coloque uma msg de erro, vc tem que saber que algo deu errado. Gravar o erro, imprimir no console, alguma coisa, colocar try…catch e não fazer nenhum tratamento é pior do que não colocar, pq vc acaba “escondendo” um erro.

OBS: Já conversamos por MSN, mas achei justo com os demais do GUJ postar aqui qual era seu real problema, para ajudar os demais.

Pessoal consegui resolver graças a Renata, nossa colega do GUJ…
So fiz uma verificação no resultset…

obrigado…

//recomedações dizem para usar nome de metodo = verbo.
public boolean validarCampo(String parametro) throws RemoteException, SQLException{  
          
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;

boolean isCampoValido = false;

try 
{  
      
       conn= Conexao.getConnection();  
      
       StringBuilder sql = new StringBuilder("select ");
       sql.append("CD_OCORRENCIA ");
       sql.append("from OCORRENCIA ");
       sql.append("where CD_OCORRENCIA = ?");
  
       pstmt = conn.prepareStatement(sql.toString());  
       pstmt.setString(1,parametro);  
       rs = pstmt.executeQuery();}  
 
       //caso entre significa que algum registro foi encontrado
       if(rs.next())
       {
             isCampoValido = true;
       }
   
       return isCampoValido;
}
catch (Exception erro)
{
    //caso haver forte concorrencia no seu banco de dados use o autocommit = false da conexão, e também para não
    // entupir de transações não finalizadas no banco.
    if(conn != null)
    {
         conn.rollback();
    }


    throw erro;
}
finally
{
      //use uma classe do tipo UtilConexao.fecharConexoes() para não fazer esse mesmo procedimento em todos os DAO.
      if(pstmt != null)
      {
           pstmt.close();
      }

      if(rs != null)
      {
            rs.close();
       }

       if(conn != null)
       {
            conn.close();
       }
}
       

Outra opção é criar uma exeção e fazer:

if(!validaCpef()){
   throw new CpfInvalidoException("mensagem");
}

É uma possibilidade, mais exceções são para erros eu acredito, o CPF não estar cadastrado na base de dados não é um erro.

Otimo dia.

if(rs.next())   
       {   
             isCampoValido = true;   
       } 

huuum feio né…

que tal

 isCampoValido = rs.next();  

e tira aquele return do meio do try

Assim fica bom, mais pq tirar o return no meio do try ?

se colocar ele no finally a exception não sobe nunca …