SELECT QUERYDEFS NO VB
Caros Colegas programadores, o grande José Carlos Macoratti me deu uma mãozinha quando postou um artigo falando sobre usar as Consultas armazenadas no Banco de dados (estou me referindo ao ACESS) com o QueryDef na DAO 3.6. Isso me ajudou muitÃssimo e diminuiu o tempo de resposta de algumas instruções de atualização de banco de dados; enfim, como diz o ditado, foi uma mão na roda.
Mas não consegui retornar registros e manipular dados com uma consulta do tipo
"SELECT * FROM Clientes". o QueryDef até que busca os dados. Mas não é como o Recordset em que podemos verificar se foi retornado algum registro, ou se foi "encontrado" o registro procurado. Não consegui também ler os dados do Query assim como podemos fazer com o Recordset (codigo = tabela!idcliente; nome = tabela!nomeCliente; etc).
Tenho que realizar uma consulta imensa em um banco de dados que retorna valores de duas tabelas (Vendas e ProdutoVendas) com o objetivo de atualizar um outro banco de dados que está no servidor. Gostaria de realizar esta consulta e retornar os dados usando a QueryDefs. Se alguém souber como fazer isso ou se tiver alguma alternativa rápida para o processo, fico grato se puder postar.
A rotina que estou usando atualmente é esta:
'----Funções de Atualização de Banco de Dados---'
'---Atualizar o Gerente---'
Public Sub ExportarVendas(DataExportacao As Date, Turno As Integer)
'--atualizar a tabela Vendas e ProdutoVendas do Gerente--'
Dim SQL As String, SQLprod As String, codigo As Long, codigoLocal As Long, codProduto As Long
On Error GoTo trata_erro
'dados da tabela vendas, ordenados por data e também por turno, visto que os turno que já foi enviado
'para o gerente não precisa mais ser enviado - nome no bd Frente -> Produtos Vendidos (atualização)
SQL = "SELECT Vendas.datavenda, Vendas.idcliente, Vendas.idpgto, Vendas.valor, Vendas.desconto, "
SQL = SQL & "Vendas.acrescimo, Vendas.idusuario, Vendas.hora, Vendas.turno, "
'dados da tabela ProdutoVenda
SQL = SQL & "ProdutoVenda.codvendas, ProdutoVenda.idproduto, ProdutoVenda.quantidade, "
SQL = SQL & "ProdutoVenda.dtgeracao, ProdutoVenda.vlProdXquant "
SQL = SQL & "FROM ProdutoVenda INNER JOIN Vendas ON ProdutoVenda.codvendas = Vendas.codvendas "
SQL = SQL & "WHERE ProdutoVenda.dtgeracao=#" & Format(DataExportacao, "mm/dd/yyyy") & "# "
SQL = SQL & "AND Vendas.turno=" & Turno & " "
SQL = SQL & "ORDER BY Vendas.codvendas"
'-------'
'soma todos os produtos e os ordena por codigo na tabela ProdutoVenda Local
'nome no bd Frente -> SomaQuant
SQLprod = "SELECT ProdutoVenda.idproduto, Sum(ProdutoVenda.quantidade) AS Soma "
SQLprod = SQLprod & "FROM Vendas INNER JOIN ProdutoVenda ON Vendas.codvendas = ProdutoVenda.codvendas "
SQLprod = SQLprod & "GROUP BY ProdutoVenda.idproduto, ProdutoVenda.dtgeracao, Vendas.turno "
SQLprod = SQLprod & "Having ProdutoVenda.dtgeracao = #" & Format(DataExportacao, "mm/dd/yyyy") & "# "
SQLprod = SQLprod & "AND Vendas.Turno = " & Turno & " "
SQLprod = SQLprod & "ORDER BY ProdutoVenda.idproduto"
'sql no banco de dados
'SELECT ProdutoVenda.idproduto, Sum(ProdutoVenda.quantidade) AS Soma
'FROM Vendas INNER JOIN ProdutoVenda ON Vendas.codvendas = ProdutoVenda.codvendas
'GROUP BY ProdutoVenda.idproduto, ProdutoVenda.dtgeracao, Vendas.turno
'Having (((ProdutoVenda.dtgeracao) = #2/17/2005#) And ((Vendas.Turno) = 1))
'ORDER BY ProdutoVenda.idproduto;
'faz a conexao com o banco retaguarda, caso não seja estabelecida conexão, sai da função
If ConexaoRemota(BancoRemoto) = False Then Exit Sub
'função de bloqueio de teclado e mouse
'BlockInput True
' 1 -> abrir tabelas remotas em primeiro lugar
Set tbVendasRemoto = dbRemoto.OpenRecordset("Vendas", dbOpenTable, dbDenyRead)
tbVendasRemoto.Index = "codvendas"
' 2 -> esta tabela é apenas de ligação, portanto não tem index
Set tbProdutoVendaRemoto = dbRemoto.OpenRecordset("ProdutoVenda", dbOpenDynaset, dbDenyRead)
' 3 -> abrir tabelas locais, apenas para leitura dos dados
Set tbVendasLocal = db.OpenRecordset(SQL, dbOpenSnapshot)
' 4 -> soma a quantidade de itens vendidos por produto no banco local
Set tbQuantProdLocal = db.OpenRecordset(SQLprod, dbOpenSnapshot)
'move para a primeira venda selecionada
tbVendasLocal.MoveFirst
'existem vendas a ser exportadas
If Not tbVendasLocal.RecordCount = 0 Then
'move para o primeiro registro
tbVendasLocal.MoveFirst
tbQuantProdLocal.MoveFirst
'codigo da venda na tabela Local para mandar para a função InserirVenda
codigoLocal = tbVendasLocal!codvendas
'codigo do produto a ser atualizado no estoque
codProduto = tbQuantProdLocal!idProduto
'codigo para atualizar tabela remota, busca o ultimo codigo e insere
If Not tbVendasRemoto.RecordCount = 0 Then
tbVendasRemoto.MoveLast
codigo = tbVendasRemoto!codvendas + 1
Else
codigo = 1
End If
'Função para inserir a venda no banco remoto, recursiva
Call InsereVenda(codigo, codigoLocal)
'Função para atualizar o estoque no banco remoto, recursiva
Call AtualizaEstoque(codProduto)
End If
tbVendasRemoto.Close
tbProdutoVendaRemoto.Close
tbVendasLocal.Close
tbQuantProdLocal.Close
Set tbVendasRemoto = Nothing
Set tbProdutoVendaRemoto = Nothing
Set Vendas = Nothing
'Set tbProdutosRemoto = Nothing
Set tbQuantProdLocal = Nothing
'UFA, agora finaliza todo o processo de atualização
'desbloqueia teclado e mouse deste computador
'BlockInput False
Exit Sub
trata_erro:
'tabela já está sendo usada por outro caixa, ou já foi bloqueada por outro usuário
If Err.Number = 3262 Or Err.Number = 3261 Then
Call ExportarVendas(DataExportacao, Turno)
'caso seja outro erro
Else
'caso seja outro erro, desbloqueia teclado
'BlockInput False
Call Program_Error("MODULO DE FUNÇÕES - Sub ExportarVendas")
End If
End Sub
----------------------------------------------------------------
'---Insere as vendas Recursivamente---'
Private Sub InsereVenda(codVenda As Long, codVendaLocal As Long)
'--função recebe o codigo da venda e insere os valores encontrados desta venda na tabela Remota buscando da tabela local
'--previamente selecionados na função acima
Dim codigo As Long
On Error GoTo trata_erro
'loop, enquanto tabela local não chegar ao fim, não deixa de atualizar a tabela remota
Do While Not tbVendasLocal.EOF
With tbVendasRemoto
'adiciona dados na tabela Vendas Remoto
.AddNew
!codvendas = codVenda
!datavenda = tbVendasLocal!datavenda
!idcliente = tbVendasLocal!idcliente
!idpgto = tbVendasLocal!idpgto
!valor = tbVendasLocal!valor
!desconto = tbVendasLocal!desconto
!idUsuario = tbVendasLocal!idUsuario
!hora = tbVendasLocal!hora
!caixanumero = CaixaNum
!Turno = tbVendasLocal!Turno
.Update
.Bookmark = .LastModified
End With
'adicionar esta venda na tabela ProdutoVenda Remoto
'adiciona os produtos vendidos na venda acima
'enquanto tiver dados desta venda que foi adicionada acima, insere dados ProdutoVenda Remoto
'o codvendas aqui é da tabela ProdutoVenda
With tbProdutoVendaRemoto
Do While codVendaLocal = tbVendasLocal!codvendas
.AddNew
!codvendas = codVenda
!idProduto = tbVendasLocal!idProduto
!quantidade = tbVendasLocal!quantidade
!dtgeracao = tbVendasLocal!dtgeracao
!vlProdXquant = tbVendasLocal!vlProdXquant
.Update
.Bookmark = .LastModified
'move para o próximo registro e busca informações para inserir no ProdutoVenda
tbVendasLocal.MoveNext
'caso tenha chegado ao fim dos produtos a serem enviados, sai da função
If tbVendasLocal.EOF Then Exit Sub
Loop
End With
'acabaram os produtos da venda X, passa para próxima venda
'tbVendasLocal.MoveNext
codVenda = codVenda + 1
codVendaLocal = tbVendasLocal!codvendas
'chama a função recursivamente
Call InsereVenda(codVenda, codVendaLocal)
Loop
Exit Sub
trata_erro:
Call Program_Error("MODULO DE FUNÇÕES - Sub InsereVenda")
End Sub
---------------------------------------------------------
Public Sub AtualizaEstoque(id As Long)
'---Função recebe o produto a ser editado e atualiza seu estoque---'
Dim SQL As String
Dim codProd As Long
On Error GoTo trata_erro
SQL = "SELECT Produtos.estoque FROM Produtos WHERE idproduto=" & id
Set tbProdutosRemoto = dbRemoto.OpenRecordset(SQL, dbOpenDynaset)
With tbProdutosRemoto
If Not .RecordCount = 0 Then
.Edit
'soma proveniente de SQL somatória
!estoque = !estoque - tbQuantProdLocal!Soma
.Update
.Bookmark = .LastModified
End If
End With
Set tbProdutosRemoto = Nothing
tbQuantProdLocal.MoveNext
If Not tbQuantProdLocal.EOF Then
codProd = tbQuantProdLocal!idProduto
'chama a função recursivamente
Call AtualizaEstoque(codProd)
End If
Exit Sub
trata_erro:
Call Program_Error("MODULO DE FUNÇÕES - Sub AtualizaEstoque")
End Sub
Se alguém tiver uma idéia, fico grato.
[S35]
Mas não consegui retornar registros e manipular dados com uma consulta do tipo
"SELECT * FROM Clientes". o QueryDef até que busca os dados. Mas não é como o Recordset em que podemos verificar se foi retornado algum registro, ou se foi "encontrado" o registro procurado. Não consegui também ler os dados do Query assim como podemos fazer com o Recordset (codigo = tabela!idcliente; nome = tabela!nomeCliente; etc).
Tenho que realizar uma consulta imensa em um banco de dados que retorna valores de duas tabelas (Vendas e ProdutoVendas) com o objetivo de atualizar um outro banco de dados que está no servidor. Gostaria de realizar esta consulta e retornar os dados usando a QueryDefs. Se alguém souber como fazer isso ou se tiver alguma alternativa rápida para o processo, fico grato se puder postar.
A rotina que estou usando atualmente é esta:
'----Funções de Atualização de Banco de Dados---'
'---Atualizar o Gerente---'
Public Sub ExportarVendas(DataExportacao As Date, Turno As Integer)
'--atualizar a tabela Vendas e ProdutoVendas do Gerente--'
Dim SQL As String, SQLprod As String, codigo As Long, codigoLocal As Long, codProduto As Long
On Error GoTo trata_erro
'dados da tabela vendas, ordenados por data e também por turno, visto que os turno que já foi enviado
'para o gerente não precisa mais ser enviado - nome no bd Frente -> Produtos Vendidos (atualização)
SQL = "SELECT Vendas.datavenda, Vendas.idcliente, Vendas.idpgto, Vendas.valor, Vendas.desconto, "
SQL = SQL & "Vendas.acrescimo, Vendas.idusuario, Vendas.hora, Vendas.turno, "
'dados da tabela ProdutoVenda
SQL = SQL & "ProdutoVenda.codvendas, ProdutoVenda.idproduto, ProdutoVenda.quantidade, "
SQL = SQL & "ProdutoVenda.dtgeracao, ProdutoVenda.vlProdXquant "
SQL = SQL & "FROM ProdutoVenda INNER JOIN Vendas ON ProdutoVenda.codvendas = Vendas.codvendas "
SQL = SQL & "WHERE ProdutoVenda.dtgeracao=#" & Format(DataExportacao, "mm/dd/yyyy") & "# "
SQL = SQL & "AND Vendas.turno=" & Turno & " "
SQL = SQL & "ORDER BY Vendas.codvendas"
'-------'
'soma todos os produtos e os ordena por codigo na tabela ProdutoVenda Local
'nome no bd Frente -> SomaQuant
SQLprod = "SELECT ProdutoVenda.idproduto, Sum(ProdutoVenda.quantidade) AS Soma "
SQLprod = SQLprod & "FROM Vendas INNER JOIN ProdutoVenda ON Vendas.codvendas = ProdutoVenda.codvendas "
SQLprod = SQLprod & "GROUP BY ProdutoVenda.idproduto, ProdutoVenda.dtgeracao, Vendas.turno "
SQLprod = SQLprod & "Having ProdutoVenda.dtgeracao = #" & Format(DataExportacao, "mm/dd/yyyy") & "# "
SQLprod = SQLprod & "AND Vendas.Turno = " & Turno & " "
SQLprod = SQLprod & "ORDER BY ProdutoVenda.idproduto"
'sql no banco de dados
'SELECT ProdutoVenda.idproduto, Sum(ProdutoVenda.quantidade) AS Soma
'FROM Vendas INNER JOIN ProdutoVenda ON Vendas.codvendas = ProdutoVenda.codvendas
'GROUP BY ProdutoVenda.idproduto, ProdutoVenda.dtgeracao, Vendas.turno
'Having (((ProdutoVenda.dtgeracao) = #2/17/2005#) And ((Vendas.Turno) = 1))
'ORDER BY ProdutoVenda.idproduto;
'faz a conexao com o banco retaguarda, caso não seja estabelecida conexão, sai da função
If ConexaoRemota(BancoRemoto) = False Then Exit Sub
'função de bloqueio de teclado e mouse
'BlockInput True
' 1 -> abrir tabelas remotas em primeiro lugar
Set tbVendasRemoto = dbRemoto.OpenRecordset("Vendas", dbOpenTable, dbDenyRead)
tbVendasRemoto.Index = "codvendas"
' 2 -> esta tabela é apenas de ligação, portanto não tem index
Set tbProdutoVendaRemoto = dbRemoto.OpenRecordset("ProdutoVenda", dbOpenDynaset, dbDenyRead)
' 3 -> abrir tabelas locais, apenas para leitura dos dados
Set tbVendasLocal = db.OpenRecordset(SQL, dbOpenSnapshot)
' 4 -> soma a quantidade de itens vendidos por produto no banco local
Set tbQuantProdLocal = db.OpenRecordset(SQLprod, dbOpenSnapshot)
'move para a primeira venda selecionada
tbVendasLocal.MoveFirst
'existem vendas a ser exportadas
If Not tbVendasLocal.RecordCount = 0 Then
'move para o primeiro registro
tbVendasLocal.MoveFirst
tbQuantProdLocal.MoveFirst
'codigo da venda na tabela Local para mandar para a função InserirVenda
codigoLocal = tbVendasLocal!codvendas
'codigo do produto a ser atualizado no estoque
codProduto = tbQuantProdLocal!idProduto
'codigo para atualizar tabela remota, busca o ultimo codigo e insere
If Not tbVendasRemoto.RecordCount = 0 Then
tbVendasRemoto.MoveLast
codigo = tbVendasRemoto!codvendas + 1
Else
codigo = 1
End If
'Função para inserir a venda no banco remoto, recursiva
Call InsereVenda(codigo, codigoLocal)
'Função para atualizar o estoque no banco remoto, recursiva
Call AtualizaEstoque(codProduto)
End If
tbVendasRemoto.Close
tbProdutoVendaRemoto.Close
tbVendasLocal.Close
tbQuantProdLocal.Close
Set tbVendasRemoto = Nothing
Set tbProdutoVendaRemoto = Nothing
Set Vendas = Nothing
'Set tbProdutosRemoto = Nothing
Set tbQuantProdLocal = Nothing
'UFA, agora finaliza todo o processo de atualização
'desbloqueia teclado e mouse deste computador
'BlockInput False
Exit Sub
trata_erro:
'tabela já está sendo usada por outro caixa, ou já foi bloqueada por outro usuário
If Err.Number = 3262 Or Err.Number = 3261 Then
Call ExportarVendas(DataExportacao, Turno)
'caso seja outro erro
Else
'caso seja outro erro, desbloqueia teclado
'BlockInput False
Call Program_Error("MODULO DE FUNÇÕES - Sub ExportarVendas")
End If
End Sub
----------------------------------------------------------------
'---Insere as vendas Recursivamente---'
Private Sub InsereVenda(codVenda As Long, codVendaLocal As Long)
'--função recebe o codigo da venda e insere os valores encontrados desta venda na tabela Remota buscando da tabela local
'--previamente selecionados na função acima
Dim codigo As Long
On Error GoTo trata_erro
'loop, enquanto tabela local não chegar ao fim, não deixa de atualizar a tabela remota
Do While Not tbVendasLocal.EOF
With tbVendasRemoto
'adiciona dados na tabela Vendas Remoto
.AddNew
!codvendas = codVenda
!datavenda = tbVendasLocal!datavenda
!idcliente = tbVendasLocal!idcliente
!idpgto = tbVendasLocal!idpgto
!valor = tbVendasLocal!valor
!desconto = tbVendasLocal!desconto
!idUsuario = tbVendasLocal!idUsuario
!hora = tbVendasLocal!hora
!caixanumero = CaixaNum
!Turno = tbVendasLocal!Turno
.Update
.Bookmark = .LastModified
End With
'adicionar esta venda na tabela ProdutoVenda Remoto
'adiciona os produtos vendidos na venda acima
'enquanto tiver dados desta venda que foi adicionada acima, insere dados ProdutoVenda Remoto
'o codvendas aqui é da tabela ProdutoVenda
With tbProdutoVendaRemoto
Do While codVendaLocal = tbVendasLocal!codvendas
.AddNew
!codvendas = codVenda
!idProduto = tbVendasLocal!idProduto
!quantidade = tbVendasLocal!quantidade
!dtgeracao = tbVendasLocal!dtgeracao
!vlProdXquant = tbVendasLocal!vlProdXquant
.Update
.Bookmark = .LastModified
'move para o próximo registro e busca informações para inserir no ProdutoVenda
tbVendasLocal.MoveNext
'caso tenha chegado ao fim dos produtos a serem enviados, sai da função
If tbVendasLocal.EOF Then Exit Sub
Loop
End With
'acabaram os produtos da venda X, passa para próxima venda
'tbVendasLocal.MoveNext
codVenda = codVenda + 1
codVendaLocal = tbVendasLocal!codvendas
'chama a função recursivamente
Call InsereVenda(codVenda, codVendaLocal)
Loop
Exit Sub
trata_erro:
Call Program_Error("MODULO DE FUNÇÕES - Sub InsereVenda")
End Sub
---------------------------------------------------------
Public Sub AtualizaEstoque(id As Long)
'---Função recebe o produto a ser editado e atualiza seu estoque---'
Dim SQL As String
Dim codProd As Long
On Error GoTo trata_erro
SQL = "SELECT Produtos.estoque FROM Produtos WHERE idproduto=" & id
Set tbProdutosRemoto = dbRemoto.OpenRecordset(SQL, dbOpenDynaset)
With tbProdutosRemoto
If Not .RecordCount = 0 Then
.Edit
'soma proveniente de SQL somatória
!estoque = !estoque - tbQuantProdLocal!Soma
.Update
.Bookmark = .LastModified
End If
End With
Set tbProdutosRemoto = Nothing
tbQuantProdLocal.MoveNext
If Not tbQuantProdLocal.EOF Then
codProd = tbQuantProdLocal!idProduto
'chama a função recursivamente
Call AtualizaEstoque(codProd)
End If
Exit Sub
trata_erro:
Call Program_Error("MODULO DE FUNÇÕES - Sub AtualizaEstoque")
End Sub
Se alguém tiver uma idéia, fico grato.
[S35]
E ai galera, alguma idéia de como resolver esse problema???
Agradeço desde já!!
Agradeço desde já!!
E ai pessoal, ninguém nunca trabalhor com QueryDefs???
Se alguém já trabalhou com isso e puder me dar uma maozinha, ficare muito grato.
[S59][S32]
Se alguém já trabalhou com isso e puder me dar uma maozinha, ficare muito grato.
[S59][S32]
Olá pessoal, ninguém pode me ajudar nesta dúvida??
Agradeço se alguém tiver alguma sugestão.
Agradeço se alguém tiver alguma sugestão.
Tópico encerrado , respostas não são mais permitidas