[GELÖST] Notizen in NAV 2013 per Funktion erstellen

6. Februar 2014 14:21

Hallo,

wenn ich versuche eine Notiz per Funktion zu erstellen bekomme ich als Ergebnis das folgende

encoding.png


Mein Code sieht wie folge aus:

Code:
CLEAR(noteLoc);
noteLoc.ADDTEXT(textPar);

IF noteLoc.LENGTH <= 255 THEN BEGIN
  char1Loc := noteLoc.LENGTH;
  textToWriteLoc.ADDTEXT(FORMAT(char1Loc));
END ELSE BEGIN
  char1Loc := 128 + (noteLoc.LENGTH - 256) MOD 128;
  char2Loc := 2 + (noteLoc.LENGTH - 256) DIV 128;
  textToWriteLoc.ADDTEXT(FORMAT(char1Loc) + FORMAT(char2Loc));
END;
textToWriteLoc.ADDTEXT(noteLoc);

IF COPYSTR(userIDPar, STRLEN(userIDPar)) = ',' THEN
  userIDPar := COPYSTR(userIDPar, 1, STRLEN(userIDPar) - 1);

newIDLoc := recRefVar.ADDLINK(
  'dynamicsnav://///runpage?page=' + FORMAT(pageIDPar) +
  '&bookmark=' + FORMAT(recRefVar.RECORDID, 0, 10) +
  '&mode=view', recRefVar.NAME);

recordLinkLoc.GET(newIDLoc);
recordLinkLoc.CALCFIELDS(Note);
recordLinkLoc.Note.CREATEOUTSTREAM(oStreamLoc);
encodingLoc := Encodingloc.GetEncoding(437);
binaryWriterLoc := binaryWriterLoc.BinaryWriter(oStreamLoc,Encodingloc);
binaryWriterLoc.Write(FORMAT(noteLoc));
oStreamLoc := binaryWriterLoc.BaseStream;
recordLinkLoc.Type := recordLinkLoc.Type::Note;
recordLinkLoc.Notify := notifyPar;
recordLinkLoc."To User ID" := userIDPar;
recordLinkLoc."User ID" := LOWERCASE(recordLinkLoc."User ID");
recordLinkLoc.MODIFY;
EXIT(recordLinkLoc."Link ID");


Die Umlaute werden nicht richtig kodiert.

Ich habe schon einige Lösungen im Forum gesehen, diese aber waren alle für NAV 2009 gedacht. Sie funktionieren nicht mehr richtig in NAV 2013 aufgrund der neune Codierung Unicode.

Hat jemand von Euch eine Idee, was ich falsch mache?

Danke Im Voraus.

Gruß

Michael
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von MichaelK am 17. Februar 2014 11:50, insgesamt 2-mal geändert.

Re: Notizen in NAV 2013 per Funktion erstellen

6. Februar 2014 17:24

Hier sind Beispiele unter Einsatz von DotNet-Methoden.

Re: Notizen in NAV 2013 per Funktion erstellen

7. Februar 2014 09:08

Hallo Kowa,

herzlichen Dank für Deine Antwort. Die Methode Encoding setzte ich ja auch ein, aber er übersetzt mir trotzdem die Umlaute nicht korrekt. Meiner Frage ist, was fehlt mir in meinem Code für die korrekte Enkodierung der Umlaute?

Gruß

Michael

Re: Notizen in NAV 2013 per Funktion erstellen

7. Februar 2014 09:51

Versuch mal damit:

Code:
streamWriter    DotNet System.IO.StreamWriter.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'     
encoding             DotNet System.Text.Encoding.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'     
myFile  File                       
MyOutStream  OutStream                         

myFile.CREATE('Test.txt');
myFile.TEXTMODE(TRUE);
myFile.CREATEOUTSTREAM(MyOutStream);


streamWriter := streamWriter.StreamWriter(MyOutStream, encoding.Unicode);



Gruß
Aydin

Re: Notizen in NAV 2013 per Funktion erstellen

7. Februar 2014 11:06

Hallo Aydin,

vielen Dank für den Vorschlag. Ich kann diesen nicht anwenden, da meine Daten nicht aus einem File kommen, sondern aus einem Textfeld in der DB.

Gruß

Michael

Re: Notizen in NAV 2013 per Funktion erstellen

7. Februar 2014 12:04

Ja gut ich dachte du kannst deinen Code so umschreiben, dass du die Funktion verwendest.
Arbeitest ja auch mit OutStream.

Wir hatten das Problem damals auch mit dem Schreiben in eine Text Datei.


Gruß
Aydin

Re: Notizen in NAV 2013 per Funktion erstellen

14. Februar 2014 14:54

Woher kommt der Text?

GELÖST Re: Notizen in NAV 2013 per Funktion erstellen

17. Februar 2014 11:20

Hallo,

Microsoft hat mir da auf die Sprünge geholfen. Mein Problem war das folgende:

Code:
encodingLoc := Encodingloc.GetEncoding(437);
binaryWriterLoc := binaryWriterLoc.BinaryWriter(oStreamLoc,Encodingloc);


Richtig ist:

Code:
//encodingLoc := Encodingloc.GetEncoding(437); <---Löschen
binaryWriterLoc := binaryWriterLoc.BinaryWriter(oStreamLoc,Encodingloc.UTF8());


Gruß

Michael

Re: GELÖST Re: Notizen in NAV 2013 per Funktion erstellen

17. Februar 2014 19:45

MichaelK hat geschrieben:Microsoft hat mir da auf die Sprünge geholfen.
Code:
encodingLoc := Encodingloc.GetEncoding(437);
binaryWriterLoc := binaryWriterLoc.BinaryWriter(oStreamLoc,Encodingloc);
Richtig ist:
Code:
//encodingLoc := Encodingloc.GetEncoding(437); <---Löschen
binaryWriterLoc := binaryWriterLoc.BinaryWriter(oStreamLoc,Encodingloc.UTF8());


Ja, so sind die :-D

Codepage 437 ist die "uralte" DOS-Codepage. Streams in Dynamics NAV arbeiten, wegen der Abwärtskompatibilität, weiterhin mit der OEM-Codepage, wohingegen Dynamics NAV 2013 für Nutzdaten voll unicodefähig ist. Deshalb auch die Codierung in UTF-8 für Notizen, um den gesamten Unicode-Bereich an Zeichen abbilden zu können. Soweit ich mich erinnere, war es auch schon unter 2009 mit dem RTC UTF-8 für Notizen.

Oft findet man diese Beispiele mit Codepage 437 im Netz, wenn es um Notizen geht, da die Artikelschreiber wohl nicht so oft aus Umlaut-Ländern kommen 8-)

Re: [GELÖST] Notizen in NAV 2013 per Funktion erstellen

18. Februar 2014 09:25

Hallo Carsten,

vielen Dank für die zusätzlichen Informationen. Ich bin da noch nicht ganz im Bilde mit dem ganzen Encoding. Das Anlegen der Notizen ist sehr umständlich gelöst. Anders betrachtet, wäre es sehr langweilig, wenn alles nach dem gleichen Muster zu lösen wäre.

:-D

Gruß

Michael

Re: [GELÖST] Notizen in NAV 2013 per Funktion erstellen

20. Februar 2014 09:13

Hallo,

Microsoft hat mir nun auch mitgeteilt, dass es für diesen Vorgang bereits eine Standardcodeunit gibt, nämlich die CU454. Alles was ich mir das so mühsam erarbeitet habe gibt es bereits schon. :-)

Gruß

Michael