Código
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!
Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009