Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Servers
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-10-2018
Bolox Bolox is offline
Miembro
 
Registrado: jul 2018
Posts: 14
Poder: 0
Bolox Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 11-10-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
A ver si te sirve alguno de los ejemplos de los enlaces relacionados, abajo del todo de la página.
Responder Con Cita
  #3  
Antiguo 29-10-2018
(MAJ) (MAJ) is offline
Miembro
 
Registrado: abr 2007
Posts: 71
Poder: 18
(MAJ) Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 29-10-2018
Bolox Bolox is offline
Miembro
 
Registrado: jul 2018
Posts: 14
Poder: 0
Bolox Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como hago un DataSnap Server rmeckbell Conexión con bases de datos 3 31-08-2017 17:02:44
Meetup #4 - Crea un servicio Rest con DataSnap y Consúmelo con Jquery egostar La Taberna 1 28-07-2017 23:18:51
Coneccion con un DataSnap server lbidi PHP 0 19-05-2016 20:45:29
Datasnap Rest Server dison Desarrollo en Delphi para Android 3 16-05-2014 10:48:44
datasnap para sql server??? _CALI Conexión con bases de datos 5 25-04-2011 19:49:04


La franja horaria es GMT +2. Ahora son las 02:34: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
Copyright 1996-2007 Club Delphi