Ver Mensaje Individual
  #1  
Antiguo 07-11-2007
LauraAS LauraAS is offline
Registrado
 
Registrado: nov 2007
Posts: 4
Reputación: 0
LauraAS Va por buen camino
Red face Capacidad WideString

Hola, he implementado un WebService en Delphi7 que a través de una interface permite realizar una serie de operaciones o funciones que devuelven un texto xml (en una variable wide string) construido a partir de consultas a la BD MSSqlServer2000 utilizando ADOStoredProc.

Pero hay una función que me falla debido a que el data set devuelto es muy superior a la capacidad para albergarlo en un widestring y como está dentro del buche while not eof del StoredProc pues se me queda "colgado" el programa cliente. Pero las demás funcionan perfectamente porque el dataset devuelto es mucho menor en tamaño.

He de devolver un texto, puesto que es una interface de un webservice que ha de devolver un xml, y que yo sepa el máximo en Delphi es el WideString. ¿Cómo se puede solventar este problema? Digo yo que ha de haber algún modo de convertir a texto consultas enormes como en caso de listar las poblaciones de una provincia o de un pais.

El código es más o menos como sigue:

TQryTablas = class(TInvokableClass, IQryTablas)
public
fGetPoblaciones(codProvincia: string): WideString;
end;

...

function TQryTablas.fGetPoblaciones(codProvincia: string): WideString;
var xmlOut: WideString;
codError: integer;
WebModule1: TWebModule1;
begin
result:='<?xml version="1.0" encoding="ISO_8859-1"?>';
result:=result+'<fGetPoblacionesResponse>';
result:=result+'<errores>';
try
WebModule1:=TWebModule1.Create(nil);
codError:=WebModule1.cargarPoblaciones(codProvincia,xmlOut);
if codError=-1 then
begin
result:=result+'<error>';
result:=result+'<coderr>002</coderr>';
result:=result+'<descerr>'+K_002+'</descerr>';
result:=result+'</error>';
end
else if codError<>0 then
begin
result:=result+'<error>';
result:=result+'<coderr>001</coderr>';
result:=result+'<descerr>'+K_001+'</descerr>';
result:=result+'</error>';
end;
result:=result+'</errores>';
result:=result+xmlOut;
result:=result+'</fGetPoblacionesResponse>';
finally
WebModule1.Free;
end;
end;


...............

function TWebModule1.CargarPoblaciones(codProvincia: string; var xml: WideString): integer;
begin
xml:='<poblaciones>';
with SPQryPoblacion do
begin
Parameters.ParamByName('@cod_provincia').Value:=codProvincia;
Parameters.ParamByName('@cod_error').Value:=0;
Active:=True;
result:=Parameters.ParamByName('@cod_error').Value;
if result=0 then
begin
First;
while not EOF do
begin
xml:=xml+'<poblacion>';
xml:=xml+'<codigo>'+FieldByName ('COD_POBLACION').AsString+'</codigo>';
xml:=xml+'<codprovincia>'+FieldByName('COD_PROVINCIA').AsString+'</codprovincia>';
xml:=xml+'<nombre>'+FieldByName('NOMBRE_POBLACION').AsString+'</nombre>';
xml:=xml+'<codpostal>'+FieldByName('COD_POSTAL').AsString+'</codpostal>';
xml:=xml+'</poblacion>';
Next;
end;
end;
end;
xml:=xml+'</poblaciones>';
end;
Responder Con Cita