PROBLEMAS NA ATUALIZACAO DE UM REGISTRO
Estou usando Access nesse projeto e não estou conseguindo atualizar um registro corretamente.
Explico. FormA atua sobre um Cadastro de Pedidos. Há um ADODC e alguns controles associados mostrando um certo registro.
FormB atua sobre um Cadastro de Produtos. Nele altero um campo que não é chave (o nome do produto, por exemplo) e queria que essa alteração aparecesse em FormA imediatamente após gravar o registro.
Como trabalho com classes, gero um evento em FormB após uma gravação de dados. O evento é recebido por FormA normalmente, mas quando executo ADODC.Refresh no receptor do evento, não vejo as alterações feitas.
Interessante é que se faço outra alteração em FormB e gravo, aà então aquela primeira é que aparece em FormA.
O que parece é que o evento está disparando antes que as alterações tenham sido realmente gravadas no banco de dados.
Alguém tem alguma ideia?
Obrigado.
Retirado do Macoratti:
adOpenForwardOnly (Padrão) Abre um cursor do tipo forward-only.
adOpenKeyset Abre um cursor do tipo keyset. (Não permite visualizar registros excluidos por outro usuário)
adOpenDynamic Abre um cursor do tipo dynamic.(Exclusão,Inclusão e alterações feitas são visÃveis)
adOpenStatic Abre um cursor do tipo static.(Cópia estática de um conjunto de registros)
http://www.macoratti.net/dao_ado2.htm
Citação::
Qual é o cursor que está setado no Adodc do Form A? Talvez seja esse o problema. Acho que o Access suporta o Keyset, Static e o ForwardOnly. O Dynamic acho que não é suportado no Access.
Retirado do Macoratti:adOpenForwardOnly (Padrão) Abre um cursor do tipo forward-only.
adOpenKeyset Abre um cursor do tipo keyset. (Não permite visualizar registros excluidos por outro usuário)
adOpenDynamic Abre um cursor do tipo dynamic.(Exclusão,Inclusão e alterações feitas são visÃveis)
adOpenStatic Abre um cursor do tipo static.(Cópia estática de um conjunto de registros)
http://www.macoratti.net/dao_ado2.htm
Estou usando o adOpenStatic, que é o default, embora o help do VB diga que é o adOpenForwardOnly.
Qual você sugere?
Editando: testei TODOS os cursores disponÃveis e não fez a menor diferença. Parece que o problema não está relacionado ao tipo de cursor.
Tentou colocar o ADODC.Refresh do FormA no enveto resize do form.
Citação::
posta o código do formA em que usa o ADODC.Refdresh
Alguns detalhes eu omiti para não ficar muito longo:
[ô]Na classe ClsProduto:
Public Event RegAtualizado()
Public Sub Atualizar()
SQLCmd = [Ô]UPDATE ...;[Ô]
With AdoCmd
.ActiveConnection = ...
.CommandType = adCmdText
.CommandText = SQLCmd
.Execute
End With
RaiseEvent RegAtualizado
End Sub [ô]Atualizar
--------------------------------------------------
[ô]No FormA:
Private WithEvents evtClsProduto As ClsProduto
Private Sub evtClsProduto_RegAtualizado()
ADODC.Refresh
End Sub
--------------------------------------------------
[ô]Em algum lugar de FormB:
ClsProduto.Atualizar
[quote]Tentou colocar o ADODC.Refresh do FormA no enveto resize do form.
Desculpa. Não entendi.
Private Sub Form_Resize()
ADODC.Refresh
End Sub
Citação::
você tentou colocar no formA issoPrivate Sub Form_Resize()
ADODC.Refresh
End Sub
Qual a lógica de se fazer isso?
Editando:
Private Sub Form_Resize()
Pause 600 [ô]A função Pause não faz parte do VB6, foi desenvolvida à parte.
ADODC.Refresh
End Sub
Inserindo uma pausa de 600 ms antes do ADODC.Refresh faz o problema desaparecer. Mas não é uma boa solução, pois o tamanho da pausa pode depender do número de registros, da velocidade do computador e outros fatores que podem mudar mais tarde e o valor de 600 ms pode não ser suficiente.
Citação::
Bom supostamente toda vez qu o form receber o foco, o adodc do mesmo será atualizado, bom você testou? não funcionou?
A alteração produzida em FormB é mostrada em FormA mesmo que esse form não esteja com o foco.
Essa é uma das finalidades de se trabalhar com os eventos da classe.
Se você ainda não utiliza classes, experimente. é caminho sem volta, garanto.
outra coisa que eu indicaria seria o tipo de cursor, porém você também já descartou esta possibilidade.
porém com o pouco de conhecimento que possuo digo que a muito tempo não utilizo objetos ADODC ou DataControl, devido a este tipo de problema.
Citação::
Na realidade ja utilizo classes desde não me lembro mais, a finalidade é testar se a classe, ou algo no form possam estar impedindo a atualização, outra maneria seria desconectar e conectar novamente o ADODC, são [ô]n[ô] maneiras de se tentar resolver o problema.
[quote]
Não sei se reparou em uma das mensagens anteriores, mas eu editei para mostrar que inserindo uma pausa de 600 ms antes do Refresh resolve o problema, mas como comentei lá não considero uma boa solução.
[quote]a muito tempo não utilizo objetos ADODC ou DataControl, devido a este tipo de problema.
Como você faz para trabalhar com controles ligados a banco de dados? Que outras opções existem?
Tenho pouca prática em VB6, como se pode notar pelas minhas questões aqui no forum.
Poderia dar umas dicas?
Obrigado.