Fórum Criação de componentes em RealTime na parte servidora #390685
17/11/2010
0
Como faço em uma aplicação datasnap para criar componentes em Realtime na parte Servidora. Normalmente criamos na parte servidora todos os Sqldataset e SqlProvider, e na parte cliente lligamos via TDSProviderConnection os ClientDataset referentes a cada tabela.
O problema é : Se temos 100 tabelas no banco teríamos que ter na aplicação servidora 100 SqlDataSet e 100 DataSetProvider (200 componentes espalhados em um ou vários DataModules), um volume muito grande para organizar visualmente.
No aguardo,
Jorge
Jorge Silva
Curtir tópico
+ 0Posts
18/11/2010
Rodrigo Mourão
Gostei + 0
18/11/2010
Jorge Silva
Pelo que entendi na primeira opção teria só um TSqlDataSet e um TDataSetProvider fixos na aplicação Server e todos os comandos Sql seriam inseridos via ClientDataSet criados em Realtime no lado Client, Pelo que entendi seria somente uma ligação para todos os TClientdataSet e seus comandos.
Perguntas:
1º Opção
Em uma aplicação com vários TClientdataSet e varias instruções SQL, sendo executadas ao mesmo tempo, o componente do lado Server não ficariam sobrecarregados ocasionando perca de performance ou até mesmo erro de informações ? Pós a maioria das telas tem varias tabelas sendo exibidas e manipuladas ao mesmo tempo.
2º Opção
Esta rotina de criação de componentes seria comandada pela aplicação cliente?
Se resposta é sim acho que seria a melhor maneira de faze-lo, mesmo dando um pouco mais de trabalho ficaria de melhor entendimento para manutenções futuras.
Como posso fazer esta rotina ?
Obrigado,
Jorge
Gostei + 0
18/11/2010
Rodrigo Mourão
Sobre a primeira pergunta não teria este tipo de problemas por mais que vc tenha vários CDS somente um por vez poderá executar o comando. Outro detalhe e ai esta o pulo do gato é que os componentes DBX são nidirecionais, não fazem cahce de dados, ou seja, recebe, executa, retorna e fim de papo, parte para outra.
Agora quando a segunda opção os componentes seriam criados dinamicamente no servidor. Bem eu sempre digo que temos mil maneiras de preparar Neston, invente uma. Assim é com o Delphi.
Uma sugestão que lhe dou seria criar um tabela, não precisa ser exatamente como estou falando, mas é uma Ideia.
TBL_DATASET
DATASETID
NAME
COMMAND
A ideia seria ter em uma tabela a relação de todos os datasets a serem criados, um ID, o Nome e o commando Sql dele. Feito isso no create do DataModule por exemplo ou do ServerModule vc faria um select nesta tabela e para cada linha retornada criaria o SqlDataSet e o Provider. Exemplo:
var
DataSet: TSqlDataSet;
Provider: TDataSetProvider
begin
Qry.First; //suponha que qry e um componente com o seguinte select (select * from TBL_DATASET)
while not Qry.Eof do
begin
DataSet := TSqlDataSet.Create(Self)
DataSet.SqlConnection := SqlConnection;
DataSet.Name := 'sql_'+Qry.FieldByName('NAME').asString;
DataSet.CommandText := Qry.FieldByName('COMMAND').asString;
Provider := TDataSetProvider.Create(Self);
Provider .Name := 'dsp_'+Qry.FieldByName('NAME').asString;
Provider .DataSet := DataSet;
RegisterProvider(Provider);
Qry.Next;
end;
end;
Confesso que pode ter ficado meio confuso mas estou sem o Delphi aqui no momento mas é apenas uma ideia, vou tentar montar o codigo mais coeso para que possa ter uma ideia melhor.
RM
Gostei + 0
22/11/2010
Jorge Silva
Cara ficou meio nebuloso, dá uma clareada ai.
Normalmente faço meu neston assim: Quando crio o form, no mesmo comando eu conecto,crio os SqlDataSet, Provider, TClientdataSet faço as ligações e conecto com o data source que é o único que já existe e já está no form já conectado com o componente visual. Esse seu neston ficaria parecido com esse ? seria executado no momento da requisição/criação do form ? Diz ai Jorge
Gostei + 0
23/11/2010
Rodrigo Mourão
Para a criação dinamica do lado do servidor ficaria algo assim:
var
xDataSet: TSqlDataSet;
xProvider: TDataSetProvider;
begin
sqlDataSets.First;
while not sqlDataSets.Eof do
begin
xDataSet := TSQLDataSet.Create(Self);
xDataSet.Name := 'sql_'+sqlDataSets.Fields[1].AsString;
xDataSet.SQLConnection := SCMain.DBDataSnap;
xDataSet.CommandText := sqlDataSets.Fields[2].AsString;
DataSet.Add(xDataSet.Name,xDataSet);
xProvider := TDataSetProvider.Create(Self);
xProvider.Name := 'dsp_'+sqlDataSets.Fields[1].AsString;
xProvider.DataSet := xDataSet;
Provider.Add(xProvider.Name, xProvider);
RegisterProvider(xProvider);
end;
end;
Isso no OnCreate de um Server Methos. No link abaixo tem os fontes.
http://www.rodrigocarreiro.com.br/wp-content/uploads/2010/11/Server.zip
Qualquer dúvida estou às ordens.
Abs!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)