Ir para conteúdo
Fórum Script Brasil
  • 0

Converter campo para ordenar na busca


Gabriel Cabral

Pergunta

Gente..

preciso ordenar uma consulta por um campo que é String

(ORDER BY VENCLI)

só que esse campo, apesar de ser string, só armazena números...e então o 10 vem antes do 2, por exemplo...

existe alguma forma de converter o campo VENCLI em integer pra eu poder ordenar a consulta através dele??

Obrigado

Link para o comentário
Compartilhar em outros sites

13 respostass a esta questão

Posts Recomendados

  • 0
só que esse campo, apesar de ser string, só armazena números...e então o 10 vem antes do 2, por exemplo...

existe alguma forma de converter o campo VENCLI em integer pra eu poder ordenar a consulta através dele??

A maneira mais correta seria voce alterar o tipo do campo para integer no seu banco de dados ( pode alterar não perderá dado algum ) ... evitaria de ter que fazer conversão de tipos.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
E se eu não puder alterar o tipo no banco??

alterar o tipo no banco é facil ( use o database desktop ele aceita tabelas do dbase IV ) e se voce tiver o código fonte do programa melhor ainda.

Caso não seja possivel ou voce não queira alterar o tipo do campo:

Uma sugestão que voce pode adptar ao seu uso

http://www.devmedia.com.br/articles/viewco...t.asp?comp=9562

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Tem um DBGrid ligado a um DataSource, que está ligado a um TQuery

Aí faço a busca com a TQuery pra exibir o resultado no DBGrid...

Mas como o campo VENCLI é do tipo string, os números não ficam corretamente ordenados como se fossem números..

E eu não posso alterar o tipo do campo..

Precisava converter esse campo pra int antes de dar o ORDER BY

Mas não sei como... já tentei várias maneiras, mas nada dá certo.

Link para o comentário
Compartilhar em outros sites

  • 0

Então...

A propriedade DataSource do DBGrid está selecionando o datasource que estou usando...

A propriedade DataSet do DataSource está selecionando a TQuery que estou usando...

E a TQuery tem sua propriedade DatabaseName apontada para o alias

Na consulta, eu quero selecionar todas vendas em aberto, ou seja, que a data do pagamento seja nula

Informo o período e o codigo do cliente para fazer um filtro...

e escolho se quero ordenar por data ou por codigo do cliente...

neste caso, é pelo código do cliente..

// Consulta por período e código//
      if (txtAbeConsulta_DataIni.Text <> '') AND
         (txtAbeConsulta_DataFin.Text <> '') AND
         (txtAbeConsulta_CodCli.Text <> '') then
      begin
        With QueryAbeConsulta Do
        begin
          Close;
          SQL.Clear;
          SQL.Add('SELECT VENCLI, VENDAT, VENDES, VENPRE, VENQTD, ');
          SQL.Add('VENTOT, VENDPG, VENNVD, VENNUM');
          SQL.Add('FROM ESTAVD3.dbf');
          SQL.Add('WHERE VENCLI = :pCodCli AND');
          SQL.Add('VENDAT BETWEEN :pDataIni AND :pDataFin AND');
          SQL.Add('VENDPG IS NULL');
          SQL.Add('ORDER BY VENCLI');

          ParamByName('pDataIni').AsDateTime := StrToDateTime(txtAbeConsulta_DataIni.Text);
          ParamByName('pDataFin').AsDateTime := StrToDateTime(txtAbeConsulta_DataFin.Text);
          ParamByName('pCodCli').AsString := txtAbeConsulta_CodCli.Text;

          Open;

        end;
      end;

Mas aí dá aquilo de não ordenar corretamente, por causa do tipo do campo VENCLI ser string, apesar de que neste campo só existem números inteiros..

Mas não posso alterar o tipo agora.

Link para o comentário
Compartilhar em outros sites

  • 0
Precisava converter esse campo pra int antes de dar o ORDER BY

Gabriel .. as sugestões são:

1 - voce trabalha com tabela temporaria onde o campo VENCLI voce define como integer

2 - usa o componente DataSetProvider e ClientDataset para poder ordenar pelo ClientDataset como te passei no link

3 - muda o tipo do campo na sua tabela, tem um pouco de trabalho para fazer as alterações no código e evita futuras dores de cabeça

4 - ou ficar perdendo tempo em tentar descobrir uma outra maneira de fazer isso ( o que acho dificil )

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Então.... eu fiz o select dessa maneira:

('select ( CAST(VENCLI AS INTEGER) ) FROM MINHATABELA.dbf');
(ORDER BY 1);

Mas deu o seguinte erro:

'QueryAbeConsulta: Type mismatch for field 'VENCLI', expecting: String actual: Integer '

Então, eu deletei os campos que eu tinha adicionado diretamente na TQuery... aí funcionou.... consegui ordenar por cod do cliente...

Só que eu resolvi um problema, mas acabei criando outro.

Como deletei os campos da TQuery, não tem como eu definir a propriedade Currency dos campos VENPRE e VENTOT, como eu preciso que apareçam no DBGrid...

Tentei então colocar CAST(VENPRE AS CURRENCY) no select, mas não deu certo...

Existe alguma forma de deixar esses campos como currency no DBGrid, sem adicioná-los diretamente na TQuery ???

Muito obrigado

Link para o comentário
Compartilhar em outros sites

  • 0

Faz o seguinte, se seu campo VENCLI só armazena numeros, você abre o banco, altera o tipo do campo para string, não se preocupe não perderá dados! após isso delete todos os campos da query e do Clientdataset se tiver um, depois salve desconecte do banco no delphi, conecte dinovo e importe os fields! altere suas configurações e teste!

ou volte como era antes e modifique o seu código assim:

// Consulta por período e código//
      if (txtAbeConsulta_DataIni.Text <> '') AND
         (txtAbeConsulta_DataFin.Text <> '') AND
         (txtAbeConsulta_CodCli.Text <> '') then
      begin
        With QueryAbeConsulta Do
        begin
          Close;
          SQL.Clear;
          SQL.Add('SELECT VENCLI, VENDAT, VENDES, VENPRE, VENQTD, ');
          SQL.Add('VENTOT, VENDPG, VENNVD, VENNUM');
          SQL.Add('FROM ESTAVD3.dbf');
          SQL.Add('WHERE VENCLI = :pCodCli AND');
          SQL.Add('VENDAT BETWEEN :pDataIni AND :pDataFin AND');
          SQL.Add('VENDPG IS NULL');
          SQL.Add('ORDER BY ' + IntToStr('VENCLI'));

          ParamByName('pDataIni').AsDateTime := StrToDateTime(txtAbeConsulta_DataIni.Text);
          ParamByName('pDataFin').AsDateTime := StrToDateTime(txtAbeConsulta_DataFin.Text);
          ParamByName('pCodCli').AsString := txtAbeConsulta_CodCli.Text;

          Open;

        end;
      end;

Abraços

Editado por Douglas_Soares
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...