Ordenar registros - complicado

Delphi

16/10/2006

Pessoal, Bom dia!!!

Estou com o problema e gostaria muito da ajuda de vocês.

Tenho um select que me retorna 3 campos: código( integer ), artigo( string ) e título( string ).

o select está da seguinte forma:

[color=red:2dfd1440b6]
select codigo, artigo, titulo
from acervo
order by titulo
[/color:2dfd1440b6]

Este select me retorna o seguinte resultado:

codigo    artigo  titulo 
26          NULL   Case Problems in finance
3           NULL   Contabilidade gerencial
19          NULL   Contabilidade industrial
34          O      controle de qualidade na industria paulista
44          NULL   Economia das empresas
49          NULL   Estruturacao das escolas e institutos de administracao
1           Uma    experiência de instrução programada em orcamento e administracao financeira
13          NULL   Gerencia de Materiais
40          NULL   Gerencia por objetivos
17          NULL   Historia administrativa do Brasil
.
.
.


Vejam que a ordenação está de acordo com o titulo.

Eu gostaria que ordenasce respeitando a o conteudo dos dois campos ( artigo e titulo ), pra ficar desse jeito, ou seja, respeitando as letras do artigo e do titulo:

codigo    artigo  titulo 
26          NULL   Case Problems in finance
3           NULL   Contabilidade gerencial
19          NULL   Contabilidade industrial
44          NULL   Economia das empresas
49          NULL   Estruturacao das escolas e institutos de administracao
administracao financeira
13          NULL   Gerencia de Materiais
40          NULL   Gerencia por objetivos
17          NULL   Historia administrativa do Brasil
34          O      controle de qualidade na industria paulista
1           Uma    experiência de instrução programada em orcamento e 
.
.
.


Acho que não tem como fazer isso com um select, mas pelo delphi sim.

Alguém tem alguma dica? Será que tem como eu jogar isso em um array e a partir daí ordenar da forma que eu preciso?

Desde já, agradeço-lhes...


Cristianojedi

Cristianojedi

Curtidas 0

Respostas

Ricardo_ascii

Ricardo_ascii

16/10/2006

Pessoal, Bom dia!!! Estou com o problema e gostaria muito da ajuda de vocês. Tenho um select que me retorna 3 campos: código( integer ), artigo( string ) e título( string ). o select está da seguinte forma: [color=red:99b1e18b4b]
select codigo, artigo, titulo
from acervo
order by titulo
[/color:99b1e18b4b] Este select me retorna o seguinte resultado: Coloque no order by assim: order by titulo, artigo ou order by artigo, titulo
codigo    artigo  titulo 
26          NULL   Case Problems in finance
3           NULL   Contabilidade gerencial
19          NULL   Contabilidade industrial
34          O      controle de qualidade na industria paulista
44          NULL   Economia das empresas
49          NULL   Estruturacao das escolas e institutos de administracao
1           Uma    experiência de instrução programada em orcamento e administracao financeira
13          NULL   Gerencia de Materiais
40          NULL   Gerencia por objetivos
17          NULL   Historia administrativa do Brasil
.
.
.
Vejam que a ordenação está de acordo com o titulo. Eu gostaria que ordenasce respeitando a o conteudo dos dois campos ( artigo e titulo ), pra ficar desse jeito, ou seja, respeitando as letras do artigo e do titulo:
codigo    artigo  titulo 
26          NULL   Case Problems in finance
3           NULL   Contabilidade gerencial
19          NULL   Contabilidade industrial
44          NULL   Economia das empresas
49          NULL   Estruturacao das escolas e institutos de administracao
administracao financeira
13          NULL   Gerencia de Materiais
40          NULL   Gerencia por objetivos
17          NULL   Historia administrativa do Brasil
34          O      controle de qualidade na industria paulista
1           Uma    experiência de instrução programada em orcamento e 
.
.
.
Acho que não tem como fazer isso com um select, mas pelo delphi sim. Alguém tem alguma dica? Será que tem como eu jogar isso em um array e a partir daí ordenar da forma que eu preciso? Desde já, agradeço-lhes...



GOSTEI 0
Ricardo_ascii

Ricardo_ascii

16/10/2006

Se eu entendi direito coloque assim no order by

order by titulo, artigo ou order by artigo, titulo


GOSTEI 0
Cristianojedi

Cristianojedi

16/10/2006

Bom, não é isso que eu quero ricardo_ascii...

Vou tentar ser mais claro.

Tenho uma tabela com os campos codigo, artigo e titulo. Se eu fizer um select assim: select codigo, artigo, titulo from acervo order by titulo - o resultado será este:

codigo     artigo     titulo
3             Um        Amor de verdade
1             NULL      Caça Fantasmas
4             A           Casa
2             O           Tesouro
5             NULL      Vingança


O resultado desde select, vai exibir da seguinte forma no meu relatório abaixo. Lembrando que o campo artigo e titulo são concatenados.

codigo     titulo
3             Um Amor de verdade
1             Caça Fantasmas
4             A Casa
2             O Tesouro
5             Vingança


Só que eu quero que o relatório exiba os dados da seguinte forma abaixo no meu relatório:

codigo     titulo
4             A Casa
1             Caça Fantasmas
2             O Tesouro
3             Um Amor de verdade
5             Vingança

Deu pra pegar? A ordenação que eu quero fazer compara qual é a letra do campo artigo e do campo titulo. Conforme for, vai ordenando


GOSTEI 0
Macario

Macario

16/10/2006

Ola.

O colega [b:c05283ab78]ricardo_ascii[/b:c05283ab78] indicou corretamente a forma de ordenacao.

Exemplo:
Order By Artigo, Titulo.


O que pode estar ocorrendo e a forma no qual voce ordena via Delphi.

Que deve obdecer a mesma do select.


Exemplo:
ClientDataSet.IndexFieldNames := ´Artigo;Titulo´;



Espero que lhe ajude;


8) [/b]


GOSTEI 0
Ricardo_ascii

Ricardo_ascii

16/10/2006

Uma outra opção seria vc. pode fazer o filtro dos registros e jogar para uma tabela temporária ja concatenados. Muda o indice da tabela temporária para esse campo concatenado e adiciona no essa tabela no relatório que irá imprimir.


Ricardo


GOSTEI 0
Cristianojedi

Cristianojedi

16/10/2006

Eu sei que se eu colocar no order by artigo, titulo, o select vai ordenar primeiro pegando os valores do campo artigo e depois do campo titulo, correto?

Mas não é isto que eu quero!!!

Se eu tenho um registro com o campo artigo = Uma e o titulo = Casa e um outro registro com o campo artigo = NULL e o campo titulo = Maquinas, se eu colocar ORDER ARTIGO, TITULO, vai me retornar o seguinte:

Uma Casa
Maquinas

Mas eu quero que ele me retorne:

Maquinas
Uma Casa

Pois ´M´ de Máquinas é menor que ´U´ de Uma.

Agora deu pra sacar?

Abraços!!!


GOSTEI 0
Ricardo_ascii

Ricardo_ascii

16/10/2006

Eu sei que se eu colocar no order by artigo, titulo, o select vai ordenar primeiro pegando os valores do campo artigo e depois do campo titulo, correto? Mas não é isto que eu quero!!! Se eu tenho um registro com o campo artigo = Uma e o titulo = Casa e um outro registro com o campo artigo = NULL e o campo titulo = Maquinas, se eu colocar ORDER ARTIGO, TITULO, vai me retornar o seguinte: Uma Casa Maquinas Mas eu quero que ele me retorne: Maquinas Uma Casa Pois ´M´ de Máquinas é menor que ´U´ de Uma. Agora deu pra sacar? Abraços!!!


Vc. viu o que eu postei sobre a tabela temporária?


GOSTEI 0
Macario

Macario

16/10/2006

Ola.

Vamo tentar o seguinte.


select isNull(Arqtigo,´ ´), titulo from tabela
order by artigo, titulo


Inclua um espaco ou simplesmente ´´(branco) quando o campo for NULL, pois assim a ordenacao tem que ficar da forma que voce precisa.


GOSTEI 0
Cristianojedi

Cristianojedi

16/10/2006

Colega,

Desculpe-me mas eu não tinha visto esta solução que você tinha postado. Mas não teria como fazer isto sem eu precisar de criar tabela temporária, não?

Obrigado pela solução!!!

Cristiano


GOSTEI 0
Cristianojedi

Cristianojedi

16/10/2006

Macario,

select codigo, isnull(artigo,´´), titulo
from acervo
order by artigo, titulo


Desta forma não deu certo!!! Ele gerou o seguinte resultado:

codigo           titulo                                                                                                                                                                                                                                                     

15               Administracao industrial e geral
16               Administração industrial e geral
42               Administracao por sistemas
37               Introdução a administração
33               Introducao a administracao financeira
8                Organizacao do trabalho
14               Origens e aplicacoes de recursos e economia financeira
12               Pratica de analise economico-financeira das empresas
22               Processo decisorio
46               Retorno do investimento
28               Streamlining
11               Teoria geral de administracao
20          A    justica administrativa na Franca
5           A    justica administrativa no Brasil
34          O    controle de qualidade na industria paulista
31          O    processo de producao
23          O    supermanager
1           Uma  experiência de instrução programada em orcamento e administracao financeira


Obrigado pela dica.


GOSTEI 0
Macario

Macario

16/10/2006

Ola.

Acho que entao a concatenacao deve ser ja no select, mas isso nao sei como ficaria.


GOSTEI 0
Cristianojedi

Cristianojedi

16/10/2006

De qualquer forma, obrigado!!!

Acho que vou ter que usar tabela temporária mesmo, o que eu não queria, como o outro colega falou em uma das respostas acima.

Flw!!!

Cristiano


GOSTEI 0
Ricardo_ascii

Ricardo_ascii

16/10/2006

Pelo que eu sei o select permite criar campo virtual somente em operações matemáticas para obter o resultado de alguma operação. Agora no caso de junção de duas strings eu desconheço.

No seu caso eu faria uma dessas alternativas:

a:) Criar uma tabela temporária e nessa tabela jogaria concatenado o campo artigo + titulo.


B) Se realmente vc. deseja fazer esse relatório por sql(select) eu faria o seguinte.
Criaria + um campo na tabela acervo. Meu arquivo ficaria assim: codigo, adjetivo, titulo e adjetivo_titulo. No evento before post do table(acervo) eu coloco a seguinte instrução: adjetivo_titulo:=adjetivo+´ ´+titulo

Aí sim vc. pode fazer o sql sem problemas. Seleciona os campos e coloca order by adjetivo_titulo

Ricardo


GOSTEI 0
Cristianojedi

Cristianojedi

16/10/2006

Muito obrigado pelas dicas, Ricardo.


Cristiano


GOSTEI 0
Ricardo_ascii

Ricardo_ascii

16/10/2006

Corrigindo,

troque o que eu disse de adjetivo por artigo...rss(desculpe)

Abraço, Ricardo


GOSTEI 0
Cabreu.jr

Cabreu.jr

16/10/2006

Ai parceiro essa é mole: é só passar o orde by pelo indice do campo

Ex: Se o campo for o primeiro do select basta dar ORDER BY 1 se for o segundo ORDER BY 2 e assim por diante


GOSTEI 0
POSTAR