Ir ao conteúdo

Consulta SQL no VB6


Daniel.Alexander

Posts recomendados

Postado

Galera, abaixo segue meu código, ele tem que pesquisar os itens mais vendidos nos últimos 15 dias e me mostrar o resultado num listbox ordenado pela quantidade vendida, só que, aparentemente não está reconhecendo a variável QuinzeDias pois mesmo eu adicionando uma venda na data precisa dos QuinzeDias e alterando para o DataVen para ser = ao QuinzeDias não é exibido o resultado. Alguém tem alguma dica, eu pensei que fosse o DataVen que não estava no Select mas ele não permite adicionar o DataVen acusa um erro citando que a variável não faz referencia a nada na expressão, O Clemente Silva me já me ajudou com esse problema um vez, alguém pode me ajudar ou até mesmo o Clemente, por favor, isso é um projeto que tenho que entregar em breve. Valeu

ListMaisVendidos.Clear

Dim QuinzeDias As String

Dim ConsultaS As String

QuinzeDias = DateAdd("d", -15, Date)

QuinzeDias = Format$(QuinzeDias, "dd/MM/yyyy")

ConsultaS = "SELECT NomeProd, SUM(QtdVenda) AS TotalVenda " & _

"FROM TabVen " & _

"WHERE (DataVen >=#" & QuinzeDias & "#)" & _

"GROUP BY NomeProd " & _

"ORDER BY SUM(QtdVenda) DESC;"

Set também = db.OpenRecordset(ConsultaS, dbOpenSnapshot)

Do

Dim Class As Integer

If também.AbsolutePosition > -1 Then

Class = Class + 1

ListMaisVendidos.AddItem Class & "º" & " Nome : " & (também("NomeProd")) & " - Quantidade Vendida :" & (também("TotalVenda"))

também.MoveNext

End If

Loop Until também.EOF

MsgBox "Pesquisa concluída", vbInformation, "Consulta de Vendas"

  • Membro VIP
Postado

O problema está no formato da data: use o formato norte-americano MM/dd/yyyy, ao invés de "dd/MM/yyyy".

Logo, ao invés de:

QuinzeDias = Format$(QuinzeDias, "dd/MM/yyyy")

Use:

QuinzeDias = Format$(QuinzeDias, "MM/dd/yyyy")

Ah, outra coisa que não tem nada a ver com o problema da data, mas mesmo assim vale uma observação: não é aconselhável declarar variáveis dentro de estruturas de repetição (ou qualquer outra estrutura). O ideal é declarar variáveis sempre no início da rotina/função, ou no início do módulo.

Você declarou "Dim Class As Integer" dentro da estrutura "Do... Loop", portanto seria melhor você fazer essa declaração no início da rotina, junto com as outras variáveis.

Eu escreveria o bloco de código da seguinte maneira:

Dim Class As Integer

Set T_B = db.OpenRecordset(ConsultaS, dbOpenSnapshot)

If Not T_B.RecordCount = 0 Then

   Do

       Class = Class + 1

       ListMaisVendidos.AddItem Class & "º" & _
       " Nome : " & (T_B("NomeProd")) & _
       " - Quantidade Vendida :" & (T_B("TotalVenda"))

       T_B.MoveNext

   Loop Until T_B.EOF

   MsgBox "Pesquisa concluída", vbInformation, "Consulta de Vendas"

Else

   MsgBox "Não há resultados para esta pesquisa.", vbInformation, "Consulta de Vendas"

End If

Set T_B = Nothing

Note que eu avaliei antes se a propriedade "RecordCount" é igual a zero, para avisar o usuário caso a consulta que ele fez não retornar resultados. Se o "RecordCount" for zero, você nem manda processar o "Do... Loop".

Também é sempre uma boa prática destruir variáveis objeto depois de usá-las, por exemplo, a variável "T_B": note no final que eu coloquei "Set T_B = Nothing".

:joia:

Postado

Olá Clemente, obrigado por responder, testei suas sugestões mas o problema persiste, tentei inclusive alterar a data de um registro no banco de dados (access) para o padrão norte americano mas a pesquisa não retorna nada, tentei também colocar (DataVen =#" & QuinzeDias & "#) deixando uma data de venda na base de dados idêntica a variavel QuinzeDias (também testei no padrão norte americano) mas não retorna nada, alguma sugestão ? Abaixo está o código com a alteração efetuada.

ListMaisVendidos.Clear

Dim QuinzeDias As String

Dim ConsultaS As String

QuinzeDias = DateAdd("d", -15, Date)

QuinzeDias = Format$(QuinzeDias, "MM/dd/yyyy")

ConsultaS = "SELECT NomeProd, SUM(QtdVenda) AS TotalVenda " & _

"FROM TabVen " & _

"WHERE (DataVen >=#" & QuinzeDias & "#) " & _

"GROUP BY NomeProd " & _

"ORDER BY SUM(QtdVenda) DESC;"

Set tebe = db.OpenRecordset(ConsultaS, dbOpenSnapshot)

Dim Class As Integer

If Not tebe.RecordCount = 0 Then

Do

Class = Class + 1

ListMaisVendidos.AddItem Class & "º" & " Nome : " & (tebe("NomeProd")) & " - Quantidade Vendida :" & (tebe("TotalVenda"))

tebe.MoveNext

Loop Until tebe.EOF

MsgBox "Pesquisa concluída", vbInformation, "Consulta de Vendas"

Else

MsgBox "Não há resultados para esta pesquisa", vbInformation, "Consulta de Vendas"

End If

Set tebe = Nothing

  • Membro VIP
Postado

Será que o problema não é o tipo de dados dos campos na tabela TabVen?

Verifique por exemplo se o campo DataVen é realmente do tipo Data/Hora. Se por acaso o tipo de dados deste campo estiver como Texto, está aí o motivo do problema. Mude para Data/Hora que aí sim vai funcionar.

Aproveite também para ver se o tipo de dados do campo QtdVenda é Número. Se este campo também estiver como Texto, isso também pode atrapalhar o resultado.

Aqui eu fiz o seguinte: criei um banco de dados, e nele criei uma tabela chamada "TabVen" com os seguintes campos: NomeProd (Texto), DataVen (Data/Hora) e QtdVenda (Número).

Inseri alguns registros para fazer os testes, depois criei um projeto no VB e coloquei um ListBox chamado "ListMaisVendidos".

Copiei e colei exatamente o código que você passou, a única coisa que eu mudei foi que eu acrescentei o comando para abrir o banco de dados (set db = OpenDatabase(etc etc etc...)).

Rodei o projeto e funcionou perfeitamente.

Veja os tipos de dados dos campos na tabela, tenho quase certeza de que o problema é esse.

:joia:

Postado

Clemente, valeu você é o cara, o problema era exatamente o tipo de dados juntamente com a dica anterior, a do "MM/dd/yyyy", tenho outra dúvida acho que bem simples, vou fazer uma query para me trazer os produtos próximo ao vencimento nos próximos 15 dias, mas quando eu faço ele me exibe todos vencimentos anteriores ao dia corrente + 15 dias, eu consigo limitar a pesquisa por exemplo >QuinzeDias e <Hoje ? Já declarei a variável Hoje mas como aplicá-la na query ? Abaixo o código:

ListProximoAoVencimento.Clear

Dim Hoje As String

Dim QuinzeDias As String

Dim ConsultaS As String

Dim ConsultaS2 As String

QuinzeDias = DateAdd("d", 15, Date)

QuinzeDias = Format$(QuinzeDias, "MM/dd/yyyy")

Hoje = Date

Hoje = Format(Hoje, "MM/dd/yyyy")

ConsultaS = "SELECT CodLote, Vencimento FROM TabLote WHERE Vencimento <=#" & QuinzeDias & "# ORDER BY Vencimento;"

Set TeBe = db.OpenRecordset(ConsultaS, dbOpenSnapshot)

Dim Class As Integer

If Not TeBe.RecordCount = 0 Then

Do

Class = Class + 1

ListProximoAoVencimento.AddItem Class & "º" & " Código : " & (TeBe("CodLote")) & " - Data de Vencimento :" & (TeBe("Vencimento"))

TeBe.MoveNext

Loop Until TeBe.EOF

MsgBox "Pesquisa concluída", vbInformation, "Consulta de Lotes"

Else

MsgBox "Não há resultados para esta pesquisa", vbInformation, "Consulta de Lotes"

End If

Set TeBe = Nothing

  • Membro VIP
Postado
Postado Originalmente por Daniel.Alexander@20 de outubro de 2005, 11:31

... eu consigo limitar a pesquisa por exemplo >QuinzeDias e <Hoje?

Na instrução SQL, coloque a cláusula WHERE assim:

WHERE Vencimento >=#" & QuinzeDias & "# AND Vencimento <=#" & Hoje & "#

:joia:

  • Membro VIP
Postado
Postado Originalmente por Daniel.Alexander@21 de outubro de 2005, 08:42

Clemente valeu mesmo, funcionou que é uma beleza, repito, você é o cara ... muito obrigado mesmo !

Precisando, estamos aí!

:joia:

  • 1 ano depois...
Visitante: robertoms1976
 
Postado

Ola pessoal, tudo bem?

Sou iniciante em VB e estou com um problema para testar os registros na tabela do banco de dados para gravar o registro na tabela. Isso é, se já conter o mesmo registro do produto na tabela ele não pode ser gravado novamente.

minha tabela do BD é a seguinte.

codigo = auto numeração

nome = texto

data_retirada = data/hora

data_devolucao = data/hora

Se o produto ja estiver com a data da devolução preenchida ele ate pode ser registrado novamente, mas se a data da devolução estiver em branco ele deve barrar a gravação do registro.

qual a melhora forma de fazer isso acontecer??

estou usando conexao Ado com um banco access..

Obrigado

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!