Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá Galera, bom dia! To com um problema e nem sei como faço pra resolver!
tenho que efetuar um cadastro de uma determinada coisa na sua devida tabela!
E logo em seguida tenho que inserir o código dessa coisa que eu acabei de cadastrar em outra tabela.
Como eu posso fazer? Alguma idéia? olha só:
sql = "insert into tabcoisa(nome_coisa) values('nome_coisa')"
o código é de auto increment (numeração automática no Access). Como posso pegar esse código que eu acabei de cadastrar pra fazer outra inserção:
sql = "insert into tabcoisa2(codigo_coisa) values (??????)"
Pensei em dar um select * from tabcoisa order by codigo_coisa desc, assim eu teria a última coisa cadastrada, mas isso pode dar problema quando houverem dois cadastros simultaneos. Vai que na hora que você dá o Select tem outra pessoa cadastrando...ai você vai pegar a coisa errada né?
Agradeço a atenção! Abraço!
Olá Patrique essa foi a primeira coisa que pensei.
Mas veja bem:
E se houverem duas pessoas cadastrando?
pessoa um cadastra a coisa: e na um milésimo antes da pessoa fazer o select pra pegar a ultima coisa vai outra pessoa e cadastra.
Olha só! Vamos supor que a pessoa um cadastrou e o código foi 51! só queeu não sei o código então vou fazer o select * from tabcoisa order by codigo_coisa desc.
Porém se antes de eu fazer esse select tem outra pessoa cadastrando simultaneamente e cadastra a coisa de código 52!
ai na hora da primeira pessoa fazer o select ela vai pegar a coisa 52 e não a 51, não é?
Esse é o meu problema! Obrigado!
Olha só! Vamos supor que a pessoa um cadastrou e o código foi 51! só queeu não sei o código então vou fazer o select * from tabcoisa order by codigo_coisa desc.
tem razão, se fizer dessa forma poderá ter problema
por isso tem uma função específica
Usando PHP
<a href="http://php.net/mysql_insert_id" target="_blank">http://php.net/mysql_insert_id
Usando MySQL
<!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1-->SELECT LAST_INSERT_ID()<!--c2--></div><!--ec2-->
<a href="[http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html"](http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html) target="_blank">[http://dev.mysql.com/doc/refman/5.0/en/get...-unique-id.html](http://dev.mysql.com/doc/refman/5.0/en/get...-unique-id.html)Recupere outras informações então, tipo faz o select procurar pelo título e descrição do cadastro que foi feito anteriormente, é impossível a pessoa colocar a mesma coisa em seguida... com o mesmo conteúdo.
Dae tu manda buscar por descrição e titulo... o sistema ira encontrar, dae tu pega o id através do select.
É uma gambiarra rsrssrsrsrs, mais eu sinceramente nunca ouvi uma função direto do sql que faça isso sem o uso de POG.
Veja se a solução que o Hinon postou serve para ti, depois poste o resultado aqui.
Solução fenomenal do Gaúcho.
Show... matou a parada, exelente função.
Pessoal! Valeu mesmo pela ajuda!
Mas ainda me resta uma dúvida. As soluções que me foram passadas são as que fazem o banco retornar o valor do ultimo registro inserido.
Mas se há inserções simultâneas o problema vai ser idêntico doq ue se eu pegar e fizer "Select * from tabcoisa order by codigo_coisa desc" não é?
Afinal, se um pouco antes do Select alguém inserir algo no banco o problema é o mesmo, vai pegar o ultimo registro inserido que não é o meu...
Não é verdade?
De acordo com o Gaúcho, o código dele funciona justamente para o que você quer.
O que você pode fazer é simular vários cadastros ao mesmo tempo e confirmar se funciona ou não.
Cara, de uma forma ou de outra não existe uma solução direta pelo sql, tu vai ter que fazer um POG.
Você testou a solução do Gaúcho? se testou e não funfou para você ae vai outra dica POG....
Eu faria uma gambiarra assim....
Criaria uma nova tabela no BD chamada "temp" no momento do cadastro eu pegaria através de uma função em asp, a hora.... o minuto... e por fim jogaria um numero randon de 4 digitos....
por exemplo....
hoje é....
Hora: 12
Minuto: 46
Randon: 7684
juntando isso ficaria
12467684
este dado eu geraria e o colocaria na tabela temp do banco de dados.... no começo do code... antes do usuário começar a cadastrar eu geraria este numero através de uma function e colocaria este numero gerado em uma session ou application.
Dai quando o usuário finalizar o cadastro você recupera este serial gerado no começo do code e o coloca no bd... depois na segunda etapa quando precisar editar ou inserir um novo registro você manda o select procurar por este serial que esta nesta session ou application.
É uma gambiarra mais é uma solução.
Patrique, entendi, mas esse código vai tornar a página mais pesada, entretando não é dispensável vou ver aqui.
Hargon, outro problema é que eu não uso o addnew do recordset, mas sim o execute da conexão.
Sendo assim, para seguir o método do gaúcho terei de mudar o modo de inserção de dados também?
O método do gaúcho é uma função.
No caso você teria que utilizar a função dele para realizar o primeiro INSERT INTO.
'Armazena o código em uma variável para ser usada posteriormente
codigo = inserirRegistro("teste", Array("nome", "data"), Array("joão2", date)).Com o código armazenado em uma variável, você poderá utilizá-lo posteriormente. O objetivo da função é retornar o código do registro
Galera tive uma idéia interessante!
A Pessoa 1 está fazendo a inserção. Nesse momento o acesso ao banco de dados fica desabilitado para a pessoa 2!
Só volta a ser reabilitado quando a pessoa1 fez o insert, o select e fechou a conexão.
Enquanto a pessoa1 estiver usando o banco a pessoa2 faz um laço de looping tentando acessar o banco até ela conseguir!
Assim não tem problema...é possível isso?
É possível, mas não é viável, e não está livre de acontecer o erro, pois pode ter uma pessoa 3, 30, 300.
Particulamente eu não faria desta maneira, ficaria inviável bloquear e fazer o usuário ficar na fila, sem contar que usuários poderiam zoar o sistema caso notassem como é feito a fila.
A função que criei e já citada aqui não vai ter problemas pois ela retorna o código próprio registro, independente de quantas conexões simultaneas pois quem controlará isso vai ser o driver de conexão.
Não foi citado neste post qual a base de dados em questão, mas se quiserem fazer direto no sql(que será o mesmo que a função que fiz) só fazer assim:
SQLSERVER
sql = "INSERT INTO TABELA (NOME,EMAIL) VALUES ('joao', 'joao@teste.com'); SELECT @@IDENTITY AS CODIGO FROM TABELA;"
set rs = conexao.execute(sql)
set rs = rs.nextrecordset
codigo = rs("CODIGO")
ORACLE
sql = "SELECT SCHEMA.NOME_DA_SEQUENCE.NEXTVAL AS CODIGO FROM DUAL "
set rs = conexao.execute(sql)
codigo = rs("CODIGO")
sql = "INSERT INTO TABELA (CODIGO, NOME,EMAIL) VALUES (" & codigo & ", 'joao', 'joao@teste.com'); "
conexao.execute(sql)
MYSQL
sql = "INSERT INTO TABELA (NOME,EMAIL) VALUES ('joao', 'joao@teste.com'); "
connexao.execute(sql)
sql = "SELECT LAST_INSERT_ID(CODIGO) AS CODIGO FROM TABELA ORDER BY CODIGO DESC LIMIT 1 "
connexao.execute(sql)
É totalmente aplicavel estas formas pois se tratam de Banco de Dados e eles controlam os códigos, chaves primárias, identificadores e no caso do Oracle a Sequence (que recomendo usar juntamente com uma TRIGGER) e os SGDBs controlam isso pela conexão ativa.
Cuidado para não fecharem uma conexão e abrir novamente sem antes ter o código(ID) do registro armazenado em uma variável.
Não se preocupem pois todos os exemplos são aprovados e corretamente utilizados(via sql ou a função), vai de cada um fazer o que é certo ou arriscar uma nova metodologia para uso da aplicação de forma restringir os usuários ou usando o famoso e ERRADO "SELECT MAX(CODIGO) FROM TABELA"
Jonathan Vou testar o que você me falou, desculpe a demora!
Obrigado a todos, de coração pela ajuda!
Sem dúvida o Imasters é o melhor forum de informática!
Vou testar o sistema com essa metodologia e logo mais falo a vocês!
Novamente, muito obrigado
Olá Jonathan!
Fiz um teste com um sistema improvisado pra isso e me parece que funcionou!
Muito Obrigado mesmo. Só que no caso do ACCESS eu adaptei o código e gostaria de saber se não dá o problema de multiusuários cadastrando:
banco = Server.MapPath("../banco.mdb")
cnstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & banco & ";"
set rs = Server.CreateObject("ADODB.RecordSet")
set cn = Server.CreateObject("ADODB.Connection")
cn.Open cnstr
sql = "insert into tabela(email) values('123vaisefode')"
cn.execute sql
sql = "SELECT @@IDENTITY AS codigo FROM TABELA"Nunca fiz isso no access, não sei se funciona o @@IDENTITY no acess, acredito que não, mas se ele tiver essa propriedade então beleza
Ok Jonathan. Eu fiz esse teste no access e tive sucesso.
Obrigado!
Problema resolvido!
>
Olá Galera, bom dia! To com um problema e nem sei como faço pra resolver!
tenho que efetuar um cadastro de uma determinada coisa na sua devida tabela!
E logo em seguida tenho que inserir o código dessa coisa que eu acabei de cadastrar em outra tabela.
Como eu posso fazer? Alguma idéia? olha só:
sql = "insert into tabcoisa(nome_coisa) values('nome_coisa')"
o código é de auto increment (numeração automática no Access). Como posso pegar esse código que eu acabei de cadastrar pra fazer outra inserção:
Agradeço a atenção! Abraço!
Como é logo em seguida, você pode fazer um select pegando o maior valor da coluna ID, neste caso ele vai pegar o ID maior que consequentemente é o último que foi cadastrado, pegando este valor você terá o último id cadastrado e com base nele você pode cadastrar em outra tabela.