4000 Zeichen

13. Oktober 2007 14:30

Hallo,

ich versuche mit Navision eine Schnittstellendatei (feste Satzlänge) mit ca 4000 Zeichen pro Zeile zu bedienen. Die Schwierigkeit dabei ist das eine Variable nur 1024 Zeichen zulässt. Also habe ich 4 Variable hintereinander gehängt. Das macht aber der Speicher des Clients nicht mit.
Also habe ich jede Variable einzeln gefüllt und dann ein Problem mit dem Zeilenumbruch bekommen. Nachdem nun CR und LF nach jeder Zeile eingefügt werden, funktioniert auch das. Mein Problem ist nun zwischen jeder Variablen das Hex Zeichen "Null" das scheinbar von Navision eingefügt wird.

Kann hier jemand helfen. Wie bekomme ich das nach Möglichkeit direkt in Navision unterdrückt?

15. Oktober 2007 07:41

Hi,

konkret zu dem Hex Zeichen "Null" kann ich leider nichts sagen.
Hast du dir schon ueberlegt ob ein BLOB Feld verwendet werden koennte?
Mit den 4 Variablen hintereinanderhaengen meinst du ein Array?

Btw, wieviel Zeilen sollen denn je Message verschickt werden koennen?

Gruesse
feri

15. Oktober 2007 11:11

Nein, ich verwende kein Array. Ich gebe die 4 Variablen hintereinander aus.

Pro Zeile ca 4000 Zeichen und bis zu 1200 Zeilen pro Übergabe sind möglich.



feri hat geschrieben:Hi,

konkret zu dem Hex Zeichen "Null" kann ich leider nichts sagen.
Hast du dir schon ueberlegt ob ein BLOB Feld verwendet werden koennte?
Mit den 4 Variablen hintereinanderhaengen meinst du ein Array?

Btw, wieviel Zeilen sollen denn je Message verschickt werden koennen?

Gruesse
feri

Re: 4000 Zeichen

15. Oktober 2007 11:18

NAVUser hat geschrieben:Also habe ich jede Variable einzeln gefüllt und dann ein Problem mit dem Zeilenumbruch bekommen. Nachdem nun CR und LF nach jeder Zeile eingefügt werden, funktioniert auch das. Mein Problem ist nun zwischen jeder Variablen das Hex Zeichen "Null" das scheinbar von Navision eingefügt wird.

Du musst in diesem Fall den Dateizeiger manipulieren und dessen Position um die entsprechende Anzahl Zeichen zurückversetzen.
Code:
DeineDatei.POS := DeineDatei.LEN - 2;  // oder auch nur -1, musst du testen

15. Oktober 2007 11:33

alternativ könntest du das ganze auch in eine StreamVariable einlesen, und von da aus auf die Zielfelder verteilen, (ist zwar aufwändiger wie ein Dataport, unterstützt dafür aber auch mehr Zeichen)

gruß Thomas

Re: 4000 Zeichen

15. Oktober 2007 12:24

Hallo
danke für den Tipp. Hat leider nicht funktioniert, da das Zeichen an Stelle 1025 ausgegeben wird und nicht in der Variablen entsteht.
Zusätzlich bekomme ich den Fehler: "Die Variable ist kein Datensatz. "Variable.Feld" ist ungültig.
Ich vermute, das es was mit dem Ausgabemodus zu tun hat. Wenn ich das ganze auf Textmode True stelle, habe ich das Hexzeichen nicht mehr, dafür völlig unformatierte Daten. Mit Textmode False erhalte ich das bekannte Ergebnis.


Timo Lässer hat geschrieben:
NAVUser hat geschrieben:Also habe ich jede Variable einzeln gefüllt und dann ein Problem mit dem Zeilenumbruch bekommen. Nachdem nun CR und LF nach jeder Zeile eingefügt werden, funktioniert auch das. Mein Problem ist nun zwischen jeder Variablen das Hex Zeichen "Null" das scheinbar von Navision eingefügt wird.

Du musst in diesem Fall den Dateizeiger manipulieren und dessen Position um die entsprechende Anzahl Zeichen zurückversetzen.
Code:
DeineDatei.POS := DeineDatei.LEN - 2;  // oder auch nur -1, musst du testen

15. Oktober 2007 12:27

Sorry hab´s vielleicht nicht genau erklärt. Ich möchte die Daten als eine Datei aus Navision ausgeben.

tba hat geschrieben:alternativ könntest du das ganze auch in eine StreamVariable einlesen, und von da aus auf die Zielfelder verteilen, (ist zwar aufwändiger wie ein Dataport, unterstützt dafür aber auch mehr Zeichen)

gruß Thomas

15. Oktober 2007 12:40

das ausgeben sollte über einen Stream aber auch funktionieren, oder du schreibst direkt in die FileVariable, und speicherst diese dann jeweils in die datei.

15. Oktober 2007 16:41

Den Outstream habe ich getestet. Hat leider nicht funktioniert.(Wieder Speicherüberlauf am Client) Obwohl Objekt und DBMS Cache bereits auf 256000 laufen.
Wie ist das mit der FileVariable gemeint? Wie funktioniert das?

tba hat geschrieben:das ausgeben sollte über einen Stream aber auch funktionieren, oder du schreibst direkt in die FileVariable, und speicherst diese dann jeweils in die datei.

15. Oktober 2007 17:10

Mit der FileVariable in etwa folgendermaßen (nur schematisch)
Datei ist dabei ein Datentyp File
Code:
datei.CREATE('C:\test.txt');
FOR i := 1 TO 10 DO BEGIN
  datei.TEXTMODE(FALSE);
  FOR j := 1 TO 10 DO BEGIN
    datei.WRITE('Test;');
  END;
  datei.TEXTMODE(TRUE);
  datei.WRITE('');
END;
datei.CLOSE;


die äussere Schleife würde die Datensätze durchlaufen
die innere ist für die Felder
mit dem Wechsel des Textmodes bekommst du den Zeilenumbruch hin (also nach dem Durchlauf des Datensatzes.
Im Write steht das zu übergebene Feld und der Feldtrenner.
Wenn du alle Felder einer Tabelle übergeben willst, kannst du hier auch sehr geschickt mittels Recordref und Fieldref eine Schleife über die Felder ziehen.

17. Oktober 2007 10:51

Die Schleife funktioniert soweit. Aber auch damit kann ich nicht alle Felder auf einmal ausgeben. Sobald ich aber einen zweiten Write Befehl mit einbinde, habe ich wieder einen Zeilenumbruch den ich nicht weg bekomme. Mit der Lösung sind auf jeden Fall die Hex Zeichen schon mal weg.

tba hat geschrieben:Mit der FileVariable in etwa folgendermaßen (nur schematisch)
Datei ist dabei ein Datentyp File
Code:
datei.CREATE('C:\test.txt');
FOR i := 1 TO 10 DO BEGIN
  datei.TEXTMODE(FALSE);
  FOR j := 1 TO 10 DO BEGIN
    datei.WRITE('Test;');
  END;
  datei.TEXTMODE(TRUE);
  datei.WRITE('');
END;
datei.CLOSE;


die äussere Schleife würde die Datensätze durchlaufen
die innere ist für die Felder
mit dem Wechsel des Textmodes bekommst du den Zeilenumbruch hin (also nach dem Durchlauf des Datensatzes.
Im Write steht das zu übergebene Feld und der Feldtrenner.
Wenn du alle Felder einer Tabelle übergeben willst, kannst du hier auch sehr geschickt mittels Recordref und Fieldref eine Schleife über die Felder ziehen.

17. Oktober 2007 11:10

der Zeilenumbruch wird nur gesetzt, durch die Einstellung Textmode, die musst du entsprechend auf true (mit Zeilenumbruch) oder False (ohne) vor jedem Write gesetzt haben.

17. Oktober 2007 12:37

Ja klar. Hab ich schon getestet. Damit erhalte ich dann aber wieder die Hex Zeichen.(':-(')

tba hat geschrieben:der Zeilenumbruch wird nur gesetzt, durch die Einstellung Textmode, die musst du entsprechend auf true (mit Zeilenumbruch) oder False (ohne) vor jedem Write gesetzt haben.
:-( :-( :-(

17. Oktober 2007 14:00

Dann verwende doch
WRITETEXT('hier steht der Text');
Danach wird kein Zeilenumbruch gesetzt.
um einen Zeilenumbruch zu erzeugen, wird einfach
WRITETEXT();
also ohne Parameter gesendet.

Achso, ich sehe gerade, es geht um NAV 3, da weiß ich jetzt nicht, ob es WRITETEXT da gibt.....

18. Oktober 2007 12:34

8-)

Danke für die Hilfe in diesem Forum. Ich werde jetzt die Schnittstelle des Empfangssystems ändern um die Daten verarbeiten zu können.

19. Oktober 2007 09:01

kurze Nachfrage,
hat's denn geklappt, und wie sieht die Lösung jetzt aus?
will ja auch was bei lernen ;)

21. Oktober 2007 15:17

tba hat geschrieben:kurze Nachfrage,
hat's denn geklappt, und wie sieht die Lösung jetzt aus?
will ja auch was bei lernen ;)


Ich habe mit deiner Lösung weiter gearbeitet. Navision hat die Ausgabe von zwei Variablen mit dem Write Befehl zugelassen. Dadurch habe ich jetzt nur noch zwei Sonderzeichen in der Ausgabedatei. Eines an Pos 2049 und eines am Ende der Ausgabezeile. Diese beiden Sonderzeichen werden im Empfangssystem eingelesen bzw überlesen.
Eine saubere Ausgabe aus Navision habe ich nicht hinbekommen.