ALTERA?ÃO NO BD FALHANDO
Deixa eu me apresentar primeiro:
Estou no mundo da programação à pouco mais de 1 ano e atualmente faço por hobby. Para conhecer melhor como a programação funciona, faço uso do [Ô]velhÃssimo[Ô] VB6 onde todos nós sabemos que é uma linguagem abandonada mesmo por sua [Ô]mãe[Ô], já que a incompatibilidade com os novos Windows que chegaram e estão chegando já está bem próximo. Tenho estudado e vou passar para o lado profissional .NET que é muito superior ao falido VB6.
Agora vem o meu passa raivas:
O problema que estou passando é com relação à atualização de dados no meu banco de dados Access no formato 2000.
Fiz um simples sistema para cadastrar produtos e realizar pedidos com a baixa do estoque informado, só que simplesmente alguns produtos não estão realizando a baixa necessária, por exemplo se o pedido é realizado com 10 produtos, então 9 deles o estoque baixa como deveria e 1 ou até mais não baixa. Não é todas as vezes que isso acontece, e na maioria das vezes tudo funciona normalmente. Já houve algumas vezes que a quantidade baixada foi de um valor abaixo do que estava [Ô]vendido[Ô], e como disse, não é em todos os produtos pertencentes ao pedido que isso acontece.
As tabelas do meu BD, não estão com nenhum relacionamento. Todas elas possuà o campo [Ô]codCadastro[Ô] auto-numérico e foi especificado nos demais, o tipo de dados conforme o que é para ser inserido, como esse campo [Ô]Qtde[Ô] está como [Ô]Long[Ô], o [Ô]valVenda[Ô] como [Ô]Currency[Ô], [Ô]Descricao[Ô] como [Ô]String[Ô] de 50 caractéres, e assim por diante.
Há 5 maquinas utilizando o sistema, todas com o Windows XP SP3 e o banco de dados está em uma pasta compartilhada.
Tenho uma variável pública que coloco a [Ô]string[Ô] de conexão, e a utilizo sempre que declaro a conexão do recordset.
Nas máquinas [Ô]estações[Ô] o acesso ao BD é feito via [Ô]\
ome_da_maquina\pasta_compartilhada\banco_de_dados.mdb[Ô] e não por uma unidade mapeada.
Exemplo: [Ô]PROVIDER=Microsoft.Jet.OLEDB.4.0; DATA SOURCE=\
ome_da_maquina\pasta_compartilhada\banco_de_dados.mdb; JET OLEDB:DATABASE PASSWORD=senha;[Ô]
Na máquina onde está o banco de dados, o acesso é feito normalmente pelo caminho local [Ô]c:\pasta\banco.mdb[Ô]
Nunca houve problemas de uma máquina não reconhecer o banco de dados, sempre antes de qualquer acesso ao BD para realizar uma modificação, faço uma verificação de comunicação de acesso e nunca aconteceu o retorno de erro por falha, tanto nas máquinas cliente como na servidora.
A baixa faço da seguinte maneira:
Os produtos pertencentes ao pedido, o usuário vai lançando-os em um listview e assim que concluÃdo, percorro todos os itens deste listview realizando a atualização da quantidade com esse código:
dim cnxTmp as new ADODB.Connection
cnxTmp.open stringConexao
dim rsTmp as new ADODB.Recordset
dim INC as Integer
for INC = 1 to ListView.ListCount - 1
rsTmp.open [Ô]UPDATE FROM tblProdutos SET Qtde = (Qtde - ListView.List(INC)_quantidade) WHERE codCadastro = [Ô] & ListView.List(INC)_codproduto[Ô], cnxTmp, adOpenKeyset, adLockOptimistic
next INC
set rsTmp = Nothing
cnxTmp.close
set cnxTmp = Nothing
Já vi em diversos tutoriais mostrando a declaração da conexão e do recordset assim que abre o formulário, e não apenas quando vai haver a comunicação com o BD. Isso eu não faço, sempre que vou realizar qualquer acesso ao BD, aà é que realizo a declaração dos controles Isto está errado?
Os produtos sempre são cadastrados normalmente, nunca houve falha de realizar um cadastro e o produto não ser inserido no BD ou algum dado estar diferente/faltando.
O problema de falhar a baixa da quantidade é a única coisa de errado que tem acontecido.
O que de errado estou fazendo?
Muito obrigado por ter acompanhado tudo que disse até aqui.
tente assim
cnxTmp.execute [Ô]UPDATE FROM tblProdutos SET Qtde = (Qtde - ListView.List(INC)_quantidade) WHERE codCadastro = [Ô] & ListView.List(INC)_codproduto[Ô]
e não
rsTmp.open [Ô]UPDATE FROM tblProdutos SET Qtde = (Qtde - ListView.List(INC)_quantidade) WHERE codCadastro = [Ô] & ListView.List(INC)_codproduto[Ô], cnxTmp, adOpenKeyset, adLockOptimistic
você está abrindo o recordset sem necessidade nesse caso, eu costumo usar somente em select
Citação::
tive um erro parecido uma vez, o problema era que no código estava exatamente como o seu dando update com open,
tente assim
cnxTmp.execute [Ô]UPDATE FROM tblProdutos SET Qtde = (Qtde - ListView.List(INC)_quantidade) WHERE codCadastro = [Ô] & ListView.List(INC)_codproduto[Ô]
e não
rsTmp.open [Ô]UPDATE FROM tblProdutos SET Qtde = (Qtde - ListView.List(INC)_quantidade) WHERE codCadastro = [Ô] & ListView.List(INC)_codproduto[Ô], cnxTmp, adOpenKeyset, adLockOptimistic
você está abrindo o recordset sem necessidade nesse caso, eu costumo usar somente em select
Certo Luiz, tomara que sua ajuda resolva o problema.
Eu utilizo o [Ô]OPEN[Ô] porque nos tutoriais que estudei, sempre era explicado dessa forma.
Vc sabe me dizer a diferença do [Ô]execute[Ô] e [Ô]open[Ô]?
Outra dúvida é que, usando como estou atualmente, esse problema não era para acontecer sempre?
Vlw amigo!
ListView.[txt-color=#e80000]List[/txt-color](INC)[txt-color=#e80000]_codproduto[/txt-color][Ô]
O que é isto,como faz isto com listivew.
Citação::
Sinceramente nunca vi um Update desta forma com listivew.
ListView.[txt-color=#e80000]List[/txt-color](INC)[txt-color=#e80000]_codproduto[/txt-color][Ô]
O que é isto,como faz isto com listivew.
Não é assim que faço amigo, apenas tentei identificar que pego o código do produto pelo texto no listview .
A forma correta seria left(lstview.list(inc),6), ok?
Citação::
tive um erro parecido uma vez, o problema era que no código estava exatamente como o seu dando update com open,
tente assim
cnxTmp.execute [Ô]UPDATE FROM tblProdutos SET Qtde = (Qtde - ListView.List(INC)_quantidade) WHERE codCadastro = [Ô] & ListView.List(INC)_codproduto[Ô]
e não
rsTmp.open [Ô]UPDATE FROM tblProdutos SET Qtde = (Qtde - ListView.List(INC)_quantidade) WHERE codCadastro = [Ô] & ListView.List(INC)_codproduto[Ô], cnxTmp, adOpenKeyset, adLockOptimistic
você está abrindo o recordset sem necessidade nesse caso, eu costumo usar somente em select
Luiz, o que eu não estava entendendo era que após o recordset havia a especificação da conexão e os [Ô]lock[Ô], e como vc disse, não é necessário nada disso.
Já fiz a modificação e vou começar a usar, vamos ver se dessa forma também pare de apresentar os problemas como vc passou.
Obrigado mais uma vez!
Dim lstItens As ListItem
For Each lstItens In SeuListivew.ListItems
rsTmp.Open [Ô]UPDATE FROM tblProdutos SET TblProdutos.Qtde = (TblProdutos.Qtde - [Ô] & Val(lstItens.SubItems([txt-color=#e80000]2[/txt-color])) & [Ô] WHERE TblProdutos.codCadastro = [Ô] & lstItens.Text, cnxTmp, adOpenKeyset, adLockOptimistic
next
Onde está de vermelho que muda.
for INC = 1 to ListView.ListCount [txt-color=#e80000]- 1[/txt-color]
Acho que é deste jeito.
for INC = 1 to ListView.ListCount
Citação::
Mais ou menos assim
Dim lstItens As ListItem
For Each lstItens In SeuListivew.ListItems
rsTmp.Open [Ô]UPDATE FROM tblProdutos SET TblProdutos.Qtde = (TblProdutos.Qtde - [Ô] & Val(lstItens.SubItems([txt-color=#e80000]2[/txt-color])) & [Ô] WHERE TblProdutos.codCadastro = [Ô] & lstItens.Text, cnxTmp, adOpenKeyset, adLockOptimistic
next
Onde está de vermelho que muda.
for INC = 1 to ListView.ListCount [txt-color=#e80000]- 1[/txt-color]
Acho que é deste jeito.
for INC = 1 to ListView.ListCount
Omar, o problema não está sendo percorrer o listview e sim a falha no banco de dados na atualização da quantidade de itens em alguns produtos e outros não. Mas isso não ocorre sempre, não há momento para acontecer, simplesmente (por exemplo) durante toda uma semana em que todos os dias está sendo realizado pedidos com qualquer quantidade de produtos, em um desses pedidos um produto não realiza a redução da quantidade cadastrada, todos os outros produtos que estão nesse mesmo pedido, tiveram as reduções, mas simplesmente em um deles não!
Queria saber qual a forma mais segura de realizar/executar a atualização de todos os produtos que estiverem nesse listview.
Obrigado!
cnxTmp.execute e não rsTmp.execute ,
o que tem a propriedade execute é a conexão cnxTmp
Aqui tem alguns que entenda bastante.
Quanto ao LUIZCOMINO.
E conhecereis a verdade, e a verdade vos libertará. João 8:32
Leia, bem interessante
http://www.cristoeaverdade.net/index.php/dizimos2/82-dizimos