Schmerzen mit Navision

Wir sind gerade mit einer Navision-Anbindung beschäftigt (ich weiss, das Ding heisst jetzt wohl "Dynamics NAV" - ist mir aber egal). Unter anderem auch via SOAP. Und das ist alles so furchtbar - ich weiss gar nicht, wo ich anfangen soll. Nachdem ich funktionierende WSDL-URLs gekriegt hab (was eine ganze Weile gedauert hat), dachte ich, dass der Rest nur noch Fleissarbeit ist. Pustekuchen.

Dass die URLs Login-geschützt sind, ist ja völlig ok und richtig. Aber bei MS geht das natürlich nicht mit einem banalen HTTP-Basic-Auth. Nein. Das muss NTLM oder wenigstens SPNEGO sein. Wegen Single-Sign-On und so. Macht besonders Spass, wenn man eben keinen Windows-Client verwendet - und auch nicht in der Windows-Domäne ist. Mit Webservices können alle plattformübergreifend miteinander reden? Haha. In nem MSDN-Blog fand ich wenigstens einen Tipp, um SPNEGO zu deaktivieren (das kann Java nicht). Nächste Falle. Natürlich erfolgt das Login mit Domänen-Account. Also muss die Domäne im Benutzernamen mit angegeben werden - "DOMÄNE\username". Backslash im Benutzernamen? Keine Chance, das so zu escapen, dass es das "wsdl2java" von Apache CXF frisst. OK, dann halt die in Java 6 eingebaute Webservice-Unterstützung. "wsimport" kapiert keine URLs in der Form "http://username:passwort@host..." sondern will die Zugangsdaten in einer separaten Datei "~/.metro/auth" haben. Unglaublich - scheinbar gibt es keine offizielle Beschreibung des Dateiformats. Bin ich der Einzige, der das nutzt? Hürde nach langem Probieren umschifft. Jetzt aber. Der Beispielcode im Blog sieht merkwürdig umständlich aus. Warum erzeugt der die Webservice-Objekte nicht über den parameterlosen Konstruktor sondern übergibt URL und QName nochmal explizit? Die Daten hat doch schon "wsimport" hart da rein geschrieben. Nach etlichen Fehlversuchen begreife ich, dass der Name des Mandanten in die URL reingefrickelt werden muss. Nächste Merkwürdigkeit. Ich will nach dieser Anleitung einen Verkaufsauftrag erstellen. Der Code dort ist nicht etwa unnötig umständlich. Nein, das muss so. Um einen Auftrag anzulegen, sind mind. 3 Requests nötig: Leeres(!) SalesOrder-Objekt erstellen und der "create"-Funktion des Webservices übergeben. Dabei wird ein ellenlanger Key im Objekt erzeugt. Anschließend die Properties setzen und dann der "update"-Funktion des Services übergeben. Das gleiche Spiel mit den einzelnen Positionen des Auftrages. Gewünschte Anzahl leerer(!) SalesLines erzeugen, "update" aufrufen. Danach die Properties der Zeilen befüllen und dann wieder mit "update" an den Webservice schicken. Alles in einem Rutsch mit "create" erzeugen wär' ja auch viel zu banal.

Und jetzt kommt das Beste. Der Mist funktioniert trotzdem nicht. NAV wirft mir grundsätzlich eine SOAPFaultException mit dem grandiosen Text "Die Zeichenfolge wurde nicht als gültige DateTime erkannt. Ein unbekanntes Wort beginnt bei Index 8." um die Ohren. Das hat mich die meisten Nerven gekostet. Also hab ich die TCP-Kommunikation mal mitgeschnitten. Der letzte fehlerauslösende Request enthielt u.a. das hier "<Time_Sent>00:00:00E-7</Time_Sent>. Verdächtig. Ich nehme an, "E-7" soll eine Zeitzonen-Angabe sein. Wohlgemerkt - ich hab das Property nicht selbst so gesetzt - das hat mir NAV in "create" so zurückgeschickt! Also hab ich mal eine richtige Uhrzeit reingeschrieben. Mhh, immer noch der gleiche Fehler. Aah, das Element "Time_Received" enthält auch ein "E-7". Also dort ebenfalls eine richtige Uhrzeit eingetragen. Gna! Jetzt beschwert es sich, dass "Time_Received" read-only sei. Du kannst mich mal. Also ein "order.setTimeSent(null);order.setTimeReceived(null);". Und? Der Mist funktioniert! Es geht! Dieses Stück "Software" kann die selbst produzierten Daten nicht wieder einlesen.

Mir graut, was da noch auf mich zukommt.

Trackbacks

Trackback-URL für diesen Eintrag

Dieser Link ist nicht aktiv. Er enthält die Trackback-URI zu diesem Eintrag. Sie können diese URI benutzen, um Ping- und Trackbacks von Ihrem eigenen Blog zu diesem Eintrag zu schicken. Um den Link zu kopieren, klicken Sie ihn mit der rechten Maustaste an und wählen "Verknüpfung kopieren" im Internet Explorer oder "Linkadresse kopieren" in Mozilla/Firefox.

Keine Trackbacks

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

Olaf am :

Hallo Olaf,
ich musste auch ein Nav anzapfen. allerdings mit PHP. Dazu habe ich folgenden Connector benutzt:
http://www.silversolutions.de/loesungen/produkte/web_connector/web_connector_fuer_microsoft_dynamics_nav

Vielleicht hilft dir das Ding etwas.

Gruß Olaf

Die Kommentarfunktion wurde vom Besitzer dieses Blogs in diesem Eintrag deaktiviert.