Bodo's Dynamics NAV Blog

Bodo ist ein Dynamics NAV Urgestein. Er programmiert NAV seit DOS Zeiten und hat auch keine Scheu vor .NET und schon gar nicht vor Dynamics 365 oder Azure. Viele Neueinsteiger wurden von ihm in den letzten Jahren zu NAV Entwicklern ausgebildet.

In diesem Blog veröffentlichen Bodo und andere Superhelden Interessantes aus der Welt von Dynamics NAV, Dynamics 365 und Azure.

Zusammenfassende Meldung - merkwürdiges Verhalten

Verfasst von Walter am Donnerstag, 25. Oktober 2012

Tags: 2009, r2, bug, zm

Heute schreibt mein lieber Kollege Walter.

Nach einem Update von NAV 2.0 auf 2009 R2 erreichte uns 6 Wochen nach der Umstellung eine Supportanfrage. Der Ausdruck der „Zusammenfassenden Meldung“ (Report 11007 Zusammenf. Meldung – Formular) brach mit folgender Fehlermeldung ab:

Dem kundigen NAV-Supporter wird sofort die Einstellung in der Fibu-Einrichtung – Reiter allgemein – Feld „Rech. an/Verk. an MwSt.-Berech.“ einfallen. Und genau so war es:

Umstellung von „Rech.an/Zahlung an Nr.“ auf „Verk. An/Eink. Von Nr.“, damit der „MwSt.-Länder-/Regionscode“ aus dem „Verkauf an Deb. Nr.“-Stammdaten gefüllt wird. Noch eine kleine Stapelverarbeitung, damit die falschen MwSt.-Posten korrigiert werden und schon hat man eigentlich einen Supportfall weniger.

Eigentlich.

Nach der Umstellung habe ich das Verhalten im Verkaufskopf getestet. Das Feld 78 „MwSt.-Länder-/Regionscode“ wird trotz korrigierter Einstellung in der Fibu-Einrichtung immer noch mit dem Ländercode aus den „Rech. an Deb. Nr.“-Stammdaten gefüllt. Was passiert denn hier?

Der Quellcodes auf dem OnValidate-Trigger des Feldes „Verkauf an Deb. Nr.“ der Tabelle 36 sieht richtig aus:

...
IF GLSetup."Bill-to/Sell-to VAT Calc." = GLSetup."Bill-to/Sell-to VAT Calc."::"Sell-to/Buy-from No." THEN BEGIN
  "VAT Registration No." := Cust."VAT Registration No.";
  "VAT Country/Region Code" := Cust."Country/Region Code";
END;
...

Ok. Dann wird ja noch der Quellcodes auf dem OnValidate-Trigger des Feldes „Rech. an Deb. Nr.“ der Tabelle 36 ausgeführt:

...
"Bill-to County" := Cust.County;
"Bill-to Country/Region Code" := Cust."Country/Region Code";
"VAT Country/Region Code" := Cust."Country/Region Code";
IF NOT SkipBillToContact THEN
  "Bill-to Contact" := Cust.Contact;
...

Ha, da wird der „MwSt.-Länder-/Regionscode“ gnadenlos mit dem Wert aus dem „Rech. an Deb. Nr.“ überschrieben.

Ein paar Zeilen weiter ist noch folgender Quellcode zu sehen:

...
IF GLSetup."Bill-to/Sell-to VAT Calc." = GLSetup."Bill-to/Sell-to VAT Calc."::"Bill-to/Pay-to No." THEN BEGIN
  "VAT Registration No." := Cust."VAT Registration No.";
  "VAT Country/Region Code" := Cust."Country/Region Code";
END;
...

Die Zeilen sind ok (auch wenn sie als schlechtes Beispiel für einen weiteren Blogeintrag dienen können – dazu vielleicht mal mehr). Also, zuerst einmal die überflüssige Zeile auskommentieren:

...
"Bill-to County" := Cust.County;
"Bill-to Country/Region Code" := Cust."Country/Region Code";
// --- naechste Zeile ist obsolet
// "VAT Country/Region Code" := Cust."Country/Region Code";
// +++
IF NOT SkipBillToContact THEN
  "Bill-to Contact" := Cust.Contact;
...

So, ein weiterer Test. Es steht jetzt der Ländercode aus den „Verk. an Deb. Nr.“-Stammdaten im Feld „MwSt.-Länder-/Regionscode“ auf Tabelle 36. Prima.

Zum Abschluss, da wir ja schon komplett die „Steuer“ testen, eben schnell den Verkaufsauftrag buchen. F11-Enter. Daten testen.

Es ist zum Verzweifeln. Der Ländercode auf den MwSt.-Posten ist immer noch falsch – die USt.IdNr. ist die USt.IdNr. vom „Rech. an Deb. Nr.“ und nicht wie erwartet aus „Verk. an Deb. Nr.“.  Sichtung des Quellcodes der Funktion „InsertVAT“ der Codeunit 12 „Gen. Jnl.-Post Line“. Ich traue meinen Augen kaum. Aber folgender Code hat es durch die Qualitätskontrolle geschafft:

...
  VATEntry."Bill-to/Pay-to No." := "Bill-to/Pay-to No.";
  IF "Bill-to/Pay-to No." <> '' THEN
    CASE VATEntry.Type OF
      VATEntry.Type::Purchase:
        BEGIN
          IF Vend."No." <> "Bill-to/Pay-to No." THEN
            Vend.GET("Bill-to/Pay-to No.");
          VATEntry."Country/Region Code" := Vend."Country/Region Code";
          VATEntry."VAT Registration No." := Vend."VAT Registration No.";
        END;
      VATEntry.Type::Sale:
        BEGIN
          IF Cust."No." <> "Bill-to/Pay-to No." THEN
            Cust.GET("Bill-to/Pay-to No.");
          VATEntry."Country/Region Code" := Cust."Country/Region Code";
          VATEntry."VAT Registration No." := Cust."VAT Registration No.";
        END;
    END;
...

Nicht nur, dass hier die Fibu-Einstellung „Rech. an/Verk. an MwSt.-Berech.“ komplett ignoriert wird, es werden auch noch die Daten aus dem „Cust“-Datensatz und nicht aus dem Verkaufsauftrag in die MwSt.-Posten geschrieben. Das ergibt nun folgende Änderung in Codeunit 12:

...
  // --- 001
  // IF "Bill-to/Pay-to No." <> '' THEN
  //   CASE VATEntry.Type OF
  //     VATEntry.Type::Purchase:
  //       BEGIN
  //         IF Vend."No." <> "Bill-to/Pay-to No." THEN
  //           Vend.GET("Bill-to/Pay-to No.");
  //         VATEntry."Country/Region Code" := Vend."Country/Region Code";
  //         VATEntry."VAT Registration No." := Vend."VAT Registration No.";
  //       END;
  //     VATEntry.Type::Sale:
  //       BEGIN
  //         IF Cust."No." <> "Bill-to/Pay-to No." THEN
  //           Cust.GET("Bill-to/Pay-to No.");
  //         VATEntry."Country/Region Code" := Cust."Country/Region Code";
  //         VATEntry."VAT Registration No." := Cust."VAT Registration No.";
  //       END;
  //   END;
  VATEntry."VAT Registration No." := "VAT Registration No.";
  VATEntry."Country/Region Code"  := "Country/Region Code";
  // +++ 001
...

Um den Supportfall nun komplett abzuschließen, habe ich auch noch die Tabelle 5900 „Servicekopf“ Feld „Rech. an Deb. Nr.“ wie Tabelle 36 korrigiert. Dort existiert der Fehler auch.

Man sollte meinen, dass es nicht nur meinem Kunden so erging – also ein vergleichbarer Fall schon mal aufgetreten ist bzw. sein sollte. Ich habe Partnersource dazu befragt. Keinerlei Hinweis auf diese Problematik. Der Artikel https://mbs2.microsoft.com/Knowledgebase/KBDisplay.aspx?scid=kb;EN-US;2664102 bezieht sich auf die „Dänische Version“ – es wird eigentlich das gleiche Problem beschrieben und ähnlich gelöst.

Ich persönlich bin der Meinung, dass das Feld 78 „MwSt.-Länder-/Regionscode“ mit dem Wert des Feldes 93 „Lief. an Länder-/Regionscode“ der Tabelle 36 Verkaufskopf gefüllt werden sollte – denn dort geht die Ware/Lieferung wirklich hin.


Kontakt

Comporsys Hansa GmbH
Spitzerdorfstr. 3
22880 Wedel, Deutschland

Tel. +49 (0)4103 12117 - 0
Fax +49 (0)4103 12117 - 29
E-Mail: info@comporsys.de