ODATA-Probleme mit Page 7002

Bild Microsoft Dynamics NAV 2016

ODATA-Probleme mit Page 7002

Beitragvon Proxion » 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: Alles auswählen
<?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: Alles auswählen
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: Alles auswählen
foreach (var p in salesPrices)
                    {
                        navContext.UpdateObject(p);
                        navContext.SaveChanges(SaveChangesOptions.PatchOnUpdate);
                    }


Da bekomme ich aber einen ganz anderen Fehler:

Code: Alles auswählen
<?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: Alles auswählen
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.
Proxion
 
Beiträge: 5
Registriert: 3. Mai 2017 17:18
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2016

Re: ODATA-Probleme mit Page 7002

Beitragvon MarkusWeiland » 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.
MarkusWeiland
 
Beiträge: 205
Registriert: 18. Januar 2017 10:01
Realer Name: Markus Weiland
Arbeitsort: SaarbrĂĽcken
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV

Re: ODATA-Probleme mit Page 7002

Beitragvon Proxion » 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: Alles auswählen
<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.
Proxion
 
Beiträge: 5
Registriert: 3. Mai 2017 17:18
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 2016


ZurĂĽck zu NAV 2016

Wer ist online?

Mitglieder in diesem Forum: Unbekannter Crawler und 1 Gast

cron