Bilder aus Navision mit Hilfe von Java auslesen

3. Juli 2007 20:25

Hallo,

ich versuche mit Hilfe von Java Informationen aus einem Artikelstammsatz auszulesen und diese in ein XML abzulegen. Das funktioniert auch einwandfrei,
mein Problem ist, zu jedem Artikel möchte ich natürlich auch ein Bild haben wenn ich das aber versuche auszulesen werden diese nur unvollständig geladen, die Folge ist das ich nur die Hälfte bis garnichts von meinem Bild sehe.

hat jemand damit schon Erfahrungen gemacht und könnte mir da vielleicht einen Hinweis geben?

danke schon mal im Voraus

3. Juli 2007 20:34

Hallo Tyrall,

zuerst darf ich dich herzlich in unserer Community begrüßen.

Nun zu deiner Frage:
Da Bilder innerhalb von Navision in sogenannten BLOB-Feldern (Binary Large Objects) abgespeichert werden, ist eine Auslesung nicht vergleichbar mit dem Auslesen von "klassischen" Tabellenfeldern.

Möglichkeit 1:
Du müsstest die Daten aus dem BLOB-Feld als BASE64-Stream abrufen.
Dazu bräuchtest du eine Funktion innerhalb von Navision, welche dir den Inhalt des BLOB-Feldes als BASE64 zurückliefert.
Code-Beispiele dafür findest du bei mibuso.com:
Base64EncodeStream
Base64DecodeStream

Möglichkeit 2:
Das Bild wird nicht in einem BLOB-Feld innerhalb von Navision gespeichert, sondern liegt auf einem Dateiserver innerhalb des Netzwerkes.
Auf der Artikelkarte wird dann in einem normalen Textfeld einfach nur ein Verweis (Pfadangabe / URL / ...) zu der Bilddatei im Netzwerk abgelegt.

3. Juli 2007 21:48

Tyrall, dein Problem hört sich an als ob du nicht den gesamten Stream sondern nur einen Buffer voll ausliest. Schau dir vllt. deinen Code nochmals genauer an.

3. Juli 2007 23:42

@timo
danke für den Tip. Nur leider kann ich in Navision selber nicht coden weil ich als Student nur die Spiellizenz habe.

@silverX

das ist mein Java Code...
[php]
// Ausgabe-Stream anlegen, um Bild zu schreiben

FileOutputStream fout = new FileOutputStream("c:/test/rad"+z+".jpg");

byte puffer[] = new byte[50000];
int anzahl=0;
// Auslesen der Bilddaten und in Datei schreiben

InputStream in = rs.getBinaryStream(71);


while((anzahl = in.read(puffer)) != -1) {

fout.write(puffer,0,anzahl);

}
// Schließen der Streams
fout.flush();
fout.close();
in.close();

[/php]

finde das Problem einfach nicht :-(

4. Juli 2007 14:45

Gibt es keinen der sowas schonmal erfolgreich erstellt hat ? und mir sagen kann was ich beachten muss. Liegt es vielleicht am JDBC Treiber ? Sind da Probleme bekannt?

5. Juli 2007 10:53

Ich habe wohl schon BLOB bzw. Memo Felder von extern (erfolgreich) ausgelesen, aber nicht mit Java (brrr :shock:)

Wie groß sind denn die erzeugten Dateien? Stimmt die Größe mit dem ursprünglich importierten Bild überein?

5. Juli 2007 17:01

Nein die Größe stimmt nicht überein im Schnitt fehlen immer ca. 5000 Bytes.
Ich vermute das das irgendwie mit der ODBC-JDBC Bridge zusammenhängt.
Aber auch nur ne Vermutung... aber eine andere Alternative kenne ich nicht.

6. Juli 2007 13:17

Tyrall,

ist mir jetzt grad etwas peinlich :oops:

Ich habe eine wichtige Kleinigkeit vergessen. Nachdem ich vorhin in einem anderen Thread beschrieben habe, dass NAV Daten in BLOB Feldern komprimiert, fiel es mir eben wie Schuppen von den Augen.

Natürlich sind die Daten die du erhälst nicht korrekt, da du nicht über NODBC arbeitest. NODBC macht den Zugriff auf BLOB Felder transparent, führt also eine automatische Dekomprimierung durch. Durch deinen Direktzugriff erhälst du natürlich die gepackten Daten mit denen du nichts anfangen kannst.

Du hast nun 2 Möglichkeiten: Entweder du setzt innerhalb von NAV beim Feld Picture das Property Compressed=No (was wegen der Demo-Lizenz nicht funktionieren dürfte) oder du prüfst, welches Komprimierungsverfahren Anwendung findet und enpackst die Daten vorm speichern. Leider ist die Komprimierung nirgendwo dokumentiert...

Sorry, dass mir das erst jetzt eingefallen ist.

6. Juli 2007 22:05

@silver


trotzdem danke, das ist jetzt wenigstens mal ein Ansatz.