5. September 2009 01:23
Hallo zusammen,
wir haben jetzt bei uns im Unternehmen testweise das SP1 aufgespielt. Um Artikeldaten in NAV täglich zu aktualisieren nutzen wir die mit 2009 eingeführten WebServices. Jetzt haben wir das Problem das es nicht mehr möglich ist einen Double-Wert richtig zu übergeben. Wenn wir z.B. einen Preis (17,22) über unsere C# Anwendung an NAV übergeben, schreibt der WebService 1722 in die Tabelle. Ich kann mir gut vorstellen das es an der Formatierung der Zahl bei der XML Übertragung liegt, also z.B. an Punkt (English) und Komma (Deutsch), aber ich habe keinerlei Möglichkeiten gefunden das anzupassen.
Den Code eines Beispielprogrammes kann man unten sehen. Hat vielleicht jemand eine Idee?
Lieben Gruß
Christian
- Code:
TempWebService.Artikel myArtikel = new WebServiceConsole.TempWebService.Artikel();
Console.Write("Text: ");
myArtikel.Description = Console.ReadLine();
Console.Write("Zahl: ");
myArtikel.Price = decimal.Parse(Console.ReadLine());
myArtikel.PriceSpecified = true;
Temp_Service myService = new Temp_Service();
myService.UseDefaultCredentials = true;
myService.Create(ref myArtikel);
Console.WriteLine();
Console.WriteLine("Fertig...");
Console.ReadKey();
7. September 2009 14:59
myArtikel.Price = decimal.Parse(Console.ReadLine());
liefert ja auch einen Dezimalwert und keinen Double-Wert. Hast Du schon mal
- Code:
myArtikel.Price = double.Parse(Console.ReadLine());
ausprobiert?
Volker
8. September 2009 20:26
Hi,
leider wird der Datentyp von Visual Studio vorgegeben. Es hat ja auch vor dem SP1 immer tadellos funktioniert, nur jetzt leider nicht mehr. Ich befürchte ich muss dafür mal einen Call bei MS aufmachen.
Oder hat vielleicht hier noch jemand eine Idee?
LG
Christian
8. September 2009 21:05
Seit wann gibt Visual Studio einen Datentyp vor?
Andere Version: Hast Du mal die Kultur für dein .NET-Programm explizit festgelegt?
- Code:
My.Application.ChangeUICulture("en")
My.Application.ChangeCulture("en-US")
oder
- Code:
My.Application.ChangeUICulture("de")
My.Application.ChangeCulture("de-DE")
Volker
9. September 2009 07:59
Wenn man den WebService via WebReferenz einbindet kennt der ja schon alle Datentypen und sagt mir, dass dies ein decimal-Typ sei. Dementsprechend lässt er auch nur decimal-Werte zu.
Hatte es schon mit
- Code:
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-us");
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-us");
und dementsprechend mit "de-de" versucht, leider auch ohne Erfolg
9. September 2009 09:04
vsnase hat geschrieben:Wenn man den WebService via WebReferenz einbindet kennt der ja schon alle Datentypen und sagt mir, dass dies ein decimal-Typ sei
War das vor SP1 auch so?
Hast Du mal probiert eine Zahl hardcoded (myArtikel.Price = "2.01";) zu übergeben? Geht das?
ggf.könntest Du auch noch versuchen in der wsdl-Datei den Datentyp zu ändern.
Volker
9. September 2009 09:16
Hi,
an die wsdl-Datei komme ich ja garnicht dran, die kommt ja direkt vom Server.
Ja, auch vor SP1 hat VisualStudio den WebService selber referenziert und die Datentypen festgelegt etc. Daher würde auch das myArtikel.Price = "2.01"; nicht gehen da ich einer Decimal-Variable keinen String-Wert übergeben kann! Und wenn ich es mit myArtikel.Price = 2.01d mache kommt das selbe ergebnis raus
LG
Christian
9. September 2009 09:25
Bubbleman hat geschrieben:an die wsdl-Datei komme ich ja garnicht dran, die kommt ja direkt vom Server
Nein, die wird nur einmal übertragen und liegt in deinem Projekt unter Webverweise->Dein Webservice->deinWebservice.wsdl. Wenn Du den Webverweis aktualisierst, wird die wsdl-Datei neu erstellt.
Das könnte übrigens auch noch ein gute Idee sein: "Webverweis aktualisieren"
Bubbleman hat geschrieben:Ja, auch vor SP1 hat VisualStudio den WebService selber referenziert und die Datentypen festgelegt
ja, aber welcher Datentyp?
9. September 2009 09:31
Das ist aber schlecht wenn ich die wsdl datei von hand anpasse. Wenn ich dann nämlich zwecks funktionserweiterung den WebVerweis aktualisiere sind die änderungen Futsch. Hat ja alles vor SP1 auch problemlos funktionier (*grrrr*)
Der Datentyp von dem Price ist decimal...
30. September 2009 15:21
Das ist aber jetzt doof. Genau das selbe Problem haben wir auch. Hab das gerade mal überprüft. Hast du ein Ticket gestellt oder eine Lösung gefunden?
30. September 2009 18:07
Ich werde mal versuchen das morgen nachzustellen. Melde mich dann.
30. September 2009 19:06
Hi,
bin gerade dabei das mit einem persönlich von uns bekannten MS-Techniker zu überfliegen. Wollen jetzt aber wohl auch ein offizielles Ticket starten. Bisher konnte er sich noch keinen Reim darauf bilden.
LG
1. Oktober 2009 09:49
da ich sowieso gerade dabei war, webservices genauer zu testen, war ich bei dem thread auch sehr interessiert.
mein aufbau ist:
- server mit nav 2009 sp1 und page auftrag als ws veröffentlicht
- client mit visual studio drauf und projekt geschrieben, was ws anbindet
über mein vs projekt kann ich nun aufträge lesen und erstellen. ich habe also mal den unit-price einer auftragszeile selbst neu gesetzt und es hat funktioniert!
- Code:
// Service Objekt
Auftrag_Service myService = new Auftrag_Service();
myService.Credentials = new NetworkCredential("user", "pw", "domäne");
// Auftrag Objekt
Auftrag myAuftrag = new Auftrag();
// Auftrag (Header) per Service erzeugen (nur PK)
myService.Create(ref myAuftrag);
// Auftrag (Header): Details hinzufügen/ändern
myAuftrag.Sell_to_Customer_No = "30000";
myAuftrag.Salesperson_Code = "LM";
// Auftrags (Lines) initialisieren
myAuftrag.SalesLines = new Sales_Order_Line[2];
for (int i = 0; i < 2; i++)
{
myAuftrag.SalesLines[i] = new Sales_Order_Line();
}
// Auftrag per Service aktualisieren
myService.Update(ref myAuftrag);
// Auftrag (Lines): Details hinzufügen/ändern
Sales_Order_Line mySalesLine0 = myAuftrag.SalesLines[0];
Sales_Order_Line mySalesLine1 = myAuftrag.SalesLines[1];
mySalesLine0.Type = NavWebServiceConsumeTest.websAuftrag.Type.Item;
mySalesLine0.No = "LS-2";
mySalesLine0.Quantity = 2;
mySalesLine0.Unit_Price = 13.37m; // <- HIER SETZE ICH DEN UNIT PRICE! c# decimal mit "m" am ende als kennung
mySalesLine1.Type = NavWebServiceConsumeTest.websAuftrag.Type.Item;
mySalesLine1.No = "LS-S15";
mySalesLine1.Quantity = 4;
// Auftrag per Service aktualisieren
myService.Update(ref myAuftrag);
In meinem NAV hat der Artikel LS-2 dann auch den Verkaufspreis von 13,37 in der Auftragszeile. Entspricht das der Fragestellung?
1. Oktober 2009 10:20
Du codierst da aber hart rum. Schon mal ausprobiert, dass aus einer TextBox auszulesen und dann zu Parsen?!
1. Oktober 2009 10:39
Hi,
ja, dein Code funktionier so, aber jetzt übergeb dem mal einen Wert mit nachkommastellen :) Dann wirst du es auch sehen ;)
LG
1. Oktober 2009 10:45
Teddy-KGB hat geschrieben:Du codierst da aber hart rum. Schon mal ausprobiert, dass aus einer TextBox auszulesen und dann zu Parsen?!
- Code:
if (!TextBox2.Text.Equals(""))
{
decimal unitprice;
if (decimal.TryParse(TextBox2.Text, out unitprice))
mySalesLine0.Unit_Price = unitprice;
}
in der textbox habe ich "1234,56" eingegeben, in der auftragszeile hatte der artikel einen vk-preis von "1.234,56"
edit: mir ist grad nochwas eingefallen. direkt nach installation von nav 2009 sp1 konnte ich nicht die sprache auf deutsch stellen. ich habe aber vor kurzem das deutsche sprachmodul nachinstalliert. vielleicht gibts hier einen zusammenhang?
1. Oktober 2009 15:18
So, ich hab da mal was vorbereitet :)
- Code:
TempWebService.Artikel myArtikel = new TempWebService.Artikel();
Console.Write("Text: ");
myArtikel.Description = Console.ReadLine();
Console.Write("Zahl: ");
string unitPriceString = Console.ReadLine();
decimal unitPrice = decimal.Parse(unitPriceString, [b]System.Globalization.CultureInfo.GetCultureInfo("en-US")[/b]);
myArtikel.Unit_Price = unitPrice;
myArtikel.Unit_PriceSpecified = true;
TempWebService.Artikel_Service myService = new TempWebService.Artikel_Service();
myService.UseDefaultCredentials = true;
myService.Create(ref myArtikel);
Console.WriteLine();
Console.WriteLine("Fertig...");
Console.ReadKey();
Obigen Code habe ich zum testen benutzt. 3 Dinge spielen eine Rolle bei meinem Test:
* Eintrag in der Tabelle "User Personalization"
* GetCultureInfo() im Code
* Eingabe des Wertes 987,65 als "987,65" oder "987.65"
Resultat ist folgende Tabelle:
- Code:
Nr. Beschreibung VK-Preis
700000 PS:1031 - WS:de-DE - Comma 987,65
700001 PS:1031 - WS:de-DE - Point 98.765,00
700002 PS:1031 - WS:en-US - Comma 98.765,00
700003 PS:1031 - WS:en-US - Point 987,65
700004 PS:1033 - WS:de-DE - Comma 987,65
700005 PS:1033 - WS:de-DE - Point 98.765,00
700006 PS:1033 - WS:en-US - Comma 98.765,00
700007 PS:1033 - WS:en-US - Point 987,65
* PS: ist die Einstellung des Feldes "Language ID" in der Tabelle "User Personalization", hat aber soweit ich das sehen konnte keinen Einfluss auf einen Webservice, so lange nicht lokale Einflüsse des Servers (Codeunit als WS, Zugriff auf FORMAT()) eine Rolle spielen.
* WS: Ist der Wert der der Methode GetCultureInfo() übergeben wird. Man sieht, dass sich die Formatierung bzw. die Serialisierung/Deserialisierung des XML sich danach richtet (DE -> US -> Eingabe von Komma wird als Dezimaltrennzeichen sauber verarbeitet, US -> Eingabe von Punkt wird als Dezimaltrennzeichen sauber verarbeitet)
* Comma/Point: Eingabe der Dezimalzahl mit Komma oder Punkt.
Ich hoffe mal das ist alles verständlich. Bei Fragen -> einfach fragen
5. Oktober 2009 23:55
Hallo Carsten,
durch deinen GetCultureInfo im Parse bestimmst du ja nur wie er die Eingabe zu parsen hat. Dementsprechend steht ja bei dir im UnitPrice schon direkt das falsche drin. Bei mir steht da auf jeden fall die richtige Zahl drin, das habe ich durch ausgeben wieder überprüft, trotzdem übergibt er diese falsch an NAV.
Ich kann leider immer noch nicht herausfinden woras das liegt :(
Lieben Gruß
Christian
6. Oktober 2009 10:57
Die jeweilige CultureInfo hab ich nur genutzt, damit ich nicht jedes mal meine Regionseinstellungen anpassen muss :)
Ich es denn wirklich so, dass die nach dem Parse resultierende Dezimalzahl korrekt ist? Welche CurrentCulture und CurrentUICulture ist bei dir eingestellt, also vom OS?
6. Oktober 2009 15:35
Hab mit der CurrentCulture und CurrentUICulture im Thread schon rumgespielt, hat aber leider nichts gebracht :(
LG
6. Oktober 2009 19:07
Mich würden nochmal die folgenden Dinge interessieren:
Im Fehlerfall, welchen Inhalt hat das Feld nach dem Create()?
Hast du schon die zwei wahrscheinlichsten Varianten, Punkt und Komma, explizit bei der Eingabe geprüft?
Funktioniert dein Code bei expliziter Benutzung der CultureInfo (de-DE, en-US) ebenfalls nicht korrekt?
Was passiert bei hartcodierten Dezimalzahlen?
6. Oktober 2009 23:18
Hallo Carsten,
die Fragen kann ich dir sogar beantworten ohne es nochmal zu testen:
Nach dem Create hat auch die Variable den neuen, falschen Wert. Ja, mit Punkt und Komma hab ich natürlich schon getestet, leider ohne Erfolg. Und auch wenn ich den Wert hartcodiert einsetze geht es nicht :(
LS
7. Oktober 2009 08:19
[quote="Bubbleman]
- Code:
myArtikel.Price = decimal.Parse(Console.ReadLine());
[/quote]
Hast Du schon mal probiert statt obigem
- Code:
myArtikel.Price = System.Convert.ToDecimal(Console.ReadLine());
zu verwenden. Bei mir hat das bei einem ähnlichen Problem auf einen PHP-Webservice geholfen. Ich konnte es nicht erklären, aber es ging.
2. ÜBerlegung: Am Server kann es nicht liegen? Ich meine, wenn die Webservices auf einem englischen Server ausgeführt werden, was erwarten dann die Webservices für Dateneingaben? Englisch oder Deutsch? Was passiert, wenn Du Dein Programm direkt auf dem Server ausführst? Falls es dann funktioniert, kannst Du in Deinem Programm doch einen Webservice erstellen, der die Daten der Clients einfach durchreicht (oder ggf. sehen, dass doch falsche Daten vom Client ankommen).
Volker
7. Oktober 2009 08:30
vsnase hat geschrieben:[quote="Bubbleman]
[code]...
2. ÜBerlegung: Am Server kann es nicht liegen? Ich meine, wenn die Webservices auf einem englischen Server ausgeführt werden, was erwarten dann die Webservices für Dateneingaben? Englisch oder Deutsch? Was passiert, wenn Du Dein Programm direkt auf dem Server ausführst? Falls es dann funktioniert, kannst Du in Deinem Programm doch einen Webservice erstellen, der die Daten der Clients einfach durchreicht (oder ggf. sehen, dass doch falsche Daten vom Client ankommen)...[/quote]
Habt ihr schon das deutsche Sprachmodul für den NAV-Server installiert. Beim SP1 muss man das, laut meiner Erfahrung per Hand tätigen.
7. Oktober 2009 08:50
das mit dem deutschen sprachmodul hatte ich auch mal vorgeschlagen.
was auch entscheidend sein könnte, sind die "region and language" settings im betriebssystem. ich z.b. hab hier ein englisches windows 7 installiert und musste dort auch erst auf deutsch umstellen, damit die formatierungen für zahlen passen.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.