Stream.READTEXT Problem

19. Dezember 2006 18:16

Hallo zusammen,

ich habe hier eine kleine Frage zum Instream Befehl READTEXT.
In einem BLOB Feld ist eine "Wurst" an Daten gespeichert, die ich auslesen und anhand von einem Trennzeichen, in dem Fall <CR> "CHAR13", strukturiert in eine Tabelle schreiben will.

Es gibt eine alte, funktionsfaehige Version dieses Programmes, mit dem es ohne Probleme klappt. Die Daten werden hier allerdings in einer anderen Tabelle ohne BLOB Feld zwischengespeichert. Um den Ablauf zu vereinfachen und einfach "sauberer" zu machen, wollen wir das auf BLOBs umstellen.

Das Programm, welches die Strukturierung anhand der Trennzeichen macht, findet nach dem Auslesen des BLOBs kein einziges <CR> und schreibt somit alles wieder als Wurst in die Tabelle. :-?

Im Testbeispiel sind definitiv mehr als 8 <CR> vorhanden.

Mir scheint, als wuerde das READTEXT diese Zeichen einfach schlucken? :evil:

Ich habe auch den READ Befehl kurz ausprobiert, hier erhalte ich allerdings diesen Fehler.
Code:
The stream cannot find a zero-terminated string.
The stream may be invalid, or the (variable or requested) size may be too small.



Hier ist noch der Code fuer das Auslesen.
Code:
CLEAR(InStrm);
EDIMess.CALCFIELDS("EDI Content");
EDIMess."EDI Content".CREATEINSTREAM(InStrm);

WHILE NOT (InStrm.EOS()) DO BEGIN                          // copy entire Message in TempString Array
  f := f + 1;                                                 
  InStrm.READTEXT(MQStrTemp2);                             // Use temp variable as there is a bug with
  MQStrTemp[f] := MQStrTemp2;                              // readtext in arrays
END;


Mir ist auch aufgefallen, dass Navision beim Auslesen direkt in eine Array Variable die Laenge durcheinander bringt, und gleich den ganzen Stream in die erste Position des Arrays schreibt.

Wie koennte ich das mit READ loesen, oder gibt es fuer READTEXT noch eine Idee?

Danke & Gruesse
feri

19. Dezember 2006 20:23

Hab einen kurzen Test gemacht. Dafür musste folgende Textdatei herhalten:

Code:
bla
blubb
dies ist ein test
dummdidumm
lala
nochmal test 1-2-3
huhu
bla
blubber
tescht 5-6-7


Mit folgendem Code wird eine Textdatei gelesen, in ein BLOB geschoben und danach Zeilenweise in eine Dimension des TempArray übertragen:

Code:
// --- Prepare
CLEAR(Picture);

f.OPEN('C:\test2.txt');

f.CREATEINSTREAM(ins);
Picture.Picture.CREATEOUTSTREAM(outs);
COPYSTREAM(outs, ins);

f.CLOSE();

// --- Test 1 READTEXT
Picture.Picture.CREATEINSTREAM(ins);

i := 0;

WHILE NOT (ins.EOS()) DO BEGIN
  i := i + 1;
  ins.READTEXT(TempText);
  TempArray[i] := TempText;
END;


Das funktioniert problemlos mit Dateien die CR/LF (0x0d, 0x0a) oder LF (0x0a) als "Trenner" enthalten. Wenn es allerdings nur ein CR ist, wie von dir angegeben, dann werden keine neuen Zeilen erkannt. Mag das das problem sein?

20. Dezember 2006 12:30

Hi SilverX,

danke fuer deinen Test.

Ich habe es jetzt mal mit <LF> als Trennzeichen probiert, in diesem Fall "schluckt" er es nicht, allerdings funktioniert das Vergleichen nicht.

Hier ist der Code, wie ich die Zeichen vergleiche, vielleicht ist ja hier etwas nicht in Ordnung?

Code:
Name   DataType   Subtype   Length
sep    Char      
sepstr Text       30
Str      Text                                600

sep := 10;       // <LF>
sepstr := '%1';
sepstr := STRSUBSTNO(sepstr,sep);
FOR i := 1 TO STRLEN(Str) DO BEGIN
  IF COPYSTR(Str,i,1) = Sep THEN BEGIN
  ...
  END;
END;


Nach dem Auslesen aus dem Stream zeigt er <LF> als "?" an. Somit findet er nie etwas :cry:.

Gruesse
feri