Bodo's Dynamics NAV Blog

Bodo ist ein Dynamics NAV Urgestein. Er programmiert NAV seit DOS Zeiten und hat auch keine Scheu vor .NET. 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.

NAV 2009 – Copy & Paste und böse Zeichen in Text- und Code-Feldern

Eintrag von Bodo am Freitag, 12. August 2011

Tags: , , , , ,

In den Zeiten zunehmender Beliebtheit von Copy & Paste möchte auch ich mich diesem Thema annehmen und auf ein Problem im Zusammenhang mit Dynamics NAV hinweisen.

Machen wir ein Beispiel. Besuchen Sie unser Impressum (http://www.comporsys.de/impressum) und kopieren den Firmennamen „Comporsys Hansa GmbH“ (Namen markieren und dann Strg+C drücken). Danach starten Sie den NAV 2009 Classic Client, legen einen neuen Debitor an und fügen den gerade kopierten Inhalt ein (Strg+V). Das Ergebnis sieht wie folgt aus:

Ich habe in der Abbildung oben extra den Namen markiert, damit das Problem offensichtlich wird. Beim Kopieren sind zwei nicht sichtbare Zeichen mit kopiert worden: Carriage Return (ASCII Code 13) und Line Feed (ASCII Code 10). Böse Zeichen.

Wenn Sie diesen Zeichen nicht entfernen, haben Sie den Salat, sobald Sie zum Beispiel die Daten als Textdatei exportieren. Dann haben Sie unerwartete Zeilenumbrüche in der Textdatei. Das führt unter anderem beim GDPdU-Export zu Programmfehlern, die sehr schwer zu lokalisieren sind.

Wie sieht die Lösung aus?

In Codeunit 1 finden Sie eine Funktion „MakeText“. Diese Funktion wird vom NAV Client aufgerufen, wenn Sie Zeichen in einem Text-Feld eingeben. Und hier ist die richtige Stelle einzugreifen, um die bösen Zeichen aus dem Text zu entfernen. Dazu rufen wir unsere eigene Funktion „RemoveBadChars“ auf. Siehe unten.

Der Quellcode der Funktion „RemoveBadChars“ sieht wie folgt aus. Neben den bereits genannten Zeichen Carriage Return und Line Feed entfernen wir auch noch das Tabulator-Zeichen.

PROCEDURE RemoveBadChars@1000000001(t@1000000000 : Text[250]) : Text[250];
  VAR
    Ch@1000000001 : Text[3];
  BEGIN
    Ch[1] := 9;   // TAB
    Ch[2] := 10;  // LF
    Ch[3] := 13;  // CR
    EXIT(DELCHR(t, '=', Ch));
  END;

Und wie sieht die Lösung für Code-Felder aus? Eine Funktion „MakeCode“ gibt es in Codeunit 1 nicht. Sie können diese aber mit der ID 109 erstellen. Diese Funktion wird der NAV Client dann aufrufen.

PROCEDURE MakeCode@109(VAR CodeText@1000000000 : Text[250]) : Integer;
  BEGIN
    CodeText := RemoveBadChars(CodeText);
    EXIT(0);
  END;

PS: Der NAV 2009 Role Tailored Client kennt das Problem der bösen Zeichen nicht.