Fórum Problemas com order by e campo varchar com numeros? #327049

08/08/2006

0

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

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

Jlimajr

Responder

Posts

08/08/2006

Night_man

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?


Responder

Gostei + 0

08/08/2006

Jlimajr

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?


Responder

Gostei + 0

08/08/2006

Jlimajr

Da descobri, preciso ordernar colocando zero a esquerda

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.


Responder

Gostei + 0

08/08/2006

George_piaulino

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


Responder

Gostei + 0

08/08/2006

Jlimajr

Ja consegui piaulino, coloquei zero a esquerda assim

001
002
003
...
010
011

Ficou bom assim, e tambem uso o Firebird.

Mesmo assim valeu


Responder

Gostei + 0

09/08/2006

Night_man

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....


Responder

Gostei + 0

09/08/2006

Marco Salles

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..


Responder

Gostei + 0

10/08/2006

Beppe

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.


Responder

Gostei + 0

11/08/2006

Marco Salles

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



Responder

Gostei + 0

18/09/2006

Beppe

[quote:03d7649ada=´Marco Salles´]
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)


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar