Apos um Insert em um formulário, como capturar o ID do ultimo registro?

Caros Amigos do Forum

Tenho um formulário (TABELA_A), que após o insert no evento ONBEFOREINSERT, preciso recuperar o ultimo ID (campo autoincremento) para poder nesse EVENTO efetuar um outro insert na TABELA_B, onde o valor de ID irá ser chave Estrangeira.

Em PHP normal fora do ScriptCase-8 uso a seguinte rotina:

// INCLUIR REGISTRO NOVO NA TABELA_A, campo (ID_TA,RAZAO) onde ID_TA é autoincremento

      $sql_TABELA_A_insert = "INSERT INTO tabela_A (RAZAO) VALUES ('$W_RAZAO')";

      mysql_query($sql_TABELA_A_insert)or die("A inclusao falhou - tabela na TABELA A);

// PEGA O ULTIMO ID CRIADO

      $W_ID_NOVO = mysql_insert_id();

// INCLUIR REGISTRO NOVO NA TABELA_B, campo (ID_TB,ID_TA,PRODUTO) onde ID_TB é autoincremento

      $sql_TABELA_B_insert = "INSERT INTO tabela_B (ID_TB,ID_PEDIDO,PRODUTO) VALUES ('$W_ID_NOVO','$W_PRODUTO')";

      mysql_query($sql_TABELA_B_insert)or die("A inclusao falhou - tabela na TABELA B);

No ScriptCase estou tentando usa o EVENTO onBeforeInsert nele tenho o seguinte comando

[color=blue]sc_exec_sql(“select ID_TA from TABELA_A order by ID_TA desc”);

sc_alert("id_ta= ".{ID_TA});[/color]

O valor de ID_TA está vindo em branco … Como resolver? peço ajuda^! Obrigado a todos

Ideal:
Criar uma trigger para gravar a segunda tabela.

Via PHP.
Crie um campo ex: sessao_php char(32).
Onbeforeinsert : {sessao_php} = session_id();

Onafterinsert:
$sessao=session_id();
sc_lookup(ds,“Select max(id) from tabelaA where sessao_php=’$sessao’”);

1 Curtida

Estou com a mesma necessidade, a unica diferença é que é em uma aplicação Controle.
O ID é AUTO-INCREMENT

EX: sc_exec_sql(“INSERT INTO dirfs (cpf, beneficiario, associado) VALUES (’$cpf’,’$beneficiario’,’$associado’)”);

  printf("Last inserted record has id %d\n", mysql_insert_id());   //ta retornando "0"

Como é bom ler o manual! Encontramos comandos que nem sabíamos que existia:
http://php.net/manual/pt_BR/function.mysql-insert-id.php

Já tinha consultado a documentação, mais pra varia é mais um problema de escopo do SC.

Contornei a situação assim.

mysql_query(“INSERT INTO dirfs (cpf, beneficiario, associado) VALUES (’$cpf’,’$beneficiario’,’$associado’)”);
printf(“ID inserido = %d\n”, mysql_insert_id());

Valeu

Com PostgreSQL eu consigo fazer da seguinte forma:

INSERT INTO usuarios (login, senha) VALUES (…, …) RETURNING id AS pk;

Funciona direitinho!

Tentei e estou recebendo o erro:

“mysql_query(): No such file or directory”

Flávia,

A forma que o Haroldo postou é sem dúvida a melhor solução. Ou então se achar muito complicado, faz um SELECT nessa tabela pegando o ID gerado, colocando no WHERE os dados que usaste pra gravar.

Esqueci de mencionar que estou trabalhando em um Controle hehehe mas vou tentar adaptar a dica dele. Obrigada!

Blz!! Quanto ao erro do mysql_query, tente usar o sc_exec_sql() mesmo…

Resolvido assim:

$sql = "INSERT INTO ...";
sc_exec_sql($sql);
sc_lookup(ds, "SELECT LAST_INSERT_ID()");
if (!empty({ds})) {
    {id_gerado} = {ds[0][0]};
    ...
}

Obrigada!

Tem que se tomar cuidado com LAST_INSERT_ID() caso tiver 100 usuários incluindo ao mesmo tempo, vai acabar pegando ID de outro usuário, a melhor forma é a que o Haroldo, passou
já que a sessão (session_id()) é única por navegador.
Olhe as Notas:
http://php.net/manual/pt_BR/function.mysql-insert-id.php

O LAST_INSERT_ID pegará o último id para a sessão mylsql em questão que é atribuída no momento da conexão com banco, sendo assim a integridade mult-usuário é mantida.

Bom dia pessoal,

Tenho uma dúvida relacionada a esse assunto:
Por exemplo, o registro original tem um campo lá de data e foi escolhido adicionar mais 5 recorrência desse original, ou seja, no total irei inserir 6 registros no banco (1 original do formulário preenchido e + 5 recorrência adicionando 1 dia no campo de data), porém gostaria de guardar em outro campo o ID gerado pelo banco para o registro original no próprio registro original e nos outros 5, tipo um campo ID_repetir, para quando precisar editar todos os 6 registros.

Qual a melhor forma de fazer isso mantendo a integridade multi-usuário?

Olá,

Se eu entendi bem, basta usar o LAST_INSERT_ID logo após a gravação do primeiro registro.

Olá Kleyber,

Beleza… E já tem como deixar isso com um valor definido do próprio campo ID_repetir? Visto que mesmo que não tenha recorrência ele pode repetir o ID gerado pelo banco.

Se o campo ID_repetir não é auto_increment, basta salvar o valor do LAST_INSERT_ID nesse campo, em cada registro.

Desculpe a ignorância, mas eu dei um truncate na tabela para testar o SELECT LAST_INSERT_ID() e ele retorna 9…

Entendo que ele está pegando esse valor de outra coluna… como garanto que ele está pegando da tabela que preciso?

O LAST_INSERT_ID está correto, pois foi em relação ao ÚLTIMO registro inserido e não ao estado atual da tabela após o TRUNCATE.