Como usar dois DataModule mudando em Runtime
04/03/2010
0
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
Mario Inacio
Posts
04/03/2010
Junior Miranda
>var
>MyConOrigem : TSqlConnection;
>begin
>MyConOrigem := DataModule2.SQLConnection1;
>MyConOrigem.StartTransaction(...);
>end;
Só uma idéia.
[]'s
04/03/2010
Mario Inacio
Para ativar a transacao funcionou sim.
Mas ainda não consigo acessar meus ClientDataSet e SQLDataSet.
04/03/2010
Emerson Nascimento
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.
04/03/2010
Emerson Nascimento
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.
04/03/2010
Junior Miranda
[]'s
Clique aqui para fazer login e interagir na Comunidade :)