12.06.2010, 01:05 | #1 |
Участник
|
jinx: Dynamics AX AIF Webservices – Date, Time und Datetime Datentypen
Ein großer Vorteil des Application Integration Frameworks (AIF) gegenüber “selbstgeschriebene” Schnittstellen ist es, dass man sich über Dinge wie Datentyp-Mappingkeine Gedanken machen muss.
Das Application Integration Framework verfügt über die entsprechende Logik, um alleDynamic AX Datentypen automatisch in den jeweils gültigen XSD-Datentyp zu “mappen”(oder umgekehrt). Zeiten, in denen sich der Entwickler zum Beispiel Gedanken machen musste, wie vieleNachkommastellen eine Zahl haben darf, oder welches Zeichen als Dezimaltrennzeichenverwendet werden muss, sind somit vorbei. Da alle Daten die aus Dynamics AX exportiert oder nach Dynamics AX importiert werden,in einem XSD-Schema konformen XML-Dokument “transportiert” werden, und das AIF entsprechendesMapping bereits stellt, geschieht das Datentyp-Mapping automatisch. Allerdings kann auf Seiten der Anwendung, welche über das Application IntegrationFramework (AIF) angebunden werden soll, ein wenig “Verwirrung” entstehen. Durch die von Programmiersprache zu Programmiersprache durchaus unterschiedlichenDatentypen kann es vorkommen, dass Dynamics AX Datentypen nicht in dem erwartetenDatentyp der anderen Programmiersprache erscheinen. Dies ist allerding kein “wirkliches” Problem des Application Integration Frameworks(AIF), sondern eher eine Frage, welche Datentypen eine Programmiersprache bereit stelltund wie diese in XSD-Datentypen “gemappt” werden. Ein gutes Beispiel hierfür sind die Dynamics AX Datentypen “Date”, “Time” und “DateTime”(inklusive aller von diesen Basisdatentypen abgeleiteten EDT’s). Ohne genauere Betrachtung liegt die Annahme nahe, dass ein DateTime Datentyp von DynamicsAX in einen DateTime Datentyp von z.B. C# “gemappt” wird. Dies ist allerdings nicht richtig. Da nicht direkt zwischen Dynamics AX Datentyp undC# Datentyp gemappt wird, sondern immer von/zu einem XSD-Datentyp gemappt wird, wirdin C# eine neue Klasse hierfür erzeugt. Ein wenig schwieriger wird es bei den beiden Dynamics AX Datentypen “Date” und “Time”.Für diese Datentypen wird z.B. in C# kein direkt vergleichbarer Datentyp bereit gestellt. Diese Datentypen werden jeweils als C# DateTime Datentypen gemappt. Das Mapping der Datentypen geschieht wie folgt: Dynamics AX XSD Schema .NET (C#) Date xs:dateSystem.DateTime Time xs:timeSystem.DateTime DateTime xs:dateTimenew class i.e. “AxdType_DateTime” Da die beiden Dynamics AX Datentypen “Date” und “Time” in den C# Datentyp “DateTime”gemappt werden, kann an dieser Stelle leider ein kleines Problem entstehen. In C# ist nun leider nicht mehr zu erkennen, um was für einen Dynamics AX Datentypes sich z.B. bei einem Feld handelt, und ob nun ein Datum oder eine Zeit in diesementhalten ist. Oftmals entsteht diese Problem dadurch nicht, dass der jeweilige Business-Kontextdie Datentypverwendung entsprechend einschränkt und es somit teilweise egal ist obnun in ein Dynamics AX Date oder Time gemappt wird. Ist es aber erforderlich zu wissen, um ob ein Feld nun den Dynamics AX Datentyp Dateoder Time hat, kann der generierte Code der Proxyklasse Aufschluss geben (oder dasXSD-Schema). Durch die Angabe eines Serialisierungs-Attributes wird bestimmt, welcher “Teil” desDateTime Datentyps verwendet wird. Für ein Feld, welches in einen Dynamics AX Date Datentyp gemappt wird, wird nur der“Datumsteil” in das XML-Dokument serialisiert. Entsprechendes geschieht für einen Dynamics AX Time Datentyp. Mapping eines C# Datetime Datentyps in einen Dynamics AX Date Datentyp (generierterCode der Proxyklasse): 1: [System.Xml.Serialization.XmlElementAttribute(DataType="date",IsNullable=true, Order=54)] 2: public System.NullableMyDateField { 3: get { 4: return this.myDateFieldField; 5: } 6: set { 7: this.myDateFieldField= value; 8: this.RaisePropertyChanged("MyDateField"); 9: } 10: } .csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; } Mapping eines C# Datetime Datentyps in einen Dynamics AX Time Datentyp (generierterCode der Proxyklasse): 1: [System.Xml.Serialization.XmlElementAttribute(DataType="time",IsNullable=true, Order=56)] 2: public System.NullableMyTimeField { 3: get { 4: return this.myTimeFieldField; 5: } 6: set { 7: this.myTimeFieldField= value; 8: this.RaisePropertyChanged("MyTimeField"); 9: } 10: } .csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; } Wie durch den generierten Code der Proxyklasse ersichtlich wird, wird nur der jeweilsbenötigte “Teil” eines C# Datetime Datentyps serialisiert/deserialisiert und somitverwendet. Für einen Dynamics AX DateTime Datentyp wird bei Erstellung des Proxys eine neue Klassegeneriert. Somit kann der Dynamics AX Datentyp hierbei immer eindeutig identifiziertwerden. 1: [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.4016")] 2: [System.SerializableAttribute()] 3: [System.Diagnostics.DebuggerStepThroughAttribute()] 4: [System.ComponentModel.DesignerCategoryAttribute("code")] 5: [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.microsoft.com/dynamics/2008/01/documents/Customer")] 6: public partial class AxdType_DateTime: object, System.ComponentModel.INotifyPropertyChanged { 7: 8: private System.DateTimelocalDateTimeField; 9: 10: private bool localDateTimeFieldSpecified; 11: 12: private AxdEnum_TimezonetimezoneField; 13: 14: private bool timezoneFieldSpecified; 15: 16: private System.DateTimevalueField; 17: 18: [System.Xml.Serialization.XmlAttributeAttribute()] 19: public System.DateTimelocalDateTime ... 20: 21: [System.Xml.Serialization.XmlIgnoreAttribute()] 22: public bool localDateTimeSpecified... 23: 24: [System.Xml.Serialization.XmlAttributeAttribute()] 25: public AxdEnum_Timezonetimezone... 26: 27: [System.Xml.Serialization.XmlIgnoreAttribute()] 28: public bool timezoneSpecified... 29: 30: [System.Xml.Serialization.XmlTextAttribute()] 31: public System.DateTimeValue { 32: 33: public event System.ComponentModel.PropertyChangedEventHandlerPropertyChanged; 34: 35: protected void RaisePropertyChanged(string propertyName)... 36: } .csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; } Dieses Verhalten ist nicht nur mit C# zu beobachten. Auch JAVA oder andere Programmiersprachenverhalten sich ähnlich und muss entsprechend berücksichtigt werden. Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu) More... |
|
|
|