[firebase-br] Cruzamento de tabelas
Marcelo Marchionny
marcelomarchionny em gmail.com
Qui Mar 20 11:59:59 -03 2008
Alexandre muito obrigado realmente isto me serviu como uma luva para o que
estava precisando.
Abraço.
Marcelo
Em 20/03/08, Alexandre Sousa <dave.malkavian em gmail.com> escreveu:
>
> 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
>
>
> ______________________________________________
> 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