GARANTIR DESCONTO

Fórum Gravar generator da tabela Master na tabela detail dbexpress #344920

23/08/2007

0

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 ?


Rinez

Rinez

Responder

Posts

23/08/2007

Carlos Jatai

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.


Responder

Gostei + 0

24/08/2007

Rinez

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.


Responder

Gostei + 0

25/08/2007

Rinez

up


Responder

Gostei + 0

25/08/2007

Paullsoftware

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:


Responder

Gostei + 0

26/08/2007

Rinez

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


Responder

Gostei + 0

26/08/2007

Paullsoftware

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
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:


Responder

Gostei + 0

27/08/2007

Rinez

OK. Paullsoftware.
Agradeço sua ajuda.
Abraços.


Responder

Gostei + 0

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

Aceitar