Solução: relacionamento mestre-detalhe no Interbase
[color=blue:45697b979c][/color:45697b979c] :D
Salve comunidade Delphi !
A alguns dias atras me deparava com um problema do qual não conseguia resolver.
Após alguns fios de cabelo a menos e muita pesquisa eu encontrei a solução pa-
ra o problema de relacionamento entre duas tabelas com conceito de Mestre-Deta-
lhe e gostaria de deixar aqui para quem quizer ou precisa tambem.
A solução foi feita em Delphi 7 com Interbase 6.5 ( se aplica perfeitamente ao 6 )
Aí vai :
(Master)-Tabela 1 :
FunCodigo Integer Not Null
FunNome Varcahr(50) not null
FunDataNasc Timestamp
FunSexo Varchar(1)
Primary Key (Funcodigo)
(Detalhe) - Tabela 2 :
DepCodigo Integer Not Null
FunCodigo Integer Not Null
DepNome Varcahr(50) Not Null
DepDataNasc Timestamp
DepSexo Varchar(1)
DepParentesco Smallint
Primary Key (DepCodigo)
Relacionamento : Aqui estamos criando o Elo de ligação do conceito Mestre-Detalhe
ALTER TABLE Dependentes ADD FOREIGN KEY (Funcodigo)
REFERENCES Funcionario ( Funcodigo)
Insira pelo menos um registro em cada tabela antes de partir para o desenvolvi-
mento do aplicativo.
Antes deve-se criar um gerador para cada tabela : Create Generator Funcod_Gen e
Create Generator DepCod_Gen
A Aplicação :
Em um novo projeto salve o formulário inicial com o nome de FrmPrincipal e a Unit como
PrincipalIB.pas. Crie um DataModule para receber os componentes de manipulação das
tabelas, para isso insira no Data Module do projeto dois componentes, sendo um IBDataBase e um
IBTransaction.
Selecione o IBDataBase1 e configure as suas propriedades :
-DataBaseName : [ \diretório\Bancodedadoscriado ] Para definí-lo use as reticências da
propriedade DataBaseName do Object Inspector.
-DefaultTransaction = IBTransaction1
-LoginPrompt = False
-Connected = True.
Selecione o IBTransaction1 e configure :
-DefaultDataBse = IBDataBase1
-Active = True
No Data Module insira mais dois componentes IBDataSet e dois DataSource e mude os nomes
para : IBDataset1 -> IBDtsFuncionarios
DataSource1 ->DsFuncionarios
IBDataSet2 -> IBDtsDependentes
DataSource2 -> DsDependentes
Configure o IBDtsFuncionarios : DataBase = IBDataBase1 e Transaction = IBTransaction1, clique
nas reticências da propriedade SelectSQL para abrir a janela e selecione a tabela Funcionários e
clique em AddTable to SQL, selecione o Fields asterisco para representar todos os campos e cli-
que em Add Field to SQL e confirme com OK.
Dê um clique com o botão direito do mouse no IBDtsFuncionarios e clique em Dataset Editor, na
janela que se abre podemos perceber todos os campos da tabela Funcionarios. Clique no botão
Select Primary Keys para selecionar apenas o campo chave, pois a partir dele os códigos SQL
serão contruídos. Clique em Generate SQL para confeccionar os códigos automaticamente e
confime com OK. Ainda no componente IBDtsFuncionarios clique na reticências da propriedade
Generator Field e preencha os itens Generator para FUNCOD_GEN, Field = FUNCODIGO e
Increment By = 1.
Coloque a prorpiedade Active com True.
Definindo as propriedades do IBDtsDependentes com o conceito de Mestre-Detalhe.
Selecione o componente IBDtsDependentes, coloque na propriedade DataBase o valor IBDataBase1,
coloque na propriedade DataSource o valor DsFuncionarios e por fim selecione a propriedade
SelectSQL e contrua o comando : Selecet * from DEPENDENTES where FUNCODIGO = :FUNCODIGO.
Que deve funcionar da seguinte forma : selecione todos os campos da tabela dependentes em que a
chave estrangeira seja igual ao parâmetro :FUNCODIGO. Este parâmetro será preenchido
pela propriedade DataSource ( que aponta para a tabela Funcionários ) de forma que serão listados
apenas os dependentes do funcionário selecionado.
Usando o memso raciocínio anterior, clique com o botão direito no componente IBDtsDependentes e
escolha a opção DataSet Editor e dentro da janela do editor clique em Select Primary Keys e em
Generate SQL para gerar os respectivos códigos. Altere a propriedade Active para True. Ainda com o
componenete IBDtsDependentes selecionado, clique na reticências da propriedade GeneratorField e
preencha os itens : Generator = DPECOD_GEN , Field = DEPCODIGO, Increment by = 1.
No DataModule selecione os componentes DataSource e aponte cada um para o seu respectivo DataSet.
Agora no Formulario principal insira dois componentes DBGrid e dois DbNavigator. Clique no menu File
e no comando Use Unit para selecionar o formulário Data Module DmIB criado. Os componentes DBGrid1
e DbNavigator1 devem ter a propriedade DataSource com o valor FrmDmIB.DsFuncionarios e os compo-
nentes DbGrid2 e DbNavigator2 o valor FrmDmIB.DsDependentes.
Se tudo deu certo e não esqueci nada voce estará vendo o relacionamento Mestre-Detalhe em ação, quando
se seleciona um funcionário na tabela, automaticamente os registros de dependentes aparecem no segundo
Grid. Note que não é possível excluir um funcionário tendo dependentes, ou seja, na tabela dependentes há
registros que dependem do código do funcionário, de maneira que o relacionamento impede a exclusão do
funcionários se houver dependentes para seu código. A solução é remover todos os dependentes para então
remover o funcionário, ou então criar um TRIGGER no Interbase para realizar a tarefa, mas este é um outro
assunto que ficará pra depois... Até mais...
Fonte : Conectividade utilizando Delphi 6 - Editora Érica.
[color=brown:45697b979c][b:45697b979c]Aquele que só pensa em derrota já está vencido...[/b:45697b979c][/color:45697b979c]
[b:45697b979c]A equipe agradece por postar a solução para o seu problema.
Porém, título editado! Removido ´A quem possa interessar !´[/b:45697b979c]
Sandra/Moderação
Salve comunidade Delphi !
A alguns dias atras me deparava com um problema do qual não conseguia resolver.
Após alguns fios de cabelo a menos e muita pesquisa eu encontrei a solução pa-
ra o problema de relacionamento entre duas tabelas com conceito de Mestre-Deta-
lhe e gostaria de deixar aqui para quem quizer ou precisa tambem.
A solução foi feita em Delphi 7 com Interbase 6.5 ( se aplica perfeitamente ao 6 )
Aí vai :
(Master)-Tabela 1 :
FunCodigo Integer Not Null
FunNome Varcahr(50) not null
FunDataNasc Timestamp
FunSexo Varchar(1)
Primary Key (Funcodigo)
(Detalhe) - Tabela 2 :
DepCodigo Integer Not Null
FunCodigo Integer Not Null
DepNome Varcahr(50) Not Null
DepDataNasc Timestamp
DepSexo Varchar(1)
DepParentesco Smallint
Primary Key (DepCodigo)
Relacionamento : Aqui estamos criando o Elo de ligação do conceito Mestre-Detalhe
ALTER TABLE Dependentes ADD FOREIGN KEY (Funcodigo)
REFERENCES Funcionario ( Funcodigo)
Insira pelo menos um registro em cada tabela antes de partir para o desenvolvi-
mento do aplicativo.
Antes deve-se criar um gerador para cada tabela : Create Generator Funcod_Gen e
Create Generator DepCod_Gen
A Aplicação :
Em um novo projeto salve o formulário inicial com o nome de FrmPrincipal e a Unit como
PrincipalIB.pas. Crie um DataModule para receber os componentes de manipulação das
tabelas, para isso insira no Data Module do projeto dois componentes, sendo um IBDataBase e um
IBTransaction.
Selecione o IBDataBase1 e configure as suas propriedades :
-DataBaseName : [ \diretório\Bancodedadoscriado ] Para definí-lo use as reticências da
propriedade DataBaseName do Object Inspector.
-DefaultTransaction = IBTransaction1
-LoginPrompt = False
-Connected = True.
Selecione o IBTransaction1 e configure :
-DefaultDataBse = IBDataBase1
-Active = True
No Data Module insira mais dois componentes IBDataSet e dois DataSource e mude os nomes
para : IBDataset1 -> IBDtsFuncionarios
DataSource1 ->DsFuncionarios
IBDataSet2 -> IBDtsDependentes
DataSource2 -> DsDependentes
Configure o IBDtsFuncionarios : DataBase = IBDataBase1 e Transaction = IBTransaction1, clique
nas reticências da propriedade SelectSQL para abrir a janela e selecione a tabela Funcionários e
clique em AddTable to SQL, selecione o Fields asterisco para representar todos os campos e cli-
que em Add Field to SQL e confirme com OK.
Dê um clique com o botão direito do mouse no IBDtsFuncionarios e clique em Dataset Editor, na
janela que se abre podemos perceber todos os campos da tabela Funcionarios. Clique no botão
Select Primary Keys para selecionar apenas o campo chave, pois a partir dele os códigos SQL
serão contruídos. Clique em Generate SQL para confeccionar os códigos automaticamente e
confime com OK. Ainda no componente IBDtsFuncionarios clique na reticências da propriedade
Generator Field e preencha os itens Generator para FUNCOD_GEN, Field = FUNCODIGO e
Increment By = 1.
Coloque a prorpiedade Active com True.
Definindo as propriedades do IBDtsDependentes com o conceito de Mestre-Detalhe.
Selecione o componente IBDtsDependentes, coloque na propriedade DataBase o valor IBDataBase1,
coloque na propriedade DataSource o valor DsFuncionarios e por fim selecione a propriedade
SelectSQL e contrua o comando : Selecet * from DEPENDENTES where FUNCODIGO = :FUNCODIGO.
Que deve funcionar da seguinte forma : selecione todos os campos da tabela dependentes em que a
chave estrangeira seja igual ao parâmetro :FUNCODIGO. Este parâmetro será preenchido
pela propriedade DataSource ( que aponta para a tabela Funcionários ) de forma que serão listados
apenas os dependentes do funcionário selecionado.
Usando o memso raciocínio anterior, clique com o botão direito no componente IBDtsDependentes e
escolha a opção DataSet Editor e dentro da janela do editor clique em Select Primary Keys e em
Generate SQL para gerar os respectivos códigos. Altere a propriedade Active para True. Ainda com o
componenete IBDtsDependentes selecionado, clique na reticências da propriedade GeneratorField e
preencha os itens : Generator = DPECOD_GEN , Field = DEPCODIGO, Increment by = 1.
No DataModule selecione os componentes DataSource e aponte cada um para o seu respectivo DataSet.
Agora no Formulario principal insira dois componentes DBGrid e dois DbNavigator. Clique no menu File
e no comando Use Unit para selecionar o formulário Data Module DmIB criado. Os componentes DBGrid1
e DbNavigator1 devem ter a propriedade DataSource com o valor FrmDmIB.DsFuncionarios e os compo-
nentes DbGrid2 e DbNavigator2 o valor FrmDmIB.DsDependentes.
Se tudo deu certo e não esqueci nada voce estará vendo o relacionamento Mestre-Detalhe em ação, quando
se seleciona um funcionário na tabela, automaticamente os registros de dependentes aparecem no segundo
Grid. Note que não é possível excluir um funcionário tendo dependentes, ou seja, na tabela dependentes há
registros que dependem do código do funcionário, de maneira que o relacionamento impede a exclusão do
funcionários se houver dependentes para seu código. A solução é remover todos os dependentes para então
remover o funcionário, ou então criar um TRIGGER no Interbase para realizar a tarefa, mas este é um outro
assunto que ficará pra depois... Até mais...
Fonte : Conectividade utilizando Delphi 6 - Editora Érica.
[color=brown:45697b979c][b:45697b979c]Aquele que só pensa em derrota já está vencido...[/b:45697b979c][/color:45697b979c]
[b:45697b979c]A equipe agradece por postar a solução para o seu problema.
Porém, título editado! Removido ´A quem possa interessar !´[/b:45697b979c]
Sandra/Moderação
Rcaps
Curtidas 1