Passar parâmetros para o Servidor de Aplicação
Meu servidor de aplicação constrói todas as instruções SQL que eu preciso utilizar. No Client eu preciso apenas passar parâmetros. Antes eu executa~va tudo no client, passando inclusive o CommandText dos CDS o que me desaconselharam a fazê-lo. Eu também não gostaria disso. Quero apenas as instruções das querys no SA e os clients passando apenas parâmetros. Tentei usar o AppServer do Objeto SocketConnection, mas não estou conseguindo concluir. Minhas funções eu passo assim:
function PegaVendedor(Cod:Integer):String;
begin
if not ConGeral.Connected then
ConGeral.Open;
Result := ConGeral.AppServer.ExecFuncao(PEGA_VENDEDOR,IntToStr(Cod));
end;
Essa função é executada do Client. Está funcionando bem. ExecFuncao é um método criado no RDM principal para executar todas as funções no meu servidor. Esse modelo é legal e bem funcional. Só preciso passar parâmetros para as minhas querys que eu não estou conseguindo. Devo criar mais um método? Como eu faria?Paulo
Curtidas 0
Respostas
Comodelphi
07/07/2008
vc defininiu uma interface no RDM?
GOSTEI 0
Paulo
07/07/2008
Sim. Esse modelo funciona. Eu só não quero mais é passar CommandText do Client para o Server, só isso. Hoje eu passo, mas como funciona em uma rede local, o impacto é pequeno.
GOSTEI 0
Comodelphi
07/07/2008
então se já tem uma interface definida com função implementada e tudo, vc passa os parametros normal. o que a sua funcao faz??? é parar abrir a query???? posta a interface implementada do RDM
GOSTEI 0
Luiz Henrique
07/07/2008
Boa Noite Paulo, tudo blz.
So confirmando, vc usa Cliente->BSS->Servidor Aplicacao , OK.
Nao sei se entendi direito, voce nao esta conseguindo concluir esta funcao que indicou ai ?
PEGA_VENDEDOR e uma especie de constante/ID para a funcao ?, para este exemplo ai, parece ser apenas um retorno do nome do vendedor.
Note que vc esta executando esta funcao do RDM Principal.
Declare um metodo no RDM Principal pela TypeLibrary.
Nome: ExecFuncao
Retorno: WideString
Parametro: id_vendedor: WideString(pelo que vc declarou)
//* TClassePrincipal seria o teu RDM Principal
function TClassePrincipal.ExecFuncao(const id_vendedor: WideString): WideString;
begin
//...aqui poderia fazer este codigo de varias formas, CDS, Qry...e etc
//...exemplifico com um classico que nao deve ser usado no cliente e sim
//...aqui no Servidor. Local de SQL é no Servidor.
cdsVendedor.Close;
cdsVendedor.CommandText:= ´SELECT NOME FROM VENDEDOR WHERE ID= ´+id_vendedor;
cdsVendedor.Open;
if cdsVendedor.RecordCount > 0 then
result:= cdsVEndedor.FieldByName(´NOME´).AsString
else
result:= ´´
//2 Exemplo
...um cds
end;
Existem varias formas de voce passar estes parametros e ate criar Queries dinamicas no Servidor.
Neste teu exemplo ai, o mais indicado seria voce fazer pelo modo mais apropriado, que seria atraves de CDS no cliente(devidamente configurado, RemoteServer/ProviderName para o RDM-Servidor), seta Parametro(naturamente o ID-Vendedor) e CDS.Open...
Para queries em geral e nao ter que ficar alterando na Type Library, a inclusao por exemplo de + um parametro, vc pode usar um array of OleVariant como parametro [vdatai, vdataf, CodCliente]...tem que encapsular este array em um OleVariant para passar ao servidor, no servidor vc acessa Parametro[0], parametro[1] e etc....
Desculpe se nao era isto, questione ai novamente para trocarmos este conhecimento ai.
Espero que ajude al alguma coisa
T+
Abraco , t+
So confirmando, vc usa Cliente->BSS->Servidor Aplicacao , OK.
Nao sei se entendi direito, voce nao esta conseguindo concluir esta funcao que indicou ai ?
PEGA_VENDEDOR e uma especie de constante/ID para a funcao ?, para este exemplo ai, parece ser apenas um retorno do nome do vendedor.
Note que vc esta executando esta funcao do RDM Principal.
Declare um metodo no RDM Principal pela TypeLibrary.
Nome: ExecFuncao
Retorno: WideString
Parametro: id_vendedor: WideString(pelo que vc declarou)
//* TClassePrincipal seria o teu RDM Principal
function TClassePrincipal.ExecFuncao(const id_vendedor: WideString): WideString;
begin
//...aqui poderia fazer este codigo de varias formas, CDS, Qry...e etc
//...exemplifico com um classico que nao deve ser usado no cliente e sim
//...aqui no Servidor. Local de SQL é no Servidor.
cdsVendedor.Close;
cdsVendedor.CommandText:= ´SELECT NOME FROM VENDEDOR WHERE ID= ´+id_vendedor;
cdsVendedor.Open;
if cdsVendedor.RecordCount > 0 then
result:= cdsVEndedor.FieldByName(´NOME´).AsString
else
result:= ´´
//2 Exemplo
...um cds
end;
Existem varias formas de voce passar estes parametros e ate criar Queries dinamicas no Servidor.
Neste teu exemplo ai, o mais indicado seria voce fazer pelo modo mais apropriado, que seria atraves de CDS no cliente(devidamente configurado, RemoteServer/ProviderName para o RDM-Servidor), seta Parametro(naturamente o ID-Vendedor) e CDS.Open...
Para queries em geral e nao ter que ficar alterando na Type Library, a inclusao por exemplo de + um parametro, vc pode usar um array of OleVariant como parametro [vdatai, vdataf, CodCliente]...tem que encapsular este array em um OleVariant para passar ao servidor, no servidor vc acessa Parametro[0], parametro[1] e etc....
Desculpe se nao era isto, questione ai novamente para trocarmos este conhecimento ai.
Espero que ajude al alguma coisa
T+
Abraco , t+
GOSTEI 0
Paulo
07/07/2008
Me desculpe por não ser muito explícito. Passar parâmetros para uma função eu consigo. Todo o meu sistema se baseia em função no servidor. Eu queria era rodar uma query, um select simples. Esse select tem ParamByName e eu não estou conseguindo passa um Edit1.Text como parâmetro para esse select sem que seja por função. Como essa função me retorna um range de dados, prefiro fazer o select no servidor e via Provider ter esse resultado em meu grid no client. Essa função eu postei apenas para dizer que dessa forma funciona e dei exemplo da minha PEGA_VENDEDOR. Tenho mais de 200 funções sendo executada no server e funcionando bem.
GOSTEI 0
Luiz Henrique
07/07/2008
Bom dia Paulo, sussegado...
Para ficar mais claro, Paulo, voce teria é que postar algo mais concreto...
Por exemplo, a instrucao SQL que deseja executar no servidor, que voce nao consegue passar ou configurar parametro para ela...
...e tambem se possivel a forma que deseja executar no lado Cliente...
Ai poderemos analisar melhor...
Ah...nao esqueca de dizer qual o componente de acesso que esta utilizando tambem...lado cliente (executar ou receber) e lado servidor...
T+
Para ficar mais claro, Paulo, voce teria é que postar algo mais concreto...
Por exemplo, a instrucao SQL que deseja executar no servidor, que voce nao consegue passar ou configurar parametro para ela...
...e tambem se possivel a forma que deseja executar no lado Cliente...
Ai poderemos analisar melhor...
Ah...nao esqueca de dizer qual o componente de acesso que esta utilizando tambem...lado cliente (executar ou receber) e lado servidor...
T+
GOSTEI 0
Paulo
07/07/2008
É o seguinte: Preciso executar uma Query(CommandText) no servidor e o parâmetro dessa SQL vem do Cliente.
Uso: DBExpress, Socket, Oracle 8i, BDS 2007, usando 3 camadas. O servidor é remoto. É mais ou menos assim:
Select CodigoCor, Produto from
Cor where CodProduto =:Prod.
Esse parãmetro Prod vem do Cliente(ComoboBox1.Text). É isso que eu quero e não estou conseguindo fazer. Tudo é para não passar CommandText remotamente. Dessa forma funciona. Eu quero mesmo é fazer funcionar a query no servidor e os parâmetros via Cliente.
Uso: DBExpress, Socket, Oracle 8i, BDS 2007, usando 3 camadas. O servidor é remoto. É mais ou menos assim:
Select CodigoCor, Produto from
Cor where CodProduto =:Prod.
Esse parãmetro Prod vem do Cliente(ComoboBox1.Text). É isso que eu quero e não estou conseguindo fazer. Tudo é para não passar CommandText remotamente. Dessa forma funciona. Eu quero mesmo é fazer funcionar a query no servidor e os parâmetros via Cliente.
GOSTEI 0
Paulo
07/07/2008
Já Resolvi. Problemas de BIOS, eheheheheh. Era só criar um parâmetro no CDS e apontar para a SQL no Servidor,nada mais que isso.
GOSTEI 0