[firebase-br] RES: Cruzamento de tabelas

Magno Machado magnomp.gprs em gmail.com
Qua Mar 19 22:36:03 -03 2008


Vc não consegue fazer um join entre duas tabelas quando o cruzamento é 
baseado em mais de um campo, seria isso?
Se for isso, então é algo assim:
select * from pai inner join filho on pai.campo1=filho.campo1 and 
pai.campo2=filho.campo2

Desculpe caso não seja isso que vc queria

"Marcelo Marchionni" 
<marcelomarchionny em gmail.com> escreveu na 
mensagem news:00b501c88a23$f449e0f0$dcdda2d0$@com...
Boa Noite Paulo,

Obrigado por tentar me ajudar.

Mas é o seguinte, estou fazendo melhorias em um gerador de relatórios aqui
na empresa e no decorrer da manutenção. Verifiquei este problema que é a
geração automática das ligações, o que seria, seria identificar os campos
que são possíveis fazer o cruzamento. Talvez eu não esteja sendo muito
claro.

Mas vou tentar exemplificar para tentar deixar bem claro qual o problema.

Exemplo. Vamos supor que eu tenha a tabela  INTERNACAO_INTERNACAO E
INTERNACAO_PACIENTE

Onde INTERNACAO_INTERNACAO tem como chave primaria o campo COD_INTERNACAO e
uma composta com os campos REGISTRO e COD_INTERNACAO,
A tabela INTERNACAO_PACIENTE tem como chave primaria o campo REGISTRO, bom
logo se vê que o campo de ligação entre as tabelas e o campo REGISTRO.

Como o processo de cruzamento é automático hoje. Sendo mais especifico tenho
um componente memo "Para os Delphianos" onde carrego a lista gerada a partir
da procedure "Da Aplicação" de nome LIGAÇÕES já descrito em mensagem
anterior.

Onde no primeiro select faço um for pelas tabelas selecionadas buscando as
FK e pegando o INDEX_NAME para que no posterior select executado repasso o
Index_name e novamente dentro de outro laço percorro tabela por tabela
selecionada verificando se a cruzamento. Bom naquelas onde não exista chave
composta onde um dos campos de cruzamento não esteja presente nesta chave
composta o funcionamento é perfeito. Mas como na situação acima descrita não
consigo fazer este cruzamento pois o index_name é diferente ou seja embora
entre as tabelas INTERNACAO_INTERNACAO e INTERNACAO_PACIENTE exista o campo
REGISTRO que é na realidade o campo de cruzamento entre elas mas devido ao
fato de que na INTERNACAO_INTERNACAO exista a chave composta entre os campos
REGISTRO e COD_INTERNACAO não bate então não consigo hoje gerar corretamente
esta ligação o que faço então para poder fazer é deixar um botão habilitado
para o usuário incluir esta ligação que não ocorre na mão mesmo.

Acho que fui longo demais na descrição. Mas acho que consegui deixar mais
claro o problema.

Abraços a todos. E fico agradecido pela ajuda da lista.
Marcelo





-----Mensagem original-----
De: lista-bounces em firebase.com.br 
[mailto:lista-bounces em firebase.com.br] Em
nome de Paulo Sérgo Feix
Enviada em: quarta-feira, 19 de março de 2008 19:44
Para: FireBase
Assunto: Re: [firebase-br] Cruzamento de tabelas

Me desculpa a minha ignoraria, é que não entendi bem, vc que fazer o
relacionamento de duas tabelas, seria isto?
Se for relacionamento de duas ou mais tabelas use inner join, ou left...


Em 19/03/08, Marcelo Marchionny 
<marcelomarchionny em gmail.com> escreveu:
>
> 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
>



-- 
Paulinho Sérgio Feix
______________________________________________
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