InStream / OutStream

12. März 2010 19:03

In der cside.chm Hilfe Datei gibt es da so ein wunderbares Beispiel für die Streams in Verbindung mit BLOBs "Code Examples for stream"
Code:
Writing Data to an OutStream
Here we want to create an OutStream to stream data out of a BLOB field for storage in an external object.
recEmployee."No." := '5555';

// We now load the XML DOM, which will pass the OutStream to the external object.
XMLDom.load('SomeData.xml');
recEmployee.Picture.CREATEOUTSTREAM(StreamOutObj);
StreamOutObj.WRITE('Ver. 1.00');

// Write version.
StreamOutObj.WRITE('Company Ltd.');

// Write (c).
StreamOutObj.WRITE(TODAY);

// Write a DATE (today).
// The following information will be written as plain text.
StreamOutObj.WRITETEXT('Dear Customer,');
StreamOutObj.WRITETEXT();

// This inserts a carriage return and a new line.
StreamOutObj.WRITETEXT('We would like to thank you for your help.');
StreamOutObj.WRITETEXT();
StreamOutObj.WRITETEXT('We hope to see you soon!');
StreamOutObj.WRITETEXT();
XMLDom.save(StreamOutObj);
recEmployee.MODIFY();

Ich verstehe alle Elemete, weiß grundsätzlich was ein XmlDOM ist und bekomme diesen Code auch zum Laufen. Verstehen tue ich nur nicht,
was das bitte soll. Mit einem 3-Zeiler wie diesem:
Code:
RecItem.Picture.CREATEOUTSTREAM(StreamOutObj);
StreamOutObj.WRITE('123');
RecItem.MODIFY();

kann ich Text in einen Blob schreiben, den ich auch über einen InStream.READ wieder heraus bekomme und anzeigen kann. Was aber hier die
Verwendung des XmlDOM und das laden irgendeiner XML-Datei für einen Sinn haben soll, ist mir bisher verborgen geblieben. Weder kommen die
XML-Daten in den Blob noch irgendwelche andere Daten in die XML-Datei ...

Wahrscheinlich habe ich ein riesen Brett vor dem Kopf - kann mich irgenjemand erleuchten?

Danke

Pidi

Re: InStream / OutStream

15. März 2010 12:38

In deinem Beispiel geht es darum die Daten eines BLOB-Feldes aud dem BLOB auszulesen und in eine XML-Datei zu schreiben. (Outstream)

Code:
XMLDom.load('SomeData.xml');
recEmployee.Picture.CREATEOUTSTREAM(StreamOutObj);
StreamOutObj.WRITE(TODAY);
XMLDom.save(StreamOutObj);


Hier würde der Inahlt von Picture in eine XML-Datei geschoben werden. (sollte so sein)
Macht natürlich mehr Sinn wenn indem BLOB eine XML-Datei liegt.
Anschliessend wird die XML-Dateu um das Datum TODAY ergänzt und gespeichert.

Für XML-DAteien und BLOBs nutze ich allerdings im Normalfall:
Code:
BLOB.EXPORT('XMLdata.xml');
BLOB.IMPORT('XMLData.xml');
z.B. reEmployee.Picture.Export('SomeData.xml');

Re: InStream / OutStream

15. März 2010 18:37

Danke für die Erläuterung.

Genau das hatte ich auch vermutet, weil es ja irgendwie logisch erscheint. Nur passiert genau das NICHT !
Nach Ausführung der folgenden Zeilen:
Code:
  IF ISCLEAR(XMLDom) THEN CREATE(XMLDom);
  XMLDom.load('D:\SomeData.xml');
  RecItem.Picture.CREATEOUTSTREAM(StreamOutObj);
  StreamOutObj.WRITE('This is a test');
  XMLDom.save(StreamOutObj);

unter Verwendung der .XML-Datei
SOMEDATA.XML
<?xml version="1.0" encoding="UTF-8"?>
<note>
<body>Test</body>
</note>

ändert sich in der .XML-Datei aber nichts!

Allerdings wird der Inhalt der .XML-Datei schon in den BLOB geladen, was man sieht, wenn man über
Code:
  RecItem.Picture.EXPORT('D:\Neu.xml');

den Inhalt des BLOB in einer neuen Datei speichert. In dieser Datei steht dann auch der über das "WRITE" in
den Stream geschriebene Text, und zwar am Anfang dieser Datei:
NEU.XML
This is a test <?xml version="1.0" encoding="UTF-8"?>
<note>
<body>Test</body>
</note>

Wirklich Sinn macht auch das nicht.

Sorry, aber da wird mein Brett vor dem Kopf eher noch größer; Ich verstehe nicht, was für einen Sinn das machen soll,
und ich sehe nicht, dass das Navision Beispiel in die .XML-Datei schreibt.

Danke

Pidi