Problemas com order by e campo varchar com numeros?
Boa tarde amigos Delphianos, tenho um campo feito em varchar
Campo
cta_reduz - varchar (10)
Só que ele recebe numeros, mais naum consigo ordernar certo usando o order by
fica assim
1
10
11
12
12
2
3
4
5
6
7
8
9
O codigo é esse
Explicando o codigo ele serve para um ComboBox receber os dados cadastrados referente a este campo [b:a027ef1d63]cta_reduz[/b:a027ef1d63].
Gradecido a ajuda de todos.
Campo
cta_reduz - varchar (10)
Só que ele recebe numeros, mais naum consigo ordernar certo usando o order by
fica assim
1
10
11
12
12
2
3
4
5
6
7
8
9
O codigo é esse
procedure TFSoma.FormShow(Sender: TObject); var c: string; begin with dm.qtbplano do begin close; sql.clear; combobox2.Clear; sql.add(´select distinct * from planocontas order by cta_reduz´); sql.add(c); Open; while dm.qtbplano.Eof = false do begin combobox2.items.add(dm.qtbplano.fieldbyname(´cta_reduz´).AsString); dm.qtbplano.next; end; dm.qtbplano.close; end; end;
Explicando o codigo ele serve para um ComboBox receber os dados cadastrados referente a este campo [b:a027ef1d63]cta_reduz[/b:a027ef1d63].
Gradecido a ajuda de todos.
Jlimajr
Curtidas 0
Respostas
Night_man
08/08/2006
ele esta ordenado certo... certo como um varchar
tu gostaria de ordenar 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
tu nao pode ter o campo como numero?
tu gostaria de ordenar 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
tu nao pode ter o campo como numero?
GOSTEI 0
Jlimajr
08/08/2006
tu gostaria de ordenar 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
Sim gostaria desta forma que tu citou. (Se for possível)
tu nao pode ter o campo como numero?
Aqui naum entendi, porque naum posso ter um campo varchar com numeros?
GOSTEI 0
Jlimajr
08/08/2006
Da descobri, preciso ordernar colocando zero a esquerda
Tai pra quem precisar desta função
Função para Zero a esquerda String.
chamando a função dentro do combobox
[b:643f217da4]Para ordenar o combobox use a propriedade Sorted = True[/b:643f217da4]
Se alguem um dia precisar tai.
Tai pra quem precisar desta função
Função para Zero a esquerda String.
function StrZero(N, L: Integer): String; var iContador: Integer; sTemp: String; begin Result := ´´; sTemp := IntToStr(N); for iContador := 1 to L - Length(sTemp) do Result := Result + ´0´; Result := Result + sTemp; end;
chamando a função dentro do combobox
procedure TFSoma.FormShow(Sender: TObject); var c: string; begin with dm.qtbplano do begin close; sql.clear; combobox2.Clear; sql.add(´select distinct * from planocontas´); sql.add(c); Open; while dm.qtbplano.Eof = false do begin combobox2.items.add( StrZero( StrToInt( dm.qtbplano.fieldbyname(´cta_reduz´).AsString), 3 ) ); dm.qtbplano.next; end; dm.qtbplano.close; end; end;
[b:643f217da4]Para ordenar o combobox use a propriedade Sorted = True[/b:643f217da4]
Se alguem um dia precisar tai.
GOSTEI 0
George_piaulino
08/08/2006
Bom amigo, SE FOR SQL SERVER TENTE ESTE tente este..
select CONVERT(INTEGER,CAMPO) from TABELA WHERE ISNUMERIC(EQP_GER) > 0
order by CONVERT(INTEGER,CAMPO)
(coloquei a clausula where para filtar somente numericos)
OU ESTE
SELECT replicate(´0´,COL_LENGTH(´TABELA´,´CAMPO´))+rtrim(CAMPO) from TABELA ORDER BY replicate(´0´,COL_LENGTH(´TABELA´,´CAMPO´))+rtrim(CAMPO)
Caso seja outro banco tente achar as funções correspondentes ao SQL SERVER
Abraços
select CONVERT(INTEGER,CAMPO) from TABELA WHERE ISNUMERIC(EQP_GER) > 0
order by CONVERT(INTEGER,CAMPO)
(coloquei a clausula where para filtar somente numericos)
OU ESTE
SELECT replicate(´0´,COL_LENGTH(´TABELA´,´CAMPO´))+rtrim(CAMPO) from TABELA ORDER BY replicate(´0´,COL_LENGTH(´TABELA´,´CAMPO´))+rtrim(CAMPO)
Caso seja outro banco tente achar as funções correspondentes ao SQL SERVER
Abraços
GOSTEI 0
Jlimajr
08/08/2006
Ja consegui piaulino, coloquei zero a esquerda assim
001
002
003
...
010
011
Ficou bom assim, e tambem uso o Firebird.
Mesmo assim valeu
001
002
003
...
010
011
Ficou bom assim, e tambem uso o Firebird.
Mesmo assim valeu
GOSTEI 0
Night_man
08/08/2006
cara despculpa a demora
eu quis te dizer q trazer o consulta soh ordenada como 1, 2, 3, 4, 5, 6 pq ano eh uma coisa muito facil, nao tem como mudar em todos os bancos e tal
se fosse soh num TStrings eh mais facil, se para ti serviu colocar os ´0´ a esquerda, blz.
senao tu poderia fazer a ordenacao manualmente depois atraves de alguma metodo de sort, convertendo o ´2´(string) para 2(numero) e o ´10´(string) para o 10(numero) e a comparacao entre eles ia das q 2 < 10...
mas blz....
eu quis te dizer q trazer o consulta soh ordenada como 1, 2, 3, 4, 5, 6 pq ano eh uma coisa muito facil, nao tem como mudar em todos os bancos e tal
se fosse soh num TStrings eh mais facil, se para ti serviu colocar os ´0´ a esquerda, blz.
senao tu poderia fazer a ordenacao manualmente depois atraves de alguma metodo de sort, convertendo o ´2´(string) para 2(numero) e o ´10´(string) para o 10(numero) e a comparacao entre eles ia das q 2 < 10...
mas blz....
GOSTEI 0
Marco Salles
08/08/2006
Aqui naum entendi, porque naum posso ter um campo varchar com numeros?
porque mesmo que visualmente voce veja numeros na verdade não são..
Voce acha que é mas não é.. Parece Denorex < Piada para os mais antigos>
no meu entendimento ja que este campo recebera numeros então ele deve ser numerico
Se voce em algum momento da sua aplicação precisar do valor Text desse campo e não querer fazer nenhum tipo de conversão (inttoStr) , basta usar a propriedade AsString dos Tfield
Se voce quiser apresentar esses Numeros com tres digitos , basta usar a propriedade DispalyFormat dos Tfields
Concluindo...Eu não o pq de não usar numeros
So uma observação... consultas OrDer By em campos alfanumerico depende do tipo de Banco e da lingua utilizada..
GOSTEI 0
Beppe
08/08/2006
Só que ele recebe numeros, mais naum consigo ordernar certo usando o order by
Vi que vc jah achou uma solução, mas teve que mudar os requisitos né?
Para a proxima, use cast, como em select * from tabela order by cast(campo as integer)
O Marco Salles levantou uma boa questão, se definiu como string apenas para usar códigos reduzidos, pode usar int e definir o campo como nulável.
GOSTEI 0
Marco Salles
08/08/2006
Para a proxima, use cast, como em select * from tabela order by cast(campo as integer)
estranho beep.... Fiz teste com vários selects
[b:5ce27b3fc0]1)Sua indicação [/b:5ce27b3fc0]:
select * from tabela order by cast(campo as integer)
[color=darkred:5ce27b3fc0]Resultado:Não Ordenou [/color:5ce27b3fc0]
[b:5ce27b3fc0]2)[/b:5ce27b3fc0]
´select cta_reduz,Cast(cta_reduz as integer) as campo from planocontas Order By Campo´;
[color=darkred:5ce27b3fc0]Resultado:Erro na Hora de Execução[/color:5ce27b3fc0]
[b:5ce27b3fc0]3)[/b:5ce27b3fc0]
´select cta_reduz,Cast(cta_reduz as integer) from planocontas Order By Cast(cta_reduz as integer)´;
[color=darkred:5ce27b3fc0]Resultado:Funciona numa boa...So tirei o As Campo[/color:5ce27b3fc0]
[b:5ce27b3fc0]4)[/b:5ce27b3fc0]
´select cta_reduz,Cast(cta_reduz as integer) as campo from planocontas Order By Cast(cta_reduz as integer)´;
[color=darkred:5ce27b3fc0]Resultado:Não ordenou.. Engraçado que este ultimo em relação ao terceiro era so para dar um nome mais amigavel para a coluna[/color:5ce27b3fc0]
Tem idéia pq que sua indicação do Beppe , aparentemente comigo aqui não funcionou e com dar un nome mais amigavel para a coluna para não ter que fazer Cast(cta_reduz as integer) duas vezes na istrução
GOSTEI 0
Beppe
08/08/2006
[quote:03d7649ada=´Marco Salles´]
estranho beep.... Fiz teste com vários selects
[b:03d7649ada]1)Sua indicação [/b:03d7649ada]:
[color=darkred:03d7649ada]Resultado:Não Ordenou [/color:03d7649ada]
[b:03d7649ada]2)[/b:03d7649ada]
[color=darkred:03d7649ada]Resultado:Erro na Hora de Execução[/color:03d7649ada]
[b:03d7649ada]3)[/b:03d7649ada]
[color=darkred:03d7649ada]Resultado:Funciona numa boa...So tirei o As Campo[/color:03d7649ada]
[b:03d7649ada]4)[/b:03d7649ada]
[color=darkred:03d7649ada]Resultado:Não ordenou.. Engraçado que este ultimo em relação ao terceiro era so para dar um nome mais amigavel para a coluna[/color:03d7649ada]
Paradox não aceita nomes ´amigáveis´ no group by ou order by. Alguns SGDB´s aceitam, ou então o índice do campo na lista do select(iniciando por 1)
Para a proxima, use cast, como em select * from tabela order by cast(campo as integer)
estranho beep.... Fiz teste com vários selects
[b:03d7649ada]1)Sua indicação [/b:03d7649ada]:
select * from tabela order by cast(campo as integer)
[color=darkred:03d7649ada]Resultado:Não Ordenou [/color:03d7649ada]
[b:03d7649ada]2)[/b:03d7649ada]
´select cta_reduz,Cast(cta_reduz as integer) as campo from planocontas Order By Campo´;
[color=darkred:03d7649ada]Resultado:Erro na Hora de Execução[/color:03d7649ada]
[b:03d7649ada]3)[/b:03d7649ada]
´select cta_reduz,Cast(cta_reduz as integer) from planocontas Order By Cast(cta_reduz as integer)´;
[color=darkred:03d7649ada]Resultado:Funciona numa boa...So tirei o As Campo[/color:03d7649ada]
[b:03d7649ada]4)[/b:03d7649ada]
´select cta_reduz,Cast(cta_reduz as integer) as campo from planocontas Order By Cast(cta_reduz as integer)´;
[color=darkred:03d7649ada]Resultado:Não ordenou.. Engraçado que este ultimo em relação ao terceiro era so para dar um nome mais amigavel para a coluna[/color:03d7649ada]
Tem idéia pq que sua indicação do Beppe , aparentemente comigo aqui não funcionou e com dar un nome mais amigavel para a coluna para não ter que fazer Cast(cta_reduz as integer) duas vezes na istrução
[/quote:03d7649ada]Paradox não aceita nomes ´amigáveis´ no group by ou order by. Alguns SGDB´s aceitam, ou então o índice do campo na lista do select(iniciando por 1)
GOSTEI 0