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
[-]
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
public
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}']
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;
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
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
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