Buscar

Atualizando e salvando tabelas em rede

Código

Depois de muita procura e testes........ foi desta forma que encontrei a melhor forma de salvar e atualizar meus registros em rede, sem perda de dados e confiabilidade.

Se alguem conhece forma melhor. por favor pode corrigir ou dar uma ideia .

Mas é totalmente funcional, testei em rede e funciona muito bem. Quem quizer posso enviar por email o programa demonstrativo com codigo fonte.

Vai precisar do  Componente mdVCL mas tem o link abaixo.
 
email: emanuelhard@hotmail.com

Atualizando Tabelas em Rede




Este é Texto foi adaptado por mim, Emanuel Vinicius Técnico em Informática Industrial - email:emanuelhard@hotmail.com Para atualização de tabelas paradox em rede.

O texto original esta no final, trabalhado com InterBase. Feito por André Luiz de Souza Fernandes, Técnico em Processamento de Dados, dono do site GSoftWares.COM e responsável pelo projeto OpenSource de Portais PHP CPGNUKE no Brasil.Contato suporte@gsoftwares.com

configure o alias no DBE . Alias - nome no TDatabase


Acompanhe os passos abaixo para fazer com que esse componente funcione em seus programas:
   OBS o Componente mdVCL já está junto a pasta descompacta e siga o passo a passo

1- Baixe a última versão desse componente no site do Autor Martin Djernæs
http://www.djernaes.dk/martin  ou diretamente pelo link http://djernaes.dk/martin/vcl.html#TmdMailSlot
    2- Depois instale o componente no seu Delphi, clique no menu "Component" Item "Install Component" selecione a Unit mdMailSlot.pas e Instale.
    3- A paleta mdVCL vai aparecer na barra de ferramentas do Delphi com os seguintes componentes:
 
 

    Neste artigo vamos usar tabelas paradox com os componentes TTABLE, TDATABASE mas poderíamos usar qualquer tipo de banco de dados ou componentes e adaptar o código deste artigo sem problemas.
    Depois insira no DataModule do seu programa o componente mdMailSlot.
    Na propriedade Slot do componente, insira o nome do seu programa, isso fará com que ele troque mensagens somente com outros programas que tenham o mesmo nome na propriedade Slot do componente.
    Não use nomes muito grandes ou com espaçamentos!
    Defina a propriedade Active do componente para True.
    No Evento OnMessageAvail insira o código que vai receber a mensagem:

  mdMailSlot1.Active := False;
  If Msg = 'AtualizarBDs' Then
    RedeAtualizaDados.Execute;
  mdMailSlot1.Active := True;

    Insira um componente ActionList no DataModulo e crie 2 actions, um com o nome RedeAtualizaDados e o outro com o nome RedeGravaDados.
    No evento OnExecute do Action RdeAtualizaDados insira o seguinte código:

procedure Tdm.RdeAtualizaDadosExecute(Sender: TObject);
Var
 AtualizaDataSet: Integer;
 reg:string;
  begin
  For AtualizaDataSet := 0 To dtbase.DataSetCount -1 Do

   If (dtbase.DataSets[AtualizaDataSet] Is TTable) And   dtbase.DataSets[AtualizaDataSet].Active And
    (dtbase.DataSets[AtualizaDataSet].State In [dsBrowse]) Then

     (dtbase.DataSets[AtualizaDataSet] As TTable).Refresh;

    form1.Label2.Caption:='Atualizado'
   end;

procedure Tdm.RdeGravaDadosExecute(Sender: TObject);
Var
 GravaDataSet: Integer;
 Reg:string;
Begin
 For GravaDataSet := 0 To dtbase.DataSetCount -1 Do
  If   (dtbase.DataSets[GravaDataSet] Is TTable) Then
   If dtbase.DataSets[GravaDataSet].Active Then
    Begin
     If (dtbase.DataSets[GravaDataSet] As TTable).State In [DsBrowse] Then
      Begin

        (dtbase.DataSets[GravaDataSet] as TTable).ApplyUpdates;
        (dtbase.DataSets[GravaDataSet] As TTable).Refresh;
        SendToMailSlot('*', mdMailSlot1.Slot, 'AtualizarBDs');
        form1.Label1.Caption:='Gravado';
      End;
 End;
End;

Agora Insira o comando abaixo nos eventos AfterPost e AfterDelete de suas tabelas
 
    RdeGravaDados.Execute;

procedure Tdm.tbbaseAfterPost(DataSet: TDataSet);
Begin

tbbase.FlushBuffers;

RdeGravaDados.Execute;
dbisavechanges(tbbase.handle);

tbbase.Close;
tbbase.open;

 // Propriedade da tabela CachedUpdate:=True
end;

No botão de salvar coloque assim

procedure TForm1.Button3Click(Sender: TObject);
begin
dm.tbbase.Refresh;
dm.tbbase.Close;
dm.tbbase.open;

dm.tbbase.Append;
dm.tbbase.FieldByName('Nome').asstring:=edit1.text;
dm.tbbase.post;
end;
 

Atualiza Tabelas do Interbase

Este artigo demonstra como atualizar as tabelas de dados na rede sem usar timer.
Para quem não conhece o componente TmdMailSlot, acesse meu artigo anterior no link...
    Clique Aqui !
    Acompanhe os passos abaixo para fazer com que esse componente funcione em seus programas:
    1- Baixe a última versão desse componente no site do Autor Martin Djernæs
http://www.djernaes.dk/martin  ou diretamente pelo link http://djernaes.dk/martin/vcl.html#TmdMailSlot
    2- Depois instale o componente no seu Delphi, clique no menu "Component" Item "Install Component" selecione a Unit mdMailSlot.pas e Instale.
    3- A paleta mdVCL vai aparecer na barra de ferramentas do Delphi com os seguintes componentes:
 
 
    Neste artigo vamos usar tabelas do Interbase com os componentes IBDataBase, IBTransaction, IBTable e IBQuery mas poderíamos usar qualquer tipo de banco de dados ou componentes e adaptar o código deste artigo sem problemas.
    Depois insira no DataModule do seu programa o componente mdMailSlot.
    Na propriedade Slot do componente, insira o nome do seu programa, isso fará com que ele troque mensagens somente com outros programas que tenham o mesmo nome na propriedade Slot do componente.
    Não use nomes muito grandes ou com espaçamentos!
    Defina a propriedade Active do componente para True.
    No Evento OnMessageAvail insira o código que vai receber a mensagem:

  mdMailSlot1.Active := False;
  If Msg = 'AtualizarBDs' Then
    RedeAtualizaDados.Execute;
  mdMailSlot1.Active := True;

    Insira um componente ActionList no DataModulo e crie 2 actions, um com o nome RedeAtualizaDados e o outro com o nome RedeGravaDados.
    No evento OnExecute do Action RedeAtualizaDados insira o seguinte código:

Var AtualizaDataSet: Integer;
Begin
  For AtualizaDataSet := 0 To IBDatabase1.DataSetCount -1 Do
  If (IBDatabase1.DataSets[AtualizaDataSet] Is TIBTable) And   IBDatabase1.DataSets[AtualizaDataSet].Active And
(IBDatabase1.DataSets[AtualizaDataSet].State In [dsBrowse]) Then
    (IBDatabase1.DataSets[AtualizaDataSet] As TIBTable).Refresh
  Else
    If (IBDatabase1.DataSets[AtualizaDataSet] Is TIBQuery) And   IBDatabase1.DataSets[AtualizaDataSet].Active And
    (IBDatabase1.DataSets[AtualizaDataSet].State In [dsBrowse]) Then
    Begin
    (IBDatabase1.DataSets[AtualizaDataSet] As TIBQuery).Close;
    (IBDatabase1.DataSets[AtualizaDataSet] As TIBQuery).Open;
End;

    No evento OnExecute do Action RedeGravaDados insira o seguinte código:
 
Var GravaDataSet: Integer;
Begin
  For GravaDataSet := 0 To IBDatabase1.DataSetCount -1 Do If   (IBDatabase1.DataSets[GravaDataSet] Is TIBTable) Then
  If IBDatabase1.DataSets[GravaDataSet].Active Then
  Begin
    If (IBDatabase1.DataSets[GravaDataSet] As TIBTable).State In [DsBrowse] Then
    Begin
      (IBDatabase1.DataSets[GravaDataSet] As TIBTable).ApplyUpdates;
      If IBTransaction1.InTransaction Then IBTransaction1.CommitRetaining;
       (IBDatabase1.DataSets[GravaDataSet] As TIBTable).Refresh;
        SendToMailSlot('*', mdMailSlot1.Slot, 'AtualizarBDs');
    End;
  End;
End;

    Agora Insira o comando abaixo nos eventos AfterPost e AfterDelete de suas tabelas
 
    RedeGravaDados.Execute;
 
    Pronto, sua aplicação vai atualizar automaticamente as tabelas na rede somente quando houver a necessidade real.
    Sou André Luiz de Souza Fernandes, Técnico em Processamento de Dados, dono do site GSoftWares.COM e responsável pelo projeto OpenSource de Portais PHP CPGNUKE no Brasil.Contato suporte@gsoftwares.com
Um forte abraço a todos!


 

Publicidade

Vote na dica




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes da dica

Categoria: Rede
Adicionada dia: 22/03/07
Por: Emanuel Vinicius De Jesus Silva Gomes
Visualizada: 12168 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009