26. Juni 2008 15:45
		
			
			Hallo,
ich habe ein Problem beim Schreiben von XML Daten in BLOB Felder via Streams. Die Schwierigkeiten treten erst ab einer gewissen Groese der einzulesenden XML Datei auf. 
Files < ~700KB werden schnell und ohne Probleme eingelesen und gespeichert, sind sie groeser, verlangsamt sich das Programm massiv (~1KB/sec) und bei 770KB verabschiedet er sich mit dem Fehler, dass die DB voll ist, 

 was natuerlich nicht stimmt.
Das Programm ist so aufgebaut:
Die Daten lese ich aus einer Queue (MQ Series) schrittweise (bei jedem loop 300 Zeichen) aus. 
Beim ersten Durchlauf erstelle ich einen Record in der Tabelle "EDI Message" und oeffne einen Stream auf das BLOB Feld "EDI Content".
Jetzt fuegt er laufend Teilstrings hinzu und speichert den Record immer wieder ab.
Ich habe testweise nach jedem Modify ein Commit gesetzt. So bringt er keinen Error am Schluss, wird allerdings noch langsamer.
Dateien mit ~1MB sind eigentlich nicht gross, und wenn man bedenkt, dass ein BLOB Feld ~2GB aufnehmen kann, dann wundert mich das schon etwas. 
- Code:
 // readqueue()
    FOR i := 1 TO ROUND(RecMessage.MessageLength/MsgLen,1,'>') DO BEGIN
      IF RecMessage.DataLength >= MsgLen THEN BEGIN                  // ReadString kann nicht mehr auslesen, als vorhanden ist. Dann wuerde
        TextIn := RecMessage.ReadString(MsgLen);                     // er nichts mehr auslesen! -> DataLength verwenden, nicht MessageLength
        writetable(TextIn);
      END ELSE BEGIN
        TextIn := RecMessage.ReadString(RecMessage.DataLength);
        writetable(TextIn);
      END;
- Code:
 // writetable(Msg)
  IF i = 1 THEN BEGIN
    MQFunc.MQMsgCreate(EDIMessage,NewCode,'','','XML','IN');        // Record wird erstellt
    
    CLEAR(OutStrm);
    EDIMessage.CALCFIELDS("EDI Content");
    EDIMessage."EDI Content".CREATEOUTSTREAM(OutStrm);              // Stream oeffnen
  END;
  OutStrm.WRITETEXT(Msg);                                           // Schreibe Msg in BLOB Feld
  
  EDIMessage.MODIFY();
Dieses Problem habe ich in NAV5.00 und NAV3.60 festgestellt.
Testweise habe ich die Daten nur in ein TXT File auf die Platte geschrieben, und das Speichern in Navision auskommentiert, dann ist er in <1sec fertig. Die MQ Automation kann also nicht Schuld sein.
Hat jemand Loesungsvorschlaege oder sonstige Ideen? 
  
Gruesse
feri
			
				
Zuletzt geändert von feri am 30. Juni 2008 15:34, insgesamt 1-mal geändert.