Jump to content
Fórum Script Brasil
  • 0

Ajuda - DBGrid ?


Guest --Ramon --

Question

Guest --Ramon --

Olá pessoal, estou com um sério problema em fazer relações no delphi 6 !

é o seguinte, estou usando delphi + zeos + mysql

tenho duas tabelas:

tb_clientes

-campos:

id (int)

nome (char 255)

status (int)

tb_status

-campos

id (int)

status (char 255)

-------------

funciona assim:

tenho um DBGRID no form que mostra os dados dos clientes, mas o meu problema é o seguinte, o dbgrid mostra no campo tb_clientes.Status, somente

o código do status,

gostaria de saber como faler esta ligação para que o dbgrid entenda que por exemplo:

tb_status:

1, Ativo

2, Inativo

tb_clientes

1, Nome1, 1

2, Nome2, 2

3, Nome3, 1

3, Nome3, 1

3, Nome3, 2

.

.

e assim por diante...

gostaria que no lugar dos numeros no campo Status ele puxasse da tabela estatus o nome do status relacionado com o numero e não mostra somente o numero no dbgrid !

Bom, agradeço a quem ajudar !

Valews!

Link to comment
Share on other sites

9 answers to this question

Recommended Posts

  • 0
Guest --Ramon --

O DBgrid é somente pra mostrar o conteudo

ele não inseri , edita e nem exclui nada !

seria mais para relacionar assim

tb_clientes.Status => tb_status.Id

ai o dbgrid teria que mostra o tb_status.Status e não numero do tb_clientes.Status

preciso fazer isso somente neste campo...

me ajudem plz !!!

Link to comment
Share on other sites

  • 0
Guest --Ramon --

Testei como você falo e funcionou certinhu !

mas porém tenho um pequeno problema...

e se eu tivesse mais de 40 campos na tabela clientes, ???

teria que escrever:

C.Campo1, C.Campo2, C.Campo3 .... etc ....C.Campo40, S.Status LEFT JOIN....

não teria um jeito de facilitar, se eu tivesse mais campos na tabela clientes, ao invés de ter que adicionar um por um no sql ???

Abraços !

Link to comment
Share on other sites

  • 0
e se eu tivesse mais de 40 campos na tabela clientes, ???

teria que escrever:

C.Campo1, C.Campo2, C.Campo3 .... etc ....C.Campo40, S.Status LEFT JOIN....

não teria um jeito de facilitar, se eu tivesse mais campos na tabela clientes, ao invés de ter que adicionar um por um no sql ???

Bom, o ideal é adicionar ao SELECT apenas o nome das colunas a serem utilizadas - supondo que você não fá utilizar todas. Isto evita trafego desnecessário de informações na rede, bem como uso dos buffers de memória.

Mas você poderia fazer desta forma então:

SELECT C.*, S.status AS DscStatus
FROM tb_clientes C
LEFT JOIN tb_status S on (S.id = C.status)

neste caso, estamos buscando todas as colunas de tb_clientes (C.*) e para evitar erro devido a existência de uma coluna status em ambas as tabelas envolvidas, utilizamos um alias (apelido) para aquele que vem da tabela tb_status, chamando-o de DscStatus (você pode dar outro nome, desde que não seja um que exista na outra tabela).

Abraços

Link to comment
Share on other sites

  • 0
Guest --Ramon --

Kara, eu tentei faze isso que você dexou...

somente mudando os nomes das tabelas para as das minhas, mais memo assim não adiantou, o primeiro código que você me passou funcionou perfeitamente, amas esse que seria para selecionar todos os campos não adiantou !

você saberia me dizer o por que, ele me mostra a Id e ão a Descrição !

Abraços !

Link to comment
Share on other sites

  • 0
somente mudando os nomes das tabelas para as das minhas, mais memo assim não adiantou, o primeiro código que você me passou funcionou perfeitamente, amas esse que seria para selecionar todos os campos não adiantou !

você saberia me dizer o por que, ele me mostra a Id e ão a Descrição !

Ramon, vamos esclarecer esta sua afirmação:

"(...) ele me mostra a Id e não a Descrição!", é este o problema a que você se refere quando escreveu: "(...) mais memo assim não adiantou, o primeiro código que você me passou funcionou perfeitamente, amas esse que seria para selecionar todos os campos não adiantou !"

É que "(...)mas esse que seria para selecionar todos os campos não adiantou !", sugere que a consulta deu erro ou algo assim. Voce poderia informar a mensagem de erro caso tenha havido?

O C.* trará todos os campos da tabela (a de clientes) cujo alias (apelido) chamamos "C". Entre todos estes campos estará, é claro, o campo Id do cliente, mas a descrição do status virá do campo buscado na tabela de status através do JOIN e, como eu disse antes, nós renomeamos o campo status retornado via join para DscStatus para evitar erro na execução da querie porque sua tabela de cliente já tem um campo com este nome.

Talvez fosse conveniente você colocar o seu comando SQL aqui para avaliação. Informe também se você adicionou os campos (fields) ao seu dataset (componente TZQuery) em design-time.

Abraços

Link to comment
Share on other sites

  • 0
Guest --Ramon --

Bom venho novamente com a mesma dúvida !

componentes:

ZEOS 5.4

DELPHI 6

mysql 5.0

tipo de tabelas MyISAM

........ estou com 2 tabelas

tb_dispesas

- Id (CHAVE , AUTO)

- Tipo (INT)

- Dispesa (CHAR 255)

- Data (DATE)

- Valor (FLOAT)

tb_tipo_dispesas

- Id (CHAVE , AUTO)

- Descricao (CHAR 255)

-------------------------- o caso é o seguinte:

preciso selecionar * da tb_dispesas e na hora de mostrar no DBGRID , mostrar no campo (tb_dispesas.Tipo = tb_tipo_dispesas.Descricao) ao invés de mostrar somente o código da tb_dispesas.Tipo

lembrando que:

no meu DBGRID quero somente mostrar os resultado (não iré inserir nem editar nem excluir) somente vizualização

e as unicas propriedades que mexi no DBGRID foi em:

Options

- RowSelect - True

- Columnize - False

-------------------------------------------------

tentei adaptar o seguinte código, mas não consegui:

SELECT D.Id, D.Dispesa, D.Tipo, D.Data, D.Valor, D.Data, D.Valor, T.Descricao FROM tb_dispesas D LEFT JOIN tb_tipo_dispesas T ON (T.Id = D.Tipo)

porém não obtive sucesso !

..... quem puder me ajudar agradeço bastante !

Link to comment
Share on other sites

  • 0

Oi, '--Ramon --'!

Atendendo a uma solicitação do amigo Micheus, passo a dar o apoio necessário ao atendimento de sua solicitação.

conforme suas tabelas

tb_clientes

-campos:

id (int)

nome (char 255)

status (int)

tb_status

-campos

id (int)

status (char 255)

A ligação enre a tabela tb_clientes e a tabela tb_status está em tb_clientes.status = tb_status.id.

Sendo assim, o sql abaixo resolverá seu problema.

SELECT STRAIGHT_JOIN cli.*, st.status 
FROM tb_clientes cli
INNER JOIN tb_status st
ON cli.status = st.id
A cláusula STRAIGHT_JOIN força a leitura das tabelas da esquerda para a direita A cláusula INNER JOIN forçará o retorno somente onde houver registros coincidentes nas duas tabelas. Os demais não serão exibidos. Observando o layout das tabelas acima o select apresentado realizará um TABLE SCAN nas duas tabelas, degradando a performance conforme o crescimento das mesmas. Para corrigir este problema sugiro a implementação de um índice primário pelo atributo id da tabela tb_status. Respondendo ao post # O mesmo proplema é apresentado com as tabelas tb_dispesas e tb_tipo_dispesas conforme apresentado abaixo
tb_dispesas - Id (CHAVE , AUTO) - Tipo (INT) - Dispesa (CHAR 255) - Data (DATE) - Valor (FLOAT) tb_tipo_dispesas - Id (CHAVE , AUTO) - Descricao (CHAR 255)
A ligação entre as duas tabelas acima está em tb_dispesas.Tipo = tb_tipo_dispesas.id. Assim, o sql seria:
SELECT STRAIGHT_JOIN D.*, tpD.Descricao 
FROM tb_dispesas D
INNER JOIN tb_tipo_dispesas tpD
ON D.Tipo = tpD.id

Mais uma vez, para evitar um TABLE SCAN, sugiro a inserção de um índice primário pelo atributo id na tabela tb_tipo_dispesas.

É isso.

Qualquer dúvida é só postar novamente.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.5k
×
×
  • Create New...