Buchen über Webservice / Aufrufen der Codeunit

19. Januar 2015 13:27

Hallo zusammen,

ich bin noch recht neu beim Thema NAV - wir haben uns die Lizenzen erst vor einigen Wochen zugelegt (NAV 2015 + Extended).
Jedenfalls spielen wir aktuell mit dem System ein wenig.

Unser erstes Thema ist der Import von Bestellungen sowie das Ändern des Status eines Verkaufauftrags / Buchen eines Verkaufauftrags.
Import bzw. anlegen über Odata ist kein Thema, ebenso bei Artikeln, Kunden usw - geht einfach, schnell und ohne Probleme über Odata als auch über SOAP.

Leider scheint es aber nicht möglich zu sein, den Status oder das Buchen über SOAP zu starten. Ich weiß zwar mittlerweile, dass es wohl über eine Codeunit theoretisch geht (die ich dann über einen Webservice zugreifbar mache), die vorhandenen Codeunits (ich glaube das war Codeunit 82) sind aber anscheinend nicht über SOAP von außen "zugreifmachbar". Ich erhalte jedenfalls immer eine Exception auf c#-Seite, und der ganze NAV-Server schmiert mir weg (auch irgendwie seltsam dass ich den Dienst beim Discover der Metadatainformation abschiessen kann, oder?).

Daher meine Frage: Wie bekomme ich es hin Aufträgem Rechnungen usw zu buchen? Soap? Interop? Oder geht es wirklich nur indem ich eigene Codeunit anlege welche auch über einen Webservice funktioniert? (Und damit dann das Granule 7200 brauche?)

Lieben Dank für die Info!

Alex

Re: Buchen über Webservice / Aufrufen der Codeunit

19. Januar 2015 13:51

Hallo Alex,

die CU 82 erwartet im OnRun-Trigger eine NAV Tabelle. Ich vermute, dass der Webservice damit ein Problem hat.

Gruß

Michael

Re: Buchen über Webservice / Aufrufen der Codeunit

19. Januar 2015 14:13

Hallo Michael,

danke für die Info. Ist also der offizielle Weg in der Tat eine eigene Codeunit zu schreiben, die dann die offiziellen Codeunits aufruft?
Oder kurz gesagt: Es gibt keine Möglichkeit im Standard ohne Application Developer-Rechte (bzw. soetwas extern entwicklen zu lassen) zu buchen / die Business-Logik / existierende Codeunits anzustoßen?

Viele Grüße,

Alex

Re: Buchen über Webservice / Aufrufen der Codeunit

19. Januar 2015 16:33

Hallo Alex,

Ich glaube mich zu erinnern, dass es dazu im aktuellen oder kommenden CU eine Änderung gibt, bei der diese Trigger bei Veröffentlichung als Web Service ignoriert werden. Kannst du mit dem CU2 nochmal testen?

Re: Buchen über Webservice / Aufrufen der Codeunit

19. Januar 2015 23:25

Hi Carsten,

hab' ich drauf, hat leider nix gebracht.

Was mich auch verwirrt.. Es reißt wirklich den ganzen Dienst in den Abgrund sobald ich auch nur eine Codeunit veröffentliche und dann die URL im Browser abrufe - das ist doch ein Bug.
Man sieht auch schön dass er aussteigt wenn er auf einen komplexen Datentyp im Parameter trifft den er wohl nicht serialisieren kann.

Server instance: DynamicsNAV80
User:
Type: System.NotSupportedException
Message: InStream
StackTrace:
at Microsoft.Dynamics.Nav.Types.XmlTypeHelper.SimpleTypesSupportedInWebservice(NavType navType)
at Microsoft.Dynamics.Nav.Types.XmlTypeHelper.XmlTypeNameFrom(NavType type)
at Microsoft.Dynamics.Nav.Service.WebServices.ServiceCodeunitWsdlAdapter.VisitParameter(ComplexTypeBuilder typeBuilder, ParameterInfo parameter)
at Microsoft.Dynamics.Nav.Service.WebServices.ServiceCodeunitWsdlAdapter.VisitInputParameters(ComplexTypeBuilder typeBuilder, ParameterInfo[] parameterInfo)
at Microsoft.Dynamics.Nav.Xsd.ElementBuilder.CreateType(ComplexType complexDelegate)
at Microsoft.Dynamics.Nav.Xsd.XsdBuilder.CreateElement(String name, ElementNumber cardinality, ElementType elementDelegate)
at Microsoft.Dynamics.Nav.Service.WebServices.ServiceCodeunitWsdlAdapter.VisitMethod(MethodInfo method, PortBuilder port, BindingBuilder binding)
at Microsoft.Dynamics.Nav.Service.WebServices.ServiceCodeunitWsdlAdapter.VisitMethods(IEnumerable`1 methods)
at Microsoft.Dynamics.Nav.Service.WebServices.ServiceCodeunitWsdlAdapter.Write(XmlTextWriter output, Uri requestUrl)
at Microsoft.Dynamics.Nav.Service.WebServices.ServiceBroker.MetadataFor(WebServiceUrlInfo relivantURLPart, Uri orginal, TextWriter output)
at Microsoft.Dynamics.Nav.Service.WebServices.ServiceBroker.Invoke(Boolean isSoapMessage, Uri url, XmlReader input, TextWriter output, NavUserAuthentication navUserAuth)
Source: Microsoft.Dynamics.Nav.Types
HResult: -2146233067

Viele Grüße,

Alex

Re: Buchen über Webservice / Aufrufen der Codeunit

21. Januar 2015 09:51

Hallo Alex,

auch unter dem CU3 tritt das Verhalten noch auf. Entweder habe ich mich getäuscht, oder es wurde zunächst nur in Dynamics NAV 2013 R2 implementiert.
Letztendlich ist aber klar was schief läuft und du solltest eine eigene Buchungs-Codeunit erstellen, die die gewünschten Funktionen dann ausführt. Selbst wenn es nur Aufrufe der Codeunit 82 sind.

Re: Buchen über Webservice / Aufrufen der Codeunit

21. Januar 2015 15:10

Hi Carsten,

dnake für Info - ja, so wird es wohl sein. Eine echte Enttäuschung - jetzt müssen wir 6k berappen um vorhandene Codeunits in einen Wrapper zu stecken (da wir noch nicht genau wissen was wir hier brauchen).
Oder kennt jemand einen Weg eine Codeunit z.B. über Interop zum Client auszuführen? Oder auf dem Server?

Viele Grüße,

Alex

Re: Buchen über Webservice / Aufrufen der Codeunit

11. Februar 2015 08:26

Ich wusste es doch :)

Tada...
VSTF 360990: Codeunits that contain a function with a parameter of type NAV object cannot be published as a web service.

Ist nun gefixt geändert im Cumulative Update 4.