Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

FabianoSouza

Escolher colunas para grid da aplicação

Recommended Posts

Vejo aqueles grids profissionais em que o usuário escolhe quais campos deseja visualizar em sua "grade" de dados.
Acho isso muito útil e quero desenvolver essa funcionalidade.

 

 

Exemplo:

A tabela têm os seguintes campos: NomeCompleto, Tel1, EnderecoRes, EmailComercial

Aí o usuário quer apenas os campos NomeCompleto e Tel1 em seu grid.

Isso é apenas um exemplo. Tenho diversas tabelas, com diversos campos.

 

 

Acredito que preciso criar uma tabela para armazenar o nome dos campos da "preferência" do usuário. Seria isso mesmo?

Quero a ajuda dos colegas para descobrir o melhor caminho para começar a criar isso.

 

Obrigado desde já.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Fabiano! tranquilo?

 

Sempre com uma ideia doida... kkk ow, da um joinha nos seus outros posts também! cara se você pretende carregar automaticamente toda vez que o usuário usar o grid, essas parametrizações devem ser salvas em algum lugar. Armazene o id da tabela e das colunas e não nomes,o id da tabela você pega quando criar e o id das colunas é sequencial (1,2,3,4...). pq se tiver muitos usuários, telas e colunas, ficar procurando em campos de texto as colunas que serão exibidas pode demorar tanto quando o select total.

 

Precisando, só entrar em contato!

abraço!

 

segue aquele exemplo maroto....

 

use tempdb
go
------------------------------------------------------------------------------------------------------
--Criação das tabelas temporárias para o exemplo
------------------------------------------------------------------------------------------------------


if object_id('tempdb..#gridtela1') is not null
drop table #gridtela1

if object_id('tempdb..#preferenciausuario') is not null
drop table #preferenciausuario


create table #gridtela1 (
nome varchar(150),
endereco varchar(250),
telefone varchar(20),
email varchar(150),
cpf varchar(20),
funcao varchar(20)
)


create table #preferenciausuario (
id_usuario int,
id_tabelagrid int,
id_coluna int
)


------------------------------------------------------------------------------------------------------
--Populando tabelas temporárias
------------------------------------------------------------------------------------------------------

insert into #gridtela1 values ('r2d2','rua 1','(88)8888-8888','r2d2@email.com','888.888.888-88','Droid')
insert into #gridtela1 values ('c3po','rua 1','(99)9999-9999','c3po@email.com','999.999.999-99','Droid')

-- o usuário opta por exibir apenas as 4 primeiras colunas: nome, endereço, telefone e email

insert into #preferenciausuario select 1,[object_id],[column_id]
from sys.columns where [object_id] = object_id('#gridtela1') and column_id < 5


------------------------------------------------------------------------------------------------------
--Exibição das colunas
------------------------------------------------------------------------------------------------------
declare @id_usuario int
declare @tabelagrid varchar(100)

set @id_usuario = 1
set @tabelagrid = '#gridtela1'


declare @select varchar(max)
set @select = 'select '

select
@select = @select+'['+name+'],'
from sys.columns sc
join #preferenciausuario pu
on pu.id_tabelagrid = sc.[object_id]
and pu.id_coluna = sc.column_id

where pu.id_usuario = @id_usuario
and pu.id_tabelagrid = object_id(@tabelagrid)

select @select = left(@select,len(@select)-1)+' from ['+@tabelagrid+'] '--pode colocar condições dinamicas também

exec(@select)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa! Fala aí, Diemerson.
Andei meio afastado do fórum heheh. Mas sei que vc deu uma força em outros posts que fiz.

Vou olhar com calma e retomar os assuntos aos poucos.

 

Bom, agora vou trabalhar no exemplo que vc postou neste tópico.

 

Brigadão, meu caro!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala ae Diemerson!!
Cara, é isso mesmo que preciso!

Uma dúvida.

Então a lógica é gravar numa tabela de preferências, o ID das colunas que eu quero que sejam

exibidas. É isso?

 

Outra coisa. Quero entender melhor esse trecho

insert into #preferenciausuario select 1,[object_id],[column_id]
 from sys.columns where [object_id] = object_id('#gridtela1') and column_id < 4

Sei o que a instrução acima faz. Mas quero saber o que significa o trecho "... select 1..."

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala ae Diemerson!!

Cara, é isso mesmo que preciso!

 

Uma dúvida.

Então a lógica é gravar numa tabela de preferências, o ID das colunas que eu quero que sejam

exibidas. É isso?

 

Outra coisa. Quero entender melhor esse trecho

insert into #preferenciausuario select 1,[object_id],[column_id]
 from sys.columns where [object_id] = object_id('#gridtela1') and column_id < 4

Sei o que a instrução acima faz. Mas quero saber o que significa o trecho "... select 1..."

 

Bom dia, Fabiano! tranquilo?

 

Nesse trecho eu populo minha tabela de preferências.

 

o "1" do select é o ID do meu usuário fictício, como pode ver na montagem do select que busca as colunas.. "where pu.id_usuario = @id_usuario"

 

no seu caso, quando um usuário marcar as preferências, vc vai inserir na tabela o id do usuário, o id da tabela e o id das colunas que ele selecionou.

ex:

 

insert into preferenciausuario values (idusuario,object_id(nomedatabela),1)

insert into preferenciausuario values (idusuario,object_id(nomedatabela),2)

insert into preferenciausuario values (idusuario,object_id(nomedatabela),3)

insert into preferenciausuario values (idusuario,object_id(nomedatabela),6)

 

ou se preferir:

 

insert into preferenciausuario values (idusuario,object_id(nomedatabela),'1;2;3;6')

 

colocando todas os ids das colunas selecionadas em uma coluna e depois fazer um split quando for montar o script de exibição.

 

E é como falei, se quer deixar permanente, tipo, o usuário seleciona a as colunas e até alterar essa seleção, será exibido o grid selecionado automaticamente toda vez que ele entrar no sistema, deve gravar esses parâmetros em algum lugar, coloque em uma tabela.

 

Ká se quiser apresentar um pop-up com as colunas pra ele marcar um checkbox nas colunas que ele quer exibir, toda vez que ele entrar no sistema, essas informações não precisam ficar no banco.

 

Independente da maneira que quer implementar, se precisar de ajuda é só entrar em contato!

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Diemerson! Mais uma vez agradeço pelas didáticas explicações.

 

Vou precisar usar alias para os campos do grid, pois não posso exibir o cabeçalho "nome", "endereco","funcao" e etc, preciso que os cabeçalhos sejam Nome, Endereço, Função e assim por diante.

 

Isso se faz necessário porque vou usar o nome das colunas da tabela como cabeçalho do grid.

Hoje já faço de maneira. Mas como declaro os campos no código, sei quais colunas precisam usar de alias.

 

Como essa nova maneira que quero fazer (escolhendo as colunas que aparecerão no grid) não sei como faria para aplicar um apelido pois os campos não estão declarados no código, estão armazenados numa tabela (pelo seu respectivo ID).

 

Minha dúvida é: como aplico um apelido para os campos que estiverem na tabela de "preferências"?

Seria o caso de criar um campo (na tab de preferências) para armazenar o apelido ou há outro meio?

 

Valew!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde, Fabiano! tranquilo?

Cara, as duas opções que não vão impactar seu banco de dados nem as aplicações que já estão rodando são:

1 - como mencionou, incluir a coluna "alias" na tabela de preferências de usuários contendo o nome que será exibido.

A montagem do script dinâmico ficaria mais ou menos assim:

select
@select = @select+'['+name+'] as ['+isnull(pu.[alias],name)+'] ,'
from sys.columns sc
join #preferenciausuario pu
on pu.id_tabelagrid = sc.[object_id]
and pu.id_coluna = sc.column_id

2 - Na montagem desse mesmo script incluir o tratamento do alias, tipo:

select
@select = @select+'['+name+'] as ['+case name
when 'funcao' then 'Função'
when 'endereco' then 'Endereço'
else name
end+'] ,'
from sys.columns sc
join #preferenciausuario pu
on pu.id_tabelagrid = sc.[object_id]
and pu.id_coluna = sc.column_id


Abraço!
qualquer coisa... chame no skype diemerson.campos ou no hangouts diemerson.campos@gmail.com

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa! Captei a essência da coisa.

 

Vou sim add vc ao Skype pra quando vierem as etapas mais pedreira hehehe

Agora que já sei a etapas, vou começar a construir a opção 1 (opção 2 deixará o código muito extenso e são muitos grids no sistema...haja mão pra escrever tantas linhas hehehe).

 

Vou tirar o feriadão para cuidar disso e fechar o post o quanto antes.

 

Valew, Diemerson!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Diemerson! Blzera??

Cara, adaptei o código e funcionou!! Abora bora implementar na aplicação heheh

Vou fechar o post. Porque atingi o objetivo.

Suas explicações são bem claras.

 

Mas mesmo assim vou fazer mais uma pergunta sobre o código do post #2

select @select = left(@select,len(@select)-1)+' from ['+@tabelagrid+'] '--pode colocar condições dinamicas também

exec(@select)

Quero entender o papel do LEN nesse trecho.

Quero saber o que você quis dizer com "--pode colocar condições dinamicas também"

 

Mais uma vez, muito obrigado!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Diemerson! Blzera??

Cara, adaptei o código e funcionou!! Abora bora implementar na aplicação heheh

Vou fechar o post. Porque atingi o objetivo.

Suas explicações são bem claras.

 

Mas mesmo assim vou fazer mais uma pergunta sobre o código do post #2

select @select = left(@select,len(@select)-1)+' from ['+@tabelagrid+'] '--pode colocar condições dinamicas também

exec(@select)

Quero entender o papel do LEN nesse trecho.

Quero saber o que você quis dizer com "--pode colocar condições dinamicas também"

 

Mais uma vez, muito obrigado!!

 

Boa tarde, Fabiano! tudo tranquilo e por ai?

 

Quanto ao len -1, na parte onde seleciono os nomes das colunas,concateno com o nome da coluna com os "[ ]" uma ",":

select

@select = @select+'['+name+],'

from sys.columns sc

 

o len limita o left, concatenando o texto da variável com o restante do script dinâmico excluindo a vírgula concatenada na ultima coluna.

 

Outra maneira de fazer seria concatenar a vírgula antes da coluna e ao concatenar no script dinâmico, utilizar um stuff substituindo o primeiro caracter por ''.

 

Já o "--pode colocar condições dinamicas também" é o Where... vc pode colocar as condições dinâmicas também, dependendo dos valores recebidos nas variáveis do seu código, ou procedure...

 

ex:

select @select = left(@select,len(@select)-1)+' from ['+@tabelagrid+'] '+isnull('where nome = '''+@nome+'''','')

 

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.