SELECT
Boa tarde amigo.
é o seguinte tenho um banco mysql onde guarda as informacoes e preciso fazer um select para me retorna no listview todos os documentos que possuem o mesmo valor sendo que o campo é float entao o que estou fazendo:
o select é esse
[Ô]SELECT * From DADOSNFEESPIONADAS [Ô] & _
[Ô]where DATAEMISSAO between [ô][Ô] & Format(TxtDataInicio, [Ô]yyyy-mm-dd[Ô]) & [Ô][ô] [Ô] & _
[Ô]and [ô][Ô] & Format(TxtDataFim, [Ô]yyyy-mm-dd[Ô]) & [Ô][ô] [Ô] & _
[Ô]and valor_nfe = [Ô] & Replace(Format(TxtValorDoc, [Ô]0.00[Ô]), [Ô],[Ô], [Ô].[Ô]) & [Ô] [Ô] & _
[Ô]Order by NSU [Ô]
sendo que ele nao me retorna o item, debuguei e colei o select no analazer do mysql e ele nao encontrou nenhum item, sendo que esse item existe na tabela do banco.
é o seguinte tenho um banco mysql onde guarda as informacoes e preciso fazer um select para me retorna no listview todos os documentos que possuem o mesmo valor sendo que o campo é float entao o que estou fazendo:
o select é esse
[Ô]SELECT * From DADOSNFEESPIONADAS [Ô] & _
[Ô]where DATAEMISSAO between [ô][Ô] & Format(TxtDataInicio, [Ô]yyyy-mm-dd[Ô]) & [Ô][ô] [Ô] & _
[Ô]and [ô][Ô] & Format(TxtDataFim, [Ô]yyyy-mm-dd[Ô]) & [Ô][ô] [Ô] & _
[Ô]and valor_nfe = [Ô] & Replace(Format(TxtValorDoc, [Ô]0.00[Ô]), [Ô],[Ô], [Ô].[Ô]) & [Ô] [Ô] & _
[Ô]Order by NSU [Ô]
sendo que ele nao me retorna o item, debuguei e colei o select no analazer do mysql e ele nao encontrou nenhum item, sendo que esse item existe na tabela do banco.
Pode dar algumas dicas?
Fazer SQL na unha assim é trabalhoso. Use ou crie um framework para construção de queries pra você. No começo dá trabalho, mas depois é só alegria. Eu estou muito feliz com o que eu fiz. Não faço um Insert, Select, Update, Delete na unha já tem anos.
Se não for fazer assim, implementa o uso de parâmetros então. Pro código ficar organizado. Fazer o format no meio da SQL atrapalha um pouco a analisar facilmente a instrução.
Mas deixando as boas práticas de lado, vamos analisar sua query.
Você disse que já copiou para o analizer do MySQL e não retornou nada né?
Primeiro passo:
[Ô]SELECT * From DADOSNFEESPIONADAS [Ô] & _
[Ô]where DATAEMISSAO between [ô][Ô] & Format(TxtDataInicio, [Ô]yyyy-mm-dd[Ô]) & [Ô][ô] [Ô] & _
[Ô]and [ô][Ô] & Format(TxtDataFim, [Ô]yyyy-mm-dd[Ô]) & [Ô][ô]
Verifica se essa instrução está gerando resultado. Se não estiver, o problema está na consulta de Datas. Ou você está usando um formato diferente de datas como padrão (yyyy-mm-dd) ou simplesmente não existem registross na data especificada.
Outra coisa que me estou preocupado é esse
Mas se a instrução tiver gerando resultado, ótimo! Passemos para a nova fase de testes:
[Ô]SELECT * From DADOSNFEESPIONADAS [Ô] & _
[Ô]where valor_nfe = [Ô] & Replace(Format(TxtValorDoc, [Ô]0.00[Ô]), [Ô],[Ô], [Ô].[Ô]) & [Ô] [Ô] & _
[Ô]Order by NSU [Ô]
Verifique se encontrou algo. Não gerou? Então o erro está na condição do valor do documento. Usar Where em campos decimais para igualdade assim, confesso que é algo que não estou acostumado a ver. Altas chances de dar merda por causa da precisão do número.
Novamente, dê uma uma reforçada no Format usando uma função para conversão numérica antes. CSgl se não me engano, é a função para converter para Single.
O lance é dividir em partes mesmo. Não tem para onde correr.
Na verdade, para esses casos de SELECT com muitos Wheres eu criei um pequeno aplicativo para separar todos para mim. Ele pega os operadores lógicos e verifica condição por condição e vê onde não está pegando. Você faz ele rapidamente, separa umas 3 horinhas e manda bronca... vai recuperar muitas horas depois com dor de cabeça de ficar copiando e colando instrução do analizer.
Abraços!
Fazer SQL na unha assim é trabalhoso. Use ou crie um framework para construção de queries pra você. No começo dá trabalho, mas depois é só alegria. Eu estou muito feliz com o que eu fiz. Não faço um Insert, Select, Update, Delete na unha já tem anos.
Se não for fazer assim, implementa o uso de parâmetros então. Pro código ficar organizado. Fazer o format no meio da SQL atrapalha um pouco a analisar facilmente a instrução.
Mas deixando as boas práticas de lado, vamos analisar sua query.
Você disse que já copiou para o analizer do MySQL e não retornou nada né?
Primeiro passo:
[Ô]SELECT * From DADOSNFEESPIONADAS [Ô] & _
[Ô]where DATAEMISSAO between [ô][Ô] & Format(TxtDataInicio, [Ô]yyyy-mm-dd[Ô]) & [Ô][ô] [Ô] & _
[Ô]and [ô][Ô] & Format(TxtDataFim, [Ô]yyyy-mm-dd[Ô]) & [Ô][ô]
Verifica se essa instrução está gerando resultado. Se não estiver, o problema está na consulta de Datas. Ou você está usando um formato diferente de datas como padrão (yyyy-mm-dd) ou simplesmente não existem registross na data especificada.
Outra coisa que me estou preocupado é esse
Format(txtDataInicio, [Ô]yyyy-mm-dd[Ô])
. Use o Cdate para converter para data antes de aplicar o formato:Format(Cdate(TxtDataInicio), [Ô]yyyy-mm-dd[Ô])
Mas se a instrução tiver gerando resultado, ótimo! Passemos para a nova fase de testes:
[Ô]SELECT * From DADOSNFEESPIONADAS [Ô] & _
[Ô]where valor_nfe = [Ô] & Replace(Format(TxtValorDoc, [Ô]0.00[Ô]), [Ô],[Ô], [Ô].[Ô]) & [Ô] [Ô] & _
[Ô]Order by NSU [Ô]
Verifique se encontrou algo. Não gerou? Então o erro está na condição do valor do documento. Usar Where em campos decimais para igualdade assim, confesso que é algo que não estou acostumado a ver. Altas chances de dar merda por causa da precisão do número.
Novamente, dê uma uma reforçada no Format usando uma função para conversão numérica antes. CSgl se não me engano, é a função para converter para Single.
O lance é dividir em partes mesmo. Não tem para onde correr.
Na verdade, para esses casos de SELECT com muitos Wheres eu criei um pequeno aplicativo para separar todos para mim. Ele pega os operadores lógicos e verifica condição por condição e vê onde não está pegando. Você faz ele rapidamente, separa umas 3 horinhas e manda bronca... vai recuperar muitas horas depois com dor de cabeça de ficar copiando e colando instrução do analizer.
Abraços!
Tópico encerrado , respostas não são mais permitidas