Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Webservice (https://www.delphipraxis.net/196134-webservice.html)

InschenierSB 25. Apr 2018 14:59

Webservice
 
Servus,
ich bin neu hier und habe erst vor kurzem mit Delphi 6 begonnen.
Jetzt habe ich die Aufgabe einen Webservice zu erstellen. Die dazugehörige WSDL Datei habe ich vom Kunden bekommen. Über SOAP UI habe ich die WSDL schon eingebunden, da bekomme ich eine Antwort mit
der entsprechenden Anfrage.
Allerdings bekomme ich im Delphi bei Ausführung ständig die FM: Object reference not set to an instance of an object!
Wer hat eine Idee woran das liegen könnt?

Wer das löst bekommt was von mir, ohne Witz!!

Viele Grüße
Sebastian

Delphi-Code in der Main.pas:

Delphi-Quellcode:
  private
    { Private-Deklarationen }


  public
    { Public-Deklarationen }

  end;

   var
  Form1: TForm1;
  sResult:ILot;
  Response:String;



implementation

{$R *.dfm}


    var
    ToolCode:string;
    CheckSlotPos:boolean;
    EquipmentValidation:boolean;
    LotName:string;
    ReturnBrokenWafers:boolean;
     UseSlotPosition:boolean;

procedure TForm1.Button1Click(Sender: TObject);

begin
  // HTTPRIO1 := THTTPRIO.Create(nil);
 //  ToolCode:='1ELAM3';
 //  CheckSlotPos:= false;
 //  EquipmentValidation:=false;
  // LotName:='R173419P';
   //ReturnBrokenWafers:=true;
   //UseSlotPosition:=false;
   //HTTPRIO1.WSDLLocation:= 'C:\SebastianBihn\Lot\Test\Lot.xml';
  HTTPRIO1.URL     := 'http://tst-rbg14:8019/Lot.svc';
  HTTPRIO1.Service := 'Lot';
  HTTPRIO1.Port    := 'BasicHttpBinding_ILot';

 //HTTPRIO1.URL:='http://tst-rbg14:8019/Lot.svc';
 //sResult:=
// sResult:=(HTTPRIO1 as ILot);
 (HTTPRIO1 as ILot).GetLotInfoByLotName(ToolCode,CheckSlotPos,EquipmentValidation,LotName,ReturnBrokenWafers,UseSlotPosition);
 //SBHTTPRIO1 := THTTPRIO.Create(nil);
 //Memo1.Lines.Text:= sResult;
end;

end.
Delphi-Code der WSDL:

Code:
// ************************************************************************ //
// Die in dieser Datei deklarierten Typen wurden aus Daten generiert, die aus
// unten beschriebener WSDL-Datei stammen:
// WSDL    : C:\SebastianBihn\Lot\Test\Lot.xml
//  >Importieren : http://tst-rbg14:8019/Lot.svc?wsdl=wsdl0
// Codieren : utf-8
// Version : 1.0
// (25.04.2018 09:21:01 - $Revision:  1.9.1.0.1.0.1.9  $)
// ************************************************************************ //

unit Lot;

interface

uses InvokeRegistry, Types, XSBuiltIns;

type
    ToolCode=string;
     CheckSlotPos=boolean;
    EquipmentValidation=boolean;
    LotName=string;
    ReturnBrokenWafers=boolean;
     UseSlotPosition=boolean;
    GetLotInfoByLotNameResponse =string;
  // ************************************************************************ //
  // Die folgenden Typen, auf die im WSDL-Dokument Bezug genommen wird, sind in dieser Datei
  // nicht repräsentiert. Sie sind entweder Aliase(@) anderer repräsentierter Typen oder auf sie wurde Bezug genommen,
  // aber in diesem Dokument nicht deklariert (!). Die Typen aus letzterer Kategorie
  // sind normalerweise mit vordefinierten/bekannten XML- oder Borland-Typen verbunden; sie könnten aber auch ein Anzeichen
  // für ein falsches WSDL-Dokument sein, das einen Schema-Typ nicht deklariert oder importiert..
  // ************************************************************************ //
  // !:GetLotInfoByLotName - "http://cim.osram.ws.gefasoft.com/"
  // !:GetLotInfoByLotNameResponse - "http://cim.osram.ws.gefasoft.com/"
  // !:GetLotByName   - "http://cim.osram.ws.gefasoft.com/"
  // !:GetLotByNameResponse - "http://cim.osram.ws.gefasoft.com/"
  // !:HoldLot        - "http://cim.osram.ws.gefasoft.com/"
  // !:HoldLotResponse - "http://cim.osram.ws.gefasoft.com/"
  // !:SplitLotByGravure - "http://cim.osram.ws.gefasoft.com/"
  // !:SplitLotByGravureResponse - "http://cim.osram.ws.gefasoft.com/"
  // !:SplitLotByGravureWorkflow - "http://cim.osram.ws.gefasoft.com/"
  // !:SplitLotByGravureWorkflowResponse - "http://cim.osram.ws.gefasoft.com/"
  // !:SplitLotByNameWorkflow - "http://cim.osram.ws.gefasoft.com/"
  // !:SplitLotByNameWorkflowResponse - "http://cim.osram.ws.gefasoft.com/"
  // !:ComposeLot     - "http://cim.osram.ws.gefasoft.com/"
  // !:ComposeLotResponse - "http://cim.osram.ws.gefasoft.com/"
  // !:GetGroupByLot  - "http://cim.osram.ws.gefasoft.com/"
  // !:GetGroupByLotResponse - "http://cim.osram.ws.gefasoft.com/"
  // !:MergeLot       - "http://cim.osram.ws.gefasoft.com/"
  // !:MergeLotResponse - "http://cim.osram.ws.gefasoft.com/"
  // !:AssignLotToEquipmentPort - "http://cim.osram.ws.gefasoft.com/"
  // !:AssignLotToEquipmentPortResponse - "http://cim.osram.ws.gefasoft.com/"


  // ************************************************************************ //
  // Namespace : http://cim.osram.ws.gefasoft.com/
  // binding  : BasicHttpBinding_ILot
  // Service  : Lot
  // Port     : BasicHttpBinding_ILot
  // URL      : http://tst-rbg14:8019/Lot.svc
  // ************************************************************************ //
  ILot = interface(IInvokable)
  ['{1E7F22BE-D470-57BE-AF25-CBAC66BA2E10}']
    function GetLotInfoByLotName(ToolCode:string;CheckSlotPos:boolean;EquipmentValidation:boolean;LotName:string;ReturnBrokenWafers:boolean;
      UseSlotPosition:boolean): GetLotInfoByLotNameResponse; stdcall;
   // function GetLotInfoByLotName(ToolCode, CheckSlotPos): GetLotInfoByLotNameResponse; stdcall;
  //  function GetLotByName(const parameters: GetLotByName): GetLotByNameResponse; stdcall;
  //  function HoldLot(const parameters: HoldLot): HoldLotResponse; stdcall;
  //  function SplitLotByGravure(const parameters: SplitLotByGravure): SplitLotByGravureResponse; stdcall;
  //  function SplitLotByGravureWorkflow(const parameters: SplitLotByGravureWorkflow): SplitLotByGravureWorkflowResponse; stdcall;
  //  function SplitLotByNameWorkflow(const parameters: SplitLotByNameWorkflow): SplitLotByNameWorkflowResponse; stdcall;
  //  function ComposeLot(const parameters: ComposeLot): ComposeLotResponse; stdcall;
  //  function GetGroupByLot(const parameters: GetGroupByLot): GetGroupByLotResponse; stdcall;
   // function MergeLot(const parameters: MergeLot): MergeLotResponse; stdcall;
  // function AssignLotToEquipmentPort(const parameters: AssignLotToEquipmentPort): AssignLotToEquipmentPortResponse; stdcall;
  end;

function GetILot(UseWSDL: Boolean=System.false; Addr: string=''): ILot;


implementation
  uses SOAPHTTPClient;

  function GetILot(UseWSDL: Boolean; Addr: string): ILot;


const
  defWSDL = 'C:\SebastianBihn\Lot\Test\Lot.xml';
  defURL = 'http://tst-rbg14:8019/Lot.svc';
  defSvc = 'Lot';
  defPrt = 'BasicHttpBinding_ILot';
var
  HTTPRIO1: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  HTTPRIO1 := THTTPRIO.Create(nil);
  try
     if UseWSDL then
    begin
      HTTPRIO1.WSDLLocation := Addr;
      HTTPRIO1.Service := defSvc;
      HTTPRIO1.Port := defPrt;
    end else
      HTTPRIO1.URL := Addr;
   Result := (HTTPRIO1 as ILot);
  finally
    if Result = nil then
      HTTPRIO1.Free;
  end;


end;


initialization
  InvRegistry.RegisterInterface(TypeInfo(ILot), 'http://cim.osram.ws.gefasoft.com/', 'UTF-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(ILot), 'http://cim.osram.ws.gefasoft.com/ILot/GetLotInfoByLotName');
 // InvRegistry.RegisterDefaultSOAPAction(TypeInfo(ILot), '');
   InvRegistry.RegisterInvokeOptions(TypeInfo(ILot), ioDocument);
end.

TiGü 25. Apr 2018 15:13

AW: Webservice
 
Delphi-Quellcode:
var
  Form1: TForm1;
  sResult: ILot;

implementation

{$R *.dfm}

var
  ToolCode: string;
  CheckSlotPos: Boolean;
  EquipmentValidation: Boolean;
  LotName: string;
  ReturnBrokenWafers: Boolean;
  UseSlotPosition: Boolean;

procedure TForm1.Button1Click(Sender: TObject);
var
  URL: string;
  Response: GetLotInfoByLotNameResponse;
begin
  URL := 'http://tst-rbg14:8019/Lot.svc';
  if not Assigned(sResult) then
    sResult := GetILot(False, URL);

  Response := sResult.GetLotInfoByLotName(ToolCode, CheckSlotPos, EquipmentValidation, LotName, ReturnBrokenWafers, UseSlotPosition);

  if Response <> '' then
    ShowMessage(Response);

end;
Was gibt es denn?

InschenierSB 25. Apr 2018 15:25

AW: Webservice
 
Also nen Kasten Bier in Form von Geld auf jeden Fall.
Aber bis jetzt bekomme ich immer noch diese komische Fehlermeldung!!??

InschenierSB 25. Apr 2018 15:30

AW: Webservice
 
So sieht der Code im SOAP aus, also im XML-Format. Das ist die Anforderung. Ich muss mich bei diesem Server erst mit einem Zertifikat anmelden. Weiß nicht ob das irgendeine Bewandtnis hat.



Code:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cim="http://cim.osram.ws.gefasoft.com/" xmlns:dat="http://cim.osram.ws.gefasoft.com/DataContracts">
   <soapenv:Header/>
   <soapenv:Body>
      <cim:GetLotInfoByLotName>
         <!--Optional:-->
         <cim:requestMessage>
            <dat:ToolCode>?</dat:ToolCode>
            <!--Optional:-->
            <dat:CheckSlotPos>false</dat:CheckSlotPos>
            <!--Optional:-->
            <dat:EquipmentValidation>false</dat:EquipmentValidation>
            <!--Optional:-->
            <dat:LotName>R173419P</dat:LotName>
            <!--Optional:-->
            <dat:ReturnBrokenWafers>true</dat:ReturnBrokenWafers>
            <!--Optional:-->
            <dat:UseSlotPosition>false</dat:UseSlotPosition>
         </cim:requestMessage>
      </cim:GetLotInfoByLotName>
   </soapenv:Body>
</soapenv:Envelope>

TiGü 25. Apr 2018 15:33

AW: Webservice
 
Die Daten, die du reinsteckst, sind eventuell fehlerhaft und/oder unvollständig.

InschenierSB 25. Apr 2018 15:41

AW: Webservice
 
Okay,
ja das ist das große Problem, aber an der WSDL-Datei müsste eigentlich alles okay sein!? Die habe ich ja von Osram bekommen. Musste aber Anpassungen machen.
Aber für den Request brauche ich 6 Parameter, die sehe ich im SOAP und da bekommen ich auch eine Antwort. Nur eben im Delphi nicht.
Vielleicht hast du noch eine Idee, wie ich die Parameter übergeben kann.
Viele Grüße.

Bernhard Geyer 25. Apr 2018 16:19

AW: Webservice
 
Delphi 6?

Besorg dir mal eine neue Delphi-Version.
Diese antike Version hat noch sehr viele Macken/Problem/Fehler im Berech SOAP/Webservices.

Und von Zertifikaten und Authentifizierungen hat diese Delphi-Version überhaupt noch nicht unterstützt.

hoika 25. Apr 2018 16:35

AW: Webservice
 
Hallo,
klar kann das Delphi6, aber nur mit Hilfe der Indys.

InschenierSB 26. Apr 2018 06:53

AW: Webservice
 
Guten Morgen,
@ Heiko
Was sind denn die Indies und wo bekomme ich die her?

@Bernhard
ja das sehe ich genau so, allerdings ist die GUI einer Maschine von uns in dieser Version erstellt. Ich habe erst vor kurzem angefangen und soll jetzt das bestehende System an einen Webserver anbinden.
Aber mal so rum gefragt, in wie weit kann ich alte Projekte hochkonvertieren, also upgraden?!

Vielen Dank für die Info.
Grüße Sebastian

mkinzler 26. Apr 2018 06:57

AW: Webservice
 
Indy ist Teil von Delphi oder über http://www.indyproject.org/index.de.aspx

Elrond 26. Apr 2018 07:27

AW: Webservice
 
Zitat:

Zitat von InschenierSB (Beitrag 1400514)
Aber mal so rum gefragt, in wie weit kann ich alte Projekte hochkonvertieren, also upgraden?!

Vielen Dank für die Info.
Grüße Sebastian

Es kommt stark auf das einzelne Projekt an, je weniger Abhängigkeiten zu Drittkomponenten desto einfacher ist es. Ich würde sogar sagen das bei ausschließlicher Verwendung von VCL es sogar innerhalb eines Tages möglich wäre (je nach Projektgröße).

Noch ein kleiner Hinweis, SOAP ist nichts magisches, es ist eigentlich einfach nur XML übers http. Bei so einen kleinen Webservice könntest du die Anfragen einfach direkt verschicken und müsstest dich nicht mit alten Bugs und ähnlichen rumärgern.

hoika 26. Apr 2018 07:39

AW: Webservice
 
Hallo,
Zitat:

und soll jetzt das bestehende System an einen Webserver anbinden.
Hier könnte man dann auch über eine DLL in einer neueren Delphi-Version nachdenken,
die in die Delphi6-Exe eingebunden wird.

TiGü 26. Apr 2018 07:57

AW: Webservice
 
Zitat:

Zitat von hoika (Beitrag 1400521)
Hallo,
Zitat:

und soll jetzt das bestehende System an einen Webserver anbinden.
Hier könnte man dann auch über eine DLL in einer neueren Delphi-Version nachdenken,
die in die Delphi6-Exe eingebunden wird.

So würde ich auch vorgehen!

Bernhard Geyer 26. Apr 2018 08:27

AW: Webservice
 
Zitat:

Zitat von TiGü (Beitrag 1400526)
Zitat:

Zitat von hoika (Beitrag 1400521)
Hallo,
Zitat:

und soll jetzt das bestehende System an einen Webserver anbinden.
Hier könnte man dann auch über eine DLL in einer neueren Delphi-Version nachdenken,
die in die Delphi6-Exe eingebunden wird.

So würde ich auch vorgehen!

Ich würde so nicht vorgehen.
Dann arbeitest du zwangsweise mit 2 IDE Versionen.
Sowas sollte man vermeiden. Es ist immer mit Mehraufwand verbunden mehrer IDE-Versionen aktiv zu halten (Eigener Arbeitsplatz, Buildsystem, ...)
Auch Debugging ist nicht gerade vereinfacht.

Bernhard Geyer 26. Apr 2018 08:29

AW: Webservice
 
Zitat:

Zitat von InschenierSB (Beitrag 1400514)
@Bernhard
ja das sehe ich genau so, allerdings ist die GUI einer Maschine von uns in dieser Version erstellt. Ich habe erst vor kurzem angefangen und soll jetzt das bestehende System an einen Webserver anbinden.

Wenn das System nicht schon nahe des Punkte ist nicht mehr weiter unterstützt zu werden (End Of Life) solltest du auf jedenfall überlegen die IDE zu aktualisieren.
Wir haben das auch lange hinausgezögert und sind froh jetzt auf XE6 (bald 10.2) zu sein. Das macht das Leben an vielen Stellen einfacher.

InschenierSB 26. Apr 2018 09:53

AW: Webservice
 
Zitat:

Zitat von Elrond (Beitrag 1400518)
Zitat:

Zitat von InschenierSB (Beitrag 1400514)
Aber mal so rum gefragt, in wie weit kann ich alte Projekte hochkonvertieren, also upgraden?!

Vielen Dank für die Info.
Grüße Sebastian

Es kommt stark auf das einzelne Projekt an, je weniger Abhängigkeiten zu Drittkomponenten desto einfacher ist es. Ich würde sogar sagen das bei ausschließlicher Verwendung von VCL es sogar innerhalb eines Tages möglich wäre (je nach Projektgröße).

Noch ein kleiner Hinweis, SOAP ist nichts magisches, es ist eigentlich einfach nur XML übers http. Bei so einen kleinen Webservice könntest du die Anfragen einfach direkt verschicken und müsstest dich nicht mit alten Bugs und ähnlichen rumärgern.

Was meinst du mit 'die Anfragen einfach direkt verschicken'? Es muss auf jeden Fall über Delphi laufen, da die Maschine Daten vom Webservice anfordert.
Grüße

InschenierSB 26. Apr 2018 09:59

AW: Webservice
 
Habe jetzt erstmal auf Delphi 2010 hochgerüstet und schaue mal ob es damit funktioniert.
Danke schon mal für die zahlreichen Antworten.

Das mit der Belohnung ist nicht vergessen, wenn es so funktioniert wie es sein soll gibt's auch ne Belohnung.

mkinzler 26. Apr 2018 10:04

AW: Webservice
 
D2010 ist auch sehr sehr alt.

Elrond 26. Apr 2018 10:19

AW: Webservice
 
Zitat:

Zitat von InschenierSB (Beitrag 1400547)
Zitat:

Zitat von Elrond (Beitrag 1400518)
Zitat:

Zitat von InschenierSB (Beitrag 1400514)
Aber mal so rum gefragt, in wie weit kann ich alte Projekte hochkonvertieren, also upgraden?!

Vielen Dank für die Info.
Grüße Sebastian

Es kommt stark auf das einzelne Projekt an, je weniger Abhängigkeiten zu Drittkomponenten desto einfacher ist es. Ich würde sogar sagen das bei ausschließlicher Verwendung von VCL es sogar innerhalb eines Tages möglich wäre (je nach Projektgröße).

Noch ein kleiner Hinweis, SOAP ist nichts magisches, es ist eigentlich einfach nur XML übers http. Bei so einen kleinen Webservice könntest du die Anfragen einfach direkt verschicken und müsstest dich nicht mit alten Bugs und ähnlichen rumärgern.

Was meinst du mit 'die Anfragen einfach direkt verschicken'? Es muss auf jeden Fall über Delphi laufen, da die Maschine Daten vom Webservice anfordert.
Grüße

Du kannst deine Anfrage direkt über http Abschicken, z.B. mit Indy. Die Automatisch erzeugten Klassen aus der WSDL sind keine Pflicht oder dergleichen. Das ganze ist mit einer gewissen Skepsis zu betrachten da Delphi einen vorgaukelt alles verstanden zu haben und am ende kommt es selbst in der neuen Version nicht mit optionalen Elementen zurecht, ganz davon zu schweigen das der komplette WS-* Stack fehlt.

InschenierSB 26. Apr 2018 10:40

AW: Webservice
 
Zitat:

Zitat von mkinzler (Beitrag 1400555)
D2010 ist auch sehr sehr alt.

Ja da hast du Recht, aber irgendwie scheint es als ob die neueren Updates kostenpflichtig sind?!
Oder? Ich meine eine Lizenz haben wir ja.
Davon ab, dann muss mein Chef halt ne neue Lizenz kaufen.

mkinzler 26. Apr 2018 10:45

AW: Webservice
 
Das war schon immer so und betrifft so ziemlich jedes kommerzielle Produkt. Wer damals Word95 gekauft hat, darf mit dieser Lizenz ja auch kein Office2016 nutzen.

TiGü 26. Apr 2018 10:46

AW: Webservice
 
Zitat:

Zitat von InschenierSB (Beitrag 1400567)
Davon ab, dann muss mein Chef halt ne neue Lizenz kaufen.

Der zieht dir die Ohren lang in Anbetracht der Preise. :-D

InschenierSB 26. Apr 2018 14:03

AW: Webservice
 
Ja nee.... also da muss er durch... Das ist so ähnlich wie wenn ich was handwerkliches mache und habe steinaltes Werkzeug. Das geht vielleicht bis zu einem bestimmten Grad aber dann ist Schluss.
Aber was anderes, wenn ich das WSDL Dokument in die Delphi 2010 Version importiere, sieht es definitiv komplett anders aus als im Delphi 6 :-D
Wie kann ich jetzt die Parameter(4 mal Boolean und 1 String) der Funktion übergeben? Der Typ ist im WSDL-Dokument deklariert. Das ist ja dann in der Main.pas ein undefinierter Bezeichner.
Ich füge mal nur den relevanten Code ein:
Das ist aus dem WSDL-Dokument die deklarierte Funktion.
Delphi-Quellcode:
  // URL      : http://tst-rbg16:8029/Lot.svc
  // ************************************************************************ //
  ILot = interface(IInvokable)
  ['{1E7F22BE-D470-57BE-AF25-CBAC66BA2E10}']
    function GetLotInfoByLotName(const requestMessage: GetLotInfoByLotNameRequest2): GetLotInfoByLotNameResponse2; stdcall;

Weiterhin der Code für die Deklaration von "GetLotInfoByLotNameRequest2"

Delphi-Quellcode:
  // ************************************************************************ //
  GetLotInfoByLotNameRequest2 = class(BaseRequest2)
  private
    FCheckSlotPos: Boolean;
    FCheckSlotPos_Specified: boolean;
    FEquipmentValidation: Boolean;
    FEquipmentValidation_Specified: boolean;
    FLotName: string;
    FLotName_Specified: boolean;
    FReturnBrokenWafers: Boolean;
    FReturnBrokenWafers_Specified: boolean;
    FUseSlotPosition: Boolean;
    FUseSlotPosition_Specified: boolean;

Und in der Main.pas rufe ich nun die Funktion GetLotInfoByLotName auf
und wie übergebe ich nun die Parameter vom Typ GetLotInfoByLotNameRequest2 ??
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  HTTPRIO1.URL:='http://tst-rbg14:8019/Lot.svc';

  sResult:= (HTTPRIO1 as ILot).GetLotInfoByLotName(?????)
end;

TiGü 26. Apr 2018 14:05

AW: Webservice
 
GetLotInfoByLotNameRequest2 ist eine Klasse.
Die kannst du ganz normal erstellen und ihre Properties ausfüllen.

InschenierSB 26. Apr 2018 14:29

AW: Webservice
 
Okay danke aber wo füge ich das genau in die Main.pas ein?! Sorry aber das ist für mich alles noch Neuland. Habe vielleicht vor 2 Wochen mit Delphi angefangen. Vorher nur S7, AWL, und solche Sachen programmiert....:(
Zitat:

Zitat von TiGü (Beitrag 1400601)
GetLotInfoByLotNameRequest2 ist eine Klasse.
Die kannst du ganz normal erstellen und ihre Properties ausfüllen.

Hier der Code aus der Main.pas

Delphi-Quellcode:
unit Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Soap.InvokeRegistry, Vcl.StdCtrls, Lot_1,
  Soap.Rio, Soap.SOAPHTTPClient;



type

  TForm1 = class(TForm)

    Button1: TButton;
    Request: TMemo;
    Response: TMemo;
    Result: TMemo;
    HTTPRIO1: THTTPRIO;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure HTTPRIO1AfterExecute(const MethodName: string;
      SOAPResponse: TStream);
    procedure HTTPRIO1BeforeExecute(const MethodName: string;
      SOAPRequest: TStream);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
  // GetLotInfoByLotNameRequest2 = class(BaseRequest2);
var
  Form1: TForm1;
  sResult:string;
  CheckSlotPos:boolean;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  HTTPRIO1.URL:='http://tst-rbg14:8019/Lot.svc';

  sResult:= (HTTPRIO1 as ILot).GetLotInfoByLotName()
end;

procedure TForm1.HTTPRIO1AfterExecute(const MethodName: string;
  SOAPResponse: TStream);
begin

      SoapResponse.Position:= 0;
      Response.Lines.LoadFromStream(SoapResponse);
end;

procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string;
  SOAPRequest: TStream);
begin
       SoapRequest.Position:= 0;
       Request.Lines.LoadFromStream(SoapRequest);
end;

end.

TiGü 26. Apr 2018 14:43

AW: Webservice
 
Das heißt, wir müssen auch noch die Grundlagen der Objekt-orientierten Programmierung mit Delphi durchgehen? :shock:
Und der Bedienung von IDE und Debugger? :shock::shock:

Delphi-Quellcode:
unit Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Soap.InvokeRegistry, Vcl.StdCtrls, Lot_1,
  Soap.Rio, Soap.SOAPHTTPClient;

type

  TForm1 = class(TForm)

    Button1: TButton;
    Request: TMemo;
    Response: TMemo;
    Result: TMemo;
    HTTPRIO1: THTTPRIO;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure HTTPRIO1AfterExecute(const MethodName: string;
      SOAPResponse: TStream);
    procedure HTTPRIO1BeforeExecute(const MethodName: string;
      SOAPRequest: TStream);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    FLot: ILot;
  public
    { Public-Deklarationen }
  end;

  // GetLotInfoByLotNameRequest2 = class(BaseRequest2);
var
  Form1: TForm1;
  sResult: string;
  CheckSlotPos: boolean;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var
  URL: string;
  Request: GetLotInfoByLotNameRequest2;
  Response: GetLotInfoByLotNameResponse2; //Oder so ähnlich. Du könntest auch einfach mal alles posten, du Fuchs!
begin
  URL := 'http://tst-rbg14:8019/Lot.svc';
  if not Assigned() then
  begin
    FLot := GetILot(False, URL);
  end;

  Request := GetLotInfoByLotNameRequest2.Create;
  Request.CheckSlotPo := True;
  Request.EquipmentValidation := True;
  Request.LotName := 'BlaBlupp';
  // usw. ich denke das Prinzip ist klar.

  Response := FLot.GetLotInfoByLotName(Request);
  if Assigned(Response) then
  begin
    ShowMessage(Response.IrgendeineTolleEigenschaftDieWirHierJetztNichtKennen);
  end;

end;

//procedure TForm1.HTTPRIO1AfterExecute(const MethodName: string;
//  SOAPResponse: TStream);
//begin
//
//  SOAPResponse.Position := 0;
//  Response.Lines.LoadFromStream(SOAPResponse);
//end;
//
//procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string;
//  SOAPRequest: TStream);
//begin
//  SOAPRequest.Position := 0;
//  Request.Lines.LoadFromStream(SOAPRequest);
//end;

end.

InschenierSB 26. Apr 2018 15:17

AW: Webservice
 
Liste der Anhänge anzeigen (Anzahl: 2)
Naja ich habe ja auch noch 2 Bücher aus der Bibliothek,
aber naja von heute auf morgen lernt man das nicht.... das ist ja normal.
Ich habe dir mal das WSDL-Dokument und die Main.pas angehangen. Vielleicht kannst du es bei dir mal ausführen....
Danke schon mal.... wobei weiß nicht ob es kompatibel zu deiner Version ist.

InschenierSB 26. Apr 2018 15:24

AW: Webservice
 
Ich denke dass ich es jetzt hinbekomme.
Aber noch eine Frage die Variablen nach dem Request. muss ich schon noch deklarieren, also die ....CheckSlotPos
..EquipmentValidation...
etc.
weil die sind ja sonst unbekannt??!

Request := GetLotInfoByLotNameRequest2.Create;
Request.CheckSlotPo := True;
Request.EquipmentValidation := True;
Request.LotName := 'BlaBlupp';
// usw. ich denke das Prinzip ist klar.

TiGü 26. Apr 2018 16:00

AW: Webservice
 
Wenn du diese Parameter ausfüllen möchtest oder musst, dann musst du die jeweilige Property hinschreiben und natürlich füllen.

TiGü 26. Apr 2018 16:08

AW: Webservice
 
Fang doch mal ganz klein an und baue dir ein Konsolenprogramm.
Tipp: Die Codevervollständigung der Delphi-IDE kannst du aufrufen, indem du den blinkenden Cursor hinter "Request." oder "Response." stellst und dann mit Strg + Leertaste aufrufst.
Dadurch siehst du die sogenannten Properties/Eigenschaften eines Objekts.
Im Response (vom Typ GetLotInfoByLotNameResponse2) sind es 38 Eigenschaften, die du abfragen und auswerten kannst.

Delphi-Quellcode:
program LoT;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Winapi.Windows,
  Winapi.ActiveX,
  Lot_1 in 'Lot_1.pas';

procedure Main;
var
  LoT: ILot;
  Request: GetLotInfoByLotNameRequest2;
  Response: GetLotInfoByLotNameResponse2;
begin
  LoT := GetILot();
  if Assigned(LoT) then
  begin
    Request := GetLotInfoByLotNameRequest2.Create;
    try
      Request.CheckSlotPos := True;
      Request.EquipmentValidation := True;
      Request.LotName := 'Hier kommt ein String rein';
      Request.ReturnBrokenWafers := True;
      Request.UseSlotPosition := True;
      Request.ToolCode := 'Hier kommt ein String rein';

      Response := LoT.GetLotInfoByLotName(Request);
      if Assigned(Response) then
      begin
        Writeln(Response.Facility);
        Writeln(Response.LotName);
        Writeln(Response.Operation);
        // usw.

        Response.Free;
      end;
    finally
      Request.Free;
    end;
  end;
end;

begin
  try
    CoInitializeEx(nil, 0);
    Main;
    CoUninitialize;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

end.

InschenierSB 27. Apr 2018 06:16

AW: Webservice
 
Zitat:

Zitat von TiGü (Beitrag 1400633)
Wenn du diese Parameter ausfüllen möchtest oder musst, dann musst du die jeweilige Property hinschreiben und natürlich füllen.

Guten Morgen,
ja genau diese Parameter muss ich ausfüllen, das ist ja meine Problem seit 2 Wochen, diese Parameter zu übergeben.

InschenierSB 27. Apr 2018 06:20

AW: Webservice
 
Zitat:

Zitat von TiGü (Beitrag 1400634)
Fang doch mal ganz klein an und baue dir ein Konsolenprogramm.
Tipp: Die Codevervollständigung der Delphi-IDE kannst du aufrufen, indem du den blinkenden Cursor hinter "Request." oder "Response." stellst und dann mit Strg + Leertaste aufrufst.
Dadurch siehst du die sogenannten Properties/Eigenschaften eines Objekts.
Im Response (vom Typ GetLotInfoByLotNameResponse2) sind es 38 Eigenschaften, die du abfragen und auswerten kannst.


Ja das mit den Eigenschaften wusste ich ja auch, das ist genau das Gleiche, wenn ich einen Punkt hinter das Objekt mache, dann macht er automatisch die das Fenster mit der Scroll-Bar auf. Wie gesagt genau diese Eigenschaften sind aber nicht dabei, da meckert der Compiler.

TiGü 27. Apr 2018 07:58

AW: Webservice
 
Zitat:

Zitat von InschenierSB (Beitrag 1400656)
Wie gesagt genau diese Eigenschaften sind aber nicht dabei, da meckert der Compiler.

"Hallo Meister, bei meinen Auto leuchtet die Motorkontrollleuchte, was ist daran kaputt?"

Ohne genaue Fehler- und Problembeschreibung werden wir dir hier nicht helfen können.
Man kann die Fehlermeldungen vom Compiler im kopieren und hier einfügen.

Wenn du bspw. das oben gezeigte Konsolenprogramm nicht ausprobierst, dann können wir dir hier nicht weiterhelfen.

Weil das nämlich so wie es da steht, und man die Pascal-Unit mit der Dateiendung: *.pas dem Projekt hinzufügt, definitiv kompiliert.
Die Eigenschaften der Request- und Response-Klasse sind in der Unit "Lot_1.pas" vorhanden.

InschenierSB 27. Apr 2018 09:06

AW: Webservice
 
Hallo TiGü,

ja okay also nachfolgend der Code.
Ich habe es jetzt soweit hinbekommen, dass keine Fehlermeldung mehr beim Ausführen erscheint. Jetzt fehlt mir nur noch dass die Response in einem Memo Fenster erscheint. Der ganze Schmarrn soll einfach nur in dem Fenster erscheinen wie mache ich das am besten?!
Die Eingabe Parameter akzeptiert der Server so anscheinend.
Warum hattest du mir das mit diesem SOAP Response und Request vorher aus kommentiert, da sieht man doch immer ganz schön die Anfrage des Clients in einem Memo?
Hatte das einen bestimmten Grund?
Delphi-Quellcode:
unit Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Soap.InvokeRegistry, Vcl.StdCtrls, Lot_1,
  Soap.Rio, Soap.SOAPHTTPClient;



type

  TForm1 = class(TForm)

    Button1: TButton;
    Request: TMemo;
    Respo: TMemo;
    Result: TMemo;
    HTTPRIO1: THTTPRIO;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
  (*  procedure HTTPRIO1AfterExecute(const MethodName: string;
      SOAPResponse: TStream);
    procedure HTTPRIO1BeforeExecute(const MethodName: string;
      SOAPRequest: TStream); *)
    procedure Button1Click(Sender: TObject);
  private
  FLot: ILot;

    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;



var
  Form1: TForm1;
  sResult:string;


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

 // HTTPRIO1.URL:='http://tst-rbg14:8019/Lot.svc';
   // URL := 'http://tst-rbg14:8019/Lot.svc';
    // EquipmentValidation:=True;


   //  (HTTPRIO1 as ILot).GetLotInfoByLotName(LotName);

 //if not Assigned(Response) then
 var
    LoT: ILot;
   Request: GetLotInfoByLotNameRequest2;
   Response: GetLotInfoByLotNameResponse2;
  begin
   LoT := GetILot();
   if Assigned(LoT) then
   begin
      HTTPRIO1.URL:='http://tst-rbg14:8019/Lot.svc';
     Request := GetLotInfoByLotNameRequest2.Create;
     try
       Request.CheckSlotPos := False;
       Request.EquipmentValidation := False;
       Request.LotName := 'R173419P';
       Request.ReturnBrokenWafers := True;
       Request.UseSlotPosition := False;
       Request.ToolCode := '1ELAM3';

       Response := LoT.GetLotInfoByLotName(Request);
       if Assigned(Response) then
       begin
        // Writeln(Response.Facility);
        // Writeln(Response.LotName);
        // Writeln(Response.Operation);
         // usw.
         //
         //Response.Free;
       end;
     finally
       Request.Free;
     end;
   end;
   end;
 end.
 (*
procedure TForm1.HTTPRIO1AfterExecute(const MethodName: string;
  SOAPResponse: TStream);
begin

      SoapResponse.Position:= 0;
      Respo.Lines.LoadFromStream(SoapResponse);
end;

procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string;
  SOAPRequest: TStream);
begin
       SoapRequest.Position:= 0;
       Request.Lines.LoadFromStream(SoapRequest);
end; *)

TiGü 27. Apr 2018 09:21

AW: Webservice
 
Zitat:

Zitat von InschenierSB (Beitrag 1400691)
Der ganze Schmarrn soll einfach nur in dem Fenster erscheinen wie mache ich das am besten?!

Delphi-Quellcode:
Respo.Lines.Add('Facility: ' + Response.Facility);
Respo.Lines.Add('LotName: ' + Response.LotName);
Respo.Lines.Add('LotName: ' + Response.LotName);
Respo.Lines.Add('NumberOfWafers: ' + Response.NumberOfWafers.DecimalString);
Respo.Lines.Add('IsEDCRequired ' + BoolToStr(Response.IsEDCRequired, True));
Prinzip verstanden?
Bei den komplexeren Datentypen wie die Eigenschaften ActualCSA, EdcEpaEquipmentList und LotAttributes wird es natürlich schwierig mit deinem Vorwissen.

Zitat:

Zitat von InschenierSB (Beitrag 1400691)
Warum hattest du mir das mit diesem SOAP Response und Request vorher aus kommentiert, da sieht man doch immer ganz schön die Anfrage des Clients in einem Memo?

Damit du dich auf das Wesentliche konzentrierst! Außerdem hast du so nur die reinen XML-Requests - und Responses gesehen. Das nützt dir aber in der Weiterverarbeitung der Daten nichts. (Logging und Debugging ausgenommen).

InschenierSB 27. Apr 2018 09:56

AW: Webservice
 
Zitat:

Zitat von TiGü (Beitrag 1400695)
Delphi-Quellcode:
Respo.Lines.Add('Facility: ' + Response.Facility);
Respo.Lines.Add('LotName: ' + Response.LotName);
Respo.Lines.Add('LotName: ' + Response.LotName);
Respo.Lines.Add('NumberOfWafers: ' + Response.NumberOfWafers.DecimalString);
Respo.Lines.Add('IsEDCRequired ' + BoolToStr(Response.IsEDCRequired, True));
Prinzip verstanden?

Ja ich denke schon.... aber bei der Zeile:Respo.Lines.Add('NumberOfWafers: ' + Response.NumberOfWafers.DecimalString); meckert er noch: Der Compiler sagt dass 'string' und 'TXSDecimal' Inkompatible Typen sind. Wie kann ich jetzt das NumberOfWafers umwandeln.

Bei den komplexeren Datentypen wie die Eigenschaften ActualCSA, EdcEpaEquipmentList und LotAttributes wird es natürlich schwierig mit deinem Vorwissen.

Das wäre jetzt erstmal nicht so wild, das würde ich dann vielleicht auch noch hinbekommen, habe noch ein paar Monate Zeit, die Anbindung in die vorhandene GUI einzubinden. Das WICHTIGSTE ist jetzt erstmal mit einer bestimmten Anfrage überhaupt eine Antwort vom Sever zu bekommen, da die ganze Geschichte noch über einen VPN läuft der auch bestimmte Zertifikate benötigt. Aber diese Verbindung habe ich ja schon über meinen Browser aufgebaut.

TiGü 27. Apr 2018 10:04

AW: Webservice
 
Zitat:

Zitat von InschenierSB (Beitrag 1400712)
aber bei der Zeile:Respo.Lines.Add('NumberOfWafers: ' + Response.NumberOfWafers.DecimalString); meckert er noch: Der Compiler sagt dass 'string' und 'TXSDecimal' Inkompatible Typen sind. Wie kann ich jetzt das NumberOfWafers umwandeln.

Bitte nicht meine Beispiele abtippen sondern kopieren.
Insofern du eine TMemo-Klasse mit den Namen Respo auf dem Formular hast, kompiliert die Zeile
Delphi-Quellcode:
Respo.Lines.Add('NumberOfWafers: ' + Response.NumberOfWafers.DecimalString);
ohne Probleme.
DecimalString ist schon vom geforderten Typ
Delphi-Quellcode:
string
.

TiGü 27. Apr 2018 10:07

AW: Webservice
 
Sollte TXSDecimal.DecimalString nicht in D2010 vorhanden sein - das kann ja gut sein - dann bitte einfach schreiben:
Delphi-Quellcode:
Respo.Lines.Add('NumberOfWafers: ' + string(Response.NumberOfWafers.AsBcd));

InschenierSB 27. Apr 2018 10:16

AW: Webservice
 
Zitat:

Zitat von TiGü (Beitrag 1400717)
Sollte TXSDecimal.DecimalString nicht in D2010 vorhanden sein - das kann ja gut sein - dann bitte einfach schreiben:
Delphi-Quellcode:
Respo.Lines.Add('NumberOfWafers: ' + string(Response.NumberOfWafers.AsBcd));

Also es funktioniert jetzt....Wahnsinn... ganz Großes Lob hauptsächlich an dich aber die anderen natürlich auch.
Jetzt ist es Zeit für die Belohnung....

TiGü 27. Apr 2018 10:17

AW: Webservice
 
Zitat:

Zitat von InschenierSB (Beitrag 1400719)
Jetzt ist es Zeit für die Belohnung....

Deinen Wochenlohn nehme ich gerne per PayPal entgegen. :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:43 Uhr.
Seite 1 von 3  1 23      

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