PDA

Ver la Versión Completa : ¿Como retornar varios valores en un Servicio Web?


jscubillos5
24-02-2014, 22:04:15
Hola comunidad, estoy empezando con los servicios Web, pero aún no sé cómo hacer que un servicio web me retorne la lista de ciudades, o departamentos por ejemplo, actualmente pienso que debería ser así:

En el servicio web, del servidor:

Debo tener un UM, que haga una consulta total a una tabla por ejemplo CIUDADES.
Dentro del archivo INTF, debo declarar un procedimiento que tenga como out, los registros totales de CIUDADES una lista tal vez no sé, y en el archivo IMPL, debo abrir la consulta y cargar el objeto de salida con el resultado de la consulta.

En el servicio web, del cliente:

Debo tener el WSDL IMPORT.
Luego en un formulario debo tener un control como un GRID, TABLA, o COMBOX que cargue el resultado del servicio web.

No sé si se pueda hacer así como lo planteo o exista una mejor forma para hacerlo, de ante mano muchas gracias por leer este hilo y tomarse el tiempo para responderlo.

jscubillos5
07-03-2014, 13:48:58
Hola comunidad la respuesta para mi pregunta, es, para enviar un DataSet en un servicio web, utilice un arreglo de una clase que hereda de de TREMOTABLE, así, todo esto en el módulo servidor del servicio web:


// Clase Departamentos que hereda de TRemotable
Departamentos = class (TRemotable)
private
// Propiedades privadas de mi clase
Fcodigo: String;
FDescricpion: String;
published
// Propiedades publicas que escriben las propiedades privadas
property Codigo: String read Fcodigo write Fcodigo;
property Descripcion: String read FDescricpion write FDescricpion;
end;
// Arreglo de Departamentos
TDepartamentos = array of Departamentos;
// Función que me retorna mi arreglo
function ConsultarDepartamento (): TDepartamentos; stdcall;


Todo el código anterior debe ir dentro de un módulo SOAP, en la clase INTF.CLASS
El siguiente código debe ir dentro del módulo SOAP, pero en la clase IMPL.CLASS:


// Implementación de la función
function TServicioWebPrueba.ConsultarDepartamento: TDepartamentos;
var
// Variable que hereda del arreglo TDepartamentos
Departamento : TDepartamentos;
Indice: Integer;
begin
//
try
try
// Se prepara una consulta
DataModulePrueba.IBQueryDepartamentos.Prepare;
// Se abre esa consulta
DataModulePrueba.IBQueryDepartamentos.Open;
// Se incializa un indice en cero
Indice:= 0;
// Mientras la consulta no tengo fin haga
while not DataModulePrueba.IBQueryDepartamentos.Eof do
begin
// Se le establece al objeto Departamento, una nueva posición en cero
SetLength(Departamento, Indice + 1);
// Por cada nueva posición se debe solicitar memoria, para guardar el dato
Departamento[Indice]:= Departamentos.Create;
// Y en cada espacio del arreglo Departamento, en sus propiedades publicas guardo los datos
Departamento[Indice].Descripcion:= DataModulePrueba.IBQueryDepartamentos.FieldByName('DESCRIPCION').AsString;
Departamento[Indice].Codigo:= DataModulePrueba.IBQueryDepartamentos.FieldByName('IDDEPARTAMENTO').AsString;
// Incremento el indice
Indice:= Indice + 1;
// Continuo con la consulta
DataModulePrueba.IBQueryDepartamentos.Next;
end;
finally
// Cierro la consulta
DataModulePrueba.IBQueryDepartamentos.Close;
end;
except
on Error: Exception do
begin

end;
end;
// Como el valor devuelto de la función es un TDepartamentos, se le indica a este objeto devuelto que sea igual a Departamento
Result:= Departamento;
end;


Ya en el cliente en un evento de un botton ONCLICK se debe hacer lo siguiente:


procedure TFormPrincipal.ButtonVerClick(Sender: TObject);
var
I: Integer;
{ Se crea un variable de TDEPARTAMENTOS, para esto debo tener en nuestros uses, el consumo del servicio web es
decir debemos tomar el WSDL, e importarlo a nuestro cliente, esto se puede hacer al golpe del raton, por medio
de NEW-> WEB SERVICES-> WSDL IMPORTER.}
Departamentos : TDepartamentos;
begin
// Luego Departamentos, se carga con nuestra función, traida del WSDL IMPORTER
Departamentos:= IServicioWebsERVIDOR1.GetIServicioWebPrueba.ConsultarDepartamento;
// Finalmente lo recorremos
for I := 0 to High(Departamentos) do
begin
// Por cada iteración se adiciona a una lista en formulario un item, con el valor de Departamentos[I].Codigo + ' - ' +
// Departamentos[I].Descripcion, en la posición de I.
ListBoxPrincipal.Items.Add(Departamentos[I].Codigo + ' - ' + Departamentos[I].Descripcion)
end;
end;

Neftali [Germán.Estévez]
10-03-2014, 09:40:58
Gracias por el apunte y el código.