[gelöst] Option und Webservice

17. September 2012 16:32

Moin moin,

ich habe ein komisches Phänomen und wollte mal nachfragen, ob jemand von euch eine Idee zur Lösung hat.

Ich greife über eine selbst erstellte C#-Anwendung auf eine Page mit Purchase Lines zu und hole mir die Informationen ab, trage dann die gelieferte Menge ein und versuche dann per Update-Befehl den Datensatz zu aktualisieren. Dabei bekomme ich jedoch immer die Fehlermeldung: "You cannot enter 'Order' in Integer."
Damit ist die Belegart gemeint, die über ein Optionfeld abgebildet wird. Anfangs hatte ich das Feld in der Page gar nicht mit drin, hab es jetzt aber mal mit eingebaut. Beim Debuggen steht natürlich die Option 'Order' drin, die aber aus der Enumeration kommt. Dennoch gibt es leider immer diesen Fehler.

Hier der Quellcode dazu:
Code:
this.activePurchaseLine.Qty_to_Receive = Decimal.Parse(this.tb_Qty2Receive.Text)
this.activePurchaseLine.Document_Type = Document_Type.Order;
this.activePurchaseLine.Document_TypeSpecified = true;

// write PurchaseLine back to NAV
purchaseLineService.Update(ref this.activePurchaseLine);


Hat jemand von euch eine Idee dazu?
Zuletzt geändert von rifmetroid am 5. November 2012 12:53, insgesamt 1-mal geändert.

Re: Option und Webservice

17. September 2012 16:41

Ehrlich gesagt verstehe ich nichts vom C#-Code, ABER:

In der NAV-Datenbank werden Optionsfelder als Integer gespeichert. Der Optionstext (z.B. "Auftrag") ist quasi eine "reine NAV-Illusion".
Versuche daher den nummerischen Wert zu übertragen. (Auftrag ist übrigens 1)

Re: Option und Webservice

17. September 2012 17:02

Vielen Dank für die Antwort.
Das mit den numerischen Werten weiß ich, leider kann ich in C# dem Feld kein Integer zuweisen, da ein Wert aus der Enumeration erwartet wird.
Für mich auch ziemlich verwirrend, da es eigentlich so funktionieren müsste...

Re: Option und Webservice

17. September 2012 17:09

Vielleicht hier eine Inspiration:
Waldo: Using Enumerations Part 1 Part 2

Re: Option und Webservice

18. September 2012 09:23

Hallo,

müsste der Code nicht so sein???:

Code:

this.activePurchaseLine.Document_Type = this.activePurchaseLine.Document_Type.Order;

Re: Option und Webservice

18. September 2012 10:54

Leider nein,

Document_Type ist die Enumeration der verschiedenen Belegarten, die automatisch durch den Webservice erzeugt wird und diesem Feld zugewiesen werden muss, ansonsten gibt es einen Typfehler.

Wir haben aber gerade eine neue Build-Version bekommen, damit werde ich das erstmal testen, evtl. ist es da auch behoben, falls es ein Bug sein sollte.

Das Problem ist ja, dass in der Belegart beim Read schon der korrekte Wert drin steht (Order) und ich auch nur die Menge aktuelle Lieferung ändere. Dann will ich mit dem Update das einfach nur wieder ins NAV schaufeln, bekomme dann aber die Fehlermeldung, auch wenn ich den Document_Type überhaupt nicht anfasse!

Re: Option und Webservice

18. September 2012 12:24

Vielleicht mal das Rundum nochmal überprüfen.
Also Webservice neustarten, vorher den NAV Server stoppen und deinen Webverweis aktualisieren.
Damit wir das alles auschließen können.

Noch ein Nachtrag:
this.activePurchaseLine.Document_Type = this.activePurchaseLine.Document_Type.Order

this.activePurchaseLine.Document_Type_KeySpecified = true //müsste auch gesetzt sein.




Gruß
Aydin

Re: Option und Webservice

20. September 2012 17:57

Das Rundum habe ich jetzt nochmal geprüft, alle Dienste neu gestartet, alle Objekte neu kompiliert, alle Webverweise aktualisiert und auch das Specified ausprobiert.
Leider gibt es immer noch den gleichen Fehler.

Wir haben jedoch einen neuen Build bekommen, den wir jetzt noch testen werden, danach melde ich mich hier wieder zurück.

Re: Option und Webservice

21. September 2012 13:55

Du willst doch dem Document_type gar keinen neuen Wert geben, oder? Dann speicher den in eine Variable beim Abruf des Datensatzes und beim Update übergibst Du die Variable dann wieder.

Allerdings kommt mir die Zeile
Code:
this.activePurchaseLine.Document_Type = Document_Type.Order;
ein bisschen knapp vor. In meinen Augen sollte da so etwas wie
Code:
this.activePurchaseLine.Document_Type = DeinWebservice.Document_Type.Order;
stehen.

Volker

Re: Option und Webservice

24. September 2012 14:13

Hi,
ich teste auch mit C#, zum testen hole ich mir immer ein Auftrag, und kopiere den,
der folgende Code funktioniert bei mir auch nicht (DocumentType kommt in Nav nicht an, bleibt Leer):

Code:
newItemSalesLine.LDocType = tmpLine.DocumentType


wenn ich den Integer als String reingebe funktioniert es :)

Code:
newItemSalesLine.LDocType = "0"; // 0= Angebot, 1=Auftrag

Re: Option und Webservice

24. September 2012 14:25

Hallo,

orientiert euch an Volkers letzten Beitrag. So müsste es richtig sein.



vsnase hat geschrieben:Du willst doch dem Document_type gar keinen neuen Wert geben, oder? Dann speicher den in eine Variable beim Abruf des Datensatzes und beim Update übergibst Du die Variable dann wieder.

Allerdings kommt mir die Zeile
Code:
this.activePurchaseLine.Document_Type = Document_Type.Order;
ein bisschen knapp vor. In meinen Augen sollte da so etwas wie
Code:
this.activePurchaseLine.Document_Type = DeinWebservice.Document_Type.Order;
stehen.

Volker

Re: Option und Webservice

25. September 2012 17:37

Das ist doch echt zum Verzweifeln...
Leider bringt keine von euch vorgeschlagene Änderung eine Besserung (trotzdem schon mal vielen Dank für die Rückmeldungen).

@Volker:
Ja, richtig, ich möchte den Typ gar nicht ändern, bekomme aber die Fehlermeldung "You cannot enter 'Order' in Integer" auch, wenn ich den Document Type über die Page gar nicht mit veröffentliche.
Von daher habe ich den mal mit reingenommen um den vielleicht richtig setzen zu können. Leider funktioniert das auch nicht, da die Enumeration schon durch den Webservice vorgegeben ist und sobald ich versuche einen string oder int dort reinzunageln, meckert schon Visual Studio rum: "Eine implizite Konvertierung vom Typ "string" in "xyz.NAVPurchaseLine.Document_Type" ist nicht möglich."

Den Namen des Webservice davorzuschreiben macht keinen Unterschied, da die Enumeration eh schon bekannt und zugänglich ist.

Ich mache das ganze mit dem Compact Framework (3.5) auf einem Windows CE Device, hab es jetzt noch nicht alternativ von einem Rechner probiert, dass werde ich wohl auch nochmal machen und evtl. auch bei der .net-framework-Version nochmal eine andere ausprobieren (die da vielleicht noch nicht ganz so restriktiv arbeitet)...

Rückmeldungen gibt es sobald ich das geschafft habe.

aydina81 hat geschrieben:Hallo,

orientiert euch an Volkers letzten Beitrag. So müsste es richtig sein.



vsnase hat geschrieben:Du willst doch dem Document_type gar keinen neuen Wert geben, oder? Dann speicher den in eine Variable beim Abruf des Datensatzes und beim Update übergibst Du die Variable dann wieder.

Allerdings kommt mir die Zeile
Code:
this.activePurchaseLine.Document_Type = Document_Type.Order;
ein bisschen knapp vor. In meinen Augen sollte da so etwas wie
Code:
this.activePurchaseLine.Document_Type = DeinWebservice.Document_Type.Order;
stehen.

Volker

Re: Option und Webservice

25. September 2012 19:15

Ich habe jetzt nochmal so ziemlich alle Möglichkeiten ausprobiert...
- .NET Compact Framework 2.0 und 3.5 auf mobilem Gerät (mit Visual Studio 2008)
- Normale Applikation mit .NET Framework 2.0 und 4.0 (mit Visual Studio 2010)

NAV-Version ist 6.00.32011.
- die Purchase Line Table (39) habe ich einfach als Page erstellt und dann per Webservice veröffentlicht
- der User, der den Webservice konsumiert hat SUPER-Rechte in NAV, daran kann es also auch nicht liegen (natürlich nur zum Testen)

Leider gibt es immer dieselbe Meldung: "You cannot enter 'Order' in Integer".

Hier mal mein aktueller Code zum testen. Einfach eine bestimmte Purchase Line abfragen, dann ein Feld ändern und enstprechend Updaten, beim Update-Aufruf kommt dann aber immer der Fehler.

Code:
try
{
  PurchaseLine_Service pls = new PurchaseLine_Service();
  pls.Credentials = credentials; //vorher schon festgelegt
  pls.Url = "http://testserver:7047/DynamicsNAV/WS/testclient/Page/PurchaseLine";

  List<PurchaseLine_Filter> purchaseFilterList = new List<PurchaseLine_Filter>();
  PurchaseLine_Filter purchaseFilter1 = new PurchaseLine_Filter();
  PurchaseLine_Filter purchaseFilter2 = new PurchaseLine_Filter();
  purchaseFilter1.Field = PurchaseLine_Fields.Document_No;
  purchaseFilter1.Criteria = "EB39819";
  purchaseFilterList.Add(purchaseFilter1);
  purchaseFilter2.Field = PurchaseLine_Fields.No;
  purchaseFilter2.Criteria = "<>''";
  purchaseFilterList.Add(purchaseFilter2);

  PurchaseLine[] purchaseLines = pls.ReadMultiple(purchaseFilterList.ToArray(), "", 100);

  purchaseLines[0].Qty_to_Receive = 5;
  purchaseLines[0].Qty_to_ReceiveSpecified = true;
                                       
  pls.Update(ref purchaseLines[0]);                   
}
catch (Exception exc)
{
  MessageBox.Show(exc.Message);
}


Könnte jemand von euch mal das gleiche auf den PurchaseLines versuchen, ob der Fehler da auch auftritt?
Ich weiß jetzt echt nicht mehr weiter...

Re: Option und Webservice

26. September 2012 08:47

Ich habe dazu jetzt noch folgende Information gefunden:

http://community.dynamics.com/product/nav/navtechnical/b/bodos/archive/2011/09/12/nav-2009-funktion-format-datentyp-option-und-unterschiedliches-verhalten-von-classic-client-und-role-tailored-client.aspx#comments

Da dies aber leider nur auf NAV beruht, bin ich da bei C# noch nicht viel weiter, aber immer noch auf der Suche...

Re: Option und Webservice

26. September 2012 10:28

rifmetroid hat geschrieben:Könnte jemand von euch mal das gleiche auf den PurchaseLines versuchen, ob der Fehler da auch auftritt?
Ich weiß jetzt echt nicht mehr weiter...


Hi,

ich habe dein Code ausprobiert , und bei mir funktioniert es, allerdings werden von 2 Einkaufszeilen die vorhanden sind, nur "Qty_to_Receive" für die erste Zeile geupdatet. Fehler bekomme ich keinen. Habs mit VS 2010 und .NET 4 Client Profile getestet

Mein Code sieht so aus:
Code:
namespace Nav_WebService_Test
{
    using WS_Page_PurchLine;

    public partial class Einkaufszeilen : Form
    {
        PurchaseLines_Service pls = new PurchaseLines_Service();
        PurchaseLines pl = new PurchaseLines();
       
        public Einkaufszeilen()
        {
            InitializeComponent();
        }

        private void BtGetPurchLines_Click(object sender, EventArgs e)
        {
            try
            {
                PurchaseLines_Service pls = new PurchaseLines_Service();
                pls.UseDefaultCredentials = true;

                List<PurchaseLines_Filter> purchaseFilterList = new List<PurchaseLines_Filter>();
                PurchaseLines_Filter purchaseFilter1 = new PurchaseLines_Filter();
                PurchaseLines_Filter purchaseFilter2 = new PurchaseLines_Filter();
                purchaseFilter1.Field = PurchaseLines_Fields.Document_No;
                purchaseFilter1.Criteria = "BE0073276";
                purchaseFilterList.Add(purchaseFilter1);
                purchaseFilter2.Field = PurchaseLines_Fields.No;
                purchaseFilter2.Criteria = "<>''";
                purchaseFilterList.Add(purchaseFilter2);

                PurchaseLines[] purchaseLines = pls.ReadMultiple(purchaseFilterList.ToArray(), "", 100);

                purchaseLines[0].Qty_to_Receive = 8;
                purchaseLines[0].Qty_to_ReceiveSpecified = true;

                pls.Update(ref purchaseLines[0]);
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
            }
        }
    }
}

Re: Option und Webservice

26. September 2012 10:30

Da fällt mir was ein. Das hat wahrscheinlich gar nichts mit der Fehlermeldung zu tun. Du rufst ja mehrere Datensätze ab. Probier mal nur den einen Datensatz abzurufen, den Du ändern willst und versuch dann ein Update.

Du könntest ja Dein Array purchaseLines durchlaufenund erneut jeden einzlnen Datensatz neu mit .Read(key) abrufen, ändern und update.

Volker

Re: Option und Webservice

26. September 2012 10:50

@elTorito:
Das nur die erste Purchase Line geupdatet wird, ist auch so gewollt, ist ja nur zum Testen gewesen.
Den Fehler habe ich bei mir leider immer noch, hoffe aber von unserem Partner ein paar Infos zu der BUG-ID 208030 zu bekommen.
Kannst du bitte mal nachschauen, welche NAV-Version ihr im Einsatz habt (wir haben 6.00.32011).

@vsnase:
Leider gibt es auch den gleichen Fehler, wenn ich mit Read und nur einer PurchaseLine arbeite. Das macht anscheinend keinen Unterschied.

Vielen Dank erstmal an alle für die Hilfe, sobald ich etwas von unserem Partner zu der BUG-ID bekomme, lasse ich wieder von mir hören, vorher muss ich dann wohl leider erstmal abwarten.

Gruß
Christian

Re: Option und Webservice

26. September 2012 11:06

Setz dir doch in der Page im OnModifyTrigger ein :

ERROR(FORMAT("Document Type"));

oder sonstwas um zu schauen was dort überhaupt ankommt.

PS: Wir haben 6.00.30677 Classic Client

Re: [gelöst] Option und Webservice

5. November 2012 12:59

Nach etwas längerer Zeit habe ich den Fehler nun herausbekommen.

Unser Admin hat den Unterbau von NAV irgendwann mal auf die 2009er Version gezogen, wir arbeiten aber immer noch alle mit dem Classic Client. Dabei hat er aber leider nicht alle Objekte upgedatet.
Codeunit 423, das Chang Log Management hat eine Funktion um Option Werte zu wandeln. Hier wurde eine Änderung vorgenommen (http://www.comporsys.de/dynamics-nav-blog/nav-2009-funktion-format-datentyp-option-und-unterschiedliches-verhalten-von-classic-client-und-role-tailored-client/), die bei uns leider fehlte. Jetzt ist sie drin und siehe da, alles funktioniert ohne Probleme.

Vielen Dank an euch alle für die Unterstützung!