Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

LuX_

[Resolvido] Duas inserções diferentes pegando um código de numera

Recommended Posts

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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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!

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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</a>

 

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" target="_blank">http://dev.mysql.com/doc/refman/5.0/en/get...-unique-id.html</a>

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

É possível, mas não é viável, e não está livre de acontecer o erro, pois pode ter uma pessoa 3, 30, 300.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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"

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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"
rs.Open sql,cn,3,3
cod = rs("codigo")
response.write cod & "<br>"
rs.close
cn.close

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok Jonathan. Eu fiz esse teste no access e tive sucesso.

 

Obrigado!

 

Problema resolvido!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.