ORDA: Zuweisung eines Pfades zu einem Blob- oder Bild-Attribut

Nicht-ORDA-Datenbankbefehle boten Ihnen die Möglichkeit, Bilder und Blobs außerhalb Ihrer Datendatei abzulegen, dank des Befehls SET EXTERNAL DATA PATH. Dieser Befehl ist nicht an ORDA angepasst und daher haben wir beschlossen, eine ähnliche Funktion in v20 R3 hinzuzufügen: Die Möglichkeit, einem Blob- oder Bildattribut einen Pfad zuzuweisen, der auf eine Datei verweist. Lassen Sie mich Ihnen mehr darüber erzählen.

HDI-Pfad für Bilder

Schauen wir uns zunächst einmal diesen Code an:

$myRecord:=ds.MyTable.new()
$myRecord.image:="C:/FolderWithMyFiles/myImage"
$myRecord.binary:="C:/FolderWithMyFiles/myBinary"
$myRecord.save()

Die Attribute image und binary sind ein picture-Attribut bzw. ein blob-Attribut. Wenn Sie diesen Attributen einen Pfad anstelle eines Bildes oder Blob zuweisen, fügt 4D nur den angegebenen Pfad in die Datendatei ein. Erst wenn Sie das Bild oder den Blob verwenden, lädt 4D die Datei von der Festplatte und erstellt eine richtige Bild- oder Blob-Variable. Für Sie ist das völlig transparent.

Vorteile und Vorsichtsmaßnahmen

Diese Vorgehensweise hat einige Vorteile:
– Sie speichern keine Binärdateien innerhalb Ihrer Datendatei. Dadurch bleibt Ihre Datendatei kleiner und ist schneller zu pflegen.
– Sie können dieselbe Datei für mehrere Datensätze verwenden, ohne den Inhalt der Datei zu duplizieren.
– Sie können die Dateien so organisieren, wie Sie wollen, und sie sogar mit Software außerhalb von 4D verwenden.

Es gibt aber auch einige Vorsichtsmaßnahmen, die Sie treffen müssen:
– Da 4D die Datei auf der Festplatte benötigt, müssen Sie sicherstellen, dass sie immer zugänglich bleibt, wenn 4D auf sie zugreift.
– Wenn Sie einem Bild oder Blob einen Pfad zuweisen, wird die Eigenschaft des Feldes „Stored“ in der Datenbankstruktur umgangen (mit der Eigenschaft „Stored“ können Sie wählen, wo der Inhalt des Bildes oder Blob gespeichert werden soll, in der Datendatei oder in einer externen Datei).

POSIX-Pfad oder 4D.File

Der erste Teil des Codes weist dem Attribut einen POSIX-Pfad zu (nur POSIX-Pfade werden akzeptiert). Eine andere Lösung ist die Zuweisung einer 4D.File wie in diesem Beispiel:

$file:=File("/PACKAGE/FolderWithMyFiles/myImage")
$myRecord:=ds.MyTable.new()
$myRecord.image:=$file
$myRecord.save()

Dieser Code weist dem Attribut den Pfad der 4D.File zu.

Was passiert, wenn Sie die Datei auf der Festplatte ändern?

Nun, das ist eine knifflige Frage. Da 4D den Inhalt von Blobs und Bildern in seinem Cache speichert, kann es sein, dass nichts passiert, bis Sie Ihre Anwendung schließen und wieder öffnen. Wenn Sie die Datei wirklich zur Laufzeit ändern wollen, können Sie einen Trick anwenden: Weisen Sie dem Attribut noch einmal den Pfad zu. Wenn 4D einen neuen Wert erkennt, wird der Cache geleert und Sie erhalten die neue Datei, wenn Sie das Bild oder den Blob das nächste Mal verwenden.
Hinweis: Wenn Sie auf das Bild oder den Blob über einen Browser zugreifen, z. B. mit Qodly oder dem Datenexplorer, denken Sie daran, auch den Browser-Cache zu löschen.

Nutzen Sie das Forum, wenn Sie Fragen haben

In der Dokumentation können Sie nachlesen, wie Sie diese neue Funktion nutzen können. Und wenn Sie eine Frage oder einen Kommentar haben, zögern Sie nicht, sich an unser Forum zu wenden. Wir werden Ihnen gerne helfen.

Nicolas Brachfogel
Product Owner & Senior Developer - Nicolas Brachfogel kam 2017 als Senior Developer (4D Server und Netzwerke) zu 4D. Als Product Owner, der die Freigabe von Apple Silicon verwaltet, ist er für das Schreiben von User Stories und deren Umsetzung in funktionale Spezifikationen zuständig und stellt sicher, dass die Implementierungen der Funktionen den Kundenanforderungen entsprechen. Nicolas ist Absolvent des Institut Supérieur d'Informatique Appliquée (INSIA) und begann seine Karriere als Softwareentwickler im Jahr 2001. Nachdem er mehrere Jahre in Java und C++ programmiert hatte, spezialisierte er sich auf die Client-Server-Entwicklung für Videospielunternehmen. Als Server-Entwickler/Architekt arbeitete er erfolgreich an den Server-Architekturen vieler Spiele (Dofus Arena, Drakerz, Trivial Pursuit Go!).