Jump to content


Photo

Informar Ao Sistema Que X Milhao é Maior Que Y Mil


  • Faça o login para participar
6 replies to this topic

#1 Nicholas Pufal

Nicholas Pufal

    Impossível: só existe até alguém duvidar e provar o contrário.

  • Usuários
  • 1655 posts
  • Sexo:Masculino
  • Localidade:Porto Alegre

Posted 21/11/2007, 11:56

Em função das necessidades de um sistema, acabei criando um problema.

Como o sistema agora usa VARCHAR no campo da grana (para que assim possa ser inserido "Sem valor" também), estou com uma dor de cabeça tremenda na hora de pesquisar valores acima de 1 milhão.

Ocorre o seguinte:

Como o campo é varchar, para o sistema agora 1.000.000,00 é menor que 700.000,00 por exemplo.
Na minha instrução SQL tenho:

Select * from blalblala Where preco BETWEEN <menorvalor> AND <maiorvalor>

Se o usuario seleciona "Acima de 1 milhão", o sistema pensa assim:

Select * from blalblala Where preco BETWEEN '1.000.000,00' AND '999.999.999,00'

E me retorna produtos cujo valor é 670 mil, 300 mil... enfim, produtos com valores inferiores à 1 milhão... Tudo isso pelo meu campo de valores ser varchar...

Alguma gambiarra pra arrumar isso?

Não posso mudar o formato do campo.
BLOG Touché Criação - Vamos trocar idéias? -> http://blog.touchecriacao.com.br/
// Links úteis: Busca || Regras
// Não respondo dúvidas via mensagem privada. Use o fórum para buscar ou perguntar.

#2 Marco Antonio Rocha

Marco Antonio Rocha

    Novato no fórum

  • Usuários
  • 15 posts
  • Sexo:Masculino
  • Localidade:São Carlos/SP

Posted 21/11/2007, 13:18

Que banco de dados você está utilizando? A idéia seria você converter o campo preco para um valor numérico antes de fazer o between.

#3 Nicholas Pufal

Nicholas Pufal

    Impossível: só existe até alguém duvidar e provar o contrário.

  • Usuários
  • 1655 posts
  • Sexo:Masculino
  • Localidade:Porto Alegre

Posted 21/11/2007, 13:46

Já tentei... Meu banco é o mySQL.

Até te pergunto: uma vez que o campo no DB é do tipo Varchar, adiantaria converter na consulta SQL essas strings para número? Não sei se o "Between" seria interpretado daí... Caso sim, ótimo.

Já tentei fazer isso, mas com CInt, aí retornava erro de Overflow (visto que tenho "." e ",").

Como posso fazer então dessa forma que vc falou? Alguma pista?
BLOG Touché Criação - Vamos trocar idéias? -> http://blog.touchecriacao.com.br/
// Links úteis: Busca || Regras
// Não respondo dúvidas via mensagem privada. Use o fórum para buscar ou perguntar.

#4 Marco Antonio Rocha

Marco Antonio Rocha

    Novato no fórum

  • Usuários
  • 15 posts
  • Sexo:Masculino
  • Localidade:São Carlos/SP

Posted 21/11/2007, 14:05

Não testei aqui (estou sem MySQL hoje), mas acho que a idéia é a seguinte:

SELECT * FROM <span style='color:orange'><Tabela>
WHERE LOWER(preco) NOT LIKE '%[a-z]%' AND CONVERT(REPLACE(REPLACE(preco, '.', ''), ',', '.'), INTEGER) BETWEEN <menor_valor> AND <maior_valor>

Na primeira condição você exclui os valores não numéricos...
Na segunda, você remove os pontos, substitui as vírgulas por pontos e converte pra inteiro, pra daí fazer o between.

#5 Nicholas Pufal

Nicholas Pufal

    Impossível: só existe até alguém duvidar e provar o contrário.

  • Usuários
  • 1655 posts
  • Sexo:Masculino
  • Localidade:Porto Alegre

Posted 22/11/2007, 09:38

Tentei dessa forma mas me retorno o erro:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INTEGER) BETWEEN 0 AND 100000.00' at line 1

Meu SQL está assim:

Select * from empreendimentos where LOWER(preco) NOT LIKE '%[a-z]%' AND Convert(Replace(Replace(preco,'.',''),',','.'),INTEGER) BETWEEN 0 AND 100000.00

Tentei direto no meu mySQL e não rolou, deu esse mesmo erro que tentando dentro do código ASP.

Ah outro detalhe: esse NOT LIKE [a-z] não tá funcionando como deveria, testei somente ele e ele não apagou da consulta um registro que tinha "Consulte" no campo valor.

EDIT: Fiz outro teste.

SELECT REPLACE(REPLACE(preco, '.', ''), ',', '.') as preco FROM `empreendimentos` Where preco between 0 AND 100000.00

Isso direto no mySQL, mas ainda assim, não funcionou. Não deu erro desta vez, mas exibiu todos os registros... Além do que, percebi que se mesmo desta forma desse certo, ia ser complicado pra mim na parte do ASP, visto que da forma que desenvolvi até aqui as minhas gambiarras, só posso alterar o que vem depois do WHERE, não o que vem antes. Complicado!

Edição feita por: Firehalk, 22/11/2007, 11:31.

BLOG Touché Criação - Vamos trocar idéias? -> http://blog.touchecriacao.com.br/
// Links úteis: Busca || Regras
// Não respondo dúvidas via mensagem privada. Use o fórum para buscar ou perguntar.

#6 Marco Antonio Rocha

Marco Antonio Rocha

    Novato no fórum

  • Usuários
  • 15 posts
  • Sexo:Masculino
  • Localidade:São Carlos/SP

Posted 22/11/2007, 14:06

Cara, agora eu consegui testar no MySQL

SELECT 
  preco,
FROM `teste` WHERE SUBSTRING(preco, 1, 1) BETWEEN '0' AND '9'

Essa minha consulta retorna somente valores que comecem com um número entre 0 e 9. Talvez te ajude.
As outas consultas que enviei, apesar de ter encontrado num fórum de MySQL, não sei o motivo ainda, não funcionam. Mal ae...

#7 Nicholas Pufal

Nicholas Pufal

    Impossível: só existe até alguém duvidar e provar o contrário.

  • Usuários
  • 1655 posts
  • Sexo:Masculino
  • Localidade:Porto Alegre

Posted 22/11/2007, 15:07

Valeu pelo apoio.

Eu testei de tudo que eu encontrava e não rolava... Preferi então radicalizar. Alterei o campo "preco" para DECIMAL e quando não quero que tenha um valor, simplesmente deixo em branco (já que o valor padrão é 0). Com isso, no ASP eu puxo os dados e uso o FormatCurrency para transformar em moeda. Com um InStr eu checo se existe "." ou não. Caso não existir é porque tá zerado e retorna na tela o valor "Consulte".

E quanto à busca agora ficou barbada.

Acabei usando só um:

Where preco <> 0 AND preco between <menorvalor> AND <maiorvalor>

Fiquei pensando no futuro, e caso não usar como Decimal ou Inteiro ia me complicar mesmo.

Mas valeu o apoio, não sabia que eu podia usar tantos argumentos com SQL.

Abraços!
BLOG Touché Criação - Vamos trocar idéias? -> http://blog.touchecriacao.com.br/
// Links úteis: Busca || Regras
// Não respondo dúvidas via mensagem privada. Use o fórum para buscar ou perguntar.




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq