INFORMAR SE UMA TABELA FOI MODIFICADA...

XYKOVIEIRA 19/04/2012 12:21:21
#400227

Olá amigos.
Num (pequeno) project que estou desenvolvendo, preciso criar uma rotina que verifique, após o usuário
acessar um determinado form e clicar em saída (unload), se a tabela foi alterada ou não.
Ex.: o usuário acessa o form, dá uma olhada geral mas não promove nenhuma alteração (seja edição,
exclusão ou inclusão de registros). Num segundo exemplo, o usuário faz uma edição de um registro
corrente qualquer, promovendo então uma alteração nos dados da tabela...
Em qualquer um dos casos, uma msgbox informaria se [Ô]os dados foram alterados[Ô] ou [Ô]os dados foram
mantidos sem alteração[Ô]
No evento <Unload> do form, eu colocaria uma rotina de procedimento para o caso de alteração da tabela,
ou então simplesmente descarregaria o form, no caso de a tabela não ter sido alterada...
Se alguém puder passar uma dica, eu agradeço.
Xyko.
ADILSOO 19/04/2012 12:45:23
#400230
Aew bão?, então, certamente pra fazer qualquer alteracão/Exclusão/Inclusão na tabela voce tem um CommandButton certo?, nesse caso voce pode criar uma tabela a parte e ex:

Botão alterar: voce faz a alteracao e logo em seguida voce grava na tabela a parte ex:

[txt-color=#0000f0]No dia DATA ás HORA o USUARIO fez a alteracao do funcionario JOAO para MARCIO.[/txt-color]

e voce faz isso nos outros botoes, de acordo com a funcao de cada um, ficara tudo gravado quem fez oque no seu BD, e posteriormente voce podera até fazer um relatório das movimentacoes...

até...
FILMAN 19/04/2012 12:47:03
#400232
No meu ver seria interessante vc criar uma tabela que controlaria isso de acordo com o usuario

EX.
TbUser
-[codUSER_ID - auto-num]
-[nome - texto]
-[senha - texto]

TbAlteracoes
-[codALT_ID - auto-num]
-[codUSER_ID - numero] sera relacionado com a tabela de usuarios
-[Alterar - Texto(SIM/NAO) ou Numero(0/1)]
-[Deletar - Texto(SIM/NAO) ou Numero(0/1)]
-[Incluir - Texto(SIM/NAO) ou Numero(0/1)]
-[Data - Date/Time]

Ai ao invés de ser no UNLOAD do FORM vc faz no processo da execução
Ex.
Se o usuário Abrir o FORM de ALTERAÇÃO alterar e confirmar a auteração faz a alteração na tabAlterações de acordo com o usuário

é um exemplo mais da pra ser melhor! só estou dando uma ideia.

Outra forma seria uma variavel global ou até mesmo um TextBox oculto no form
quando o form é inicializado inicia com zero ai no botão de alteração, inserção, exclusão mude para 1 ai
no unload do form respectivo verifica se esta como 1 e mostra a msg

tambem é uma outra forma mais cada um interpreta e descreve da forma que mais lhe convêm


espero ter ajudado
AJSO 19/04/2012 12:57:56
#400234
Caro pode controlar por trigger de sua tabela

INSERT UPDATE DELETE dá para monitorar qq desses comandos.


Boa sorte
XYKOVIEIRA 19/04/2012 15:28:38
#400263
O form possui no menu o comando <Sair> que remete para a rotina descrita no próximo segmento (Unload)

Private Sub mnuSair_Click()
If MsgBox([Ô]Confirma sair ?[Ô], vbYesNo + vbQuestion) = vbNo Then
Exit Sub
Else
Unload Me
End If
End Sub


Private Sub Form_Unload(Cancel As Integer)
Dim FSO As New FileSystemObject
[ô]Se as pastas no destino estiverem sem dados:
If Dir([Ô]C:\Safe Database\Livros.mdb[Ô]) = [Ô][Ô] And Dir([Ô]B:\Safe DataBase\Livros.mdb[Ô]) = [Ô][Ô] Then
FSO.CopyFile [Ô]c:\Program Files (x86)\Livros.mdb[Ô], [Ô]c:\Safe DataBase\[Ô], True
FSO.CopyFile [Ô]c:\Program Files (x86\Livros.mdb[Ô], [Ô]b:\Safe DataBase\[Ô], True
MsgBox [Ô]Atenção! As cópias de segurança foram geradas com êxito...[Ô] & vbNewLine & vbNewLine & _
[Ô]Local dos arquivos de segurança < C:\Safe DataBase\*.mdb> e < B:\Safe DataBase\*.mdb >[Ô], vbInformation + vbOKOnly
Tabela.Close
Banco.Close
Set Banco = Nothing
Exit Sub
Else
[ô]Se as pastas no destino estiverem com dados:
Kill [Ô]C:\Safe DataBase\Livros.mdb[Ô]
Kill [Ô]b:\Safe DataBase\livros.mdb[Ô]
FSO.CopyFile [Ô]c:\Program Files (x86)\Livros.mdb[Ô], [Ô]c:\Safe DataBase\[Ô], True
FSO.CopyFile [Ô]c:\Program Files (x86)\Livros.mdb[Ô], [Ô]b:\Safe DataBase\[Ô], True
MsgBox [Ô]Atenção! As cópias de segurança foram geradas com êxito...[Ô] & vbNewLine & vbNewLine & _
[Ô]Local dos arquivos de segurança:[Ô] & vbNewLine & [Ô] < C:\Safe DataBase\*.mdb >[Ô] & vbNewLine & _
[Ô] < B:\Safe DataBase\*.mdb >[Ô], vbInformation + vbOKOnly
Tabela.Close
Banco.Close
Set Banco = Nothing
Exit Sub
End If
End Sub

O que eu estou tentando fazer é interromper a gravação dos arquivos de segurança, caso o usuário não tenha alterado
nenhum dado quando acessou o form. Ajso, onde eu colocaria os controles que vc citou, no exemplo acima?
Tô meio perdido, ainda.
Xyko
ADEMILSON 19/04/2012 16:24:49
#400274
Resposta escolhida
Declare uma variável do tipo Boolean ex. TabelaAlterada;
No load dos forma mude o estado da variavel para False;
Ao clicar no botão gravar ou executar uma rotina de gravação mude o estado da variável para True;

Quando o form fechar vc verifica o estado da variável, se for true houve alteração, se for false não houve alteração.
FILMAN 19/04/2012 17:19:55
#400282
Cara vê se te ajuda a esclarecer
XYKOVIEIRA 19/04/2012 17:45:18
#400284

Valeu amigos!
Utilizei a [ô]deixa[ô] do Ademilson, declarando uma variável global como boolean, referenciando-a no evento <Load> como <False>, e nos eventos
<Gravar> e <Excluir> como <True>. Finalmente, no evento <Unload>, complementei o código conforme segue:

[txt-color=#007100]If TabChanged = True And Dir([Ô]C:\Safe Database\Livros.mdb[Ô]) = [Ô][Ô] And Dir([Ô]B:\Safe DataBase\Livros.mdb[Ô]) = [Ô][Ô] Then
FSO.CopyFile [Ô]c:\Program Files (x86)\Livros.mdb[Ô], [Ô]c:\Safe DataBase\[Ô], True
FSO.CopyFile [Ô]c:\Program Files (x86)\livros.mdb[Ô], [Ô]b:\Safe DataBase\[Ô], True
Else
Exit Sub[/txt-color]

Deu certo...
Agradeço imensamente a prestimosa colaboração dos colegas do forum.
Xyko.

Melhor do que sua presença ser notada, é sua ausência ser sentida...[c] [txt-color=#007100] [/txt-color]
FOXMAN 19/04/2012 17:55:54
#400285
Citação:

:
Caro pode controlar por trigger de sua tabela

INSERT UPDATE DELETE dá para monitorar qq desses comandos.


Boa sorte



Este seria um dos mais corretos procedimentos caso não houvesse a necessidade de informar ao usuario.
Eu tbem adotaria essa opção.

No entanto, eu tive que fazer algo semelhante, porém em vb.net, e neste caso eu utilizei a propriedade TAG de cada campo para armazenar o valor inicial dos campos.
Ao perder o foco do objeto eu lanço uma comparação entre o objeto e sua TAG, caso haja diferença eu habilito o SALVAR.

Este era um dos meus problemas tbem, porém desenvolvi esta técnica que me ajudou a controlar estas alterações.

Tópico encerrado , respostas não são mais permitidas