Agrupamento de dados

806 views
Skip to first unread message

Fernando Vargas

unread,
Mar 25, 2013, 8:32:18 AM3/25/13
to dug...@googlegroups.com
Bom dia espartanos.....

.....estou com a seguinte situação: 

Tenho a estrutura de dados:

CREATE TABLE sys_configuracao (
  idSecao VARCHAR(100) NOT NULL,
  idConfiguracao VARCHAR(100) NOT NULL
  dsConfiguracao VARCHAR(MAX)
  
  constraint PK_sys_configuracao_idSecao_idConfiguracao primary key (idSecao,idConfiguracao);
);

Eu preciso mostrar esses dados em uma grid ( ou qualquer outro controlador que me permita isso ) onde eu possa fazer um agrupamento pela coluna "idSecao". Eu sei que os componentes da DEVEXPRESS fazem isso, mas no momento não temos licença então eu preciso de uma solução FREE.

Alguém conhece um bom componente para fazer isso e que seja FREE???

Grato pelo suporte.

Evandro Souza

unread,
Mar 25, 2013, 9:38:26 AM3/25/13
to dug...@googlegroups.com
Bom dia,
no meu entendimento, a cxGrid(DevExpress) é útil para os casos que vc quer proporcionar ao usuário a liberdade de agrupar por qualquer coluna disponivel na grade.

Mas no seu caso você quer agrupar somente pela 'IdSecao', um simples group by na expressão SQL não resolveria?



--
--
Você recebeu esta mensagem porque está inscrito no "DUG-RS -
Delphi Users Group Rio Grande do Sul" em Grupos do Google.
Acesse o nosso BLOG em http://www.dug-rs.org e contribua com a comunidade Delphi do Rio Grande do Sul
Para postar neste grupo, envie um e-mail para dug...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para
dug-rs-un...@googlegroups.com
Para ver mais opções, visite este grupo em
http://groups.google.com.br/group/dug-rs?hl=pt-BR
 
Twitter: @dugrs
http://www.facebook.com/groups/dugrs/
http://www.Vimeo.com/dugrs
 
---
You received this message because you are subscribed to the Google Groups "DUG-RS - Delphi Users Group Rio Grande do Sul" group.
To unsubscribe from this group and stop receiving emails from it, send an email to dug-rs+un...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
 
 

Fernando Vargas

unread,
Mar 25, 2013, 9:48:31 AM3/25/13
to dug...@googlegroups.com
Não é bem isso! :)

Eu preciso fazer agrupamento na GRID ( citei o exemplo do DEVEXPRESS para o intendimento do que eu preciso ) e queria saber se existe um componente ( que faça a mesma coisa que o DEVEXPRESS faça ) só que FREE.

Felipe Dornelles Dal Pizzol

unread,
Mar 25, 2013, 10:06:52 AM3/25/13
to dug...@googlegroups.com
CARA, Se tu usa qry, dsp e cds, tu pode fazer uma cópia do data do teu cds e, ao clique no título de uma coluna do grid, criar índices para aquele campo. Defina como ascendente ou descendente que vai ficar show de bola.

Fora isso, tu poderia usar o order by do sql, mas dependendo da quantidade de registros, isso certamente se tornará inviável.

Cordialmente,
Felipe Dornelles Dal'Pizzol

Fernando Vargas

unread,
Mar 25, 2013, 10:19:14 AM3/25/13
to dug...@googlegroups.com
Certamente Felipe! 

Mas como tu disse uma hora vai ficar com muitos dados, então já quero "matar dois coelhos com uma cajadada". Eu achei uma vcl free só que ela esta disponível só para 32bits. 64bits não tem! 

Estou vendo uma forma de criar os fontes para 64bits!

Mas obrigado pelo suporte!!!!!

Aquele abraço!

Evandro Souza

unread,
Mar 25, 2013, 10:25:17 AM3/25/13
to dug...@googlegroups.com
Pessoal, até onde eu sei o cxGrid utiliza um simples "group by", se é aquela funcionalidade de "arrastar a coluna para agrupar". Visto isto, seria possível sim "reprogramar" a mesma funcionalidade do cxGrid. 

Por exemplo: criar um combobox que possua todos os Fields da Query da grade escolhida, ao lado do combobox terá um botão "agrupar" que fará o "group by"  da coluna selecionada.

Eu discordo da lentidão, se o database estiver bem modelado, não há por que existir lentidão, e se existir , existiria também na utilização do cxGrid(DevExpress).

Att.

Felipe Dornelles Dal Pizzol

unread,
Mar 25, 2013, 10:33:40 AM3/25/13
to dug...@googlegroups.com
Evandro, pode crer... a lentidão existe! Ao começar a considerar
o tráfego de rede, já deve considerár.

Fernando, tu edita valores dessa tabela que tu está carregando?
Começa a cogitar o uso de índices, que falei no primeiro e-mail,
pois estando os dados na memória já, é bem barbada ordená-los
utilizando-se de índices.



Cordialmente,
Felipe Dornelles Dal'Pizzol


Evandro Souza

unread,
Mar 25, 2013, 10:48:24 AM3/25/13
to dug...@googlegroups.com
Concordo , um cadastro\tabela com volume de dados grande e sem paginação(limit por página) com certeza ficará lento.
Ainda tenho algumas observações:
1) Trabalhar com a memória da maquina cliente nunca é a melhor solução, visto que é sempre imprevisível quanto de memória da maquina estará a nossa disposição.
2) O group by e order by foram concebidos primariamente no banco de dados não atoa, empresas e instituições como Oracle e PostgreSQL estudaram\estudam métodos específicos e especialistas para efetuar este trabalho do melhor e mais eficiente modo possível.

Gustavo Luis Hinterholz

unread,
Mar 25, 2013, 10:56:37 AM3/25/13
to dug...@googlegroups.com
Tens alguns poréns nessa historia ne :
Se :
- Ele pegar todos os dados de uma vez, e efetuar os groups, order e tudo mais em memoria, temos o seguinte cenário:
  -1 Consulta ao banco, o que gera menos tráfego de rede.
  - Dados alocados na memoria volátil,o que e considerado meio perigoso por inumeros fatores.
  - Oneração e gerenciamento de memória por parte do client, o que pode ser mais lento do que relacionado a um processamento no server por exemplo.

Caso:
- O order by e o limit seja efetuados no proprio SQL(comando) temos outro cenário:
  - Várias consultas ao banco, onerando a rede, mas cada consulta considerando o comando group by por exemplo e bem menor que uma consulta geral como no exemplo acima.
  - Maior segurança de integridade dos dados entre outras, pois os mesmos vem "prontos" do banco de dados.
  - Oneração e gerenciamento de memória por parte do servidor, o que pode ser mais rápido por exemplo ordenar lá, do que na própria máquina.

Enfim, no meu modo de ver, seria uma questão de escolha e o que mais se adequa ao ambiente em que vai ser utilizado.

Att
Gustavo Luis Hinterholz
9381-8192

Fernando Vargas

unread,
Mar 25, 2013, 11:15:44 AM3/25/13
to dug...@googlegroups.com
Galera, eu já tenho conhecimento sobre tudo isso! 

O que eu preciso é uma coisa simples: os dados agrupados não podem aparecer mais de uma vez na GRID. Novamente só citei o DEVEXPRESS como exemplo da funcionalidade do cxGrid que é o que eu preciso!

Felipe Dornelles Dal Pizzol

unread,
Mar 25, 2013, 11:35:32 AM3/25/13
to dug...@googlegroups.com
Agora temos um novo cenário: "Os dados agrupados não podem aparecer mais de uma vez na grid"...

Pena que não veio junto da pergunta inicial.. .heheheheh

Cordialmente,
Felipe Dornelles Dal'Pizzol


Fernando Vargas

unread,
Mar 25, 2013, 11:55:03 AM3/25/13
to dug...@googlegroups.com
Hehehe de repente me expressei mal.

Mas isso que eu preciso! O cxGrid tem essa funcionalidade quando tu arrasta uma coluna para a área de agrupamento aquele dado aparece uma unica vez. 

Não precisa ser da forma como o cxGrid faz, de ter que arrastar a "coluninha" somente quero quando eu agrupar por alguma coluna o dado daquela coluna deve aparecer uma unica vez.

Rodrigo Sebben

unread,
Mar 25, 2013, 12:43:55 PM3/25/13
to dug...@googlegroups.com
A um tempo atrás eu precisei fazer algo parecido, mas em vez de agrupar eu tinha que ordenar pela coluna. O que fiz foi implementar uma função no onTitleClick que ao clicar na coluna, eu ordenava a consulta por aquele campo es se clicasse novamente no mesmo campo ele invertia a ordenação. Quando fiz isso era numa tabela pequena então toda vez que era clicado eu mandava o comando sql para o componente e ele carregava os dados novamente, sei que não é o correto, mas solucionou o meu problema.

Acredito que para você teria que ser algo parecido só que em vez de aplicar uma ordenação, você deve aplicar o group by no campo selecionado, e este, deveria ser colocado em destaque acima do grid, para indicar por qual campo ele está agrupado.

Tirando essa forma de fazer não vejo outra forma(ao menos que eu conheça) que tu consiga fazer isso sem usar o CxGrid.

Att.
Rodrigo Sebben
Express Systems

Fernando Vargas

unread,
Mar 25, 2013, 1:27:58 PM3/25/13
to dug...@googlegroups.com
Olá Rodrigo Sebben, na teoria é isso que eu preciso!

Quando eu mandar agrupar por um campo a coluna que ordena o grid deve ir para cima dela e não pode se repetir na grid.

Uma pergunta, tu saber como eu faço para mover essa coluna especifica para cima da grid?

Rodrigo Sebben

unread,
Mar 25, 2013, 1:34:06 PM3/25/13
to dug...@googlegroups.com
A estrutura do dbgrid não permite esse tipo de interação dentro dele, pois ele só mostra aquilo que retorna do dataset. Para isso você teria que colocar junto ao grid um Label/edit que recebesse essa informação(campo selecionado para agrupar) e no grid ele mostraria esse agrupamento, selecionado. Para que ele não apareça no grid é só tirar ele do select do SQL que retorna essa consulta e pronto.

Att.
Rodrigo

Wendel

unread,
Mar 25, 2013, 4:36:56 PM3/25/13
to dug...@googlegroups.com
Cria um frame com um panel e um grid, qdo clicar no título ele mostra o panel e altera o grid

Enviado via iPhone
Softcom Informatica
Paf-ecf/Mobile/Erp

Evandro Souza

unread,
Mar 25, 2013, 4:43:01 PM3/25/13
to dug...@googlegroups.com
O problema desta solução que estamos propondo é que não fará o efeito "cascata" que o cxGrid faz:
Imagem inline 1

Mas dai tu pode colocar a coluna elegida para a primeira posição e modificar a cor da mesma, para destacar mostrando que ela é a agrupada..

Fernando Vargas

unread,
Mar 26, 2013, 7:16:02 AM3/26/13
to dug...@googlegroups.com
Bom dia Evandro.

Sim sim! Esta solução é viável!

Eu só preciso saber como eu faço para a grid não repetir mais 1 vez a coluna elegida como agrupada, intende?

Evandro Souza

unread,
Mar 26, 2013, 7:39:46 AM3/26/13
to dug...@googlegroups.com
Não se entendi a tua pergunta. Pois para mim,  no momento que você utilizar o agrupamento, seja ele em ClientDataset ou SQL. Automaticamente a coluna não deverá se repetir( caso ela continue se repetindo o agrupamento não funcionou né).

Sugestão, primeiro escolha qual o modo você deseja agrupar:
Após escolher poste suas dúvidas mais especificas aqui.

Samuel N. Junior

unread,
Mar 26, 2013, 7:41:36 AM3/26/13
to dug...@googlegroups.com
Será que o que você está querendo é algo parecido com isso?




Samuel

Rodrigo Sebben

unread,
Mar 26, 2013, 7:42:16 AM3/26/13
to dug...@googlegroups.com
Se ele está aparecendo no agrupando é porque o campo está no select, apenas retire ele ou não use "select * from..." que ele não irá aparecer.

Att.
Rodrigo Sebben

Fernando Vargas

unread,
Mar 26, 2013, 7:57:28 AM3/26/13
to dug...@googlegroups.com
Samuel N. Junior..

Isso mesmo que eu preciso!!!!

Que componente é esse? Ou é um DBGrid comum?

Samuel N. Junior

unread,
Mar 26, 2013, 8:10:13 AM3/26/13
to dug...@googlegroups.com
Fernando,

Esse é um componente pago. No exemplo que tem mandei é o Infopower da Woll2Woll.

Não conheço nenhum "free" que faça isso, mas existem vários "pagos" de baixo custo como, por exemplo, o TMS GridPack da TMS Software (EUR 120,00), o QuantumGrid da DevExpress (US$ 799,99), o InfoPower (US$ 599,00), etc,

Acho se levar em conta o tempo que você perderá fazendo algo parecido (e dando manutenção depois) acabará saindo mais barato comprar o TMS GridPack da TMS Software.

Faça uma conta "simples", se você "custar" R$ 30,00/hora, já "consumiu" um valor bem mais alto do que os R$ 300,00 de um produto pronto procurando uma solução.

Pode ser que o Grid do JEDI faça algo parecido (desconheço pois nunca o usei).

[ ]s


Samuel

Fernando Vargas

unread,
Mar 26, 2013, 8:23:16 AM3/26/13
to dug...@googlegroups.com
Obrigado pela solução Samuel! É que eu no caso não posso adquirir, pois é para o conselho o qual eu trabalho!

E tudo passa por processo licitatório, então já viu!

Mas obrigado pela solução!

Samuel N. Junior

unread,
Mar 26, 2013, 8:24:53 AM3/26/13
to dug...@googlegroups.com
Como eu disse, dê uma olhada no Jedi, quem sabe ele faz isso.

Agora que o pessoal da lista sabe o que você quer, quem sabe eles não conheçam algo free que faça isso.

[ ]s

Samuel

Samuel N. Junior

unread,
Mar 26, 2013, 8:29:18 AM3/26/13
to dug...@googlegroups.com
Acabei de ter uma ideia (não sei se funcionaria).

No evento onDrawDataCell ou no onDrawColumnCell do dbGRID você pode verificar, antes de deixar o Delphi "desenhar" a Grid, se o valor que será impresso é igual ao último e, se for, não deixar ele colocar novamente o texto.

Dará um pouco de trabalho pois você terá que controlar isso tanto na navegação "para frente" quanto na volta dos registros.

[ ]s


Samuel
Em 26/03/2013 09:23, Fernando Vargas escreveu:

Evandro Souza

unread,
Mar 26, 2013, 8:36:10 AM3/26/13
to dug...@googlegroups.com
Eu faria diferente, pq esses eventos de Draw do Grid é fogo.. Eu tentaria utilizar um Calculated Field do DataSet e faria o tratamento no OnCalcFields.
Não consigo ter a visualização agoa quanto á performance..
 

Fernando Vargas

unread,
Mar 26, 2013, 8:45:38 AM3/26/13
to dug...@googlegroups.com
Pessoal procurando no Google, depois de pesquisar muito, achei um componente free que faz o que eu preciso.

O SMDBGRID além de ter a grid que eu preciso tem outros componentes compatíveis com Delphi XE2 e XE3.

Vale a pena conferir e é FREE!

A unica desvantagem é que ele não é compatível com 64bits. Mas isso a gente faz!

No mais galera muito obrigado pelo suporte!!!

Aquele abraço.

PARA QUEM QUISER CONFERIR SEGUE O LINK: http://www.scalabium.com/smdbgrid.htm
Reply all
Reply to author
Forward
0 new messages