Sort em datatable com duas colunas

401 views
Skip to first unread message

Gustavo Ferreira

unread,
May 28, 2009, 1:15:00 PM5/28/09
to DotNetFloripa
Pessoal, mais uma dúvida básica mas que ninguém consegue resolver:

Tenho um datatable que tenho que montar dependendo de diversas
condições, então não posso usar um ORDER BY no Sql.

Porém, preciso ordená-lo por TRÊS colunas.

Na minha inocência, já tentei as três formas seguintes, nenhuma
funcionou:


1. Ordernar usando o Select do datatable:
dt.Select("", "coluna1, coluna2, coluna3");

2. Usar o DefaultView para ordenar:
DataView dv = dt.DefaultView;
dv.Sort = "coluna1, coluna2, coluna3";

3. Criar um BindingSource na marra:
BindingSource bs = new BindingSource();
bs.DataSource = dt;
bs.Sort = "coluna1, coluna2, coluna3";


pelamordedeus, isso não deve ser difícil fazer. o que estou fazendo de
errado?

PS: na internet todo mundo fala que "dá", mas ninguém testa a própria
solução;
PS2: eu não vou fazer 3 loops para ordenar (uma "solução" que deram
foi essa);
PS3: vocês estão se tornando minha última esperança =)

Gustavo Ferreira

unread,
May 28, 2009, 1:32:41 PM5/28/09
to DotNetFloripa
Mais algumas informações pertinentes:

A primeira coluna é sempre uma data.
A segunda é uma string.
A terceira é um numérico.

Dependendo de uma condição de cadastro, a ordenaçao da segunda e
terceira coluna se invertem.

On 28 maio, 14:15, Gustavo Ferreira <gustavoferreir...@gmail.com>
wrote:

Gustavo Ferreira

unread,
May 28, 2009, 1:45:07 PM5/28/09
to DotNetFloripa
Bom, se serve de consolo, descobri que a minha tentativa 2 foi a mais
acertada. Eu consigo usar o sort nos tipos string e data, mas o
numérico, mesmo estando sozinho, não funciona.

Em código:
dv.Sort = "nIdNetting" //não funciona
dv.Sort = "tDdPagamento, sDsProduto" //funciona


Alguém?

On 28 maio, 14:32, Gustavo Ferreira <gustavoferreir...@gmail.com>
wrote:

Rodrigo Vieira

unread,
May 28, 2009, 1:54:51 PM5/28/09
to dotnet...@googlegroups.com
Nao funciona em que sentido? Fica na mesma ordem das rows do bd, ou
uma outra ordem maluca?

2009/5/28 Gustavo Ferreira <gustavof...@gmail.com>:

Marco Santana

unread,
May 28, 2009, 1:54:59 PM5/28/09
to dotnet floripa
Nunca usei Linq com Dataset, na verdade, devo ser um dos poucos que teve o privilégio de nunca usar DataSet, mas se vc conseguir transformar o DataSet em um tipo IEnumerable, ICollection, IQueryable, enfim, basta usar um
 
var query = from dado in DataSetName
                order by columnList
                select dado;
 
whateverControl.DataSource = query;
whateverControl.DataBind();
 
Ops, lógico que o mínimo de framework deve ser 3.0;
 
 
Marco.
 
> Date: Thu, 28 May 2009 10:45:07 -0700
> Subject: [dotNetFloripa: 426] Re: Sort em datatable com duas colunas
> From: gustavof...@gmail.com
> To: dotnet...@googlegroups.com

Marco Santana

unread,
May 28, 2009, 2:03:22 PM5/28/09
to dotnet floripa
Complementando. Linq pode ser usado com DataSet.
 
http://language-integrated-query.com/Linq_to_Dataset.aspx

 
> Date: Thu, 28 May 2009 10:45:07 -0700
> Subject: [dotNetFloripa: 426] Re: Sort em datatable com duas colunas
> From: gustavof...@gmail.com
> To: dotnet...@googlegroups.com
>
>

Gustavo Ferreira

unread,
May 28, 2009, 2:29:33 PM5/28/09
to DotNetFloripa
Não posso usar linq, estou no framework 2... se pudesse, eu estaria
bem feliz =)


O que eacontece: tenho alguns milhares de registros no banco de dados
que tenho que agrupar por "Data de pagamento", "Descrição do produto"
e "Netting". Dependendo de um parâmetro, a ordenção deve ser por "Data
de pagamento", "Netting" e "Descrição do produto".

Para montar o agrupamento, acabei utilizando uma lista. Para jogar no
grid, tenho que converter a lista para um DataTable.


Nesas várias tentativas, consigo ordenar pela data de pagamento e
produto sem problemas, mas quando tento ordenar pelo netting, é
indiferente, vem na ordem que montei o agrupamento.

On 28 maio, 15:03, Marco Santana <marcosant...@msn.com> wrote:
> Complementando. Linq pode ser usado com DataSet.
>
> http://language-integrated-query.com/Linq_to_Dataset.aspx
>
>
>
> > Date: Thu, 28 May 2009 10:45:07 -0700
> > Subject: [dotNetFloripa: 426] Re: Sort em datatable com duas colunas
> > From: gustavoferreir...@gmail.com
> _________________________________________________________________
> Invite your mail contacts to join your friends list with Windows Live Spaces. It's easy!http://spaces.live.com/spacesapi.aspx?wx_action=create&wx_url=/friend...

Bruno Campos

unread,
May 28, 2009, 2:02:50 PM5/28/09
to dotnet...@googlegroups.com
Boa tarde,

É desta maneira mesmo, ordenando o DataView.
Qual a versão do .Net você está utilizando?

Teste aqui com o seguinte caso:

DataTable table = new DataTable();
table.Columns.Add("name", typeof(string));
table.Columns.Add("price", typeof(int));
table.Columns.Add("date", typeof(DateTime));
table.Columns.Add("nada", typeof(string));
table.Rows.Add("aaa", 30, "03/01/2009", "hhh");
table.Rows.Add("bbb", 10, "07/01/2009", "yyy");
table.Rows.Add("aaa", 20, "01/01/2009", "bbb");
table.Rows.Add("ddd", 10, "03/01/2009", "nnn");
table.Rows.Add("eee", 40, "07/01/2009", "zzz");

table.DefaultView.Sort = "date, price";
table = table.DefaultView.ToTable();

Console.WriteLine("name", "price", "date", "nada");
for(int i=0; i < table.Rows.Count; i++){
Console.WriteLine(table.Rows[i]["name"] + ", " +
table.Rows[i]["price"] + ", " + table.Rows[i]["date"] + ", " +
table.Rows[i]["nada"]);
}


E deu certo.




2009/5/28 Gustavo Ferreira <gustavof...@gmail.com>:

Gustavo Ferreira

unread,
May 28, 2009, 2:42:05 PM5/28/09
to DotNetFloripa
Vamos lá pessoal, todos juntos: "AAAAH Gustavo! Que coisa feia! Que
papelão!"

Eu estava olhando pra coluna errada ¬¬

A solução do dataview funciona.



Sem comentários. Vou até encerrar o expediente mais cedo hoje.

Valeu pela força ^^

On 28 maio, 15:02, Bruno Campos <brunocam...@gmail.com> wrote:
> Boa tarde,
>
> É desta maneira mesmo, ordenando o DataView.
> Qual a versão do .Net você está utilizando?
>
> Teste aqui com o seguinte caso:
>
> DataTable table = new DataTable();
> table.Columns.Add("name", typeof(string));
> table.Columns.Add("price", typeof(int));
> table.Columns.Add("date", typeof(DateTime));
> table.Columns.Add("nada", typeof(string));
> table.Rows.Add("aaa", 30, "03/01/2009", "hhh");
> table.Rows.Add("bbb", 10, "07/01/2009", "yyy");
> table.Rows.Add("aaa", 20, "01/01/2009", "bbb");
> table.Rows.Add("ddd", 10, "03/01/2009", "nnn");
> table.Rows.Add("eee", 40, "07/01/2009", "zzz");
>
> table.DefaultView.Sort = "date, price";
> table = table.DefaultView.ToTable();
>
> Console.WriteLine("name", "price", "date", "nada");
> for(int i=0; i < table.Rows.Count; i++){
>         Console.WriteLine(table.Rows[i]["name"] + ", " +
> table.Rows[i]["price"] + ", " + table.Rows[i]["date"] + ", " +
> table.Rows[i]["nada"]);
>
> }
>
> E deu certo.
>
> 2009/5/28 Gustavo Ferreira <gustavoferreir...@gmail.com>:

André Carlucci

unread,
May 28, 2009, 2:43:24 PM5/28/09
to dotnet...@googlegroups.com
Olá Gustavo,
 
Eu tive um problema parecido há um tempo atrás (nem tinha 3.5 ainda).
Lembro que fiquei me matando tb até implementar o Sort na mão, daí funcionou.
 
Pra você fazer isso tem que extender a classe BindingList<T> e dar override nos métodos de Sort.
 
Se quiser posso dar uma procurada onde está esse código...
 
[]'s
 
André
2009/5/28 Gustavo Ferreira <gustavof...@gmail.com>

--
André Carlucci

Gustavo Ferreira

unread,
May 28, 2009, 3:08:07 PM5/28/09
to DotNetFloripa
Oi André, mais por curiosidade vc pode até postar aqui... A solução do
dataview funciona, foi só uma baita capiravada minha hehehe

On 28 maio, 15:43, André Carlucci <andrecarlu...@gmail.com> wrote:
> Olá Gustavo,
>
> Eu tive um problema parecido há um tempo atrás (nem tinha 3.5 ainda).
> Lembro que fiquei me matando tb até implementar o Sort na mão, daí
> funcionou.
>
> Pra você fazer isso tem que extender a classe BindingList<T> e dar override
> nos métodos de Sort.
>
> Se quiser posso dar uma procurada onde está esse código...
>
> []'s
>
> André
> 2009/5/28 Gustavo Ferreira <gustavoferreir...@gmail.com>

Danilo Garcia

unread,
May 29, 2009, 8:20:35 AM5/29/09
to DotNetFloripa
Bom dia pessoal,

estou com um duvida queria com vcs se vcs podem me esclarecer, ja consultei
o pai de todos (Google) e empaquei.
eu tenho que imprimir fichas de funcionarios com os dados que estao no banco
de dados SQL Server.
as fichas sao impressas com campos ja pre-definidos e eu tenho que colocar
os dados do banco de dados nesses campos.
qual seria a melhor maneira de se fazer isso..crystal reports, reporting
services ou outra ferramenta com que eu possa fazer isso?

Obrigado pela ajuda desde ja.

Att.
Danilo Garcia

André Carlucci

unread,
May 29, 2009, 9:29:08 AM5/29/09
to dotnet...@googlegroups.com
O velho e bom Word!
 
Tem um lance de mala direta lá, você pode conectar em qualquer banco e gerar as fichas através de modelos.
 
[]'s!
 
André
2009/5/29 Danilo Garcia <duo_ma...@hotmail.com>
--
André Carlucci

adriano soares

unread,
May 29, 2009, 10:46:13 AM5/29/09
to dotnet...@googlegroups.com
jesus

2009/5/29 André Carlucci <andrec...@gmail.com>

Danilo Garcia

unread,
May 29, 2009, 10:55:22 AM5/29/09
to dotnet...@googlegroups.com
eu tinha feito isso antes em php com fpdf gerava um doc de pdf no browser com os campos certos definidos com a classe fpdf e imprimia o formulario...mas pelo que li o fpdf nao funfa em asp.net...queria fazer um esquema parecido

Gilmar Rose

unread,
May 29, 2009, 12:08:16 PM5/29/09
to dotnet...@googlegroups.com
Olá

Não sou uma pessoa muito participativa no fórum por não programar tanto para p C#, estamos em estudos para migração do nosso sistema para esta linguagem.

Mas tem sim um componente que trabalha com PDF. não lembro se é iTExt ou iPDF, no nossos testes estamos trabalhanco com Script em cima do pdf mexendo com sub menus e camadas.

Segunda  Feira estarei no serviço e posso repassar esta informação mais concreta, mas se quiser pesquisar os papiros goolisticos, foi la que eu achei.

Abrx
Gilmar Correa Rose
Especialista em Automação e Computação Indústrial
CREA-SC 250006841-2
48-99525575


2009/5/29 Danilo Garcia <duo_ma...@hotmail.com>

Gustavo Ferreira

unread,
May 29, 2009, 12:09:10 PM5/29/09
to DotNetFloripa
Danilo,

A solução "ideal" acredito que seria o uso de reporting services (o
crystal tb serve, mas prefiro o reporting services). Eu só fui
desenvolvedor final, não cheguei a fazer a configuração nem a
integração com a aplicação, então nisso não posso te ajudar.

A solução "que funciona mas não é recomendada", é fazer a exportação
na mão, seja para uma planilha do excel, e talvez até word tb dê para
fazer isso.


Sobre o Reporting Services, vc tb pode usar com a versão express,
então recomendo perder um pouco de tempo para fazê-lo funcionar.

Gustavo

On 29 maio, 11:55, "Danilo Garcia" <duo_maxwel...@hotmail.com> wrote:
> eu tinha feito isso antes em php com fpdf gerava um doc de pdf no browser com os campos certos definidos com a classe fpdf e imprimia o formulario...mas pelo que li o fpdf nao funfa em asp.net...queria fazer um esquema parecido
>
> From: adriano soares
> Sent: Friday, May 29, 2009 11:46 AM
> To: dotnet...@googlegroups.com
> Subject: [dotNetFloripa: 437] Re: Ficha de Funcionarios
>
> jesus
>
> 2009/5/29 André Carlucci <andrecarlu...@gmail.com>
>
>   O velho e bom Word!
>
>   Tem um lance de mala direta lá, você pode conectar em qualquer banco e gerar as fichas através de modelos.
>
>   []'s!
>
>   André
>
>   2009/5/29 Danilo Garcia <duo_maxwel...@hotmail.com>

Danilo Garcia

unread,
May 29, 2009, 12:22:57 PM5/29/09
to dotnet...@googlegroups.com
Ok vou dar uma estudada em cima dele então

obrigado pela dica.

--------------------------------------------------
From: "Gustavo Ferreira" <gustavof...@gmail.com>
Sent: Friday, May 29, 2009 1:09 PM
To: "DotNetFloripa" <dotnet...@googlegroups.com>
Subject: [dotNetFloripa: 440] Re: Ficha de Funcionarios

José Filipe Néis

unread,
May 29, 2009, 1:30:26 PM5/29/09
to dotnet...@googlegroups.com
Danilo,

Só leva em consideração que pra utilizar o Reporting Services vais precisar
de 1 licença do SQL Server 2008, o que não é necessariamente barato.

Teus dados podem estar em outras base de dados, mas a engine do Reporting
Services precisa da licença pra rodar.

Abraços.

José Filipe
http://addwatch.wordpress.com/

-----Mensagem original-----
De: dotnet...@googlegroups.com [mailto:dotnet...@googlegroups.com]
Em nome de Danilo Garcia
Enviada em: sexta-feira, 29 de maio de 2009 13:23
Para: dotnet...@googlegroups.com
Assunto: [dotNetFloripa: 441] Re: Ficha de Funcionarios

Danilo Garcia

unread,
May 29, 2009, 1:47:23 PM5/29/09
to dotnet...@googlegroups.com
minha base de dados esta em sql 2005 o teste que estou fazendo esta rodando
sobre sql 2005 express na minha maquina.
to baixando o advanced tools pra sql 2005 express.
tb funciona certo?

--------------------------------------------------
From: "José Filipe Néis" <jfn...@hotmail.com>
Sent: Friday, May 29, 2009 2:30 PM
To: <dotnet...@googlegroups.com>
Subject: [dotNetFloripa: 442] RES: [dotNetFloripa: 441] Re: Ficha de

Rodrigo Vieira

unread,
May 29, 2009, 1:47:28 PM5/29/09
to dotnet...@googlegroups.com
Tanto o word como o excel podem ser salvos num formato XML que pode
ser uma mao na roda. Ja fiz relatorios dessa forma: primeiro criei um
relatorio-exemplo no excel, aí eu salve como xml, abri num editor e
substituí os valores-teste que eu tinha entrado com palavras-chave, ou
seja, la no meio do meu arquivo excel eu tinha algo assim

<tc>Nome: Jose da Silva</tc>

e eu substituí por

<tc>Nome: {nome_cliente}</tc>

Aí eu salvei esse novo arquivo como um template, e qdo quero gerar um
relatorio meu programa pega esse arquivo, substitui as palavras-chave
pelos valores vindo do BD, e salva uma copia.

Pode nao sei a solução mais elaborada, mas funciona bem sem a
necessidade de instalar componentes etc, é só lidar com arquivos e
strings.

- Rodrigo

2009/5/29 José Filipe Néis <jfn...@hotmail.com>:

Rodrigo Garcia

unread,
May 29, 2009, 2:31:30 PM5/29/09
to dotnet...@googlegroups.com
Forma (formula?) mais simples: XML + XSL + XSLT. Em 10 minutos vc tem os dados dos seus usuários puxados da base sql express e serializados pra XML com uma cara bonitinha que vc definiu no seu "template" com XSL. E não se engane, XSL é simples mas faz estrago!
Quer utilizar o componente de report viwer na aplicação sem utilizar o reporting services?
Se tiver mais acostumado com o Crystal, não sou mt seguidor de reports, mas parece que tem uma licença gratuita pra web (caso sua app for web), me corrijam se estiver errado.
 
[]s
 
Rodrigo Garcia

2009/5/29 Rodrigo Vieira <rodr...@gmail.com>



--
Att,

Rodrigo Garcia.

José Filipe Néis

unread,
May 29, 2009, 3:18:53 PM5/29/09
to dotnet...@googlegroups.com

Quando o Rodrigo Vieira respondeu com a solução do Excel ia citar o XSL, mas faltou tempo pra uma resposta mais completa..

 

Essa semana ainda estávamos trabalhando pra colocar um DataSet num arquivo XSL dentro de determinado padrão. No link http://www.eggheadcafe.com/articles/20050404.asp tem um bom começo, apesar de algumas limitações (só suporta um datatable por vez, por exemplo).

 

Vou postar no blog a solução que criei pra fazer mais de um DataTable por vez (uma planilha cada) nesse final de semana, mas se alguém achar que essa linha serve e quiser consumir me envia um e-mail que mando por anexo mesmo.

 

Abraços.

 

José Filipe

http://addwatch.wordpress.com/

 

Rodrigo Vieira

unread,
May 30, 2009, 12:42:18 AM5/30/09
to dotnet...@googlegroups.com
Pessoalmente eu gosto de evitar XSL e XML pq pra debugar, testar
(testes unitarios) etc é mais chato do que o bom e velho C#. Mas eu
uso em alguns lugares pq o desempenho é ultra-rapido qdo comparado com
outras formas, entao se desempenho é um fator importante, com certeza
vale a pensa considerar a possibilidade de usar XSL. Só pra contar um
"causo", a gente tinha um componente antigo que gerava exports pro
Excel usando automação do Excel no servidor, que pra exports
complicados levava 2 a 3 minutos por relatorio. Converti pra XSL e o
tempo por relatorio caiu para menos de 1 segundo. Os admins dos
servidores só faltaram me carregar nos braços qdo viram isso...rs



2009/5/29 Rodrigo Garcia <ro.g...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages