[gelöst] Anzeige Inhalt eines BLOB-Feldes

9. November 2017 14:29

Hallo zusammen,

ich habe ein BLOB-Feld, in welchem ein Text abgespeichert ist.
Gibt es die Möglichkeit, diesen Text wieder auszulesen und auf einer Page (z.B. Sales Lines)
anzeigen zu lassen?
Meine bisherigen Versuche zeigten diese Zeichen an:
瀼猠祴敬∽慭杲湩›

Ich vermute das noch eine Konvertierung fehlt. Kann mir hierfür jemand einen Tip geben?

Vielen Dank und Grüße
Frank
Zuletzt geändert von fragglet am 14. November 2017 09:50, insgesamt 1-mal geändert.

Re: Anzeige Inhalt eines BLOB-Feldes

9. November 2017 15:57

Wie sahen die Versuche denn aus?

Grundsätzlich hängt das von der Textkodierung ab, das kann ja theoretisch alles sein, was kreucht und fleucht.
Wo kommt der Inhalt denn her?

NAV kann ja nur 4 Optionen und unterscheidet bei den UTFs noch nicht einmal mit oder ohne BOM.

In Codeunit 10 Type Helper findet man diese Funktion
Code:
ReadTextBlobWithTextEncoding(VAR BlobFieldRef : FieldRef;Encoding : TextEncoding) BlobContent : Text
TempBlob.INIT;
BlobFieldRef.CALCFIELD;
TempBlob.Blob := BlobFieldRef.VALUE;
TempBlob.Blob.CREATEINSTREAM(InStream,Encoding);
IF InStream.READ(BlobContent) = 0 THEN;

Die wird z.B. aus Codeunit 454 Job Queue - Send Notification aufgerufen.

Alternativ wäre für UTF-8 hier ein Beispiel mit direktem .NET-Einsatz mittels BinaryReader. Damit könnte man auch Kodierungen außerhalb der NAV-internen Möglichkeiten realisieren.
https://stackoverflow.com/questions/37404789/display-blob-field-containing-text-in-rdlc-report-dynamics-nav
https://msdn.microsoft.com/de-de/library/system.io.binaryreader(v=vs.110).aspx

Re: Anzeige Inhalt eines BLOB-Feldes

10. November 2017 17:31

Ich habe erst neulich eine entsprechende Funktion aufgrund der Konvertierung auf dotNet umgestellt, da vorher nicht alle Symbole gespeichert werden konnten.

1. Funktion: Text in Blob speichern

Variablen:
Code:
Name   DataType   Subtype   Length
StreamOut   OutStream      
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'   

Funktion:
Code:
Text2Blob(myText : Text)
CLEAR(Blob);
IF myText <> '' THEN BEGIN
  Blob.CREATEOUTSTREAM(StreamOut);
  StreamWriter := StreamWriter.StreamWriter(StreamOut,Encoding.UTF8);
  StreamWriter.Write(myText);
  StreamWriter.Flush;
  StreamWriter.Close;
END;

Aufruf im Page-Validate Trigger des Textfeldes:
Code:
Text2Blob(myText);



2. Funktion: Text aus dem Blob laden:
Variablen:
Code:
Name   DataType   Subtype   Length
myText   Text      
StreamIn   InStream      
StreamReader   DotNet   System.IO.StreamReader.'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'   

Funktion:
Code:
Blob2Text() : Text
CALCFIELDS(Blob);
IF NOT Blob.HASVALUE THEN
  EXIT('')
ELSE BEGIN
  Blob.CREATEINSTREAM(StreamIn);
  StreamReader := StreamReader.StreamReader(StreamIn,Encoding.UTF8,TRUE);
  myText := StreamReader.ReadToEnd;
  StreamReader.Close;
  EXIT(myText)
END;

Aufruf im OnAfterGetRecord Trigger der Page:
Code:
myText := Blob2Text;

Re: Anzeige Inhalt eines BLOB-Feldes

14. November 2017 09:49

Hallo vandyke,

vielen Dank für deine Anleitung. Jetzt hat es funktioniert.

Viele Grüße

Re: [gelöst] Anzeige Inhalt eines BLOB-Feldes

14. November 2017 10:04

Siehe übrigens auch die Funktionen am Ende von XMLport 9170 (ja sorry, hätte mich vielleicht früher melden sollen :roll: )

Re: [gelöst] Anzeige Inhalt eines BLOB-Feldes

15. November 2017 17:49

Na eben, da steht das ja. Sogar das Problem ist als Kommentar aufgeführt :-D
Und ich such mich noch mühsam durch die Dot.Net Funktionen :mrgreen:

Re: [gelöst] Anzeige Inhalt eines BLOB-Feldes

15. November 2017 23:37

Na eben, da steht das ja. Sogar das Problem ist als Kommentar aufgeführt


Anscheinend hat NAV 2015 den Kommentar in dem XML-Port noch nicht gelesen, und weiß gar nicht, dass es kein UT8 verarbeiten kann. :mrgreen: :mrgreen:
( es ist übrigens witzig, dass in der dort erzeugten XML-Datei als Codierung UTF16 angegeben ist, der BLOB hier aber als UTF8 geschrieben wird.)

Aber Scherz beiseite:
Der Kommentar stand auch schon in der NAV2013- Version drin, und die beherrschte noch kein Textencoding. 8-)

In NAV 2015 kannst du mit TextEncoding auch bei den BLOB-Streams arbeiten, das sollte das Problem in der Form lösen, wie Kowa es beschrieben hat.
Mit der Ausnahme, dass man in NAV 2015 ein Variable vom Typ "Textencoding" noch nicht als Parameter an eine Funktion übergeben kann.

Ansonsten hatte ich bisher keine Probleme damit.
Man muss nur höllisch aufpassen, mit welcher Codierung man was wohin geschrieben hat, damit man es mit der richtigen Codierung wieder ausließt.
Also am besten genau je eine Funktion schreiben, die den Inhalt einer Textvariable in den Blob schreibt, bzw. Ihn mit der gleichen Codierung wieder in eine Tetxvariable ausliest.

Gruß Fiddi