Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Providers (https://www.clubdelphi.com/foros/forumdisplay.php?f=10)
-   -   Extender Servidor Datasnap y Firedac (https://www.clubdelphi.com/foros/showthread.php?t=90000)

juniorSoft 16-03-2016 19:01:12

Extender Servidor Datasnap y Firedac
 
Hola amigos,

Hace mucho que no posteaba dudas en esta maravillosa gran biblioteca de conocimiento delphi,

Me gustaría ver un ejemplo que enseñe como extender un servidor Datasnap utilizando modulos de datos adicionales.

Me explico

Cuando creamos con el asistente un servidor datasnap este nos genera dependiendo de las opciones que marquemos un modulo llamado server container que contiene los componentes del servidor datasnap para su definición y comunicación con los clientes. Otro modulo llamado ServerMethods para colocar ahí los componentes de acceso a datos.

Cuando la aplicación es pequeña quizás baste con el servermethods para colocar los componentes que se requieren pero a medida que la aplicación va creciendo y se va volviendo mas compleja, hace falta espacio para colocar componentes y se requieren otros módulos de datos. Me gustaría ver un ejemplo utilizando datatanap con módulos de datos que extiendan el espacio donde colocar componentes pero que la aplicaciones clientes lo vean como parte del mismo servidor ademas de utilizar componentes firedac con una configuración master-detail que obtenga y actualice datos desde el cliente utilizando solo la biblioteca de firedac ya que es una biblioteca multiplataforma y así actualizar los conocimientos


desde ya muchas gracias :)

AgustinOrtu 16-03-2016 20:33:11

He utilizado el asistente para crear un server datasnap; le he dejado tildada la opcion para inlcuir los metodos de prueba (EchoString y ReveseString)

Luego modifique la implementacion de esos dos metodos para que devuelvan tambien el nombre de la clase que "hace el trabajo":

Código Delphi [-]
function TServerMethods1.EchoString(Value: string): string;
begin
  Result := ClassName + ', '  + Value;
end;

function TServerMethods1.ReverseString(Value: string): string;
begin
  Result := ClassName + ', '  + StrUtils.ReverseString(Value);
end;

Luego puse el server en ejecucion, y cree el cliente, simplemente con el componente TSQLConnection y puse la propiedad DriverName a "Datasnap"; por ultimo hice click derecho y seleccione "generate DataSnap client classes"

Esto genera una nueva unidad con la clase proxy "TServerMethods1Client"

A partir de esto, puedo escribir este codigo sencillo en el form principal del cliente:

Código Delphi [-]
procedure TForm2.FormCreate(Sender: TObject);
begin
  Methods1 := TServerMethods1Client.Create(SQLConnection1.DBXConnection);
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  Edit1.Text := Methods1.EchoString('Hola');
  Edit2.Text := Methods1.ReverseString(Edit1.Text);
end;

Hasta aca es el tipico tutorial Datasnap

Para agregar un nuevo modulo de datos, solamente basta con volver al projecto del servidor, agregar un nuevo TDataModule; no hay que olvidarse de la directiva {$METHODINFO}, eso te podes fijar como lo genera el asistente. Esa directiva basicamente controla que metodos se exponen y cuales no

Llame a este nuevo modulo de datos TServerMethods2, que esta implementado igual que el TServerMethods1:

Código Delphi [-]
{$METHODINFO ON}
  TServerMethods2 = class(TDataModule)
  public
    function EchoString(Value: string): string;
    function ReverseString(Value: string): string;
  end;
{$METHODINFO OFF}

function TServerMethods2.EchoString(Value: string): string;
begin
  Result := ClassName + ', '  + Value;
end;

function TServerMethods2.ReverseString(Value: string): string;
begin
  Result := ClassName + ', '  + StrUtils.ReverseString(Value);
end;

Volvi a mi cliente, y volvi a "generate DataSnap client classes", y en este caso la unit generada ahora 2 clases:

Código Delphi [-]
TServerMethods1Client = class(TDSAdminClient)
[...]

TServerMethods2Client = class(TDSAdminClient)
[...]

Asi que es muy facil modificar el codigo para usar una u otra, este es el Form de la aplicacion cliente:

Código Delphi [-]
type
  TForm2 = class(TForm)
    SQLConnection1: TSQLConnection;
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    Methods1: TServerMethods1Client;
    Methods2: TServerMethods2Client;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
  Methods1 := TServerMethods1Client.Create(SQLConnection1.DBXConnection);
  Methods2 := TServerMethods2Client.Create(SQLConnection1.DBXConnection);
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  Edit1.Text := Methods1.EchoString('Hola');
  Edit2.Text := Methods1.ReverseString(Edit1.Text);
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  Edit1.Text := Methods2.EchoString('Hola');
  Edit2.Text := Methods2.ReverseString(Edit1.Text);
end;

Saludos

juniorSoft 17-03-2016 01:25:58

Gracias AgustinOrtu por tu pronta y excelente respuesta :)


La franja horaria es GMT +2. Ahora son las 03:16:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi