Umsetzung der IDS-Connect-Schnittstelle für Delphi. Unterstützt werden die Schnittstellenversionen 2.5 und 2.5.1.
Weitere Informationen unter https://www.itek.de/beratung/ids-connect
| Aktion | Code | Methode |
|---|---|---|
| Warenkorb senden | WKS | TIDSConnect.IDSConnectWKS |
| Warenkorb empfangen | WKE | TIDSConnect.IDSConnectWKE |
| Artikeldeeplink | ADL | TIDSConnect.IDSConnectADT |
| Artikelsuche | AS | TIDSConnect.IDSConnectAS |
| Logininformationen | LI | TIDSConnect.IDSConnectLI |
| Schnittstellenversion | SV | TIDSConnect.IDSConnectSV |
LI und SV laufen als direkter POST ohne Browser und ohne Hook-URL:
//Welche Anmeldedaten braucht der Shop?
var lLogin : TIDSConnect_LoginInfo;
if TIDSConnect.IDSConnectLI(URL,lLogin) then
if lLogin.PasswordRequired then ...
//Welche Version sprechen wir?
case TIDSConnect.IDSConnectSVBestVersion(URL) of
idsConnectVersion_2_5_1 : lWarenkorb.WarenkorbInfo.Version := idsConnectVersion_2_5_1;
idsConnectVersion_2_5 : lWarenkorb.WarenkorbInfo.Version := idsConnectVersion_2_5;
end;Antwortet der Shop nicht, liefert IDSConnectLI False und lässt alle drei
Angaben auf „erforderlich"; IDSConnectSVBestVersion liefert dann
idsConnectVersion_Unkown.
Die erzeugte Schnittstellenversion steuert WarenkorbInfo.Version. Voreingestellt
ist idsConnectVersion_2_5_1; für die alte Fassung genügt
lWarenkorb.WarenkorbInfo.Version := idsConnectVersion_2_5;Beim Einlesen werden beide Fassungen erkannt, ebenso ältere Antworten mit Version 1.3, 2.0 und 2.3.
InquiryNo,OfferNo,PartNoundOrderConfNoin den Kopfdaten entfallen und werden durch beliebig vieleReferenz-Einträge ersetzt (OrderInfo.Referenzen, je mit Belegnummer, Belegdatum und Belegart).- Belegarten:
220Bestellung,231Bestätigung (Auftrag),310Angebot,315Vertrag. - Positionen kennen zusätzlich
SumMaterialSurcharges(Summe der Rohstoffzuschläge),DiscountableAmount(skontofähiger Betrag) und eigeneReferenz-Einträge mit Belegposition. - Adressen:
Name4entfällt,Streetwird zuStreet1bisStreet3, die Postleitzahl ist auf 9 Stellen begrenzt. - Der Lieferort kann Geokoordinaten tragen (
GeoLat,GeoLang). - Rohstoff-Codeliste um
MS(Messing) undMK(MK Kupfer) erweitert. - Für die Artikelsuche gibt es die Parameter
multipleResultundhookURLTimeout:
TIDSConnect.IDSConnectAS(URL,Kundennr,Benutzer,Passwort,TempDatei,Suchbegriff,
lWarenkorb,
True, //Mehrfachrückgabe an die HookUrl unterstützt
300); //HookUrl bleibt 300 Sekunden aktivMit multipleResult = True darf der Shop mehrfach an die Hook-URL senden. Der
Warte-Dialog bleibt dann offen und übernimmt jede eintreffende Rückgabe: deren
Positionen werden an lWarenkorb angehängt, die Kopfdaten stammen aus der
ersten Rückgabe. Der Dialog zeigt laufend die Anzahl der übernommenen Rückgaben;
beendet wird der Vorgang über „Fertig" oder durch Ablauf der Frist.
hookURLTimeout bemisst sich dabei — wie in der Spezifikation vorgesehen — ab
der letzten Übertragung.
Ob ein Shop die Mehrfachrückgabe beherrscht, lässt sich nicht abfragen. Der
Parameter ist eine Zusage der Handwerkssoftware an den Shop („ich kann mehrere
Rückgaben verarbeiten"), keine Anfrage; die Spezifikation kennt dafür weder in
SV noch in LI ein Merkmal. Praktisch bleibt nur, es je Großhändler einmal
auszuprobieren und zu hinterlegen — im Beispielprojekt über den Schlüssel
MultipleResult in der configuration.ini.
Damit ein Shop, der nur einmal sendet, den Dialog nicht die volle Frist offenhält, wird nach der ersten Rückgabe nur noch kurz auf weitere gewartet:
//Sekunden; 0 = immer die volle Frist abwarten
TIDSConnect.IDSCONNECT_MULTIPLERESULT_FOLLOWUP := 30;Wer den Ablauf selbst steuern will, kann die Rückgaben mit
TIDSConnect.MergeOrderItems(_Quelle,_Ziel) zusammenführen — nötig, weil
LoadFromStream den Zielwarenkorb vor dem Einlesen leert.
Die Rück-Kommunikation läuft über eine eigene, per HTTPS erreichbare Adresse:
TIDSConnect.IDSCONNECT_HOOKURL := 'https://<eigener-server>/idsconnect.php';Ein passendes Server-Skript liegt als idsconnect.php bei. Über diese Adresse laufen Warenkorb-, Preis- und Kundendaten — sie gehört auf einen Server, den man selbst kontrolliert.
Nach dem Absenden zeigt die Unit einen Warte-Dialog und fragt die Hook-URL im Abstand von zwei Sekunden ab, bis die Rückübertragung eintrifft, der Anwender abbricht oder das Zeitlimit abläuft:
//Sekunden; 0 = ohne Zeitbegrenzung warten, bis der Anwender abbricht
TIDSConnect.IDSCONNECT_HOOKURL_TIMEOUT := 300;Für die Artikelsuche gilt stattdessen der an IDSConnectAS übergebene
hookURLTimeout.
SaveToString gibt jeden Block aus, sobald er gefüllt ist — eine reine Anfrage
ohne Preise erzeugt also dieselben Elemente wie bisher:
SupplierInfo,CustomerInfoundDeliveryPlaceInfo, sobaldIDNooder ein Adressfeld gesetzt ist (beim Lieferort ab 2.5.1 auch bei gesetzten Geodaten)- je Position
Kurztext,Langtext,OfferPrice,NetPrice,PriceBasis,VAT,TechnClarification,Hinweis,Fehlercode,Fehlertext,Zuschlag,RohstoffanteilundDivers, sofern belegt
Alle Textinhalte werden XML-maskiert; beim Einbetten in das HTML-Formular kommt die HTML-Maskierung hinzu.
Parser- und Netzwerkfehler werden über einen optionalen Callback gemeldet:
TIDSConnect.IDSCONNECT_ONERROR :=
procedure (const _Message : String; _E : Exception)
begin
//protokollieren oder anzeigen
end;Für Testumgebungen mit selbstsignierten Zertifikaten lässt sich die Zertifikatsprüfung gezielt abschalten — im Normalbetrieb bleibt die Prüfung des Betriebssystems aktiv:
TIDSConnect.IDSCONNECT_ALLOW_INVALID_CERT := True;Alle vier Aktionen laufen wahlweise im Standardbrowser oder im integrierten
Browser (TEdgeBrowser, benötigt die WebView2-Runtime). Gesteuert wird das über
den Parameter _TmpFilename:
- gesetzt — das Formular wird in diese Datei geschrieben und im Standardbrowser geöffnet
- leer — das Formular wird direkt im integrierten Browser angezeigt; es entsteht keine Datei mit Zugangsdaten auf der Platte
Im integrierten Browser erkennt der Dialog den Sprung auf die Hook-URL selbst und schließt sich; der Warenkorb wird danach abgeholt. Beim Standardbrowser übernimmt das der Warte-Dialog mit Polling.
TEdgeBrowser braucht einen beschreibbaren Ordner für Profil, Cookies und
Cache. Bleibt er leer, legt WebView2 ihn neben der ausführbaren Datei an —
unter C:\Program Files schlägt die Initialisierung damit fehl. Deshalb wird,
wenn beim ShowDialog kein Pfad übergeben wird, automatisch
%LOCALAPPDATA%\<AnwendungsName>.IDSConnect.WebView2
verwendet und bei Bedarf angelegt. Der Ordner ist bewusst dauerhaft und kein Temp-Verzeichnis: WebView2 legt dort die Anmeldesitzung ab, sonst müsste sich der Anwender bei jedem Aufruf neu am Shop anmelden. Ein eigener Pfad lässt sich weiterhin übergeben.
Das Projekt unter Samples erwartet neben der Projektdatei eine
configuration.ini:
[Settings]
HookUrl=https://<eigener-server>/idsconnect.php
[Name Lieferant]
Username=...
Password=...
Customernumber=...
IDSConnectUrl=https://...
DemoArticle=... ;optional, füllt das Feld Artikelnummer
MultipleResult=1 ;optional, Shop beherrscht die MehrfachrückgabeDer Schalter „Shop-Infos (SV / LI)" fragt beim ausgewählten Anbieter die unterstützten Schnittstellenversionen und die benötigten Anmeldedaten ab.
Die Datei enthält Zugangsdaten und ist deshalb von der Versionsverwaltung ausgenommen.
| Lieferant | ja | geplant | nein | Version |
|---|---|---|---|---|
| Pfeiffer & May | x | - | - | 2.5 |
| GC-Gruppe | x | - | - | | Pietsch | x | - | - | | Pürsch | - | - | x | | Sanitär-Heinze | x | - | - | | ZVSHK | x | - | - |
Copyright (C) 2026 Landrix Software GmbH & Co. KG Sven Harazim, info@landrix.de
Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.