Pegar numero do autoincremento no FB para gravar nas tabelas relacionadas.Como?

11/09/2017

0

Ola!
Tenho uma tabela trocaCheques e outra Cheques...Para cada transacao na tabela trocaCheques eu quero gravar varios cheques na tabela cheques.So que eu preciso pegar o valor novo do campo TrocaID pra gravar na tabela Cheques...Como eu faria isso se o valor de TrocaID so é gerado depois que eu gravar na tabela trocaCheques minha transacao? Se eu dou um append na tabela trocaCheque ele so gera o autoincremnt do FB depois que eu salvo a transacao e como eu faria pra gravar pra cada cheque que eu quiser gravar na tabela cheques?

eu estava dando um append e um post ja de cara no botao adicionar depois no botao salvar eu procurava por este registro que tinha sido inserido ao clicar em adicionar( eu inseria um texto e no botao salvar fazia um if locate ) mas pra trabalhar em rede nao funciona gera key violation se 2 pessoas tiverem inserindo dados.


como eu faria isso por favor?

obrigado
Eduardo Tavares

Eduardo Tavares

Responder

Post mais votado

11/09/2017

No FB você pode usar o RETURNING (Retorna o valor de um campo após a operação sendo update ou insert), só que invés de você dar um EXECSQL você da um OPEN na query. Usarei o exemplo utilizando o DBEXPRESS:

    function InsertSQL: String;
    begin
         Result := 'INSERT INTO TROCACHEQUES (TROCAID, NUMEROCHEQUE, VALOR) VALUES (GEN_ID(ID_TROCACHEQUE), 1), 
                         :NUMEROCHEQUE, :VALOR) RETURNING TROCAID';
    end;

   
   procedure InsertTrocaCheques;
   var
       Query: TSQLQuery;
       IdTrocaCheque: Integer;
   begin
        Query := TSQLQuery.Create(nil);
        try
           Query.SQLConnection := SuaConexao; //sua conexão que estará definida de alguma forma
           Query.SQL.Add(InsertSQL);
           Query.ParamByName('NUMEROCHEQUE').AsString := '123456';  
           Query.ParamByName('VALOR').AsCurrency := 123,80;

           Query.Open;

           IdTrocaCheque := Query.FieldByName('TROCAID').AsInteger;

           //Insira seus métodos de controles aqui pra trabalhar com o IdTrocaCheque

        finally
            Query.Close; //é bom fechar querys abertas mesmo que vá destruir o objeto na sequência
            FreeAndNil(Query);
        end;
   end;


Não coloquei o restante do código inserindo na tabela CHEQUES por que acho que você irá entender o restante da lógica, no entanto, qualquer coisa estou a disposição, abraços.

Rafael Bosco

Rafael Bosco
Responder

Mais Posts

11/09/2017

Eduardo Tavares

Mas como eu faria no meu caso.Eu to fazendo o seguinte : eu dou um append na tabela trocaCheques e antes de salvar os dados dela eu vou adicionando os cheques o numero que for tipo 5 cheques,depois que acabei de add os cheques ai eu salvo os dados da tabela trocacheque...nesse caso como eu faco ja que vou ter que salvar o trocacheque primeiro pra depois salvar os cheques com a ID do TC?

obrigado
Responder

11/09/2017

Eduardo Tavares

Rafael tudo bem? Obrigado primeiramente...estou usando o codigo aqui mas quando eu rodo da um erro falando que o campo TROCAID da query1 nao existe..
Responder

11/09/2017

Rafael Bosco

tudo tranquilo e por aí Eduardo? Então cara, o exemplo que eu usei, foi para uma tabela imaginária, não sei como é a sua tabela, e qual é o nome correto do campo TROCAID (que é o identificador que você quer gravar na tabela CHEQUES).

Você quer gravar primeiro na tabela TROCACHEQUES correto? Depois de gravado você precisa do campo ID desta tabela para gravar na tabela CHEQUES correto?

O meu exemplo faz justamente isso, ele da um INSERT na tabela TROCACHEQUES e já me retorna qual foi o ID deste insert (que com ele você vai utilizar para gravar na tabela CHEQUES).

A estrutura ficaria assim:

1. INSERT NA TABELA TROCACHEQUES RETORNANDO O ID.
2. INSERT NA TABELA CHEQUES COM O ID RETORNADO DO PASSO 1.
Responder

11/09/2017

Eduardo Jr

Sim eu so troquei os nomes dos campos de acordo com minha tabela aqui...quando eu busco o valor com o codigo IdTrocaCheque := Query.FieldByName('TROCAID').AsInteger; ele diz que nao existe sendo que esta la o campo...minhas ligacoes sao sqlconnection/sqldataset/datasetprovider/clientdataset/datasource mas estou fazendo isso em uma query que tenho no DM ligada ao sqlconnection...

obrigado
Responder

11/09/2017

Eduardo Jr

fiz o seguinte: no botao inserir eu inserir um registro com um texto qqr em um campo da tabela trocaCheques e ja peguei o valor do ID pq eu uso ele em pelo menos umas outras 4 tabelas que salvo antes mesmo de finalizar a transacao da tabela principla que e a trocaCheques...mas na vdd ja ta salvo dai no final na hora de finalizar eu procuro pelo valor que entrei ao clicr em adicionar e edito o registro adicionando o resto das info...
Responder

11/09/2017

Eduardo Jr

aqui esta o codigo do botao adicionar...so que esta dando um erro agora cursor is not open...

  With DM.sqlQuery1 do
  Begin
    SQL.Clear;
    SQL.Add('INSERT INTO ENTRADAS(ENTRADA_ID,DETALHE_ENTRADA) VALUES(GEN_ID(GEN_ENTRADAS_ID,1),:DET_ENT) RETURNING ENTRADA_ID');
    ParambyName('DET_ENT').AsString := 'INSERINDO';
    Open;
  End;

  eID := DM.sqlQuery1.FieldByName('ENTRADA_ID').AsInteger;
Responder

11/09/2017

Eduardo Jr

esqueci de mencionar estou usando FB 1.5 este comando returning funciona com esta versao?
Responder

12/09/2017

Rafael Bosco

Bom dia, é, o returning não funciona para o FireBird 1.5, e há componentes que também não conseguem executar o returning, exemplo é o DBExpress para o Firebird 3.0 (somente via FIREDAC).

Meu amigo, minha dica é você usar o FB 2.5, não só por causa do returning... o 1.5 está quase obsoleto, o 2.5 é mais seguro e há mais funcionalidades para você trabalhar com o seu DB.
Responder

12/09/2017

Eduardo Jr

Obrigado Rafael..tem como eu mudar a versao do banco que eu ja tenho ou tenho que criar de novo na versao nova?

obrigado
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar