Delphi - Problema con WebService

   
Vista:

Problema con WebService

Publicado por rq (3 intervenciones) el 26/11/2011 12:57:22
Saludos

Estoy tratando de recibir un valor tipo TXSDecimal desde una funcion en un Webservice, pero Delphi 2007 me presenta el mensaje de error: Range check error.

La unidad generada luego de importar el WSDL es la siguiente:
// Encoding : utf-8
// Version : 1.0
// (20/11/2011 17:41:58 - - $Rev: 10138 $)
// ************************************************************************ //

unit ConsultarBalance;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

const
IS_OPTN = $0001;
IS_UNBD = $0002;
IS_NLBL = $0004;
IS_REF = $0080;


type

// ************************************************************************ //
// The following types, referred to in the WSDL document are not being represented
// in this file. They are either aliases[@] of other types represented or were referred
// to but never[!] declared in the document. The types from the latter category
// typically map to predefined/known XML or Borland types; however, they could also
// indicate incorrect WSDL documents that failed to declare or import a schema type.
// ************************************************************************ //
// !:string - "http://www.w3.org/2001/XMLSchema"[Gbl]
// !:decimal - "http://www.w3.org/2001/XMLSchema"[Gbl]


ArrayOfString = array of WideString; { "http://tempuri.org/"[GblCplx] }

// ************************************************************************ //
// ************************************************************************ //
ServiceSoap = interface(IInvokable)
['{77573149-9C57-FA51-F11F-EFD527C91BD9}']
function QuerySaleTransaction(const _uniqueKey: WideString; const _stan: WideString; const _terminalId: WideString; const _provider: WideString; const _phone: WideString; const _totalAmount: WideString
): ArrayOfString; stdcall;
function QueryVoidTransaction(const _uniqueKey: WideString; const _stan: WideString; const _terminalId: WideString; const _provider: WideString; const _phone: WideString; const _serialNo: WideString
): ArrayOfString; stdcall;
function GetCurrentBalance(const _key: WideString): TXSDecimal; stdcall;
end;

function GetServiceSoap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): ServiceSoap;

. . .




y el codigo que utilizo para llamar la funcion es :



procedure TfrmProcesar_Tarjetas_Consulta_Balance.XiButton6Click(Sender: TObject);
Var
sLlave : WideString;
val2 : TXSDecimal;


begin

...
val2 := txsdecimal.Create;
val2 := ConsultarBalance.GetServiceSoap.GetCurrentBalance(
Trim( sLlave) );
...

end

Tambien lo he intentado

...
val2 := txsdecimal.Create;
val2.AsBCD := ConsultarBalance.GetServiceSoap.GetCurrentBalance(
Trim( sLlave) ).AsBCD;
...

Pero me genera el mismo error.

Si alguien me puede ayudar, le agradecere mucho
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Problema con WebService

Publicado por E.T. (1108 intervenciones) el 26/11/2011 17:53:29
La forma en que yo lo he hecho es haciendo un cast con el componente THttpRio hacia el tipo de tu interface y asignandoselo a una variable del tipo qu esperas como respuesta, en este caso algo como lo siguiente

val2 := (HTTPRio1 as ServiceSoap).GetCurrentBalance(Trim( sLlave));

Con la informacion que proporcionas y viendo lo que yo tengo es mas o menos como te quedaría el llamado a la funcion del web service

El componente THTTPRio lo encuentras en la paleta WebServices, en delphi 7, no se en otras versiones
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema con WebService

Publicado por E.T. (1108 intervenciones) el 26/11/2011 18:03:05
Olvidé mencionar algo.
Tienes que llenar las siguientes propiedades del componente
Port
Service
WSDLLocation

la tecercera propiedad el obvia, es la url del documento wsdl, las otras dos yo las tengo de la siguiente manera
en port tengo el nombre de la interface

Que para ti es: ServiceSoap

y en Service es el nombre de la interfaz, mas la palabra service
ServiceSoapService para ti.

Para obtener los valores correctos de Port y de Service, basta con poner la url del wsdl, luego vas a las otras propiedades y despliegas la lista que está donde se pone los valores de las propiedades y te las debería mostrar, tal vez tarde un poco en lo que hace conexion al servidor en busca de esos valores, sino puedes, intenta ponerlos manualmente
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema con WebService

Publicado por rq (3 intervenciones) el 27/11/2011 04:54:12
Muchas gracias E.T. por tu pronta respuesta

Voy a realizar pruebas y te comentare los resultados.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema con WebService

Publicado por rq (3 intervenciones) el 27/11/2011 21:49:25
Saludos

He realizado arias pruebas y me continua dando el mismo error: Range check error.
Alguna sugerencia?

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema con WebService

Publicado por E.T. (1108 intervenciones) el 28/11/2011 04:33:19
Fuiste tú quien programó el webservice?
Pareciera ser un error en el servicio o en el valor que le mandas, intenta tambien sin asignar el valor de respuesta a la variable así:

1
(HTTPRio1 as ServiceSoap).GetCurrentBalance(Trim( sLlave));

o así como lo tenias originalmente:
1
ConsultarBalance.GetServiceSoap.GetCurrentBalance(Trim( sLlave) );


Esto para ver si no es un error de conversión de tipos.
Si es un servicio de accceso público podrias pasarme la url del wsdl para hacer pruebas directamente, esto es a criterio tuyo porsupuesto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar