Gabriel Cabral Postado Agosto 27, 2009 Denunciar Share Postado Agosto 27, 2009 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Douglas Soares Postado Agosto 27, 2009 Denunciar Share Postado Agosto 27, 2009 Veja se isso te ajuda:http://www.comandodigital.com.br/forum/index.php?showtopic=4Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Gabriel Cabral Postado Agosto 27, 2009 Autor Denunciar Share Postado Agosto 27, 2009 Da segunda forma não deu pra fazer, pois não uso ClientDataSetDa primeira forma, deu erro também:Incompatible types: 'string' and 'Integer' Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Agosto 27, 2009 Denunciar Share Postado Agosto 27, 2009 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Gabriel Cabral Postado Agosto 28, 2009 Autor Denunciar Share Postado Agosto 28, 2009 E se eu não puder alterar o tipo no banco??como eu poderia fazer essa conversao, considerando que é uma tabela dbf :( Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Agosto 28, 2009 Denunciar Share Postado Agosto 28, 2009 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 usohttp://www.devmedia.com.br/articles/viewco...t.asp?comp=9562abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Gabriel Cabral Postado Agosto 28, 2009 Autor Denunciar Share Postado Agosto 28, 2009 Eu realmente não posso alterar o tipo do campo.E o que voce me indicou talvez não seja possível de ser feito, pois não utilizo ClientDataSet :( Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Douglas Soares Postado Agosto 28, 2009 Denunciar Share Postado Agosto 28, 2009 Você só utiliza o componente SQLQuery ?, se outro ligado a ele, expecifique!abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Gabriel Cabral Postado Agosto 28, 2009 Autor Denunciar Share Postado Agosto 28, 2009 Tem um DBGrid ligado a um DataSource, que está ligado a um TQueryAí 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 BYMas não sei como... já tentei várias maneiras, mas nada dá certo. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Douglas Soares Postado Agosto 28, 2009 Denunciar Share Postado Agosto 28, 2009 Eu não consegui ligar esses componentes juntos sem ter um ClientDataSet... posta seu código, talvez eu possa te ajuda :wacko: Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Gabriel Cabral Postado Agosto 28, 2009 Autor Denunciar Share Postado Agosto 28, 2009 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 aliasNa consulta, eu quero selecionar todas vendas em aberto, ou seja, que a data do pagamento seja nulaInformo 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Agosto 28, 2009 Denunciar Share Postado Agosto 28, 2009 Precisava converter esse campo pra int antes de dar o ORDER BYGabriel .. 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 link3 - 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ça4 - ou ficar perdendo tempo em tentar descobrir uma outra maneira de fazer isso ( o que acho dificil ) abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Gabriel Cabral Postado Setembro 1, 2009 Autor Denunciar Share Postado Setembro 1, 2009 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Douglas Soares Postado Setembro 1, 2009 Denunciar Share Postado Setembro 1, 2009 (editado) 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 Setembro 1, 2009 por Douglas_Soares Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Gabriel Cabral
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
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.