Pegar numero do autoincremento no FB para gravar nas tabelas relacionadas.Como?
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
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
Curtidas 0
Melhor post
Rafael Bosco
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:
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.
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.
GOSTEI 1
Mais Respostas
Eduardo Tavares
11/09/2017
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
obrigado
GOSTEI 0
Eduardo Tavares
11/09/2017
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..
GOSTEI 0
Rafael Bosco
11/09/2017
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.
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.
GOSTEI 1
Eduardo Jr
11/09/2017
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
obrigado
GOSTEI 0
Eduardo Jr
11/09/2017
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...
GOSTEI 0
Eduardo Jr
11/09/2017
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;
GOSTEI 0
Eduardo Jr
11/09/2017
esqueci de mencionar estou usando FB 1.5 este comando returning funciona com esta versao?
GOSTEI 0
Rafael Bosco
11/09/2017
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.
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.
GOSTEI 1
Eduardo Jr
11/09/2017
Obrigado Rafael..tem como eu mudar a versao do banco que eu ja tenho ou tenho que criar de novo na versao nova?
obrigado
obrigado
GOSTEI 0