Como relacionar campos de InterBase

Delphi

13/01/2008

Olá a todos,

Tenho uma consulta, onde está gravado numa tabela o ID do usuário, que seria a chave primaria da tabela de usuarios. Bom, eu preciso pegar o nome desse usuários na tabela de usuários e exibi-lo na consulta.

Alguém sabe uma forma simples de se fazer isso?

Obrigado a todos,
Sérgio


Sérgio Gobbo

Sérgio Gobbo

Curtidas 0

Respostas

Alexandrejose

Alexandrejose

13/01/2008

Você precisa fazer INNER JOIN com a tabela de usuários.

select A.*, B.Nome from Tabela A inner join TabelaUsuarios B on A.ID = B.ID;

Se foi o que eu entendi é isso.


GOSTEI 0
Sérgio Gobbo

Sérgio Gobbo

13/01/2008

Obrigado, é isso mesmo. Eu estou usando um IBDataSet no Delphi, só que não estou conseguindo utilizar essa instrução nele, você saberia como fazer ou em qual componente?

Obrigado


GOSTEI 0
Alexandrejose

Alexandrejose

13/01/2008

É nesse mesmo, ou no IBQuery, vc deve estar escrevendo algo errado.
Rode no IBExpert ou no IBConsole, se funcionar nele, funciona no componente.


GOSTEI 0
Sérgio Gobbo

Sérgio Gobbo

13/01/2008

Então meu amigo, deu certo, só que dá um pequeno problema, os registros repetem 90 vezes cada um.

Esse é o código:

SELECT TBOPERACOES.*, TBUSUARIOS.NOME, TBATLETAS.NOME FROM TBOPERACOES INNER JOIN TBUSUARIOS ON TBOPERACOES.ID_U =TBUSUARIOS.ID_U, TBOPERACOES INNER JOIN TBATLETAS ON TBOPERACOES.ID_A=TBATLETAS.ID_A ORDER BY ID_OP

é assim: essa tabela de operações tem o ID do Usuário e o ID do Atleta e na hora de exibir esses dados na consulta eu quero que venha com o nome do usuário e o nome do atleta que se encontram em suas respectivas tabelas. Então eu quero que,apartir do ID de cada um, eu consiga exibir seus nomes, relacionando as tabelas.
Na hora que carrego o formulário, tem um DBGrid que está ligado com o IBDataSet em que está o select, e ele exibi 90 vezes cada registro que tem na tabela. Porém, se eu fizer só um INNER JOIN com Usuários ou Atletas, aí funciona e aparece normalmente os registros.

Teria alguma maneira de fazer um relacionamento de uma tabela com duas outras sem acontecer isso?

Obrigado,
Sérgio


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

13/01/2008

Colega,

Teste o roteiro abaixo:

SELECT 
       TBOPERACOES.*, 
       TBUSUARIOS.NOME, 
       TBATLETAS.NOME 
FROM 
       TBOPERACOES
INNER JOIN 
       TBUSUARIOS 
ON 
       TBOPERACOES.ID_U = TBUSUARIOS.ID_U
INNER JOIN
       TBATLETAS
ON
       TBOPERACOES.ID_A =TBATLETAS.ID_A
ORDER BY
       ID_OP



GOSTEI 0
Sérgio Gobbo

Sérgio Gobbo

13/01/2008

Obrigado pela ajuda Aroldo.

Realmente não duplicou os registros, porém, ele só pega os registros q que possuem um ID de usuário e um ID de Atleta, que nem sempre existirá.
É assim: essa tabela de operações registra tudo que o Usuário faz no sistema, ou seja, se ele insere, edita ou exclui um atleta do sistema, será reistrado o ID desse usuário e o ID do atleta que estava envolvido na operação. Porém, se o Usuário efetua login ou logoff no sistema, também será registrado, só que o campo ID_A (ID do atleta) estará em branco, pois não terá nenhum atleta envolvido.

Quando faço aquele SELECT, são pegos todos os registros que tem ID_A, ou seja, inserções, edições ou exclusões, porém os de login e logoff não são pegos pelo SELECT. Há alguma forma de pegar todos os registros d tabela de operações, relacionar com TBUSUÁRIOS, para exibir o nme do usuário e relacionar os que tem ID_A com TBATLETAS para exibir o nome do atleta, quando houver?

Obrigado novamente pela ajuda,
Sérgio


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

13/01/2008

Colega,

Left ou Right Outer Join dependendo do caso. Tem como colocar a estrutura básica das tabelas (chaves primárias e chaves estrangeiras das associações)?


GOSTEI 0
Sérgio Gobbo

Sérgio Gobbo

13/01/2008

Bom, é assim:

TBAtletas

ID_A int chave primaria
Nome varchar
(todos os outros campos varchar)


TBUsuarios

ID_U int chave primaria
Nome varchar
(todos os outros campos varchar)


TBOperacoes

ID_OP int chave primaria
ID_U int seria a chave estrangeira de TBUsuarios
ID_A int seria a chave estrangeira de TBAtletas
Operacao varchar (a operação realizada: inserção, edição, etc)
data date
hora time
OBS varchar


é isso aí meu amigo, mas eu sou inciante com sql, então num sei direito trabalhar com outer join.... o inner join meio q aprendi com oq vc postou anteriormente.. hehe
se vc pudesse me explicar agradeceria!

Obrigado pela ajuda,
Sérgio


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

13/01/2008

Colega,

SELECT
    TBOPERACOES.*,
    tbusuarios.nome USUARIO,
    tbatletas.nome ATLETA
FROM TBOPERACOES
left join tbusuarios
on (tboperacoes.id_u=tbusuarios.id_u)
left join tbatletas
on (tboperacoes.id_a=tbatletas.id_a)


Roteiro de criação das tabelas para quem quiser testar.

/*==============================================================*/
/* Table: TBATLETAS                                             */
/*==============================================================*/
create table TBATLETAS (
ID_A                 INTEGER                        not null,
NOME                 VARCHAR(60),
constraint PK_TBATLETAS primary key (ID_A)
);

/*==============================================================*/
/* Table: TBOPERACOES                                           */
/*==============================================================*/
create table TBOPERACOES (
ID_OP                INTEGER                        not null,
ID_U                 INTEGER,
ID_A                 INTEGER,
OPERACAO             VARCHAR(20),
DATA                 DATE,
HORA                 DATE,
OBS                  VARCHAR(100),
constraint PK_TBOPERACOES primary key (ID_OP)
);

/*==============================================================*/
/* Table: TBUSUARIOS                                            */
/*==============================================================*/
create table TBUSUARIOS (
ID_U                 INTEGER                        not null,
NOME                 VARCHAR(60),
constraint PK_TBUSUARIOS primary key (ID_U)
);

alter table TBOPERACOES
   add constraint FK_TBOPERAC_RELATIONS_TBUSUARI foreign key (ID_U)
      references TBUSUARIOS (ID_U);

alter table TBOPERACOES
   add constraint FK_TBOPERAC_RELATIONS_TBATLETA foreign key (ID_A)
      references TBATLETAS (ID_A);




GOSTEI 0
Sérgio Gobbo

Sérgio Gobbo

13/01/2008

Funcionou perfeitamente!!
Aroldo, obrigado pela sua ajuda, acho q já estou melhorando com SQL graças a vc.. hehe

Amigo, vou te perguntar mais uma coisa, é a última.. hehe

Depois que testei oq vc postou, comecei a fazer um filtro daquele select. Por exemplo, esse select é executado ao abrir o formulário de consulta. Sò que no formulário, o usuário tem a opção de filtrar pelo nome do usuário, pelo nome do atleta, pelo tipo de operação ou pela data.
Por exemplo, o formulário é aberto, vão ter milhares de registros no DBGrid, maseu só quero ver os registros de Login de um usuário que se chama Carlos, por exemplo.
Tentei colocar um where ao fim do codigo mas num deu certo. Tentei também fazer uma subconsulta, mas dava erro na forma como eu colocava o código. Você saberia alguma boa técnica pra isso?

Agradeço novamente,
Sérgio


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

13/01/2008

Colega,

Eu costumo ´entrar´ no formulário com a consulta (query) fechada e aguardar que o usuário defina os critérios (constraints) de seleção. Desta forma, o formulário é carregado rapidamente em memória e o usuário tem a disposição os critérios de filtragem e num clique de um botão ele pode submeter a consulta ou desistir da tarefa naquele momento.


GOSTEI 0
Sérgio Gobbo

Sérgio Gobbo

13/01/2008

Então, é que aquele select q vc postou anteriormente era pra relacionar as tabelas, ou seja, aparecer todos os registros na tela com os nomes de usuario e atleta e não apenas com o ID. Só que apartir destes registros, eu precisaria fazer um filtro, pelo nome por exemplo.
Ou seja, eu precisaria fazer um filtro em cima do resultado daquele select.

Obrigado


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

13/01/2008

Colega,

Basta adicionar as retrições (where). Exemplo:

select
    tboperacoes.*,
    tbusuarios.nome USUARIO,
    tbatletas.nome ATLETA
from tboperacoes
left join tbusuarios
on (tboperacoes.id_u=tbusuarios.id_u)
left join tbatletas
on (tboperacoes.id_a=tbatletas.id_a)
where tbatletas.nome = ´AROLDO ZANELA´



GOSTEI 0
Sérgio Gobbo

Sérgio Gobbo

13/01/2008

Obrigado Aroldo.

Está tudo ok.

Muito grato pela ajuda.


GOSTEI 0
POSTAR