Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-12-2010
gcaffe gcaffe is offline
Miembro
 
Registrado: oct 2004
Posts: 53
Poder: 20
gcaffe Va por buen camino
Pasar datos a una clase de un WS

Hola:
estoy desarrollando una aplicación SOAP con Delphi 2010, tengo los proxy consegidos a traves de WSDL Importer. Logro establecer una sessión y consumo algunos métodos sencillos.
La dificultad se me presenta cuando uno la property de los datos es de un tipo desconocido para Delphi, por ejemplo property Array_Of_OriginCode, hay otros similares como se muestran en el código de abajo
La Calse que uso esta definida en el Proxy así;
Código Delphi [-]
  PackageTourProductAvailRQ = class(TRemotable)
  private
    FProductCode: Array_Of_ProductCode2;
    FProductCode_Specified: boolean;
    FBrochureCode: Array_Of_BrochureCodeType;
    FBrochureCode_Specified: boolean;
    FBrochureExcluded: Array_Of_BrochureCodeType;
    FBrochureExcluded_Specified: boolean;
    FProviderCode: Array_Of_ProviderCode2;
    FProviderCode_Specified: boolean;
    FOriginCode: Array_Of_OriginCode;
    FOriginCode_Specified: boolean;
    FProductConfigurations: ProductConfigurations;
    FProductConfigurations_Specified: boolean;
    FOfferIndicator: Boolean;
    FOfferIndicator_Specified: boolean;
    FFirstDepartureDate: TXSDate;
    FLastDepartureDate: TXSDate;
    FLastDepartureDate_Specified: boolean;
    FNumberOfDepartures: TXSDecimal;
    FNumberOfDepartures_Specified: boolean;
    FRequestedAcomodations: RequestedAcomodations2;
    FRequestedAcomodations_Specified: boolean;
    procedure SetProductCode(Index: Integer; const AArray_Of_ProductCode2: Array_Of_ProductCode2);
    function  ProductCode_Specified(Index: Integer): boolean;
    procedure SetBrochureCode(Index: Integer; const AArray_Of_BrochureCodeType: Array_Of_BrochureCodeType);
    function  BrochureCode_Specified(Index: Integer): boolean;
    procedure SetBrochureExcluded(Index: Integer; const AArray_Of_BrochureCodeType: Array_Of_BrochureCodeType);
    function  BrochureExcluded_Specified(Index: Integer): boolean;
    procedure SetProviderCode(Index: Integer; const AArray_Of_ProviderCode2: Array_Of_ProviderCode2);
    function  ProviderCode_Specified(Index: Integer): boolean;
    procedure SetOriginCode(Index: Integer; const AArray_Of_OriginCode: Array_Of_OriginCode);
    function  OriginCode_Specified(Index: Integer): boolean;
    procedure SetProductConfigurations(Index: Integer; const AProductConfigurations: ProductConfigurations);
    function  ProductConfigurations_Specified(Index: Integer): boolean;
    procedure SetOfferIndicator(Index: Integer; const ABoolean: Boolean);
    function  OfferIndicator_Specified(Index: Integer): boolean;
    procedure SetLastDepartureDate(Index: Integer; const ATXSDate: TXSDate);
    function  LastDepartureDate_Specified(Index: Integer): boolean;
    procedure SetNumberOfDepartures(Index: Integer; const ATXSDecimal: TXSDecimal);
    function  NumberOfDepartures_Specified(Index: Integer): boolean;
    procedure SetRequestedAcomodations(Index: Integer; const ARequestedAcomodations2: RequestedAcomodations2);
    function  RequestedAcomodations_Specified(Index: Integer): boolean;
  public
    constructor Create; override;
    destructor Destroy; override;
  published
    property ProductCode:           Array_Of_ProductCode2      Index (IS_OPTN or IS_UNBD) read FProductCode write SetProductCode stored ProductCode_Specified;
    property BrochureCode:          Array_Of_BrochureCodeType  Index (IS_OPTN or IS_UNBD) read FBrochureCode write SetBrochureCode stored BrochureCode_Specified;
    property BrochureExcluded:      Array_Of_BrochureCodeType  Index (IS_OPTN or IS_UNBD) read FBrochureExcluded write SetBrochureExcluded stored BrochureExcluded_Specified;
    property ProviderCode:          Array_Of_ProviderCode2     Index (IS_OPTN or IS_UNBD) read FProviderCode write SetProviderCode stored ProviderCode_Specified;
    property OriginCode:            Array_Of_OriginCode        Index (IS_OPTN or IS_UNBD) read FOriginCode write SetOriginCode stored OriginCode_Specified;
    property ProductConfigurations: ProductConfigurations      Index (IS_OPTN) read FProductConfigurations write SetProductConfigurations stored ProductConfigurations_Specified;
    property OfferIndicator:        Boolean                    Index (IS_OPTN) read FOfferIndicator write SetOfferIndicator stored OfferIndicator_Specified;
    property FirstDepartureDate:    TXSDate                    read FFirstDepartureDate write FFirstDepartureDate;
    property LastDepartureDate:     TXSDate                    Index (IS_OPTN) read FLastDepartureDate write SetLastDepartureDate stored LastDepartureDate_Specified;
    property NumberOfDepartures:    TXSDecimal                 Index (IS_OPTN) read FNumberOfDepartures write SetNumberOfDepartures stored NumberOfDepartures_Specified;
    property RequestedAcomodations: RequestedAcomodations2     Index (IS_OPTN) read FRequestedAcomodations write SetRequestedAcomodations stored RequestedAcomodations_Specified;
  end;

En el procedimeinto que uso está así y compila OK:
Código Delphi [-]
procedure TfrmMain.btnCargaOfertaClick(Sender: TObject);
var
   FIni, FFin: TXSDate;
   Nchs: TXSDecimal;
   SS: SessionSoapHeader;
   RQ: PackageTourProductAvailRQ;
   RS: PackageTourProductAvailResult;
   i, j, k: integer;
   Prd: Array_Of_ProductCode2;
   Ori: Array_Of_OriginCode;
begin
   SS := OtaSessionSoapHeader.Create;
   RQ := OTA_OrizoniaPackageTourProductAvailRQ.Create;
   Nchs := TXSDecimal.Create;
   Nchs.DecimalString := Format('%d', [7]);
   FIni := TXSDate.Create;
   FFin := TXSDate.Create;
   try
      SS.ApiSessionId := DameSession(Sender);  // Me da el número de sesión y funciona OK
(*)      Prd[1] := 'PD02';                        // Como prueba este producto y Falla en ejecución
      Ori[1] := 'MAD';
      RQ.ProductCode := Prd;
      RQ.OriginCode := Ori;
//      RQ.ProductConfigurations;                // RQ solo me devuelve esta propiedad no hay ProductConfiguration
      RQ.OfferIndicator := False;
      RQ.FirstDepartureDate.XSToNative(DateToStr(Date+1));
      RQ.LastDepartureDate.XSToNative(DateToStr(Date+8));
      RS := GetPackageTourServiceSoap(True,'',HTTPRIO2).OTA_OrizoniaPackageTourProductAvail(RQ);
      // Aqui de averigua el resultado
      with RS do begin
        // Falta codificar
      end;
   finally
      RQ.Free;
      RS.Free;
      Nchs.Free;
      FIni.Free;
      FFin.Free;
   end;
end;

La ayuda que les pido es que me orienten como debo hacer referencia a ese tipo de propiedad ya que en la linea marcada con (*) da un EAccessViolation.
He probado definir de varias formas Prd y Ori pero no acierto.

Muchas gracias.
Responder Con Cita
  #2  
Antiguo 17-12-2010
gcaffe gcaffe is offline
Miembro
 
Registrado: oct 2004
Posts: 53
Poder: 20
gcaffe Va por buen camino
Después de mucho leer y preguntar encontré la solución, como siempre sencilla cuando parece un mundo por resolver.

El problema que estaba teniendo es que necesitaba inicializar el array dinámico. La líneas:

Prd: Array_Of_ProductCode2;
Ori: Array_Of_OriginCode;

Declaran arrays sin miembros, por tanto no se pueden asignar, para poderlo hacer hay que utilizar la función SetLength(array, número de miembros), por ejemplo:

Setlength(Prd, 3);
Esto establece el array con la cantidad de 3. Dicho array siempre será base 0, osea irá desde 0 hasta 2. Para poder saber el número de miembros de un array dinámico hay que utilizar la función length como con los strings.

Aplicando esta instrucción solucioné el problema de asignación.
Espero que a alguien le sirva.

Un saludo
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
clase que contiene otra clase definida de forma posterior astwin OOP 5 20-02-2009 11:26:55
¿¿Es posible pasar una clase como parámetro con el modificador var?? PaFernan99 OOP 3 09-02-2009 18:49:00
Clase Que Guarde Datos En Base De Datos sdiaz1983 Conexión con bases de datos 2 03-05-2008 01:50:33
Como pasar datos de una hoja de Excel a Bases de Datos de Paradox Goyo OOP 1 06-02-2007 01:57:20
Error al intentar acceder a datos desde una Clase chico_bds OOP 5 18-01-2007 18:59:32


La franja horaria es GMT +2. Ahora son las 11:07:24.


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