ALTERA?ÃO NO BD FALHANDO

POCE1DON 13/05/2015 16:45:06
#446599
Olá amigo, será que pode me ajudar?

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.
LUIZCOMINO 13/05/2015 17:29:54
#446602
Resposta escolhida
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
POCE1DON 13/05/2015 19:14:54
#446605
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!
POCE1DON 13/05/2015 19:23:03
#446606
Fui modificar para testar como disse, mas no seu exemplo está no momento da conexão e não na abertura do recordset, nem existe a propriedade [Ô]Execute[Ô] no recordset.
OMAR2011 13/05/2015 19:32:04
#446607
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.
POCE1DON 13/05/2015 19:45:52
#446608
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!
OMAR2011 13/05/2015 20:50:07
#446611
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
POCE1DON 13/05/2015 21:25:15
#446613
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!
LUIZCOMINO 14/05/2015 09:50:33
#446625
amigo é

cnxTmp.execute e não rsTmp.execute ,

o que tem a propriedade execute é a conexão cnxTmp


LUIZCOMINO 16/05/2015 09:09:22
#446685
finalize o tópico se foi resolvido!
OMAR2011 16/05/2015 13:02:25
#446693
Vai ter que esperar que apareça um filho de Deus que responda.
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
Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas