ODATA-Probleme mit Page 7002

6. Dezember 2018 04:31

Hallo @ all,

ich habe ein kleines Problem mit dem modifizieren vorhandener Verkaufspreise.

Ich habe die Page 7002 freigegeben und möchte eigentlich eine ganz einfache Sache machen.
Der Preis wird extern kalkuliert und hier dann eingefügt (das funktioniert soweit ohne Probleme neue Preise einzufügen).
Vorhandene Preise die nicht mehr korrekt sind sollen dann modifiziert werden.
Das Start- und das Enddatum soll verändert werden, dass es vor dem neuen Preis abgelaufen ist und somit nicht mehr gültig man aber immer noch eine Historie hat welche Preise vorher aktiv waren.
Die Logik dafür habe ich schon geschrieben und alles ist super bis zu dem Moment, wenn ich das ganze senden möchte.

Zum Aufbau kurz.
Ich benutze die ODATA-Verbindung in einer WPF-Anwendung die ich mit Visual Studio programmiere.
Dafür benutze ich die ODataLib. Hier der Link zu der aktuellen Version:
https://www.nuget.org/packages/Microsoft.Data.OData/

Die ODataLib erstellt mir automatisch alle Classen und Methoden zum Einfügen, Löschen und Updaten der Objekte.


Ich habe nun 2 Probleme.

Problem 1.
Der Filter auf "Sales_Code" wird komplett ignoriert. Es kommt kein Fehler somit stimmt die Syntax es wird aber nicht gefiltert und auch nur bei dem Feld.
Man kann da eintragen was auch immer man möchte man bekommt immer die Preise für alle Kunden zugesendet. Der Filter davor und danach wird berücksichtig.
Hier mal eine Beispiel-Uri:
http://Server:7053/NAV2016/OData/Company('DieFirma')/Verkaufspreise()?$filter=Item_No eq 'XXX' and Sales_Code eq '12345' and Minimum_Quantity ge 0


Problem 2.
Nachdem ich die vorhandene Preise modifiziert habe bekomme ich komische Meldungen beim Senden an den Server.
Ich habe es zuerst mit einer DataServiceCollection probiert.
Da ist dann folgende Meldung gekommen:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"><m:code/><m:message xml:lang="en-US">The filter "=1/2/0001 12:00:00 AM" is not valid for the Starting Date field on the Sales Price table. The value "1/2/0001 12:00:00 AM" can't be evaluated into type Date.</m:message></m:error>


Ich dachte mir dann ok. Vielleicht gibt es Probleme mit der Collection.
Also bin ich hin und habe eine Schleife geschrieben die jedes Objekt einzeln speichert.
Hier ein kleines Beispiel zur Veranschaulichung:

Code:
List<Verkaufspreise> salesPrices = new List<Verkaufspreise>();


Dann wir die Liste mit den vorhandenen Verkaufspreisen aus der NAV-Datenbank gefüllt.
Das Start- und Enddatum wird modifiziert und danach kommt die Schleife.

Code:
foreach (var p in salesPrices)
                    {
                        navContext.UpdateObject(p);
                        navContext.SaveChanges(SaveChangesOptions.PatchOnUpdate);
                    }


Da bekomme ich aber einen ganz anderen Fehler:

Code:
<?xml version="1.0" encoding="UTF-8"?>

-<m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">

<m:code/>

<m:message xml:lang="en-US">No Currency within the filter ''.</m:message>

</m:error>

Ich habe keine Ahnung wieso das System da „Currency“ verlangt. So ein Feld gibt es nicht. Es gibt nur Currency_Code und das ist leer und soll auch leer bleiben.
Ich habe mir auch den generierten Code von Visual Studio angeschaut es gibt nirgends eine Verwendung des Wortes „Currency“.

Um es noch zu vervollständigen hier noch der Code zum Einfügen eines neuen Preises.
Dieser Funktioniert ohne Probleme:
Code:
Verkaufspreise verkaufspreis = new Verkaufspreise
                        {
                            Item_No = itemNumber,
                            Sales_Code = customerNumber,
                            Unit_Price = price,
                            Minimum_Quantity = quantity,
                            Unit_of_Measure_Code = itemBaseUnit,
                            Sales_Type = "Customer",
                            Starting_Date = DateTime.Now
                        };

                        navContext.AddToVerkaufspreise(verkaufspreis);
                        navContext.SaveChanges();


Meine Frage ist nun.
Kann evtl. jemand bei sich mal kurz die Page 7002 Freigeben und versuchen dort die Werte zu ändern?
Vielleicht kennt ja auch jemand das Problem mit Update und ODATA?
Evtl. ist auch etwas mit der Page nicht in Ordnung da das Filtern wie in Problem 1 beschrieben nicht richtig funktioniert. Das kann ja jeder kurz im Browser testen, wenn er möchte.

Ich hoffe ich konnte das Problem einigermaßen verständlich schildern.

Besten Dank im Voraus an alle.

Re: ODATA-Probleme mit Page 7002

6. Dezember 2018 09:45

Bei deinem Datumsproblem. Prüfe mal ob du in der Instanz beim Odata-Service die korrekte Sprache definiert hast https://docs.microsoft.com/en-us/dynamics-nav/configuring-microsoft-dynamics-nav-server. Vielleicht wirkt sich die Culture hier noch auf das Format aus. Außerdem schickst an der Stelle ein DateTime. Nav will hier aber nur ein Date.

In der Verkaufspreistabelle gehört die Währung zum Primärschlüssel. Wenn du die Währung nicht brauchst, gib sie trotzdem als Leerstring mit.

Re: ODATA-Probleme mit Page 7002

8. Dezember 2018 00:16

Hallo Markus,

danke für deine Hilfe. Leider bringt mich das nicht weiter.

Wie bereits geschrieben funktioniert es, wenn ich einen neuen Preis hinterlege.
Da definiere ich das Startdatum mit "DateTime.Now".
Das ist auch vollkommen korrekt.
Wenn man sich genau anschaut was NAV über die ODATA Schnittstelle einem zusendet dann sieht man in dem XML Format folgendes:
Code:
<d:Starting_Date m:type="Edm.DateTime">2018-12-03T00:00:00


NAV selber sendet eine DateTime und aus diesem Grund wird von .net auch eine DateTime identifiziert und ich kann auf Grund der Typisierung auch nur ein DateTime übergeben.
Das ist soweit also richtig.
Sonst würde es auch nicht funktionieren, wenn ich einen neuen Preis anlege.

Bei der Währung habe ich beim Anlegen eines neuen Preises "null" stehen und damit funktioniert das auch ohne Probleme.
Wenn ich die List der vorhandenen Preise aus der Datenbank bekomme ist der "Currency_Code" bereits als leerer String definiert.
Damit funktioniert es aber nicht.
Ich habe auch schon versucht den "Currency_Code" für jeden Preis auf "null" zu setzten damit es genauso ist wie wenn ich den Preis neu anlege aber auch das funktioniert nicht.
Ich bekomme trotzdem die gleiche Meldung.

Hat evtl. noch jemand eine Idee?

Könnte bitte jemand auch Problem 1 bei sich mal testen?
Einfach die Page 7002 Freigeben und den Link von Problem 1 mal mit seinen Daten im Browser testen.
Ich glaube da ist wirklich ein Bug.

Besten Dank.