INFORMAR SE UMA TABELA FOI MODIFICADA...
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.
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é...
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é...
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
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
Caro pode controlar por trigger de sua tabela
INSERT UPDATE DELETE dá para monitorar qq desses comandos.
Boa sorte
INSERT UPDATE DELETE dá para monitorar qq desses comandos.
Boa sorte
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
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
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.
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.
Cara vê se te ajuda a esclarecer
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]
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