Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Servers (https://www.clubdelphi.com/foros/forumdisplay.php?f=9)
-   -   No se crea 'methods unit' en DataSnap server (https://www.clubdelphi.com/foros/showthread.php?t=93477)

Bolox 11-10-2018 12:32:51

No se crea 'methods unit' en DataSnap server
 
Hola foreros.
Os escribo porque tengo un problema, a ver si me podéis echar una manita.
No tengo ni idea de Delphi (soy programador web), estoy empezando y sé lo básico, básico, sin embargo en el trabajo me pidieron hacer un DataSnap Application Server sencillo y estoy descubriendo de a poco como va. He seguido varios ejemplos y no me ha funcionado ninguno.

Ahora estoy siguiendo la documentación oficial (debería haber empezado por ahí xD), concretamente este hilo de la docwiki -> Using a REST DataSnap Server with an Application and FireDAC (No puedo postear links)

El problema me viene al principio, que se supone que se crearán 3 componentes, ServerUnit, WebModuleUnit y ServerMethods. Pero al guardar el proyecto ServerMethods no se me crea. Pero bueno, continuo con los ejemplos como si nada, sin embargo al llegar a declarar las funciones que tienen que ver con los JSON me da el siguiente error: "Undeclared Identifier 'TJSONDataSets'. Tengo que llamar a otro componente o algo? No entiendo porque no encuentra el identificador si se supone que lo declaro yo :( . Lo siento si la pregunta es muy estúpida, voy algo perdido.

Os dejo el código a continuación.

ServerUnit
Código Delphi [-]
unit ServerUnit;

interface

uses
  Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.AppEvnts, Vcl.StdCtrls, IdHTTPWebBrokerBridge, Web.HTTPApp, Data.DB,
  Datasnap.DBClient, Datasnap.DSConnect;

type
  TForm1 = class(TForm)
    ButtonStart: TButton;
    ButtonStop: TButton;
    EditPort: TEdit;
    Label1: TLabel;
    ApplicationEvents1: TApplicationEvents;
    ButtonOpenBrowser: TButton;
    DSProviderConnection1: TDSProviderConnection;
    procedure FormCreate(Sender: TObject);
    procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
    procedure ButtonStartClick(Sender: TObject);
    procedure ButtonStopClick(Sender: TObject);
    procedure ButtonOpenBrowserClick(Sender: TObject);
  private
    FServer: TIdHTTPWebBrokerBridge;
    procedure StartServer;
    { Private declarations }
  public
    { Public declarations }

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  WinApi.Windows, Winapi.ShellApi, Datasnap.DSSession;

procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
begin
  ButtonStart.Enabled := not FServer.Active;
  ButtonStop.Enabled := FServer.Active;
  EditPort.Enabled := not FServer.Active;
end;

procedure TForm1.ButtonOpenBrowserClick(Sender: TObject);
var
  LURL: string;
begin
  StartServer;
  LURL := Format('localhost(no me deja poner urls)', [EditPort.Text]);
  ShellExecute(0,
        nil,
        PChar(LURL), nil, nil, SW_SHOWNOACTIVATE);
end;

procedure TForm1.ButtonStartClick(Sender: TObject);
begin
  StartServer;
end;

procedure TerminateThreads;
begin
  if TDSSessionManager.Instance <> nil then
    TDSSessionManager.Instance.TerminateAllSessions;
end;

procedure TForm1.ButtonStopClick(Sender: TObject);
begin
  TerminateThreads;
  FServer.Active := False;
  FServer.Bindings.Clear;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FServer := TIdHTTPWebBrokerBridge.Create(Self);
end;


procedure TForm1.StartServer;
begin
  if not FServer.Active then
  begin
    FServer.Bindings.Clear;
    FServer.DefaultPort := StrToInt(EditPort.Text);
    FServer.Active := True;
  end;
end;

end.
WebModuleUnit1
Código Delphi [-]
unit WebModuleUnit1;

interface

uses
  System.SysUtils, System.Classes, Web.HTTPApp, Datasnap.DSHTTPCommon,
  Datasnap.DSHTTPWebBroker, Datasnap.DSServer,
  Web.WebFileDispatcher, Web.HTTPProd,
  DataSnap.DSAuth,
  Datasnap.DSProxyJavaScript, IPPeerServer, Datasnap.DSMetadata,
  Datasnap.DSServerMetadata, Datasnap.DSClientMetadata,
  Datasnap.DSCommonServer, Datasnap.DSHTTP, FireDAC.Stan.Intf,
  FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf,
  FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool,
  FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Phys.IB, FireDAC.Phys.IBDef,
  FireDAC.VCLUI.Wait, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf,
  FireDAC.DApt, FireDAC.Stan.StorageBin, FireDAC.Stan.StorageJSON, Data.DB,
  FireDAC.Comp.DataSet, FireDAC.Comp.Client, FireDAC.Comp.UI,
  FireDAC.Phys.IBBase;

type
  TWebModule1 = class(TWebModule)
    DSHTTPWebDispatcher1: TDSHTTPWebDispatcher;
    DSServer1: TDSServer;
    WebFileDispatcher1: TWebFileDispatcher;
    DSProxyGenerator1: TDSProxyGenerator;
    DSServerMetaDataProvider1: TDSServerMetaDataProvider;
    FDConnectionEMPLOYEE: TFDConnection;
    FDPhysIBDriverLink1: TFDPhysIBDriverLink;
    FDGUIxWaitCursor1: TFDGUIxWaitCursor;
    FDQueryDepartmentNames: TFDQuery;
    FDQueryDepartment: TFDQuery;
    FDQueryDepartmentEmployees: TFDQuery;
    FDStanStorageJSONLink1: TFDStanStorageJSONLink;
    FDStanStorageBinLink1: TFDStanStorageBinLink;
    procedure WebModule1DefaultHandlerAction(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    procedure WebFileDispatcher1BeforeDispatch(Sender: TObject;
      const AFileName: string; Request: TWebRequest; Response: TWebResponse;
      var Handled: Boolean);
      {$METHODINFO ON}
public
    { Public declarations }
{Aquí declaro la función, los componentes FDStanStorageJSONLink están añadidos, no sé si tendré que añadir algo más}
function GetDepartmentNames: TFDJSONDataSets;
end;

var
  WebModuleClass: TComponentClass = TWebModule1;

implementation


{$R *.dfm}

uses Web.WebReq;

procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  Response.Content :=
    '' +
    'DataSnap Server' +
    'DataSnap Server' +
    '';
end;




{Este es el codigo añadido}
function TWebModule1.GetDepartmentNames: TFDJSONDataSets;
begin

  FDQueryDepartmentNames.Active := False;
  Result := TFDJSONDataSets.Create;

  TFDJSONDataSetsWriter.ListAdd(Result, FDQueryDepartmentNames);
end;

procedure TWebModule1.WebFileDispatcher1BeforeDispatch(Sender: TObject;
  const AFileName: string; Request: TWebRequest; Response: TWebResponse;
  var Handled: Boolean);
var
  D1, D2: TDateTime;
begin
  Handled := False;
  if SameFileName(ExtractFileName(AFileName), 'serverfunctions.js') then
    if not FileExists(AFileName) or (FileAge(AFileName, D1) and FileAge(WebApplicationFileName, D2) and (D1 < D2)) then
    begin
      DSProxyGenerator1.TargetDirectory := ExtractFilePath(AFileName);
      DSProxyGenerator1.TargetUnitName := ExtractFileName(AFileName);
      DSProxyGenerator1.Write;
    end;
end;

initialization
finalization
  Web.WebReq.FreeWebModules;

end.

Casimiro Notevi 11-10-2018 21:16:29

A ver si te sirve alguno de los ejemplos de los enlaces relacionados, abajo del todo de la página.

(MAJ) 29-10-2018 04:55:14

Buenas compañero


Creo que estas cometiendo un error, en webmodule no tenes que poner los métodos públicos del servidor, esos métodos van precisamente en la unidad servermethods, ademas el error que te da es porque el componente TJSONDataSets es una unidad que se encuentra en la librería Data.FireDACJSONrReflect, la cual tenes que declararla en la sección uses


p/d: te dejo un video que enseña como hacer un servidor https://www.youtube.com/watch?v=8kVqg7ho5zg

Bolox 29-10-2018 11:17:25

Buenas MAJ.
Primero, muchas gracias por tu ayuda.
Te comento, lo del importar Data.FireDACJSONrReflect ya lo descubrí xD. Me costó bastante pero lo descubrí.
Sobre lo del WebModule por eso abrí el post, porque en la documentación me dice que se crean los tres archivos, WebModule, ServerUnit y ServerMethods. Sin embargo lo que realmente pasa es que WebModule y ServerUnit SÍ se crean pero ServerMethods NO se crea. Por lo que solo cuento con el Module y el Unit. ¿Sabes como tengo que crear este ServerMethods o es porque me falta algun componente o alguna otra cosa?.


Muchas gracias por el video, está noche en salir del trabajo le echo un vistazo.

Mil gracias compañeros.


La franja horaria es GMT +2. Ahora son las 12:52:35.

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