Insert com Foreign Key
Pessoal Boa noite, Novamente preciso da Ajuda de vocês
Tenho duas Tabelas, que por sinal foi atraves de uma outra pergunta de Ontem que cheguei a este resultado,
[b:6c7e623372]Tabela Master[/b:6c7e623372]
[color=blue:6c7e623372]CREATE TABLE ´PERFIL´
(
´LI_IDPERFIL´INTEGER NOT NULL,
´STR_NOMEPERFIL´VARCHAR(40) NOT NULL,
´STR_SISTEMA´VARCHAR(4),
PRIMARY KEY (´LI_IDPERFIL´)
);
SET TERM ^ ;
/* Triggers only will work for SQL triggers */
CREATE TRIGGER ´SET_LI_IDPERFIL´ FOR ´PERFIL´
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.LI_IDPERFIL is null) then
new.LI_IDPERFIL = gen_id( LI_IDPERFIL, 1 );
END
^
COMMIT WORK ^
SET TERM ;^[/color:6c7e623372]
[b:6c7e623372]Tabela Detalhe[/b:6c7e623372]
[color=red:6c7e623372]CREATE TABLE ´ITEMPERFIL´
(
´LI_IDITEMPERFIL´INTEGER NOT NULL,
´LI_IDPERFIL´INTEGER NOT NULL,
´LI_IDMENU´INTEGER,
´LI_INCLUI´INTEGER,
´LI_EXCLUI´INTEGER,
´LI_ALTERA´INTEGER,
´LI_CONSULTA´INTEGER,
´LI_DESIGNER´INTEGER,
´LI_IMPRIMIR´INTEGER,
PRIMARY KEY (´LI_IDITEMPERFIL´)
);
ALTER TABLE ´ITEMPERFIL´ ADD CONSTRAINT ´FK_LI_IDPERFIL´ FOREIGN KEY (´LI_IDPERFIL´) REFERENCES ´PERFIL´ (´LI_IDPERFIL´) ON DELETE CASCADE;
SET TERM ^ ;
/* Triggers only will work for SQL triggers */
CREATE TRIGGER ´SET_LI_IDITEMPERFIL´ FOR ´ITEMPERFIL´
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.LI_IDITEMPERFIL is null) then
new.LI_IDITEMPERFIL = gen_id( LI_IDITEMPERFIL, 1 );
END
^
COMMIT WORK ^
SET TERM ;^[/color:6c7e623372]
Estou gerando o Campo LI_IDPerfil no evento on NewRecord da Tabela Master, Acontece que quando eu seleciono o botão Novo eu já dou um Insert na tabela Master e Faço uma carga de dados pré-existente na tabela itemPerfil, como o Código Li_IDPerfil não esta Fisicamente na tabela Perfil a aplicação me retorna erro de ForeiGN Key, segue abaixo o código que estou usando
procedure TFormPerfil.btnNovoClick(Sender: TObject);
begin
if not DTSPrincipal.DataSet.Active then //verifica se esta fechado
DTSPrincipal.DataSet.Open;
DTSPrincipal.DataSet.Append;
If Not DTSItemPerfil.Dataset.Active Then
DTSItemPerfil.Dataset.Active := True;
Panel5.Enabled := True;
DTMPrincipal.cdsMenu.Close;
DTMPrincipal.cdsMenu.Open;
DTMPrincipal.cdsMenu.Last;
DTMPrincipal.cdsMenu.First;
While not DTMPrincipal.cdsMenu.Eof do Begin
DTMPrincipal.cdsItemPerfil.Append;
[color=green:6c7e623372]DTMPrincipal.cdsItemPerfil.FieldByName(´Li_IDPerfil´).AsInteger := DTMPrincipal.cdsPerfil.FieldByName(´Li_IDPerfil´).AsInteger;[/color:6c7e623372]
DTMPrincipal.cdsItemPerfil.FieldByName(´Li_IDMenu´).AsInteger := DTMPrincipal.cdsmenu.FieldByName(´Li_IDMenu´).AsInteger;
DTMPrincipal.cdsMenu.Next;
End;
O erro ocorre na Linha de Cor verde.
Qual seria a Solução para este problema.
Tenho duas Tabelas, que por sinal foi atraves de uma outra pergunta de Ontem que cheguei a este resultado,
[b:6c7e623372]Tabela Master[/b:6c7e623372]
[color=blue:6c7e623372]CREATE TABLE ´PERFIL´
(
´LI_IDPERFIL´INTEGER NOT NULL,
´STR_NOMEPERFIL´VARCHAR(40) NOT NULL,
´STR_SISTEMA´VARCHAR(4),
PRIMARY KEY (´LI_IDPERFIL´)
);
SET TERM ^ ;
/* Triggers only will work for SQL triggers */
CREATE TRIGGER ´SET_LI_IDPERFIL´ FOR ´PERFIL´
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.LI_IDPERFIL is null) then
new.LI_IDPERFIL = gen_id( LI_IDPERFIL, 1 );
END
^
COMMIT WORK ^
SET TERM ;^[/color:6c7e623372]
[b:6c7e623372]Tabela Detalhe[/b:6c7e623372]
[color=red:6c7e623372]CREATE TABLE ´ITEMPERFIL´
(
´LI_IDITEMPERFIL´INTEGER NOT NULL,
´LI_IDPERFIL´INTEGER NOT NULL,
´LI_IDMENU´INTEGER,
´LI_INCLUI´INTEGER,
´LI_EXCLUI´INTEGER,
´LI_ALTERA´INTEGER,
´LI_CONSULTA´INTEGER,
´LI_DESIGNER´INTEGER,
´LI_IMPRIMIR´INTEGER,
PRIMARY KEY (´LI_IDITEMPERFIL´)
);
ALTER TABLE ´ITEMPERFIL´ ADD CONSTRAINT ´FK_LI_IDPERFIL´ FOREIGN KEY (´LI_IDPERFIL´) REFERENCES ´PERFIL´ (´LI_IDPERFIL´) ON DELETE CASCADE;
SET TERM ^ ;
/* Triggers only will work for SQL triggers */
CREATE TRIGGER ´SET_LI_IDITEMPERFIL´ FOR ´ITEMPERFIL´
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.LI_IDITEMPERFIL is null) then
new.LI_IDITEMPERFIL = gen_id( LI_IDITEMPERFIL, 1 );
END
^
COMMIT WORK ^
SET TERM ;^[/color:6c7e623372]
Estou gerando o Campo LI_IDPerfil no evento on NewRecord da Tabela Master, Acontece que quando eu seleciono o botão Novo eu já dou um Insert na tabela Master e Faço uma carga de dados pré-existente na tabela itemPerfil, como o Código Li_IDPerfil não esta Fisicamente na tabela Perfil a aplicação me retorna erro de ForeiGN Key, segue abaixo o código que estou usando
procedure TFormPerfil.btnNovoClick(Sender: TObject);
begin
if not DTSPrincipal.DataSet.Active then //verifica se esta fechado
DTSPrincipal.DataSet.Open;
DTSPrincipal.DataSet.Append;
If Not DTSItemPerfil.Dataset.Active Then
DTSItemPerfil.Dataset.Active := True;
Panel5.Enabled := True;
DTMPrincipal.cdsMenu.Close;
DTMPrincipal.cdsMenu.Open;
DTMPrincipal.cdsMenu.Last;
DTMPrincipal.cdsMenu.First;
While not DTMPrincipal.cdsMenu.Eof do Begin
DTMPrincipal.cdsItemPerfil.Append;
[color=green:6c7e623372]DTMPrincipal.cdsItemPerfil.FieldByName(´Li_IDPerfil´).AsInteger := DTMPrincipal.cdsPerfil.FieldByName(´Li_IDPerfil´).AsInteger;[/color:6c7e623372]
DTMPrincipal.cdsItemPerfil.FieldByName(´Li_IDMenu´).AsInteger := DTMPrincipal.cdsmenu.FieldByName(´Li_IDMenu´).AsInteger;
DTMPrincipal.cdsMenu.Next;
End;
O erro ocorre na Linha de Cor verde.
Qual seria a Solução para este problema.
Ariovaldo
Curtidas 0
Respostas
Ariovaldo
02/04/2005
Pessoal alguém teria uma sugestão? só para completar estou usando o Firebird 1.3 e os componentes de acesso é Client data set
GOSTEI 0
Ariovaldo
02/04/2005
Ai Pessoal alguém teria uma Solução, utilizo Firebird com componentes de Acesso IBX
GOSTEI 0