[gelöst]RTC Control AddIn BigText Sonderzeichenproblem

14. Oktober 2011 12:22

Servus,

ich hol mal etwas aus:

Ich entwickel im Augenblick ein Control AddIn (in C#) für den RTC (Nav 2009 SP1).
Das Control kommuniziert mit dem RTC über eine BigText Variable.

D.h. in der Page gibt es eine Variable BigText, welche als Source an mein Control gebunden wird.

Die Werte für die BigText Variable erhalte ich aus einer eigenen Codeunit.
In der Codeunit schraube ich über XMLDom ein XMLDokument zusammen und schreibe das in die BigText Variable.

Code:
TempBlob.Blob.CREATEOUTSTREAM(oStream);
XMLDoc.save(oStream);

TempBlob.Blob.CREATEINSTREAM(iStream);
BigText.READ(iStream);


Die Variable erhalte ich dann als Object, bzw. String über die Value Property auch in meinem AddIn.

Code:
public object Value
{           
      get { return (control.Values); }           
      set
      {               
            if (value is string)
            {                   
                 string data = (string)value;                   
                 control.Values = data;                   
            }
      }           
 }


Und nehme sie dann im UserControl des AddIns über ein XMLReader Objekt wieder auseinander um an meine Werte zu kommen.
Das funktioniert auch alles wunderbar, d.h. mein Code funktioniert.

Jetzt das eigentliche Problem:

Die Texte werden offenbar beim schreiben des XMLs in die BigText Variable verändert.
Wenn ich das XML als File ablege, steht in dem File auch drin was drin stehen soll.
Wenn ich das File auslese, erhalte ich genau die Daten die ich haben will.
Wenn ich allerdings in den Stream schreibe sind u.a. meine ganzen Sonderzeichen durch andere Zeichen ersetzt worden.
Das ist blöd und führt zu merkwürdigen Sachen in meinem AddIn :(

Hatte das Problem vieleicht hier auch schon jemand und hat das gelöst?
Oder hätte vieleicht einen brauchbaren Lösungsansatz?

Mich würd vor allem interessieren, warum die Zeichen ersetzt werden, ob ich das verhindern kann.
Oder ob ich meinem AddIn irgendwie beibringen muss, dass er eine andere Zeichencodierung verwenden soll.

Und wenn ja, wie und welche.

Bin für jede Hinweise dankbar.
Zuletzt geändert von Jack am 17. Oktober 2011 15:59, insgesamt 1-mal geändert.

Re: RTC Control AddIn BigText Sonderzeichenproblem

14. Oktober 2011 12:56

Suche mal bei google nach Nav 2009 und Unicode.
Der Freddy schreibt das ganz gut, was geht und was nicht. Ich tippe mal, dass dies das gleiche Problem ist wie unter CC.

Re: RTC Control AddIn BigText Sonderzeichenproblem

14. Oktober 2011 13:51

Hallo,

was für ein Sprachcode verwendet dein Betriebssystem?
Gibt es da Unstimmigkeiten zwischen den Schnittstellen? Ich würd erstmal in diesem Bereich mal anfangen zu suchen, damit das schon mal ausgeschlossen werden kann:-)

Ansonsten gib mal in NAV deinen BigText als Message aus. Vielleicht sieht man da schon was passiert.


Gruß
Aydin

Re: RTC Control AddIn BigText Sonderzeichenproblem

14. Oktober 2011 13:54

Über Webservices ist es das gleiche Problem. Es ist das Unicode-Problem.

Re: RTC Control AddIn BigText Sonderzeichenproblem

14. Oktober 2011 17:21

Ich hab mir Freddys Blog zu dem Thema mal durchgelesen, das Thema selber gibts hier:
http://blogs.msdn.com/b/freddyk/archive/2008/11/10/nav-2009-and-unicode.aspx

Leider bringt mich das nach wie vor nicht sonderlich viel weiter.
Die Workarounds die er vornimmt lassen sich bei mir leider nicht wirklich vornehmen.
Ich muss meine Daten über die BigText Variable an mein Control übergeben.
Das mit dem COM Objekt hab ich auch bereits festgestellt, denn wenn ich die save Funktion des XMLDocs aufrufe und einen Dateipfad übergebe erhalte ich ja eine saubere Datei, da er mit den NAV Streams und Files nichts zu tun hat.

Ich hab in C# die Möglichkeit strings zu konvertieren, wenn ich die entsprechenden Codepages kenne.

Code:
string data = (string)value;

Encoding oem = Encoding.GetEncoding(437);
Encoding unicode = Encoding.Unicode;

byte[] oemBytes = oem.GetBytes(data);
byte[] unicodeBytes = Encoding.Convert(oem, unicode, oemBytes);
char[] unicodeChars = new char[unicode.GetCharCount(unicodeBytes, 0, unicodeBytes.Length)];

unicode.GetChars(unicodeBytes, 0, unicodeBytes.Length, unicodeChars, 0);
string unicodeString = new string(unicodeChars);


Bei meinem Input kommt dabei aber wieder was unbrauchbares raus.
Scheint mir also nicht die Codepage 437 zu sein, wie Freddy sagt, sondern irgendwas anderes.

Oder ich mach beim Konvertieren einen Fehler.

Ich geb mal ein Beispiel:

Ich hab in meiner NAV Tabelle einen Text mit einem Umlaut stehen: ü
Nachdem ich das in den BigText geschrieben und der an mein Control gebunden wurde steht anstelle des ü: Ž‰
Nach der Konvertierung über die Funktion oben steht dort: Z‰

Ohne zu wissen welche Codepage das sein soll kommt man hier anscheinend nicht wirklich weiter :/

Re: RTC Control AddIn BigText Sonderzeichenproblem

14. Oktober 2011 18:38

In Deutschland soll die Code Page 850 sein.

Gruß, Fiddi

Re: RTC Control AddIn BigText Sonderzeichenproblem

17. Oktober 2011 09:11

An einem ähnlichen Problem bzgl. Webservices habe ich auch. Leider ist es da noch komplizierter, Ich bekomme Daten über Webservice ins NAV. Da kann ich Freddy's Ansatz gar nicht benutzen.
Wenn Du das Problem gelöst hast, wäre es toll wenn Du hier das mitteilen könntest.

Re: RTC Control AddIn BigText Sonderzeichenproblem

17. Oktober 2011 10:21

Hallo,

läuft der NAV Server bzw. Webservice auf einem anderen Server als der Client und die Database?

Also wir haben das Problem mit dem Webservice nicht. Ich meine der Sprachcode des Servers macht da die Probleme.

Vielleicht helfen die folgende Links in C# weiter:
http://www.java2s.com/Code/CSharp/GUI-W ... German.htm
http://msdn.microsoft.com/de-de/library ... ng(v=vs.80).aspx


Gruß
Aydin

Re: RTC Control AddIn BigText Sonderzeichenproblem

17. Oktober 2011 10:30

Also an der Codepage selber liegt es nicht, es ist egal ob ich 437, oder die 850 verwende.
Ich werde das Problem vorerst nicht weiter verfolgen, werde in den nächsten Wochen bei einem anderen Projekt aber definitiv wieder darüberfliegen.

Da kommt dann die Problematik die JanGD hat zum tragen.
BigText über Webservices, da muss auch ein XML drüber...

Ich meld mich jedenfalls wieder, falls ich eine Lösung finden sollte.

Re: RTC Control AddIn BigText Sonderzeichenproblem

17. Oktober 2011 15:47

So, das wird jetzt ein Doppelpost, aber ich will die Lösung mal etwas hervorheben.

Man muss rein gar nichts hin und her konvertieren.
Man muss nur dafür sorgen, dass NAV die ganze Logik behandelt was Streams angeht.

D.h. sollte man irgendwelche COM Objekte (wie ich in meinem Fall mit XMLDOM) verwenden,
dann kommt nicht auf die Idee irgendwas über eine COM Funktion in einen Stream zu schreiben, sondern die Werte müssen über den Stream eingelesen werden.

Beispiel:

Wenn Daten aus dem XML Dokument in den Stream sollen nicht so reinschreiben:

Code:
TempBlob.INIT;
TempBlob.Blob.CREATEOUTSTREAM(oStream);
XMLDoc.save(oStream);

TempBlob.Blob.CREATEINSTREAM(iStream);
BigText.READ(iStream);


Sondern so einlesen:

Code:
TempBlob.INIT;
TempBlob.Blob.CREATEOUTSTREAM(oStream);
oStream.WRITE(XMLDoc.xml);

TempBlob.Blob.CREATEINSTREAM(iStream);
BigText.READ(iStream);


Hab das mit Sonderzeichen getestet, scheint alles zu funktionieren.

Theoretisch sollte das ganze auch über die WebServices mit BigText funktionieren.
Habs noch nicht ausprobiert, aber hab damit nächste Woche zu tun.

Re: [gelöst]RTC Control AddIn BigText Sonderzeichenproblem

17. Oktober 2011 16:08

Hallo,

leider ist das über Webservices wieder ein anderes Thema.
Du bekommst ja kein XMLDomDoc Objekt sondern einen String (BigText) übertragen.

Dann mache ich

Code:
TransmissionEntryL.INIT;
TransmissionEntryL.Content.CREATEOUTSTREAM(WsXmlOutStream);
IF NOT ConvertedBigText.WRITE(WsXmlOutStream) THEN
  EXIT('1');


Damit schreib ich das ins Blob. Ich habe mir mal den Spaß gegönnt innerhalb der DB das zu extrahieren und selbst im Stream/Blob sind die Konvertierungen schon durchgeführt worden. Daher ist Deine Lösung zwar interessant, aber für WebServices scheinbar nicht wirklich nutzbar.

Re: [gelöst]RTC Control AddIn BigText Sonderzeichenproblem

17. Oktober 2011 16:20

Der Ansatz scheint mir der selbe zu sein.

Ich kommuniziere ja auch über einen BigText mit meinem AddIn.
Auf seiten von C# hat will er ein object haben (was sich dann als string herausstellt).

Die Definition müsste in deinem Webservice eigentlich genauso sein.
Entweder will der Webservice ein object oder einen string.

Was in dem BigText selber drin steht, ist ja egal.
Vor allem da das XML Dokument nicht als object in dem BigText steht, sondern lediglich der Textinhalt.

Re: [gelöst]RTC Control AddIn BigText Sonderzeichenproblem

18. Oktober 2011 09:31

In C# ist es ein String den ich übergebe und dieser ist in der CAL Funktion als Parameter in dieser Webservice Funktion ein BigText.
Soll ich nun ein Typ Object wo ich einen String reinpacke übergeben? Kann er das immer konvertieren?
Oder verstehe ich das gerade falsch?

Re: [gelöst]RTC Control AddIn BigText Sonderzeichenproblem

18. Oktober 2011 10:40

Vergessen wir mal das ganze mit den Strings oder Objects hin und her schieben.
Weil, ein String ist ein Object, macht keinen Unterschied in dem Fall.

Wenn du auf Seiten deiner C# Applikation einen String an den Webservice übergibst, dann steht anschließend auf NAV Seite der String genauso in deiner Variablen drin (in dem Fall der BigText).
Das Problem ist, dass anschließend Streams benötigt werden um damit weiterarbeiten zu können.

Die Streams Encoden das ganze offenbar in irgendeiner Art und Weise.
Wenn du nicht in den Stream liest, sondern schreibst, findet entweder kein Encoding, oder ein Encoding in die falsche Richtung statt.
Das war mein Problem.

Code:
TransmissionEntryL.INIT;
TransmissionEntryL.Content.CREATEOUTSTREAM(WsXmlOutStream);
IF NOT ConvertedBigText.WRITE(WsXmlOutStream) THEN
  EXIT('1');


Das ganze schreibt.
Schau mal ob man das ganze nicht lesend aus Sicht des Streams machen könnte:

Code:
TransmissionEntryL.INIT;
TransmissionEntryL.Content.CREATEOUTSTREAM(WsXmlOutStream);
WsXmlOutStream.WRITE(ConvertedBigText);


Könnte vieleicht funktionieren.
Hab nur grad keine Möglichkeit zu testen, ob der Stream direkt aus einem BigText lesen kann.