Como usar dois DataModule mudando em Runtime
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
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
Curtidas 0
Respostas
Junior Miranda
04/03/2010
Não seria isso que vc precisa?
>var
>MyConOrigem : TSqlConnection;
>begin
>MyConOrigem := DataModule2.SQLConnection1;
>MyConOrigem.StartTransaction(...);
>end;
Só uma idéia.
[]'s
>var
>MyConOrigem : TSqlConnection;
>begin
>MyConOrigem := DataModule2.SQLConnection1;
>MyConOrigem.StartTransaction(...);
>end;
Só uma idéia.
[]'s
GOSTEI 0
Mario Inacio
04/03/2010
Olá Junior,
Para ativar a transacao funcionou sim.
Mas ainda não consigo acessar meus ClientDataSet e SQLDataSet.
Para ativar a transacao funcionou sim.
Mas ainda não consigo acessar meus ClientDataSet e SQLDataSet.
GOSTEI 0
Emerson Nascimento
04/03/2010
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.
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.
GOSTEI 0
Emerson Nascimento
04/03/2010
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.
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.
GOSTEI 0
Junior Miranda
04/03/2010
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
[]'s
GOSTEI 0