Como usar dois DataModule mudando em Runtime

04/03/2010

1

Bom dia amigos,

Preciso usar dois datamodule no meu sistema, a fim de fazer uma sincronização de dados entre duas bases.

Estou criando uma função que faz essa sincronização.

Minha dúvida é a seguinte:

Na função, queria criar duas variaveis, uma DMORIGEM e outra DMDESTINO, pois posso usar uma chamada diferente para alterar o conteúdo de ambas as variáveis.
Não estou conseguindo identificar o tipo de variavel que vai receber o nome real do DataModule.
Tentei Assim:

procedure sinc(nDirecao: integer);
var
   DmOrigem,DmDestino: TDataModule ;

begin

try
   if nDirecao = 0 then begin      // Envia do terminal para o servidor
      DmOrigem  := dmLocal    ;
      DmDestino := DM ;
   end else begin                  // Busca vendas, areceber e fiscal do servidor para o terminal
      DmOrigem  := DM ;
      DmDestino := dmLocal ;
   end;     

            TrsServer.TransactionID  := 333;
            TrsServer.IsolationLevel := xilReadCommitted;

*** Aqui não consegui ter acesso ao CONEXAO que é um SQLCONNECTION que está no DataModule

            dmDestino.Conexao.StartTransaction(TrsServer);

            TrsL.TransactionID       := 332;
            TrsL.IsolationLevel      := xilReadCommitted;

*** Aqui não consegui ter acesso ao CONEXAO que é um SQLCONNECTION que está no DataModule

            dmOrigem.conexao.StartTransaction(TrsL);


*** Aqui faço minhas instruções, mas também como mencionado não tenho acesso ao CLIENTDATASET e SQLDATASET contidos no DataModule

except

     

end;

end;

Grato pela atenção
Responder

Posts

04/03/2010

Junior Miranda

Não seria isso que vc precisa?
>var
  >MyConOrigem : TSqlConnection;
>begin
  >MyConOrigem := DataModule2.SQLConnection1;
  >MyConOrigem.StartTransaction(...);
>end;

Só uma idéia.
[]'s 
Responder

04/03/2010

Mario Inacio

Olá Junior,

Para ativar a transacao funcionou sim.

Mas ainda não consigo acessar meus ClientDataSet e SQLDataSet.


Responder
você não tem acesso aos objetos porque eles não existem na classe TDataModule.

pra resolver isso você tem duas opções:

1- cria uma classe com as definições comuns aos DM e os cria a partir dessa classe (e não de TDataModule); ou
   você cria um DM e chama-o de DMPai (será a classe TDMPai).
   nesse DMPai, você coloca todos os objetos comuns aos 2 DM's, que serão criados por herança.
   depois, na declaração da sua rotina, você terá
   DmOrigem,DmDestino: TDMPai;
   e terá acesso à todos os objetos ali contidos.

2- mantém como está e busca pelos objetos com o método FindComponent/FindControl
   procedure sinc(nDirecao: integer);
   var
      DmOrigem,DmDestino: TDataModule ;
   begin
      try
         if nDirecao = 0 then begin      // Envia do terminal para o servidor
            DmOrigem  := dmLocal;
            DmDestino := DM;
         end else begin                  // Busca vendas, areceber e fiscal do servidor para o terminal
            DmOrigem  := DM;
            DmDestino := dmLocal;
         end;

         TrsServer.TransactionID := 333;
         TrsServer.IsolationLevel := xilReadCommitted;

         TSQLConnection(dmDestino.FindComponent('Conexao')).StartTransaction(TrsServer);

         TrsL.TransactionID := 332;
         TrsL.IsolationLevel := xilReadCommitted;

         TSQLConnection(dmOrigem.FindComponent('Conexao')).StartTransaction(TrsL);

//       você terá de usar o FindComponent para todos os objetos
      except
      end;
   end;

sugiro a você optar pela opção 1. fica mais elegante, mais fácil, além de você poder compartilhar objetos, pode também compartilhar códigos entre os DM herdados.


Responder
você pode tentar outra coisa: faça o typecast usando um dos DMs criados (desde que esses DM's sejam idênticos):

procedure sinc(nDirecao: integer);
var
   DmOrigem,DmDestino: TDataModule;
begin
   try
      if nDirecao = 0 then begin      // Envia do terminal para o servidor
         DmOrigem  := dmLocal;
         DmDestino := DM;
      end else begin                  // Busca vendas, areceber e fiscal do servidor para o terminal
         DmOrigem  := DM;
         DmDestino := dmLocal;
      end;

      TrsServer.TransactionID := 333;
      TrsServer.IsolationLevel := xilReadCommitted;

      TDMLocal(dmDestino).Conexao.StartTransaction(TrsServer);

      TrsL.TransactionID := 332;
      TrsL.IsolationLevel := xilReadCommitted;

      TDMLocal(dmOrigem).Conexao.StartTransaction(TrsL);

//    e sucessivamente
   except
   end;
end;

note que eu usei o TDMLocal tanto para dmOrigem quanto para dmDestino. como eu disse, se os DM's forem idênticos quanto aos objetos inseridos, você poderá usar sempre a mesma classe como referência.
Responder

04/03/2010

Junior Miranda

De início, Pensei que o referido Dm era só de conexão. Estava para postar um complemento com uma terceira opção, quando vi a nova resposta do EMERSON E. DO NASCIMENTO(Mandou bem!!!). Agora fica por sua conta a escolha.

[]'s 
Responder