Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Recuperar id do registro que acaba de ser inserido


evertonviana

Pergunta

Galera,

Mais uma vez eu perturbando...

Situação:

Usuário acaba de inserir um registro no BD, que gerou uma nova entrada (ID) é redirecionado para uma tela de

informação "Registro Inserido".

A Idéia é após "Registro Inserido", aparecer o numero de Identificação desse registro.

Como faz?

Link para o comentário
Compartilhar em outros sites

14 respostass a esta questão

Posts Recomendados

  • 0

Ai você terá que fazer uma leitura normal mesmo, porem organizando o id em ordem decrecente, mais ou menos assim:

'selecionando apenas 1 registro na ordem decrecente, que logicamente é o ultimo id cadastrado.

'você pode fazer isso logo que acabar de gravar os dados do usuario.

sql = "Select TOP 1 * from USUARIOS order by ID_USUARIO desc"

set rs = conexao.execute(sql)

ultimo_id = RS("id_usuario")

estou imaginando que você já tenha a conexao com o banco criada...

Abração!

Link para o comentário
Compartilhar em outros sites

  • 0

que bd você usa?

olha um exemplo com SQL server:

CREATE PROCEDURE dbo.PRC_INSERE_TESTE
@campo1 as blá blá blá,
@campo2 as blá blá blá,
@campo3 as blá blá blá,
@int_Identity INT OUTPUT
AS INSERT INTO dbo.TABELA
	(
		campo1,
		campo2,
		campo3
	)
VALUES
	(
		@campo1,
		@campo2,
		@campo3
	)

SET @int_Identity = (SELECT @@IDENTITY)

RETURN
no exemplo acima a tabela tem um campo auto increment (identity). ná página
vSql = "dbo.PRC_INSERE_TESTE"
Set cmd = Server.CreateObject("ADODB.Command")
With cmd
    .ActiveConnection = objConn
    .Commandtext = vSql
    .CommandType = 4
    .Parameters.Append .CreateParameter("@campo1", 9, 9, 9, var1) 'onde está 9 você deve colocar os paremetros de acordo com sua tabela
    .Parameters.Append .CreateParameter("@campo2", 9, 9, 9, var2)
    .Parameters.Append .CreateParameter("@campo3", 9, 9, 9, var3)
    .Parameters.Append .CreateParameter("@Id", 9, 9, 9)
    .Execute
    retCount = .Parameters("@Id")
End with

Response.Write("Id gerado no DB = " & retCount)

relação de parametros

Link para o comentário
Compartilhar em outros sites

  • 0

Se for SQL SERVER, te indico o SCOPE_IDENTITY() que é mais seguro.

@@IDENTITY= retorna o último valor identity inserido em qualquer tabela desde que seja na sessão corrente.

IDENT_CURRENT() = retorna o último valor identity inserido em uma determinada tabela em qualquer sessão ou escopo.

SCOPE_IDENTITY() = limitado a um escopo e com isso retornará o último valor identity inserido dentro do escopo de um determinado batch.

Fonte: http://www.mcdbabrasil.com.br/modules.php?...icle&sid=59

Link para o comentário
Compartilhar em outros sites

  • 0
Ai você terá que fazer uma leitura normal mesmo, porem organizando o id em ordem decrecente, mais ou menos assim:

'selecionando apenas 1 registro na ordem decrecente, que logicamente é o ultimo id cadastrado.

'você pode fazer isso logo que acabar de gravar os dados do usuario.

sql = "Select TOP 1 * from USUARIOS order by ID_USUARIO desc"

set rs = conexao.execute(sql)

ultimo_id = RS("id_usuario")

estou imaginando que você já tenha a conexao com o banco criada...

Abração!

Leandro_SM:

Sim pensei fazer dessa maneira, mas imaginei a aplicação funcionando e varias pessoas realizando inserções no BD ao mesmo tempo, se eu inserir uma entrada junto com você será que não daria algum tipo de conflito, na hora de recuperar esse registro para mostrar na tela?

Fercosmig:

Estou usando um MDB até terminar a criação da aplicação, posteriormente outra pessoa fará a conversão para SQL(não domino)... Como você sugere em MDB?

Link para o comentário
Compartilhar em outros sites

  • 0

quanto a inserção ao mesmo tempo, use o aplicattion lock e unlock.

mysql

Esqueça MAX() +1 , ORDER BY chave DESC LIMIT 1, SHOW TABLE STATUS, entre outros…

Segue abaixo uma das melhores formas para se fazer isso:

1 INSERT INTO tabela (chave_primaria, coluna1, coluna2) VALUES (null, ‘aaa‘, ‘bbb‘);
2 SELECT LAST_INSERT_ID() INTO @ID;
3 INSERT INTO outratabela (chave_estrangeira, coluna3, coluna4) VALUES (@id, ‘xxx‘, ‘yyy‘);
4 INSERT INTO outratabela (chave_estrangeira, coluna3, coluna4) VALUES (@id, ‘www‘, ‘zzz‘);
5 INSERT INTO outratabela (chave_estrangeira, coluna3, coluna4) VALUES (@id, ‘uuu‘, ‘iiii‘); 
Desta forma você tem 100% de eficiência na recuperação do ID, não tendo problemas em capturar um ID recém-inserido por outro usuário. Com LAST_INSERT_ID() você estará recuperando sempre o último ID gerado pela sua sessão.

Se você estiver usando INNODB engine, ainda pode trabalhar com transações adicionando os comandos START TRANSACTION e COMMIT para ter total integridade dos dados.
access
<!--#include file=adovbs.inc -->

<% 
Set objConn = CreateObject("ADODB.Connection")
Set objRS = CreateObject("ADODB.Recordset")

objConn.Open "DSN=advworks;"

'Access does not support a cursor engine so a client cursor must be used
objRS.CursorLocation = adUseClient

objRS.Open "SELECT * FROM Customers", objConn, adOpenStatic, adLockOptimistic

     ' when you invoke the method AddNew it adds a new record to the end of           
     ' your current recordset and places your cursor on that record.
     
objRS.AddNew
    objRS("CompanyName") = "Microsoft"
    objRS("ContactFirstName") = "Bob"
    objRS("ContactLastName") = "Smith"
objRS.Update

     ' when you invoke the method Update, it updates the database with the
     ' values of the new record that we just created.  To retrieve the 
     ' value of the Autonumber field we need to update the ADO recordset that
     ' currently have.

     ' When you do a Requery on your recordset, you lose your cursor.  So
     ' we need to store the location before we do the Requery, then reset
     ' it after the Requery.

'before the requery, the Autonumber field shows as 0
Response.Write "<br>ID before Requery = " & objRS("CustomerID")   

bookmark = objRS.absolutePosition  ' First, store the location of you cursor
objRS.Requery                      ' Next, update your recordset with the data from the database

'after the requery, the absolutePosition is the first record of the recordset
Response.Write "<br>ID before setting absolutePosition = " & objRS("CustomerID")

objRS.absolutePosition = bookmark  ' Finally, change your cursor back

'now we have the Autonumber value
Response.Write "<P>Added ID = " & objRS("CustomerID")

objRS.Close
objConn.Close
set objConn = nothing
set objRS = nothing
%>

Link para o comentário
Compartilhar em outros sites

  • 0

Bareta,

Mas utilizando o Application Lock eu estaria "travando" essa opção de inserção, para evitar simultaniedade? Estou me baseado nessa explicação: http://imasters.uol.com.br/artigo/1749/asp...to_application/

Caso sim, não seria muito legal, pois os usuário teriam de esperar um outro operador terminar de cadastrar, para poder ai então voltar a cadastrar. certo?

Teria alguma outra maneira?

Link para o comentário
Compartilhar em outros sites

  • 0
veja que essa espera não é da forma que você pensa...

lock

sql="insert ...."

unlock

bareta,

Desculpe minha enorme ignoracia, mas não consegui operar da maneira acima, como ficaria esse código:

'Trava ação para que não haja colisao
lock

sql = "select TOP 1 * from atendimento order by codigo_atend desc"
Set mostra = Server.CreateObject("ADODB.Recordset")
mostra.open sql, conex, 3,3

'Destrava ação para uso de outro usuario
unlock

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...