Fórum Problemas com order by e campo varchar com numeros? #327049
08/08/2006
0
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
Curtir tópico
+ 0Posts
08/08/2006
Night_man
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
08/08/2006
Jlimajr
Sim gostaria desta forma que tu citou. (Se for possível)
Aqui naum entendi, porque naum posso ter um campo varchar com numeros?
Gostei + 0
08/08/2006
Jlimajr
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
08/08/2006
George_piaulino
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
08/08/2006
Jlimajr
001
002
003
...
010
011
Ficou bom assim, e tambem uso o Firebird.
Mesmo assim valeu
Gostei + 0
09/08/2006
Night_man
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
09/08/2006
Marco Salles
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
10/08/2006
Beppe
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
11/08/2006
Marco Salles
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]
Gostei + 0
18/09/2006
Beppe
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]
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
Clique aqui para fazer login e interagir na Comunidade :)