[firebase-br] Cruzamento de tabelas
Alexandre Sousa
dave.malkavian em gmail.com
Qui Mar 20 09:29:21 -03 2008
Cara, eu tenho uma procedure que traz todos as tabelas e seus respectivos
relacionamentos (campos) separados por ponto e virgula. Ve se ajuda. Segue o
codigo:
CREATE OR ALTER PROCEDURE RELACIONA_TABELAS
RETURNS (
TABELA1 VARCHAR(31),
TABELA2 VARCHAR(31),
CAMPOTABELA1 VARCHAR(70),
CAMPOTABELA2 VARCHAR(70))
AS
DECLARE VARIABLE TEMPFIELD VARCHAR(31);
DECLARE VARIABLE FK VARCHAR(31);
DECLARE VARIABLE PK VARCHAR(31);
begin
for select
rrc.RDB$INDEX_NAME as FK,
rrc.RDB$RELATION_NAME as Tabela1,
rrc2.RDB$INDEX_NAME as PK,
rrc2.RDB$RELATION_NAME as Tabela2
from RDB$RELATION_CONSTRAINTS rrc
join RDB$REF_CONSTRAINTS rrfc on (rrfc.RDB$CONSTRAINT_NAME =
rrc.RDB$CONSTRAINT_NAME)
join RDB$RELATION_CONSTRAINTS rrc2 on (rrc2.RDB$CONSTRAINT_NAME =
rrfc.RDB$CONST_NAME_UQ)
into :FK, :TABELA1, :PK, :TABELA2
do
begin
CAMPOTABELA1 = '';
CAMPOTABELA2 = '';
for select ris.RDB$FIELD_NAME
from RDB$INDEX_SEGMENTS ris
where ris.RDB$INDEX_NAME = :FK
order by ris.RDB$FIELD_POSITION
into :TEMPFIELD
do
begin
CAMPOTABELA1 = :CAMPOTABELA1 || :TEMPFIELD;
CAMPOTABELA1 = RTRIM(CAMPOTABELA1);
CAMPOTABELA1 = :CAMPOTABELA1 || ';';
end
for select ris.RDB$FIELD_NAME
from RDB$INDEX_SEGMENTS ris
where ris.RDB$INDEX_NAME = :PK
order by ris.RDB$FIELD_POSITION
into :TEMPFIELD
do
begin
CAMPOTABELA2 = :CAMPOTABELA2 || :TEMPFIELD;
CAMPOTABELA2 = RTRIM(CAMPOTABELA2);
CAMPOTABELA2 = :CAMPOTABELA2 || ';';
end
suspend;
end
end;
Abraço,
Alexandre Sousa
----- Original Message -----
From: "Marcelo Marchionny" <marcelomarchionny em gmail.com>
To: "FireBase" <lista em firebase.com.br>
Sent: Wednesday, March 19, 2008 6:07 PM
Subject: [firebase-br] Cruzamento de tabelas
Boa Tarde Lista.
Já vasculhei um bocado da rede e não achei nada que me ajude.
Preciso fazer um cruzamento entre tabelas selecionadas em meu sistema afim
de pegar seus relacionamentos. OK até aqui facil "quando nas duas tabelas
existirem somente chave simples de ligação entre elas"
Tipo na Tabela TABELA1 tenho o campo CODIGO PK na TABELA2 o campo FK.
então consigo montar a tal ligação
TABELA1.CAMPO PK = TABELA2.CAMPO FK
agora quando, em alguma tabela tenho uma chave composta com o código que
uso não consigo ter a ligação, entre a tabela com chave composta e a tabela
com a chave simples.
Então me pergunto não tem como mesmo fazer este cruzamento?
Existe alguma forma de fazer isso ?
Ah afim de ajudar segue o código que uso meu sistema é delphi e utilizo
firebird 1.5 sei que a lista é de FIREBIRD mas como acredito estar
totalmente no selecto código vai mais para ficar visivel a forma como estou
fazendo. Espero que ninguém se encomode.
Peço desculpas antecipado caso alguém não goste.
*procedure TFormGerencial.Ligacoes;
var
i, u : Integer;
begin
LigacaoTabelas.Clear;
for i := 0 to SelecaoTabelas.Items.Count - 1 do
begin
BDados.IBBusca.Active := False;
with BDados.QBusca do
begin
Close;
SQL.Clear;
SQL.Add('SELECT A.RDB$INDEX_NAME , A.RDB$FIELD_NAME ,');
SQL.Add('B.RDB$RELATION_NAME , B.RDB$FOREIGN_KEY ');
SQL.Add('FROM RDB$INDEX_SEGMENTS A, RDB$INDICES B');
SQL.Add('WHERE A.RDB$INDEX_NAME = B.RDB$INDEX_NAME');
SQL.Add('AND RDB$RELATION_NAME = '+#39+Trim(
SelecaoTabelas.Items.Strings[i])+#39); // AQUI REPASSO A TABELA*
* SQL.Add('AND RDB$FOREIGN_KEY IS NULL');
SQL.Add('ORDER BY A.RDB$FIELD_NAME');
open;
end;*
* for u := 0 to SelecaoTabelas.Items.Count - 1 do
begin
BDados.IBCadastro.Active := False;
with BDados.QCadastros do
begin
Close;
SQL.Clear;
SQL.Add('SELECT A.RDB$INDEX_NAME , A.RDB$FIELD_NAME ,');
SQL.Add('B.RDB$RELATION_NAME , B.RDB$FOREIGN_KEY ');
SQL.Add('FROM RDB$INDEX_SEGMENTS A, RDB$INDICES B');
SQL.Add('WHERE A.RDB$INDEX_NAME = B.RDB$INDEX_NAME');
SQL.Add('AND RDB$RELATION_NAME = '+#39+Trim(
SelecaoTabelas.Items.Strings[u])+#39);
SQL.Add('AND RDB$FOREIGN_KEY = '+#39+Trim(BDados.QBusca.FieldByName
('RDB$INDEX_NAME').AsString)+#39);
SQL.Add('ORDER BY A.RDB$FIELD_NAME');
open;
end;*
* while not BDados.QCadastros.eof do
begin
LigacaoTabelas.Items.Add(Trim(BDados.QBusca.FieldByName
('RDB$RELATION_NAME').AsString)+'.'+Trim(BDados.QBusca.FieldByName('RDB$FIELD_NAME').AsString)+'
= '+
Trim(BDados.QCadastros.FieldByName
('RDB$RELATION_NAME').AsString)+'.'+Trim(BDados.QCadastros.FieldByName
('RDB$FIELD_NAME').AsString));*
* BDados.QCadastros.Next;
BDados.QBusca.Next;
end;
end;*
*end;*
Agradeço a todos.
Marcelo
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use:
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa
Mais detalhes sobre a lista de discussão lista