[firebase-br] Mestre/Detalhe

Penatti pentec em terra.com.br
Dom Out 31 17:11:29 -03 2004


Meu primeiro aplicativo de entrada de pedidos teve suas tabelas criadas com o 
seguinte script:
CREATE TABLE PEDCAB 
( NUMERO	VARCHAR(6) CHARACTER SET WIN1252 NOT NULL,
  CABDET	INTEGER NOT NULL,
  DATA	TIMESTAMP,
  VENCTO	TIMESTAMP,
  CLIENTE	VARCHAR(4) CHARACTER SET WIN1252 NOT NULL,
  TOTPEDQ	NUMERIC(8, 1),
  TOTPEDV	NUMERIC(15, 2),
 UNIQUE (CABDET),
 PRIMARY KEY (NUMERO));
CREATE TABLE PEDDET 
( CABDET	INTEGER NOT NULL,
  ORDEM	INTEGER NOT NULL,
  PRODUTO	VARCHAR(4) CHARACTER SET WIN1252 NOT NULL,
  PARCEIRO	VARCHAR(3) CHARACTER SET WIN1252 NOT NULL,
  QDE	NUMERIC(8, 1),
  TOTV	NUMERIC(15, 2),
 PRIMARY KEY (CABDET, ORDEM));
alter table peddet add foreign key (cabdet) references pedcab (cabdet) on 
delete cascade;
set term ^;
CREATE TRIGGER TRG_PEDDET_AI FOR PEDDET 
ACTIVE AFTER INSERT POSITION 0
AS
DECLARE VARIABLE VT NUMERIC(15,2);
DECLARE VARIABLE QT NUMERIC(9,1);
BEGIN
  SELECT TOTPEDV FROM PEDCAB WHERE PEDCAB.CABDET = NEW.CABDET INTO :VT;
  IF (VT IS NULL) THEN VT = 0;
  IF (NEW.TOTV IS NULL) THEN NEW.TOTV = 0;
  VT = (VT + NEW.TOTV);
  UPDATE PEDCAB SET TOTPEDV = :VT WHERE PEDCAB.CABDET = NEW.CABDET;
  SELECT TOTPEDQ FROM PEDCAB WHERE PEDCAB.CABDET = NEW.CABDET INTO :QT;
  IF (QT IS NULL) THEN QT = 0;
  IF (NEW.QDE IS NULL) THEN NEW.QDE = 0;
  QT = (QT + NEW.QDE);
  UPDATE PEDCAB SET TOTPEDQ = :QT WHERE PEDCAB.CABDET = NEW.CABDET;
END ^
CREATE TRIGGER TRG_PEDDET_AU FOR PEDDET 
ACTIVE AFTER UPDATE POSITION 0
AS
BEGIN
  UPDATE PEDCAB SET TOTPEDV = ((TOTPEDV - OLD.TOTV) + NEW.TOTV) WHERE 
PEDCAB.CABDET = NEW.CABDET;
  UPDATE PEDCAB SET TOTPEDQ = ((TOTPEDQ - OLD.QDE) + NEW.QDE) WHERE 
PEDCAB.CABDET = NEW.CABDET;
END ^
CREATE TRIGGER TRG_PEDDET_BD FOR PEDDET 
ACTIVE BEFORE DELETE POSITION 0
AS
BEGIN
  UPDATE PEDCAB SET TOTPEDV = (TOTPEDV - OLD.TOTV) WHERE PEDCAB.CABDET = 
OLD.CABDET;
  UPDATE PEDCAB SET TOTPEDQ = (TOTPEDQ - OLD.QDE) WHERE PEDCAB.CABDET = 
OLD.CABDET;
END ^
COMMIT WORK ^
SET TERM ;^

Quando testo no IBConsole, até que tudo funciona. Mas em Delphi estou tendo 
que gravar (postar) o cabeçalho antes de começar a inserir detalhes, acredito 
que por não existir ainda um CABDET (chave estrangeira) válido para ser 
gravado no registro detalhe. Isso gera alguns transtornos, pois, se o usuário 
desistir do pedido durante os detalhes, terei de remover o cabeçalho já 
postado, logo, a rotina vai ficar um inferno.

Há outra solução? Alguém tem exemplo?

Obrigado.

PS: como faço para responder questões da lista, pois estou tendo o erro:
"You seem to be top-posting. Don't do that".







Mais detalhes sobre a lista de discussão lista