PROBLEMAS NA ATUALIZACAO DE UM REGISTRO

JALEXM 18/05/2012 10:41:05
#402237
Olá.
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.
LLAIA 18/05/2012 12:36:17
#402251
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
JALEXM 18/05/2012 14:22:38
#402261
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.
MARCELO.TREZE 18/05/2012 16:02:57
#402270
posta o código do formA em que usa o ADODC.Refdresh

Tentou colocar o ADODC.Refresh do FormA no enveto resize do form.

JALEXM 18/05/2012 16:29:48
#402274
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.
MARCELO.TREZE 18/05/2012 16:36:30
#402275
você tentou colocar no formA isso

Private Sub Form_Resize()
ADODC.Refresh
End Sub
JALEXM 18/05/2012 16:44:46
#402278
Citação:

:
você tentou colocar no formA isso

Private 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.
MARCELO.TREZE 18/05/2012 17:41:11
#402286
Bom supostamente toda vez qu o form receber o foco, o adodc do mesmo será atualizado, bom você testou? não funcionou?
JALEXM 18/05/2012 17:54:39
#402289
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.
MARCELO.TREZE 18/05/2012 18:30:49
#402295
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.

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.





JALEXM 18/05/2012 22:07:24
#402305
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.
Tópico encerrado , respostas não são mais permitidas