Fórum Dados de 2 campos em apenas 1 numa Grid #340069

09/04/2007

0

Olá pessoal, tudo bem? Espero que sim.

Não sei se esta muito claro o título, mas vou explicar o q tenho tentado fazer.

Tenho dois tipos de dados diferentes em um bd, CODINOME e NOME. São campos separados, mas gostaria de colocar numa grid, em apenas um campo da grid, as duas informações, ficando mais ou menos assim:

CODINOME (NOME).

Como eu tenho que fazer o SQL no ClientDataSet pra ele me retornar isso?

Grato pela ajuda.


Aersoftware

Aersoftware

Responder

Posts

09/04/2007

Cabelo

Depende em qual BD você está trabalhando???

Mas independente, você deve achar o caracter de concatenação e usá-lo

Ex..

No Firebird ficaria assim

select (CODINOME || ´ ( ´ || NOME || ´)´) as D_CAMPO from Tabela order by NOME

só um exemplo..

iria retornar a lista de

CODINOME (NOME)

Exatamente como está acima.. se quiser pode trocar os parênteses por um hífem

select (CODINOME || ´ - ´ || NOME) as D_CAMPO from Tabela order by NOME

irá retonar uma lista com este formato :

CODINOME - NOME

No DBGrid, você indica o nome do campo sendo D_CAMPO

Isso fará com o que os dados que você concatenou no sql, apareça no grid como você quer..

um abraço


Responder

Gostei + 0

09/04/2007

Robsonselzelin

Crie um campo calculado no seu dataset (query, table, etc.) e no evento oncalcfields:

dataset.fieldbyname(´campo_calculado´).asstring := dataset.fieldbyname(´campo1´).asstring + ´ - ´ + dataset.fieldbyname(´campo2´).asstring;


Responder

Gostei + 0

09/04/2007

Cabelo

Crie um campo calculado no seu dataset (query, table, etc.) e no evento oncalcfields: dataset.fieldbyname(´campo_calculado´).asstring := dataset.fieldbyname(´campo1´).asstring + ´ - ´ + dataset.fieldbyname(´campo2´).asstring;


Sua idéia é boa..

mas ao que me consta.. campo calculado demora mais que um simples sql, já que o delphi é que irá fazer o processamento, depois mesmo de ter dado um sql no BD..

Acho inviável..


Responder

Gostei + 0

10/04/2007

Aersoftware

Olá,

Estou usando o Firebird.

Eu já usei esse comando pra colocar os dois campos num TEdit. Isso até que foi fácil, pensei q seria parecido numa Grid, mas aí percebi que não tem nada a ver, é pelo Sql mesmo.

Acho que o que faltou foi o caractere de concatenação, vou tentar assim.

Cabelo, só não entendi no exemplo o ´as D_CAMPO´.. o que seria?

Pois num sql normalzinho eu faria ´Select * From Tabela´..


Responder

Gostei + 0

11/04/2007

Cabelo

Bom..

Algumas dicas..

Pois num sql normalzinho eu faria ´Select * From Tabela´..


Sempre que você der um select, não use ´*´, é melhor você indicar todos os nomes dos campos, pois ganha em performance, pois quando você dá um select * from Tabela, o firebird, vai primeiro nas tabelas relacionais, e olha os fields da tabela em questão, quando se usa um caracter coringa, depois, reformula o sql com os dields selecionados, e aplica na tabela em questão, se você perder o mínimo de tempo digitando os nomes dos campos é muito melhor..

Cabelo, só não entendi no exemplo o ´as D_CAMPO´.. o que seria?


O firebird mantém um padrão de nomeação de campos, que fica armazenado em uma tabela relaciona relation$fields, quando ele não acha um field selecionado, ele usa um nome padrão, mas nós podemos alterar este nome, que é o caso, quando dou um ´as´, estou nomeando o campo que irá retornar o selecionado..

faça seu select assim

select campo1, campo2, campo3, campo4, (campo1 | ´  -  ´ | campo2) as D_CONCATENA from tabela


você vai ver que se pegar este sql e executar em um editor de sql, perceba que o nome do campo concatenado será D_CONCATENA como você havia avisado ao firebird..

qualquer dúvida posta aí..

um abraço.


Responder

Gostei + 0

11/04/2007

Aersoftware

Então, é melhor eu digitar todos os campos da tabela no select do q colocar o ´*´, mesmo que sejam muitos campos?

Bom, eu fiz um teste no Select aqui, colocando pra ele procurar somente os campos que eu precisava, e cada vez dava um erro dizendo que ele nao tava achando um dos campos da tabela. Acabou que eu tive que botar todos os campos pra ele funcionar, ficou grande, assim:

        ´Select PKCOD_PERSONAGEM_COMICS, FKCOD_EDITORA_ORIGINAL, FKCOD_NUCLEO, CODINOME_PERSONAGEM_COMICS,´
        + ´NOME_PERSONAGEM_COMICS, NOME_COMPLETO_COMICS, CODINOME_ORIGINAL_COMICS, TIPO_PERSONAGEM_COMICS,´
        + ´IMAGEM_PERSONAGEM_COMICS, NOME_IMAGEM_PERSONAGEM_COMICS, ANO_CRIACAO_PERSONAGEM_COMICS,´
        + ´ALTURA_PERSONAGEM_COMICS, PESO_PERSONAGEM_COMICS, COR_OLHOS_PERSONAGEM_COMICS,´
        + ´COR_CABELOS_PERSONAGEM_COMICS, BASE_OPERACOES_COMICS, PRIMEIRA_APARICAO_EUA_COMICS,´
        + ´PRIMEIRA_APARICAO_BRA_COMICS, OUTROS_CODINOMES_COMICS, PODERES_HABILIDADES_COMICS,´
        + ´DESCRICAO_PERSONAGEM_COMICS,´
        + ´(CODINOME_PERSONAGEM_COMICS | ´-´ | NOME_PERSONAGEM_COMICS) as D_CONCATENA From TB_PERSONAGENS_COMICS Order by CODINOME_PERSONAGEM_COMICS´;



Se eu deixar o código assim:

(CODINOME_PERSONAGEM_COMICS | ´-´ | NOME_PERSONAGEM_COMICS) as D_CONCATENA


Ele da erro, acho que por causa do operador ´-´. Se eu tiro ele, funciona perfeitamente, mas mesmo assim, continua me listando só o ´Codinome´.

Não sei se tem algo errado com a Grid, pq ela ta ligada num ClientDataSet de consulta de Personagem. Eu tenho dois Clients pra Personagens, um pras operações normais (inclusão, exclusão, etc) e outro só pra consultas. A Grid ta ligada nele.

Pq assim, pra explicar o que estou tentando fazer: Tenho duas Grids e dois botoes, (inserir e apagar). Uma delas, só vai me consultar o nome do Personagem pra eu incluir na outra, mas o que vou pegar é o código desse personagem.

O que surgiu de dúvida pra fazer isso é que pode ter mais de um Personagem com o mesmo ´Codinome´, o que vai fazer a diferença é o ´Nome´, por isso queria colocar do lado, pra diferenciar eles.


Responder

Gostei + 0

12/04/2007

Cabelo

O código do seu sql deve ficar assim (no delphi) :

´Select PKCOD_PERSONAGEM_COMICS, FKCOD_EDITORA_ORIGINAL, FKCOD_NUCLEO, CODINOME_PERSONAGEM_COMICS, NOME_PERSONAGEM_COMICS, NOME_COMPLETO_COMICS, CODINOME_ORIGINAL_COMICS, TIPO_PERSONAGEM_COMICS, IMAGEM_PERSONAGEM_COMICS, NOME_IMAGEM_PERSONAGEM_COMICS, ANO_CRIACAO_PERSONAGEM_COMICS, ALTURA_PERSONAGEM_COMICS, PESO_PERSONAGEM_COMICS, COR_OLHOS_PERSONAGEM_COMICS, COR_CABELOS_PERSONAGEM_COMICS, BASE_OPERACOES_COMICS, PRIMEIRA_APARICAO_EUA_COMICS, PRIMEIRA_APARICAO_BRA_COMICS, OUTROS_CODINOMES_COMICS, PODERES_HABILIDADES_COMICS, DESCRICAO_PERSONAGEM_COMICS,  (CODINOME_PERSONAGEM_COMICS ||´´ - ´´|| NOME_PERSONAGEM_COMICS) as D_CONCATENA From TB_PERSONAGENS_COMICS Order by CODINOME_PERSONAGEM_COMICS´;


Assim funciona..

Quando te passei o caracter de concatenação, achei que saberia usar.. no sql no delphi, você deve usar exatamente como está a cima..

um abraço..


Responder

Gostei + 0

12/04/2007

Aersoftware

Putz, desculpe, nao queria ser chato, mas acho q to fazendo algo errado, pq nao funciona comigo.. desse jeito q tu me passou, ele funciona, lista todos persoangens, mas nao faz essa concatenação.. pelo menos nao no campo que estou exibindo, q é único.. to exibindo na grid o campo de Codinome.

Ficou assim:

  DmDados.ClientPersonagensComicsCons.Close;
  With DmDados.SqlPersonagensComics do
    begin
      close;
      CommandText :=
        ´Select PKCOD_PERSONAGEM_COMICS, FKCOD_EDITORA_ORIGINAL, FKCOD_NUCLEO, CODINOME_PERSONAGEM_COMICS, ´
        + ´NOME_PERSONAGEM_COMICS, NOME_COMPLETO_COMICS, CODINOME_ORIGINAL_COMICS, TIPO_PERSONAGEM_COMICS,´
        + ´IMAGEM_PERSONAGEM_COMICS, NOME_IMAGEM_PERSONAGEM_COMICS, ANO_CRIACAO_PERSONAGEM_COMICS,´
        + ´ALTURA_PERSONAGEM_COMICS, PESO_PERSONAGEM_COMICS, COR_OLHOS_PERSONAGEM_COMICS,´
        + ´COR_CABELOS_PERSONAGEM_COMICS, BASE_OPERACOES_COMICS, PRIMEIRA_APARICAO_EUA_COMICS,´
        + ´PRIMEIRA_APARICAO_BRA_COMICS, OUTROS_CODINOMES_COMICS, PODERES_HABILIDADES_COMICS,´
        + ´DESCRICAO_PERSONAGEM_COMICS,´
        + ´(CODINOME_PERSONAGEM_COMICS ||´´ - ´´|| NOME_PERSONAGEM_COMICS) as D_CONCATENA From TB_PERSONAGENS_COMICS Order by CODINOME_PERSONAGEM_COMICS´;
      open;
    end;
  DmDados.ClientPersonagensComicsCons.Open;




Responder

Gostei + 0

13/04/2007

Cabelo

No Grid, qual o field que você está mostrando???

Tem que ser D_CONCATENA....

O Label do field, pode ser qualquer um mas o fieldname tem que ser D_CONCATENA, e se você tiver campos calculados no dataset, é necessário você inserir o D_CONCATENA lá tb, se for o caso.. certo??


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar