[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