Fórum Atualização Sincronizada #244587

27/07/2004

0

Olá a Todos,

Desenvolvi um sistema Client/Servidor, e para q o sistema faça uma atualização sincronizada, ou seja a hora q alguém adiciona algum registro é atualizado na mesmo hora para os outros usuários. Para isso criei uma Tabela Auxiliar (TableAux) com dois campos, uma para o Nome da tabela q irei atualizar (TableName) e outro com a Data e Hora para Atualizar (UpdateDateTime).


Desenvolvi a seguinte rotina :


Variáveis Globais:
ErroTransacao : Boolean;

// ************* Transações *************** //

function TDMprinc.IniciarTransacao(aValorTransacao : Integer) : Boolean;
begin
try
Transacao.TransactionID := aValorTransacao;
Transacao.IsolationLevel := xilREPEATABLEREAD; // Só aqui q estou em Dúvida ....
Conexao.StartTransaction(Transacao);
Result := True;
ErroTransacao := Result;
except
Result := false;
ErroTransacao := Result;
end;
end;

procedure TDMprinc.FinalizarTransacao;
var
Msg : PAnsiChar;
begin
try
if (ErroTransacao <> False) then Conexao.Commit(Transacao);
except
on Exc:Exception do
begin
Msg := Pchar(´Ocorreu um erro na Transação do registro: ´ + Exc.Message);
Application.MessageBox(Msg, ´Transações´,mb_ok+mb_iconError);
Conexao.Rollback(Transacao);
end;
end;
end;

function TDMprinc.UpdateSystem(aTabela : String) : Boolean;
var
DataBanco : String;
begin
with qUpdate do
begin
Close;
SQL.Clear;
SQL.Add(´SELECT * FROM TableAux´);
SQL.Add(´WHERE UpdateDateTime > :DataHora´);
SQL.Add(´AND TableName = :NomeTable´);
///// ************************************************** //////
if (aTabela = ´Clientes´) then
Params[0].AsString := DateTimeToStr(DataHoraClientes);
if (aTabela = ´Generos´) then
Params[0].AsString := DateTimeToStr(DataHoraGeneros);
if (aTabela = ´Fitas´) then
Params[0].AsString := DateTimeToStr(DataHoraFitas);
if (aTabela = ´Compras´) then
Params[0].AsString := DateTimeToStr(DataHoraCompras);
if (aTabela = ´Locação´) then
Params[0].AsString := DateTimeToStr(DataHoraLocacao);
if (aTabela = ´Devolução´) then
Params[0].AsString := DateTimeToStr(DataHoraDevolucao);
///// ************************************************ //////
Params[1].AsString := aTabela;
Prepared := true;
Open;
DataBanco := FindField(´UpdateDateTime´).AsString;
Close;
end;
if (DataBanco <> ´´) then
begin
IniciarTransacao(1); // Inicar Transação
With qUpdate do
begin
SQL.Clear;
SQL.Add(´UPDATE TableAux ´);
SQL.Add(´SET UpdateDateTime = :UpdateDateTime ´);
SQL.Add(´WHERE TableName = :NomeTable´);
Params[0].AsDateTime := Now;
Params[1].AsString := aTabela;
ExecSQL;
end;
FinalizarTransacao; // Finalizar Transação
Result := true;
end
else
Result := false;
end;
// ****************** Transações - FIM - ****************** //


Modo de Utilizar, na tela q achar necessário utilizar um componente Ttimer.

Evento OnTimer (TTimer) :

if (DMprinc.UpdateSystem(´Clientes´) = True) then
begin
DMprinc.CDSClientes.Close;
DMprinc.CDSClientes.Open;
DMprinc.CDSClientes.Last;
MostrarDados;
end;


Gostaria q comentassem, sugestões. Utilizei os Componentes dbExpress e TclientDateSet.
Banco de Dados FIREBIRD.

Grato,

Christian.


Christian_adriano

Christian_adriano

Responder

Posts

27/07/2004

Rômulo Barros

[color=red:4ee18878b5][b:4ee18878b5]Respondendo:[/b:4ee18878b5][/color:4ee18878b5] :P :P :P

Modo de Utilizar, na tela q achar necessário utilizar um componente Ttimer. Evento OnTimer (TTimer) : if (DMprinc.UpdateSystem(´Clientes´) = True) then begin DMprinc.CDSClientes.Close; DMprinc.CDSClientes.Open; DMprinc.CDSClientes.Last; MostrarDados; end;


Cara, acho péssimo a opção de ficar ´abrindo´ e ´fechando´ sua Query em um ´Timer´. Deveremos ´abrir´ e ´fechar´ a tabela somente quando houver, realmente, modificações nas tabelas, fazendo com que todos os usuários atualizem-se. Já fiz algo parecido e o pessoal do clubedelphi me ajudou bastante, principalmente o ´Aroldo Zanela´. Para isso, utilizei o componente ShellChangeNotify da Paleta ´Samples´. Para mais detalhes deste componente, entre em contato comigo.

Veja Também: http://delphiforum.icft.com.br/forum/viewtopic.php?t=43877


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar