Dados de 2 campos em apenas 1 numa Grid
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.
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
Curtidas 0
Respostas
Cabelo
09/04/2007
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
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
GOSTEI 0
Robsonselzelin
09/04/2007
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;
dataset.fieldbyname(´campo_calculado´).asstring := dataset.fieldbyname(´campo1´).asstring + ´ - ´ + dataset.fieldbyname(´campo2´).asstring;
GOSTEI 0
Cabelo
09/04/2007
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..
GOSTEI 0
Aersoftware
09/04/2007
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´..
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´..
GOSTEI 0
Cabelo
09/04/2007
Bom..
Algumas dicas..
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..
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
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.
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.
GOSTEI 0
Aersoftware
09/04/2007
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:
Se eu deixar o código assim:
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.
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.
GOSTEI 0
Cabelo
09/04/2007
O código do seu sql deve ficar assim (no delphi) :
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..
´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..
GOSTEI 0
Aersoftware
09/04/2007
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:
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;
GOSTEI 0
Cabelo
09/04/2007
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??
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??
GOSTEI 0