[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