Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Pasar datos a una clase de un WS (https://www.clubdelphi.com/foros/showthread.php?t=71254)

gcaffe 09-12-2010 21:13:50

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.

gcaffe 17-12-2010 16:42:52

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


La franja horaria es GMT +2. Ahora son las 16:34:11.

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