Gravar generator da tabela Master na tabela detail dbexpress
Tenho uma tabela FICHAS master com campo ID integer.
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 ?
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
Curtidas 0
Respostas
Carlos Jatai
23/08/2007
acredito que voce está gerando ID em FICHA quando muda o foco do MASTER para o DETAIL, se for assim, quando for gravar cada linha do detail, grave o número da ID em FICHAS na ID em ITENSFICHAS ... assim funciona.
GOSTEI 0
Rinez
23/08/2007
Prezado Carlos:
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.
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
Rinez
23/08/2007
up
GOSTEI 0
Paullsoftware
23/08/2007
Você está passando pelo mesmo problema que tive quando iniciei o DBExpress, se vc usa o trio SQLDataSet + DataSetProvider + ClientDataSet...
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:
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
Rinez
23/08/2007
OK. Paullsoftware:
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
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
Paullsoftware
23/08/2007
aqui tem um artigo que mostra como usar Master/Detalhe com DbExpress
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
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:
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
Rinez
23/08/2007
OK. Paullsoftware.
Agradeço sua ajuda.
Abraços.
Agradeço sua ajuda.
Abraços.
GOSTEI 0