Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-08-2013
Avatar de GerTorresM
GerTorresM GerTorresM is offline
Miembro
 
Registrado: nov 2005
Ubicación: Tunja - Boyacá
Posts: 210
Poder: 19
GerTorresM Va por buen camino
error al importar WSDL SOAP Server

Hola a tod@s:

Experimentando con el uso de cliente - servidor inicie trabajo con SOAP SERVER APLICATION, en orden de ideas el ideal es crear una servicio que me permita crear y tramitar las peticiones propias de la capa de datos de una aplicación e hice lo siguiente:

cree un SOAPWebModule que quedo así

Código Delphi [-]
{ SOAP WebModule }
unit UWMServerData;

interface

uses
  SysUtils, Classes, HTTPApp, InvokeRegistry, WSDLIntf, TypInfo,
  WebServExp, WSDLBind, XMLSchema, WSDLPub, SOAPPasInv, SOAPHTTPPasInv,
  SOAPHTTPDisp, WebBrokerSOAP;

type
  TWMServerDataPredial = class(TWebModule)
    HTTPSoapDispatcher1: THTTPSoapDispatcher;
    HTTPSoapPascalInvoker1: THTTPSoapPascalInvoker;
    WSDLHTMLPublish1: TWSDLHTMLPublish;
    procedure WebModule1DefaultHandlerAction(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  WMServerDataPredial: TWMServerDataPredial;

implementation

{$R *.dfm}

procedure TWMServerDataPredial.WebModule1DefaultHandlerAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  WSDLHTMLPublish1.ServiceInfo(Sender, Request, Response, Handled);
end;

end.

en el momento de crearlo me indico que si desea crear la interfaz e implementación a lo que respondi que no, a continuación adicione un SOAP SERVER DATAMODULE, en el cual adicione un componente TADOConnection y procedi a crear en el archivo tanto la interfaz como la implementación con el siguiente código.

Código Delphi [-]
Unit UDMServerData;

interface

uses SysUtils, Classes, InvokeRegistry, Midas, SOAPMidas, SOAPDm, DB, ADODB,
  Provider;

type
  IDMServerData = interface(IAppServerSOAP)
    ['{016B9267-0E56-47A5-BE3A-C83C986376DD}']
    // Ver 1.0 Agosto 21 de 2013.
    procedure setConexionBDADO(pNombreBaseDatos, pContrasena  : String ; out esConexionExitosa : Boolean); StdCall;
    procedure setConjuntoDatos(pNombreFuenteDatos, pSQL, pNombreDataSetProvider: String; out esCreacionExitosa : Boolean ); StdCall;
    procedure eliminarConjuntoDatos(pNombreFuenteDatos, pDatasetProvider : String); StdCall;
    procedure getSiguiente(pNombreTabla, pNombreCampo, pCondidicional: String ; out dataGetSiguiente : Double); StdCall;
    procedure getCampo(pNombreTabla, pNombreCampo, pCondicional: String ; out dataGetCampo : Variant); StdCall;
    procedure setCampo(pNombreTabla, pNombreCampo, pValor, pCondicional: String ); StdCall;
    procedure AdicionarRegistro(pNombreTabla, pListaCampo, pValorCampo, pCondicional: String); StdCall;
    procedure eliminarRegistro(pNombreTabla, pCondicional: String ); StdCall;
  end;

  TDMServerData = class(TSoapDataModule, IDMServerData, IAppServerSOAP, IAppServer)
    conServerData: TADOConnection;

  private
    function getConsulta(pSQL: String):TADOQuery; stdcall;
  public
    procedure setConexionBDADO(pNombreBaseDatos, pContrasena  : String ; out esConexionExitosa : Boolean); StdCall;
    procedure setConjuntoDatos(pNombreFuenteDatos, pSQL, pNombreDataSetProvider: String; out esCreacionExitosa : Boolean ); StdCall;
    procedure eliminarConjuntoDatos(pNombreFuenteDatos, pDatasetProvider : String); StdCall;
    procedure getSiguiente(pNombreTabla, pNombreCampo, pCondicional: String ; out dataGetSiguiente : Double); StdCall;
    procedure getCampo(pNombreTabla, pNombreCampo, pCondicional: String ; out dataGetCampo : Variant); StdCall;
    procedure setCampo(pNombreTabla, pNombreCampo, pValor, pCondicional: String); StdCall;
    procedure AdicionarRegistro(pNombreTabla, pListaCampo, pValorCampo, pCondicional: String); StdCall;
    procedure eliminarRegistro(pNombreTabla, pCondicional: String ); StdCall;
   end;

implementation

{$R *.DFM}

procedure TDMServerDataCreateInstance(out obj: TObject);
begin
 obj := TDMServerData.Create(nil);
end;

{ TDMServerDataPredial }

function TDMServerData.getConsulta(pSQL: String): TADOQuery;
var qGetConsulta_temporal : TADOQuery;
begin
  qGetConsulta_temporal:= TADOQuery.Create(nil);
  with qGetConsulta_temporal do
    begin
      close;
      connection:= Self.conServerData;
      sql.text:= pSQL;
    end;
  try
    Result:= qGetConsulta_temporal;
  finally
  end;
end;

procedure TDMServerData.setConexionBDADO(pNombreBaseDatos,
  pContrasena: String; out esConexionExitosa: Boolean);
var ConStr_local : String;
begin
  if FileExists(pNombreBaseDatos) then
    begin
      ConStr_local:= 'Provider=Microsoft.Jet.OLEDB.4.0; ' +
        'User ID=Admin;'+
        'Data Source=' + pNombreBaseDatos  + ';' +
        'Persist Security Info=False;' +
        'Jet OLEDBatabase Password=' + pContrasena ;
      self.conServerData.ConnectionString:= ConStr_local;
      self.conServerData.LoginPrompt:= False;
      self.conServerData.open;
      esConexionExitosa:= True;
    end
  else begin
    esConexionExitosa:= False;
    exit;
  end;

end;


procedure TDMServerData.setConjuntoDatos(pNombreFuenteDatos, pSQL,
  pNombreDataSetProvider: String; out esCreacionExitosa : Boolean);
Var adoDataset_temporal : TADODataSet;
    DSP_temporal : TDataSetProvider;
begin
  // Crea FuenteDatos y tDatasetProvider
  esCreacionExitosa:= True;
  try
    adoDataset_temporal:= TADODataSet.Create(self);
    DSP_temporal:= TDataSetProvider.Create(self);
    adoDataset_temporal.Connection:= self.conServerData;
    adoDataset_temporal.CommandText:= pSQL;
    adoDataset_temporal.MaxRecords:= 50;
    adoDataset_temporal.Name:= pNombreFuenteDatos;
    DSP_temporal.Name:= pNombreDataSetProvider;
    DSP_temporal.DataSet:= adoDataset_temporal;
    RegisterProvider(DSP_temporal);
  except
     esCreacionExitosa:= False;
  end;
end;

procedure TDMServerData.eliminarConjuntoDatos(pNombreFuenteDatos,
  pDatasetProvider: String);
var DSP_temporal : TDataSetProvider;
    ADODataSet_temporal : TADODataSet;
begin
  // Elmina NombreFuenteDatos y tDatasetProvider

  DSP_temporal:= TDataSetProvider(GetProvider(pDatasetProvider));
  ADODataSet_temporal:= TADODataset(DSP_temporal.Dataset);
  try
    UnRegisterProvider(DSP_temporal);
  finally
    DSP_temporal.Free;
    ADODataSet_temporal.Free;
  end;
end;

procedure TDMServerData.getSiguiente(pNombreTabla, pNombreCampo,
  pCondicional: String; out dataGetSiguiente: Double);
Var qGetCampo_temporal : TADOQuery;
begin
  dataGetSiguiente:= 1;
  if pCondicional <> '' then
    qGetCampo_temporal:= getConsulta(' select Max(' + pNombreCampo + ') As Maximo '+
       ' from ' + pNombreTabla +
       ' Where ' + pCondicional)
  else qGetCampo_temporal:= getConsulta(' select Max(' + pNombreCampo + ') As Maximo '+
    ' from ' + pNombreTabla);
  try
    qGetCampo_temporal.open;
    if qGetCampo_temporal.RecordCount >= 1 then
    dataGetSiguiente:= qGetCampo_temporal.FieldByName('Maximo').AsFloat + 1;
  finally
    qGetCampo_temporal.Free;
  end;
end;

procedure TDMServerData.getCampo(pNombreTabla, pNombreCampo,
  pCondicional: String; out dataGetCampo: Variant);
var qGetCampo_temporal : TADOQuery;
begin
  dataGetCampo:= 0;
  if pCondicional <> '' then
    qGetCampo_temporal:= getConsulta(' select ' + pNombreCampo +
      ' from ' + pNombreTabla +
      ' where ' + pCondicional)
  else qGetCampo_temporal:= getConsulta(' select ' + pNombreCampo +
      ' from ' + pNombreTabla);
  try
    qGetCampo_temporal.open;
    if qGetCampo_temporal.RecordCount >= 1 then
       case qGetCampo_temporal.Fields[0].DataType of
          ftString: dataGetCampo:= qGetCampo_temporal.FieldByName(pNombreCampo).AsString;
          ftInteger: dataGetCampo:= qGetCampo_temporal.FieldByName(pNombreCampo).AsInteger;
          ftBoolean: dataGetCampo:= qGetCampo_temporal.FieldByName(pNombreCampo).AsBoolean;
          ftDateTime: dataGetCampo:= qGetCampo_temporal.FieldByName(pNombreCampo).AsDateTime;
          ftFloat: dataGetCampo:= qGetCampo_temporal.FieldByName(pNombreCampo).AsFloat;
       else dataGetCampo:= qGetCampo_temporal.FieldByName(pNombreCampo).AsVariant;
       end;
  finally
    qGetCampo_temporal.Free;
  end;
end;

procedure TDMServerData.setCampo(pNombreTabla, pNombreCampo, pValor,
  pCondicional: String);
var qSetCampo_temporal : TADOQuery;
begin
  qSetCampo_temporal:= getConsulta(' Update ' + pNombreTabla +
                                   ' set ' + pNombreCampo + ' = ' + pValor +
                                   ' where ' + pCondicional);
  try
    qSetCampo_temporal.ExecSQL;
  finally
    qSetCampo_temporal.Free;
  end;
end;

procedure TDMServerData.AdicionarRegistro(pNombreTabla, pListaCampo,
  pValorCampo, pCondicional: String);
var qAdicionarRegistro_temporal: TADOQuery;
begin
  if pCondicional <> '' then
    qAdicionarRegistro_temporal:= GetConsulta(' Insert Into ' + pNombreTabla + '(' + pListaCampo + ')' +
      ' Values (' + pValorCampo + ')' +
      ' Where ' + pCondicional)
  else  qAdicionarRegistro_temporal:= GetConsulta(' Insert Into ' + pNombreTabla + '(' + pListaCampo + ')' +
         ' Values (' + pValorCampo + ')');
  try
    qAdicionarRegistro_temporal.ExecSQL;
  Finally
    qAdicionarRegistro_temporal.Free;
  end;
end;

procedure TDMServerData.eliminarRegistro(pNombreTabla,
  pCondicional: String);
Var qEliminarRegistro_temporal : TADOQuery;
begin
  if pCondicional <> '' then
    qEliminarRegistro_temporal:= GetConsulta('delete from ' + pNombreTabla +
      ' where ' + pCondicional)
  else qEliminarRegistro_temporal:= GetConsulta('delete from ' + pNombreTabla );
  try
    qEliminarRegistro_temporal.ExecSql;
  finally
    qEliminarRegistro_temporal.Free;
  end;
end;


initialization
   InvRegistry.RegisterInvokableClass(TDMServerData, TDMServerDataCreateInstance);
   InvRegistry.RegisterInterface(TypeInfo(IDMServerData));
end.

Bien como tal compila y genera el archivo correspondiente, pero al intentar importar el WSDL me genera un error, en vista de lo sucedido empece por compililar y generar y el esto fue exitoso compilando con tan una la única función y solo un método sin importar el que fueses.

Agradezco de antemano cualquier colaboración.. adjunto fuentes



gertorresm
Colombia
Archivos Adjuntos
Tipo de Archivo: rar Data.rar (10,5 KB, 4 visitas)
Responder Con Cita
  #2  
Antiguo 22-08-2013
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Hola GerTorresM

Los archivos de implementación e Interfaz son los que generan el código para poder importar el WSDL, de hecho en el archivo de interfaz es donde publicas las clases y métodos que serán "mostrados" en el WSDL y el archivo de implemenmtación (como su nombre lo indica) es el que contine la lógica de negocios de los métodos publicados en el archivo de interfáz.

Te recomiendo vuelvas a crear tu Servicio Web y dile que sí te agregue esos archivos.

Puedes seguir éste tutorial, aunque muy, muy, básico, te dará una idea de lo que estás intentando hacer.

Saludos
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #3  
Antiguo 22-08-2013
Avatar de GerTorresM
GerTorresM GerTorresM is offline
Miembro
 
Registrado: nov 2005
Ubicación: Tunja - Boyacá
Posts: 210
Poder: 19
GerTorresM Va por buen camino
Red face una versión Mejorada

Egostar :

en primer lugar gracias por tu tiempo, fue con el tutorial que publicaste que inicie con el temas hace algunos días; mis conocimientos son muy basicos en el tema, pero date cuenta que un Modulo de datos no tiene interfaz e implementación separada y lo que busco es poder crear un módulo de datos web al que se puede accesar, generar la conexión a la BD y crear los DataSetProvider, y para el caso TADODataset; y la verdad es que tengo problemas para accesar a los métodos del módulo de datos desde la implementación de un SOAPServer APLICATION.

Si tu tienes una solución mas o menos sobre lo expuesto o un ejemplo donde puede accesar al modulo de datos te agardezco; dele un ojo al código y ayudame a mejorarlo para cocinar esta idea



gertorresm:
Responder Con Cita
  #4  
Antiguo 22-08-2013
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por GerTorresM Ver Mensaje
..... dele un ojo al código y ayudame a mejorarlo para cocinar esta idea .....
Hola GerTorresM

Me daré un tiempo para hacer un ejemplo con tu código, incluso puede servir para actualizar mis tutoriales acerca de Servicios Web

Saludos
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #5  
Antiguo 23-08-2013
Avatar de GerTorresM
GerTorresM GerTorresM is offline
Miembro
 
Registrado: nov 2005
Ubicación: Tunja - Boyacá
Posts: 210
Poder: 19
GerTorresM Va por buen camino
Sigamos con la versión mejorada

Bien dandole cuerda a esta asunto encontre que para esta caso se pude generar el archivo utilizando una aplicativo llamado WSLDImport, este aplicativo permite a partir de archivos WSDL generar unidades .pas con la interfaz correspodiente, usuando la siguiente sintaxis WSLDImport -P file y se genero el archivo que adjunto, ahora en orden de ideas monte el Cliente y el Servidor, en orden de ideas se logra la comunicación y la conexión de la BD, pero al conectar el ClienteDataSet con el provider remoto me envia un error. "Dataprovider not Exported"

Te adjunto el codigo del cliente y del server y te invito para sigamos dandole a la versión mejora, sumemos más a tu tutorial y algo que le sirva como ejemplo a todos los miembros que nos estamos rompiendo la cabeza con las app cliente servidor



Quedo en contacto y pendiente de nuestra versión mejorada
Archivos Adjuntos
Tipo de Archivo: rar SOAP.rar (43,7 KB, 10 visitas)
Responder Con Cita
  #6  
Antiguo 23-08-2013
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por GerTorresM Ver Mensaje
Bien dandole cuerda a esta asunto encontre que para esta caso se pude generar el archivo utilizando una aplicativo llamado WSLDImport, este aplicativo permite a partir de archivos WSDL generar unidades .pas con la interfaz correspodiente, usuando la siguiente sintaxis WSLDImport -P file y se genero el archivo que adjunto, ahora en orden de ideas monte el Cliente y el Servidor, en orden de ideas se logra la comunicación y la conexión de la BD, pero al conectar el ClienteDataSet con el provider remoto me envia un error. "Dataprovider not Exported"

Te adjunto el codigo del cliente y del server y te invito para sigamos dandole a la versión mejora, sumemos más a tu tutorial y algo que le sirva como ejemplo a todos los miembros que nos estamos rompiendo la cabeza con las app cliente servidor

Quedo en contacto y pendiente de nuestra versión mejorada
Éste fin de semana pongo manos a la obra y veré el asunto de la conectividad que no debería ser problema, sólo un detalle, yo usaría TDataSet's para el retorno, para, de esa forma, no amarrar al cliente que consume el web Service a usar una tecnología específica, sino la que quiera, aunque por otro lado me gustaría ver que hace DataSnap (nunca lo he usado )

Saludos
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
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
Consumir WebService. Ayuda con XML,WSDL,XSD,SOAP josemmerida Internet 2 23-12-2010 13:37:16
Exportar/Importar BD SQL server paladincubano SQL 3 21-02-2008 22:05:35
importar tablas paradox en SQL Server seken Tablas planas 3 03-10-2006 02:33:25
importar nuevos datos access-sql server galmacland MS SQL Server 2 18-02-2005 21:30:00
Web Snap Intraweb SOAP Server etc.. Descendents Internet 0 18-07-2003 01:41:37


La franja horaria es GMT +2. Ahora son las 14:34:22.


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