AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Webservice Rückgabe komplexe Datenstruktur
Thema durchsuchen
Ansicht
Themen-Optionen

Webservice Rückgabe komplexe Datenstruktur

Ein Thema von af99 · begonnen am 7. Jun 2011 · letzter Beitrag vom 16. Jun 2011
Antwort Antwort
Seite 2 von 2     12   
af99

Registriert seit: 22. Apr 2004
84 Beiträge
 
Delphi XE5 Ultimate
 
#11

AW: Webservice Rückgabe komplexe Datenstruktur

  Alt 15. Jun 2011, 16:45
soe ist die soap komponente THTTPRIO.

Es tut mir leid ich habe von Webservices leider noch nicht viel Ahnung. Was soll ich mir bei Getweb_getInventory ansehen??? Ich habe halt das Problem das ich zum Aufruf dem Webservice folgende Werte übergeben muss.
- CustomerNo
- Article
- Quantity

Wobei Customerno vom Type integer ist. Das klappt auch. Wenn ich dem Webservice nur die Customerno übergebe wird der Service auch aufgerufen und ich bekomme die Antwort das halt Article und Quantity fehlt.

Wenn ich nun Item vom Typ Array_Of_ItemType belegen möchte um hier Article und Quantity zu übergeben dann springt das Programm direkt vom Befehl
rein.Item[0] := myItemType;
zur Programmzeile
end;

Ich habe es auch folgendermassen probiert

Code:
...
rein := messagein.Create;
rein.CustomerNo := 1;
rein.Item[0].Quantity := 1;
rein.Item[0].Article := '10000100';
web.Getweb_getInventory.getInventory(rein);
...
Also ohne soap Komponente.. hat aber den gleicehn Effekt. Das Programm springt beim Ausführen von rein.Item[0].Quantity := 1;
zum end;
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#12

AW: Webservice Rückgabe komplexe Datenstruktur

  Alt 15. Jun 2011, 20:24
Hallo,

ich rufe den Webservice immer anders auf, kann Dir aber nicht sagen, was dort der Unterschied ist.

Delphi-Quellcode:
Var Webservice:web_getInventory;
    Erg:MessageOut;
begin
  Webservice:=Getweb_getInventory(false,'',HTTPRIO1);

  rein:=...
  
  erg:=Webservice.getInventory(rein);
                   
end;
Httprio1: ist eine HTTPRio-Kompo, die du mit auf die Form ziehst. Die braucht Du im Normalfall gar nicht. Aber wenn Du Dir anschauen willst, was da übertragen wird und wieder zurückkommt, fülle noch OnBeforeExecute und OnAfterExecute:

Delphi-Quellcode:
procedure TForm2.HTTPRIO1AfterExecute(const MethodName: string;
  SOAPResponse: TStream);
Var sl:Tstrings;
begin
  sl:=TStringList.Create;
  try
    SOAPResponse.Position:=0;
    sl.LoadFromStream(SOAPResponse);

    sl.SaveToFile(irgendwohin+'SoapResponse-Test.xml');
  finally
    sl.free;
  end;
end;

procedure TForm2.HTTPRIO1BeforeExecute(const MethodName: string;
  var SOAPRequest: WideString);
Var sl:Tstrings;
begin
  sl:=TStringList.Create;
  try
    sl.Text:=SOAPRequest;

    sl.SaveToFile(irgendwohin+'Soaprequest-Test.xml');
  finally
    sl.free;
  end;
end;
bist Du dir sicher, daß das funktionieren kann:
Delphi-Quellcode:
  myArray : array[0..1] of ItemType;

...

  myItemType := ItemType.Create;
  myItemType.Article := '10000100';
  myItemType.Quantity := 1;

  myArray[0] := myItemType;
Du hast ja damit ein Array mit 2 Feldern, belegst und erstellst aber nur das erste.
Für mich wäre logischer, wenn du das als dynamisches Aray deklarierst

Delphi-Quellcode:
Var
  myArray : Array_Of_ItemType; -> Array_Of_ItemType siehe die Wsdl

...
  setlength(myArray,1);
  rein.item:= myArray;

  myItemType := ItemType.Create;
  myItemType.Article := '10000100';
  myItemType.Quantity := 1;

  rein.item[0]:=myItemType;
Gruß Frank

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
af99

Registriert seit: 22. Apr 2004
84 Beiträge
 
Delphi XE5 Ultimate
 
#13

AW: Webservice Rückgabe komplexe Datenstruktur

  Alt 16. Jun 2011, 14:48
Hallo Frank,

Du bist mein Held. Hat super geklappt

Ich kann nun den Service ansprechen und bekomme eine Antwort zurück So sieht es nun aus.
Code:
var
  gi: messageout;
  rein: messagein;
  myArray : Array_Of_ItemType;
  myItemType : ItemType;

begin
  gi := messageout.Create;
  rein := messagein.Create;
  myItemType := ItemType.Create;

  setlength(myArray,1);
  rein.item:= myArray;

  rein.CustomerNo := 1;
  myItemType.Article := '10000100';
  myItemType.Quantity := 1;

  myArray[0] := myItemType;

  gi := (soe as web_getInventory).getInventory(rein);
...
Nun habe ich leider ein weiteres Problem.
Der Service muss folgendermassen angefragt werden.
Code:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header/>
   <soapenv:Body>
      <getInventoryIn>
         <CustomerNo>13635000</CustomerNo>
         <!--1 or more repetitions:-->
         <Item>
            <Article>101000500</Article>
            <Quantity>10</Quantity>
         </Item>
      </getInventoryIn>
   </soapenv:Body>
</soapenv:Envelope>
ich generiere aber (Habe ich dank deines Tipps aus der Datei des Ereignisses soeBeforeExecute)

Code:
  <?xml version="1.0" ?>
- <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <SOAP-ENV:Body>
- <MessageIn xmlns="http://www.soennecken.de/web.getInventory/">
  <CustomerNo xmlns="">1</CustomerNo>
- <Item xmlns="">
  <Article>10000100</Article>
  <Quantity>1</Quantity>
  </Item>
  </MessageIn>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>
Ich muss also statt meines
<MessageIn lns="http://www.soennecken.de/web.getInventory/">
ein
<getInventoryIn>
übergeben

Wie soll ich denn nun das anstellen.

Vielen Vielen Dank schon mal für Eure Hilfe
Gruß
Andreas
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#14

AW: Webservice Rückgabe komplexe Datenstruktur

  Alt 16. Jun 2011, 15:23
Sorry, muß gleich zu ner Feier und hab nicht viel Zeit

such mal hier im Forum zu Webservice oder soap, hier gab es vor kurzem ein gleiches Problem.
Es gibt da immer ein Problem mit namespaces, die irgendwie falsch gesetzt werden.

Du kannst aber die zu übertragende Soapnachricht im onbeforeexecute manuell mit etwas Fleiß und pos+delete etc ändern ...

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz