Fórum Gravar generator da tabela Master na tabela detail dbexpress #344920
23/08/2007
0
Tenho uma tabela detalhe ITENSFICHAS com campo IDFICHAS
Para inserir uma nova ficha faço:
with dm.qprocura do begin
close;
sql.clear,
sql.add(´select max(ID) AS MMAX from FICHAS´);
open;
end;
If (dm.qprocura.isempty) or (dm.qprocura.field[0].asinteger=0)
then novaficha:=1;
if dm.qprocura.fields[0].asinteger>0 then novaficha:= dm.qprocura.fields[0].asinteger+1;
Ai etão gravo o campo IDFICHAS da tabela ITENSFICHAS com a variável inteira novaficha.
Funciona bem em monousuário.
Como fazer com que FICHAS tenha tenha ID autonumeravel com trigger e generator e na mesma transaçao pegar esse
generator de FICHAS e gravar o campo IDFICHAS no ITENSFICHAS ?
Rinez
Curtir tópico
+ 0Posts
23/08/2007
Carlos Jatai
Gostei + 0
24/08/2007
Rinez
Primeiramente obrigado pela resposta, mas vou explicar melhor:
Quero gravar em duas tabelas:
Tabela Pai tem campo ID .
Na tabela filha em um campo IDFICHAS onde será gravado o ID da tabela Pai.
Preciso pegar ID DA TABELA PAI estou fazendo assim:
1) Com select pego o maior numero do ID da tabela Pai:
Select max(id) as mmax from Fichas.
Coloco da variavel inteira mcod= query1.fields[0] as integer +1.
2) Com esse numero gravo na tabela filha assim:
update ITENSFICHAS SET IDFICHAS=:IDFICHAS ...
PARAMBYNAME(´IDFICHAS´).ASINTEGER:=MCOD;
EXCESQL.
Funciona bem DESTA FORMA, mas para rede esse select max
pode dar problema,.
O que eu gostaria de fazer é colocar Trigger na Tabela Pai para numeração automatica.
Pegar o generator e gravar no campo idfichas da tabela filha.
na mesma transação isto é:
Quero abrir a transação,
gravar a tabela pai,
pegar o generator,
gravar tabela filha,
fechar a transação com commit,
caso haja gero uma exceção e dou rollback.
Gostei + 0
25/08/2007
Rinez
Gostei + 0
25/08/2007
Paullsoftware
Isso é feito automaticamente!!! quanto a disparar o Gerador, posso te passar um código mais tarde ou amanhã quando estiver em ksa blz?
para trabalhar com Master/Detail no DbExpress é mais simples usar campos DataFields para serem usados como tabelas Filhas, assim o relacionamento é feito quase que automaticamente... vou preparar um exemplo e te passo blz!
um abraço :wink:
Gostei + 0
26/08/2007
Rinez
Estou usando uma query do dbexpress.
Não uso o trio query+dataprovider+clientdataset para inserir dados.
Eu uso esse trio somente para apresentar dados.
Para inserir dados uso stringgrid, edits e faço:
try
if not(DM.SQLConnection1.InTransaction) then begin
TD.TransactionID:=1;
TD.IsolationLevel:=xilREADCOMMITTED;
dm.SQLConnection1.startTransaction(TD);
end; // transation
with query1 do begin
close;
sql.clear;
SQL.ADD(´SELECT MAX(ID) AS MMAX FROM FICHAS´);
OPEN;
END;
IF QUERY1.FIELDS[0].ASINTEGER=0 THEN
MCOD:=1;
IF QUERY1.FIELDS[0].ASINTEGER>0 THEN
MCOD:=QUERY1.FIELDS[0].ASINTEGER+1;
Dai eu uso query assim:
with query1 do begin
close;
sql.clear;
sql.add(´ Insert into FICHAS (´);
sql.add(´ID,NOME, ... ) VALUES (´);
sql.add(´:ID,:NOME, ... ´);
PARAMBYNAME(´ID´).ASINTEGER:=COD;
PARAMBYNAME(´NOME´).ASSTRING:=TRIM(EDIT1.TEXT);
. . . .
. . . .
EXECSQL;
END;
//NA TABELA ITENSFICHAS TEM TRIGGER E GENERATOR PARA ID
with query1 do begin
close;
sql.clear;
sql.add(´ Insert into ITENSFICHAS (´);
sql.add(´IDFICHAS,PROFISSIONAL,SERVICO,...) VALUES (´);
sql.add(´:IDFICHAS,:PROFISSIONAL,:SERVICO,:VALOR)´);
parambyname(´IDFICHAS´).ASINTEGER:=MCOD;
parambyname (´PROFISSIONAL´).ASSTRING:= STRINGGRID1.CELLS[1,2];
parambyname (´SERVICO´).ASSTRING:= STRINGGRID1.CELLS[2,2];
parambyname (´VALOR´).ASFLOAT:= STRTOFLOAT(STRINGGRID1.CELLS[3,2];
EXECSQL;
END;
dm.sqlconnection1.commit(td);
except
dm.sqlconnection1.rollback(td);
on e:exception do begin
showmessage(´Erro ao gravar dados´);
exit;
end; end;
Desta maneira funciona bem. O que eu gostaria é fazer uma trigger em FICHAS e generator e ao inserir ITENSFICHAS pegar o generator
de FICHAS. Já fiz isso mas pode ocorrer erro pois se o generator de Fichas adiantar um dá errado a gravação em ITENSFICHAS.
Abraços
Rinez
Gostei + 0
26/08/2007
Paullsoftware
https://www.devmedia.com.br/articles/viewcomp.asp?comp=1744
mais aqui está o código que uso para disparar o gerador no banco através do delphi
function NewGen(GenName: String; aConexao:TSQLConnection): integer; var ResultSet: TCustomSQLDataSet; SQLstmt: string; begin SQLStmt := ´SELECT CAST(gen_id(´ + GenName + ´,1)as integer) as NewValor from RDB$DATABASE;´; ResultSet := nil; try aConexao.Execute(SQLstmt, nil, @ResultSet); if Assigned(ResultSet) then begin Result := ResultSet.FieldByName(´NewValor´).AsInteger; end; finally ResultSet.Free; end; end; (* NewGen *)
e aqui http://www.4shared.com/file/22916199/1298da5f/Master-Detail.html?dirPwdVerified=e32e3712 vc pode baixar um demo para tentar entender melhor..
espero ter ajudado :wink:
Gostei + 0
27/08/2007
Rinez
Agradeço sua ajuda.
Abraços.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)