troubleshooting Question

Reading complex type element repeats first one found several times

Avatar of DPlayer
DPlayer asked on
DelphiSOAP ProtocolWeb Services
3 Comments2 Solutions163 ViewsLast Modified:
Hi Experts.

I'm using Delphi XE6, using WSDL Importer with default options.

This is response I get from server:

    <group id="709">
      <fact term="Amount" value="141578823.7700" typ="Decimal"/>
      <fact term="Currency" value="RSD" typ="String"/>
    </group>
    <group id="709">
      <fact term="Amount" value="2854.2100" typ="Decimal"/>
      <fact term="Currency" value="USD" typ="String"/>
    </group>
    <group id="709">
      <fact term="Amount" value="42182.5000" typ="Decimal"/>
      <fact term="Currency" value="EUR" typ="String"/>
    </group>

(*Shortened for brewity*)


Everything gets read fine, except that for each of groups 709 I get only first group data. So I end up with:

    Data[1]=709/141578823.7700/RSD
    Data[2]=709/141578823.7700/RSD
    Data[3]=709/141578823.7700/RSD

instead of

    Data[1]=709/141578823.7700/RSD
    Data[2]=709/2854.2100/USD
    Data[3]=709/42182.5000/EUR

This is what WSDLImp gave me as a result:
      Fact = class(TRemotable)
      private
        Fterm: string;
        Fterm_Specified: boolean;
        Fvalue: string;
        Fvalue_Specified: boolean;
        Ftyp: string;
        Ftyp_Specified: boolean;
        procedure Setterm(Index: Integer; const Astring: string);
        function  term_Specified(Index: Integer): boolean;
        procedure Setvalue(Index: Integer; const Astring: string);
        function  value_Specified(Index: Integer): boolean;
        procedure Settyp(Index: Integer; const Astring: string);
        function  typ_Specified(Index: Integer): boolean;
      published
        property term:    string  Index (IS_ATTR or IS_OPTN) read Fterm write Setterm stored term_Specified;
        property value:   string  Index (IS_ATTR or IS_OPTN) read Fvalue write Setvalue stored value_Specified;
        property typ:     string  Index (IS_ATTR or IS_OPTN) read Ftyp write Settyp stored typ_Specified;
      end;
    
      Record = array of Fact;
    
      Group = class(TRemotable)
      private
        Fid: string;
        Fid_Specified: boolean;
        Ffact: Record;
        Ffact_Specified: boolean;
        procedure Setid(Index: Integer; const Astring: string);
        function  id_Specified(Index: Integer): boolean;
        procedure Setfact(Index: Integer; const ARecord: Record);
        function  fact_Specified(Index: Integer): boolean;
      public
        destructor Destroy; override;
      published
        property id:      string  Index (IS_ATTR or IS_OPTN) read Fid write Setid stored id_Specified;
        property fact:    Record  Index (IS_OPTN or IS_UNBD) read Ffact write Setfact stored fact_Specified;
      end;
    
      Array_Of_Group = array of Group;
    
      Main = class(TRemotable)
      private
        Fgroup: Array_Of_Group;
        Fgroup_Specified: boolean;
        procedure Setgroup(Index: Integer; const AArray_Of_Group: Array_Of_Group);
        function  group_Specified(Index: Integer): boolean;
      public
        destructor Destroy; override;
      published
        property group:  Array_Of_Group  Index (IS_OPTN or IS_UNBD) read Fgroup write Setgroup stored group_Specified;
      end;

Iterating through all Groups of Main, and reading all Facts, I get as I've mentioned only first set of facts that I come across repeated as many times as there is group with id=709.
So, my question is. What do I need to do in order to get all distinct groups and their values? What am I missing?
SOLUTION
Sinisa Vuk
Software architect
Join our community to see this answer!
Unlock 2 Answers and 3 Comments.
Start Free Trial
Learn from the best

Network and collaborate with thousands of CTOs, CISOs, and IT Pros rooting for you and your success.

Andrew Hancock - VMware vExpert
See if this solution works for you by signing up for a 7 day free trial.
Unlock 2 Answers and 3 Comments.
Try for 7 days

”The time we save is the biggest benefit of E-E to our team. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange.

-Mike Kapnisakis, Warner Bros