PLANO DE CONTAS - ORDER BY CONTA

Caros criei um consulta para o cadastro de plano de contas e ao ordena por código da conta o mesmo não está trazendo o resultado que gostaria, que seria pelo nível da conta contábil. alguém já se deparou com esse problema, abaixo o resultado da consulta e o resultado desejado. Desde já agradeço.

Resultado consulta order by Código
Código Tipo Descrição
1 S ATIVO
11 S ATIVO CIRCULANTE
111 S DISPONÍVEL
11.101 S CAIXA
11.102 S BANCOS
11.101.001 A CAIXA GERAL
11.102.001 A BANCO ITAU
2 S PASSIVO
21 S PASSIVO CIRCULANTE

Consulta desejada

Código Tipo Descrição
1 S ATIVO
11 S ATIVO CIRCULANTE
111 S DISPONÍVEL
11.101 S CAIXA
11.101.001 A CAIXA GERAL
11.102 S BANCOS
11.102.001 A BANCO ITAU
2 S PASSIVO
21 S PASSIVO CIRCULANTE

Você tem que ter 2 campos, esse do Código Visível, e mais um campo interno que sempre vai ficar escondido mais vai ser usado nas ordenações.

Campo Interno = CHAR(20) Ou o número de caracteres máximo do seu plano de contas.

Ai preparar este campo na hora que gravar as contas assim:
{CampoIntermo}=str_pad(str_replace(’.’, ‘’, {CodigoVisivel}), 20, ‘0’, STR_PAD_RIGHT);

Depois sempre que for fazer as consultas ordenar pelo CodigoInterno e mostrar o Código Visível da conta para o usuário.

Se não der certo a opção do Jailton, e tiver que aplicar diretamente no sql faça um

ORDER BY
LEFT(CT1_CONTA,1),LEFT(CT1_CONTA,2),LEFT(CT1_CONTA,3),LEFT(CT1_CONTA,5),CT1_CONTA

para trazer em ordem vc deve ter uma modelagem adequada e durante a inserção das contas você deve ir atualizando um sequencial.

o sequencial é fundamental para ordenar adequadamente a conta.

Obrigado a todos, irei alterar a estrutura da tabela e testar.

Resolvido. Obrigado a todos pela dica.

Informe como resolveu, para que sirva a outros com a mesma dúvida.

Resolvi da seguinte forma abaixo conforme primeira resposta.

Campo Interno = CHAR(20) Ou o número de caracteres máximo do seu plano de contas.

Ai preparar este campo na hora que gravar as contas assim:
{CampoIntermo}=str_pad(str_replace(’.’, ‘’, {CodigoVisivel}), 20, ‘0’, STR_PAD_RIGHT);