Se o código está na outra tabela (tabela usuario_sistema) voce tem que fazer um select antes do insert para obter o campo…
ricardocomp
Jóia ctdaa?
é justamente isso que eu estou precisando
fazer, mas eu sei um pouco de SQL e não
estou sabendo fazer essa consulta será
que vc ctdaa ou alguém poderia me dar
uma ajuda?
Mas o problema é que o nome é da tabela tecnico e não da tabela usuario_sistema.
[]'s.
ctdaa
É um protocolo de boas práticas do fórum ensinar a pescar ao invés de dar o peixe… por isso vou dar umas dicas sem escrever o comando pronto… OK?
assim: do mesmo jeito que você preparou o insert:
#Stringsql="INSERT INTO tecnico(idUsuario, nome, telefone, celular, email)"#+"VALUES(?,?,?,?,?)";##ps=conn.prepareStatement(sql);
depois o ps.execute vai te retornar um resultset de onde voce pega o resultado da pesquisa… o codigo que voce precisa.
É fácil… voce deve encontrar vários exemplos por ai.
(Nao sei se estou respondendo muito básico para a sua pergunta… mas como a pergunta foi básica também…)
OK?
ctdaa
Agora está me confundindo.
Você que inserir um técnico novo, certo? o id do técnico esta na tabela do usuario_sistema, já existe lá ou voce vai criar também o registro na tabela usuario_sistema?
Guinter
OPa!! cara vc deve fazer um join com a tabela tecnico pra referenciar o nome que esta da tabela tecnico
edmarr
Primeiramente , procure uma IDE para o Banco de Dados que vc utilize e execulte os codigos la primeiramente ,
o sql para pegar o nome tem q ser por Like pq vc nao tem previsao tipo assim .
Mas deste jeito vc nao tem precisao , tem que pegar algo que seja unico
Um exemplo de unico eh vc pegar uma chave unica uma PrimaryKey , Uniquekey e talz …
Bom Estudo
thiago_spdvr
deve ser tomados alguns cuidados com a forma como vai ser feita esta pesquisa, pois o resultado da consulta pode te retornar mais de um valor, no caso da falta de precisão citada acima pelo edmarr.
ricardocomp
olá pessoal seguindo o conselho de todos
vc’s eu consegui chegar até aqui:
Stringid="SELECT DISTINCT usuario_sistema.idUsuario FROM usuario_sistema INNER JOIN tecnico WHERE tecnico.nome=?;";Stringsql="INSERT INTO tecnico(idUsuario, nome, telefone, celular, email)"+"VALUES(?,?,?,?,?)";ps=conn.prepareStatement(sql);ps.setString(1,tecnico.getNome());intidUsuario=Integer.parseInt(id);ps.setInt(2,idUsuario);ps.setString(3,tecnico.getNome());ps.setString(4,tecnico.getTelefone());ps.setString(5,tecnico.getCelular());ps.setString(6,tecnico.getEmail());ps.executeUpdate();
Só que agora está aparecendo a seguinte
mensagem:
01/10/200913:23:01teste.TesteGeralmainSEVERE:nullexception.LAFQADaoException:Erroaoinserirdadosjava.lang.NumberFormatException:Forinputstring:"SELECT DISTINCT usuario_sistema.idUsuario FROM usuario_sistema INNER JOIN tecnico WHERE tecnico.nome=?;"atdao.TecnicoDao.salvarTecnico(TecnicoDao.java:59)atteste.TesteGeral.main(TesteGeral.java:46)
Será que alguém poderia me dar uma ajuda?
O que eu fiz de errado?
[]'s.
ricardocomp
Na consulta eu preciso passar um nome de um técnico
e retornar o idUsuario daquele Técnico.
[]'s.
P
pjava
Não sei como seria em java, mas farei tipo delphi e ai vc refaz pra java:
“SELECT DISTINCT usuario_sistema.idUsuario FROM usuario_sistema INNER JOIN tecnico WHERE tecnico.nome=:pnome”;
se fosse delphi, eu pegaria esse parametro(pnome) e carregaria com o valor que um certa variável estaria entrando. Logo, você pode substituir o parametro pnome pela variável. Em java, não sei como funciona, pois estou aprendendo também, mas o conceito vale pra qualquer linguagem, pois isso é SQL ANSI puro.
edmarr
Cara vc tem q fazer o seguinteeeeeeeee primierooooooo
Primeiramente , procure uma IDE para o Banco de Dados que vc utilize e execulte os codigos la primeiramente .
APos ito eh simples eh so passar para o Codigo .
lina
ricardocomp:
olá pessoal seguindo o conselho de todos
vc's eu consegui chegar até aqui:
String id = "SELECT DISTINCT usuario_sistema.idUsuario FROM usuario_sistema INNER JOIN tecnico WHERE tecnico.nome=?;";
String sql = "INSERT INTO tecnico(idUsuario, nome, telefone, celular, email)"
+ "VALUES(?,?,?,?,?)";
ps = conn.prepareStatement(sql);
ps.setString(1, tecnico.getNome());
int idUsuario = Integer.parseInt(id);
ps.setInt(2, idUsuario);
ps.setString(3, tecnico.getNome());
ps.setString(4, tecnico.getTelefone());
ps.setString(5, tecnico.getCelular());
ps.setString(6, tecnico.getEmail());
ps.executeUpdate();
Só que agora está aparecendo a seguinte
mensagem:
01/10/200913:23:01teste.TesteGeralmainSEVERE:nullexception.LAFQADaoException:Erroaoinserirdadosjava.lang.NumberFormatException:Forinputstring:"SELECT DISTINCT usuario_sistema.idUsuario FROM usuario_sistema INNER JOIN tecnico WHERE tecnico.nome=?;"atdao.TecnicoDao.salvarTecnico(TecnicoDao.java:59)atteste.TesteGeral.main(TesteGeral.java:46)
Será que alguém poderia me dar uma ajuda?
O que eu fiz de errado?
[]'s.
Oi,
Claro... olha o que você está fazendo:
String id = "SELECT DISTINCT usuario_sistema.idUsuario FROM usuario_sistema INNER JOIN tecnico WHERE tecnico.nome=?;";
int idUsuario = Integer.parseInt(id);
Ou seja, tentando "transformar" uma String não numérica em um numero inteiro. ?!?!
Tchauzin!
ctdaa
ctdaa:
Agora está me confundindo.
Você quer inserir um técnico novo, certo? o id do técnico esta na tabela do usuario_sistema, já existe lá ou voce vai criar também o registro na tabela usuario_sistema?
Repito esta pergunta… pois como eh que voce vai inserir um técnico “novo” e quer pegar o nome dele de outra tabela com um código que nem foi criado ainda???
O seu problema é mais conceitual do que programação…
Coloque as definições de catalogo das tabelas tecnico e usuario_sistema para gente analisar… seria um bom começo pro pessoal dar a dica correta!
ricardocomp
Jóia Pessoal?
o que eu estou querendo fazer é uma consulta onde eu passo o nome do Técnico
e a consulta me retorne o id_Usuario da Tabela Usuario correspondente aquele Técnico
Será que alguém poderia me dar uma ajuda?
[]'s.
thiago_spdvr
Segue um exemplo de metodo de busca que utilizo:
Retorna um objeto do tipo cliente.
publicstaticClienteGetCliente(intcod_cli){try{Connectioncon=Conexao.Conectar();Stringsql=" Select * FROM tb_cliente Where id_cliente = '"+cod_cli+"'";System.out.println(sql);Statementstmt=con.createStatement();ResultSetrs=stmt.executeQuery(sql);Clientecli=newCliente();System.out.println(rs);while(rs.next()){cli.SetIdent(rs.getInt("id_cliente"));}returncli;}catch(ExceptionErr){System.out.Println(err.getMessage);returnnull;}}
ricardocomp
Jóia Thiago?
Eu estou tentando fazer aqui mas não estou conseguindo
será que tem como vc ou alguém me dar uma ajuda aqui?
Eu construir o trecho de código assim:
Stringsql1="SELECT DISTINCT usuario_sistema.idUsuario "+"FROM usuario_sistema INNER JOIN tecnico "+"WHERE nome = '"+tecnico.getNome()+"'";ps=conn.prepareStatement(sql1);ps.setInt(1,tecnico.getIdUsuario());Stringsql2="INSERT INTO tecnico(idUsuario, nome, telefone, "+"celular, email)"+"VALUES(?,?,?,?,?)";ps=conn.prepareStatement(sql2);ps.setString(2,tecnico.getNome());ps.setString(3,tecnico.getTelefone());ps.setString(4,tecnico.getCelular());ps.setString(5,tecnico.getEmail());ps.executeUpdate();
Você não pode rodar duas SQLs ao mesmo tempo com a mesma conexão.
Para inserts, updates e deletes(modificações na base em geral) você:
Cria o statement a partir da conexão, passando um SQL
Seta as variáveis
Executa o statement
Fecha o statement
Para selects, você:
Cria o statement a partir da conexão, passando um SQL
Seta as variáveis
Executa o statement, trazendo os resultados num result set
Itera pelo result set, pegando os registros retornados
Fecha o result set
Fecha o statement
Lembrando, um de cada vez.
M
marcobiscaro2112
Você quer pegar o usuário do sistema correspondente àquele técnico específico (passa o nome do técnico e pega as informções do usuário correspondente)? Se for, tente fazer o seguinte:
Stringsql="SELECT u.* FROM usuario_sistema AS u, tecnico AS t WHERE t.nome = ? AND u.id = t.id_usuario";ps=conn.prepareStatement(sql);ps.setString(1,tecnico.getNome());ResultSetrs=ps.executeQuery();while(rs.next()){System.out.println("id: "+rs.getString("id"));System.out.println("login: "+rs.getString("login"));System.out.println("senha: "+rs.getString("senha"));System.out.println("tipo_usuario: "+rs.getString("tipo_usuario"));}
ctdaa
Bom… o exception que voce está tomando é porque voce nao tem “?” no sql que voce está preparando… voce já colocou direto o nome do técnico. Então voce não precisa desta linha:
ps.setInt(1,tecnico.getIdUsuario());...
Agora ainda acho que você está confuso no objetivo de pegar um registro do usuario_tabela pesquisando pelo nome do tecnico que nao existe ainda… Porque voce não tenta usar uma ferramenta de query, o próprio netbeans ou eclipse tem, para executar seus comandos e testar se o que você quer fazer vai dar certo…
Agora seu problema: a criação do técnico associado ao usuário:
Qual informação sobre o usuario voce tem? eu acho que seria o “login”. Então voce faz o select na tabela_usuario assim:
sql="select id from tabela_usuario where login=?";ps=conn.prepareStatement(sql);ps.setString(1,usuario.getLogin());ResultSetrs=ps.executeQuery();....
Agora voce já tem o id da tabela_usuario para preencher o “NOVO” registro que voce vai criar para o técnico.
No Insert voce coloca este “id” no campo “id_usuario” da tabela tecnico…
ricardocomp
Olá pessoal,
Bruno o seu passo-a-passo eu vou até anotar aqui,
Marco eu não entendi direitor o porque desse u.* na consulta
e também não sei para que serve direito o AS de uma consulta.
ctdaa eu estou usando a ferramenta do MySQL Query Browser
para testar as minhas consultas, e as minhas chaves primárias
são todas auto_increment.
Seguindo o conselho de todo mundo eu cheguei até aqui:
publicvoidsalvarTecnico(Tecnicotecnico)throwsLAFQADaoException{...Stringsql1="SELECT idUsuario FROM usuario_sistema WHERE login=?;";ps=conection.prepareStatement(sql1);//Como e aonde criar a instância usuario para conseguir pegar o login???ps.setString(1,usuario.getLogin());rs=ps.executeQuery();StringidUsuario=rs.getString("idUsuario");Integer.parseInt(idUsuario);Stringsql2="INSERT INTO tecnico(idUsuario, nome, "+"telefone, celular, email)"+"VALUES(?,?,?,?,?)";/* Cria o Statement a partir da conexão (conn) * passando a consulta sql como parâmetro. */ps=conn.prepareStatement(sql2);/* Seta as variáveis */ps.setInt(1,idUsuario);ps.setString(2,tecnico.getNome());ps.setString(3,tecnico.getTelefone());ps.setString(4,tecnico.getCelular());ps.setString(5,tecnico.getEmail());/* Executa o Statement */ps.executeUpdate();...}
O problema agora é que eu passo um Técnico
para o método e não sei aonde e nem como criar a instância de Usuario?
Será que alguém poderia me dar uma ajuda?
[]'s.
ricardocomp
Eu tenho que pegar a instância de um usuario relacionada com aquele tecnico,
será que alguém poderia me dar uma ajuda?
[]'s.
ctdaa
Bom… aí você é o analista da aplicação… mas imagino duas opções:
o próprio usuário esta se cadastrando como técnico, então voce deve ter uma página de login para o usuário se autenticar… pega o código do login a já preenche este informação na classe tecnico antes de enviá-la para a classe DAO.
um administrador está cadastrando técnicos, então você deve apresentar na tela de cadastro uma selection list de usuários para o administrador escolher, mesma coisa, pega o login e coloca na classe tecnico.
Boa Sorte.
pablouu
.
ricardocomp
Jóia ctdaa?
No meu caso eu só tenho duas entidades,
onde um técnico é um administrador(com todas as permissões) e
um produtor é um usuário comum do sistema.
[]'s.
ctdaa
Excelente. O técnico está preenchendo seu próprio cadastro. Ao entrar no sistema ele fez login? Digitou usuário e senha, etc… então guarda este login para inserir na classe do técnico. Aliás o “produtor” também vai se cadastrar? o procedimento será o mesmo.
ricardocomp
Jóia ctdaa?
quem cadastra o produtor é o técnico mas o produtor e o técnico
tem que fazer o login no sistema. Mas agora eu ainda não entendi
aonde e como criar a instância do usuario ainda?
Será que tem como você ou alguém me dar uma ajuda?
[]'s.
ricardocomp
Jóia Pessoal,
eu estive pensando aqui,
e cheguei a uma conclusão
acho que eu vou fazer o seguinte:
publicvoidsalvarTecnico(Tecnicotecnico,UsuarioSistemausuario)throwsLAFQADaoException{...Stringsql1="SELECT idUsuario FROM usuario_sistema WHERE idUsuario=?;";ps=conection.prepareStatement(sql1);ps.setInt(1,usuario.getIdUsuario());rs=ps.executeQuery();intidUsuario=rs.getInt("idUsuario");Stringsql2="INSERT INTO tecnico(idUsuario, nome, "+"telefone, celular, email)"+"VALUES(?,?,?,?,?)";/*CriaoStatementapartirdaconexão(conn)*passandoaconsultasqlcomoparâmetro.*/ps=conn.prepareStatement(sql2);/*Setaasvariáveis*/ps.setInt(1,idUsuario);ps.setString(2,tecnico.getNome());ps.setString(3,tecnico.getTelefone());ps.setString(4,tecnico.getCelular());ps.setString(5,tecnico.getEmail());/*ExecutaoStatement*/ps.executeUpdate();...}
O que eu devo fazer?
Será que alguém poderia me dar uma ajuda?
[]'s.
ctdaa
Pelo jeito você nao instanciou o usuario ainda… por isso do nullPointer.
Uma pergunta: em que momento voce fez o insert do usuário? Está em outra classe DAO?
No diagrama MER que vc mostrou o relacionamento é 1:1 entre usuário e técnico.
Sendo assim, quando voce insere um registro de tecnico, tem que inserir o usuario também.
Como se fossem uma coisa só. Uma unidade de informação.
Entao nesta sua classe DAO deveria ter dois insert ao invés de um select e um insert.
A classe usuário pode fazer parte dos atributos da classe técnico.
Semelhante para o produtor.
B
Bruno_Laturner
Uma pergunta antes:
Por que você está fazendo um select de idUsuario sendo que você já tem o id contigo?
Olá Pessoal,
Graças a Deus e a ajuda de todos vc’s, eu consegui
resolver o meu problema, MUITO OBRIGADO MESMO A TODOS QUE ME AJUDARAM.
Se algum dia alguém estiver com a mesma dúvida vou postar o meu código aqui:
publicvoidsalvarTecnico(Tecnicotecnico,UsuarioSistemausuario)throwsLAFQADaoException{PreparedStatementps=null;ResultSetrs=null;if(tecnico==null)thrownewLAFQADaoException("O valor passado não pode ser lido");try{/*SQL 1*/Stringsql1="INSERT INTO usuario_sistema(login, password_2, tipo_usuario)"+"VALUES(?,?,?)";/* Cria o Prepared Statement a partir da conexão, passando um SQL */ps=conection1.prepareStatement(sql1);/* Seta as variáveis */ps.setString(1,usuario.getLogin());ps.setString(2,usuario.getPassword());ps.setString(3,usuario.getTipoUsuario().toString());/* Executa o statement */ps.executeUpdate();/* Cria um Statement */stmt=(Statement)conection1.createStatement();intidUsuario=-1;rs=stmt.executeQuery("SELECT LAST_INSERT_ID() FROM usuario_sistema");if(rs.next()){idUsuario=rs.getInt(1);}else{thrownewLAFQADaoException("Erro ao pegar a chave primaria");}/*SQL 2*/Stringsql2="INSERT INTO tecnico(idUsuario, nome, "+"telefone, celular, email)"+"VALUES(?,?,?,?,?)";/* Cria o Statement a partir da conexão (conn) * passando a consulta sql como parâmetro. */ps=conection2.prepareStatement(sql2);/* Seta as variáveis */ps.setInt(1,idUsuario);ps.setString(2,tecnico.getNome());ps.setString(3,tecnico.getTelefone());ps.setString(4,tecnico.getCelular());ps.setString(5,tecnico.getEmail());/* Executa o Statement */ps.executeUpdate();rs.close();/* Fecha o statement */stmt.close();}catch(Exceptionsqle){thrownewLAFQADaoException("Erro ao inserir dados\n"+sqle);}finally{try{/* Fecha as Conexões e os PreparedStatement */ConnectionFactory.closeconnection(conection1,ps);ConnectionFactory.closeconnection(conection2,ps);}catch(SQLExceptionex){Logger.getLogger(TecnicoDao.class.getName()).log(Level.SEVERE,null,ex);}}}