![]() Home Grundsätzliches Installation Konfiguration Erste Schritte Laufzeitschalter Textdateien Systemfunktionen Tabellenfunktionen Indexfunktionen Volltext-Indizierung Memos und Blobs Semaphoren-Konzept Support Datenbank Einführungskurs |
Memo- und Blob-FunktionenSowohl Memos als auch Blobs werden in eigenen physikalischen Dateien gespeichert. In der zugehörigen Tabelle werden nur Zeiger auf den entsprechenden Eintrag in der jeweiligen Memo- oder Blob-Datei hinterlegt. Ein Memo-Feld speichert einen beliebig großen Text, ein Blob-Feld (BLOB = Binary Large OBject) irgendwelche Binärdaten.Memos einlesenMemofelder werden gefüllt, indem ein Text (extern oder intern) eingelesen wird.ReadMemo(db,'Memofeld',pfad_zur_textdatei) Mit einem zusätzlichen Parameter kann festgelegt werden, ob durch
den Aufruf der Funktion ein bereits bestehendes memo durch dier Textdatei
ersetzt oder ergänzt wird:
Der Vorgabewert (also wenn nichts angegegeben wird) ist 0. Ein weiterer Parameter legt fest, ob der externe Text im ANSI- oder in ASCII-Zeichensatz vorliegt: 0 (Vorgabe) ANSI-Zeichensatz
Beispiel:
Wichtig: ReadMemo arbeitet immer mit dem aktuellen (also zuletzt gelesenen oder geschriebenen) Datensatz. Es wird immer eine komplette Transaktion durchgeführt, also inklusive dem Zurückschreiben des aktuellen Datensatzes. Deshalb ist ein abschließendes WriteRec nicht nötig. Beispiel:
Der Rückgabewert von ReadMemo ist 0, wenn alles in Ordnung ist, ansonsten wird der Fehlercode geliefert. Memogröße bestimmenDie aktuelle Größe (in Bytes) eines Memos liefert die Funktion MemoLen:MemoLen(dn,'Memofeld') -> Anzahl aller Zeichen des zugehörigen Textes. Memos aus HTML-Formularen einlesenIn HTML-Formularen werden Memos normalerweise über ein TEXTAREA-Tag eingelesen. Die Textarea sollte einen Namen haben, der mit "text:" beginnt:<textarea name="text:Bemerkung" ... Das Formular mit der Textarea muss die Methode "POST" verwenden. Dann wird beim Ausführen des entsprechenden Programms automatisch ein Ramtext angelegt, das den Inhalt der Textarea im ASCII-Zeichensatz enthält. Wenn Sie also die Textarea in ein Memo einlesen wollen, genügt folgender Aufruf: ReadMemo(db,'Memofeld','ramtext:text:Bemerkung',1,1) Memo auslesenDas Gegenstück von ReadMemo steht mit der Funktion CopyMemo zur Verfügung, mit der der Inhalt eines Memofeldes in eine (interne oder externe) Textdatei übertragen wird.CopyMemo(db,'Memofeld',pfad_zur_textdatei) Auch hier gibt es einen weiteren Parameter, der den Zeichensatz der Textdatei festlegt: 0 (Vorgabe) -> ANSI-Zeichensatz
Wie ReadMemo arbeitet auch CopyMemo mit dem aktuellen Datensatz. Memos in TemplatesDie Funktion Subst bietet eine sehr bequeme Möglichkeit, Memos in Templates einzufügen:Subst(target,db,'Memofeld',1) fügt an die Stelle des Targets den Inhalt des Memofeldes ein, wobei bereits eine korrekte Zeichenkonvertierung nach HTML vorgenommen wird. Diese Methode wird eingesetzt, wenn das Target den Inhalt eines Textareas definiert, das Memo also editiert werden soll. Ausserhalb eines Textareas wird man Subst(target,db,'Memofeld',5) wählen, denn hierbei werden harte Zeilenumbrüche innerhalb des Memos durch '<br>') ersetzt. Tipp: Wenn Sie in Memos bestimmte Auszeichnungstags (Beispiel <b>..</b>) einsetzen, können Sie diese auch noch nach der HTML-Konvertierung wirksam werden lassen: WHILE subst('<b>','<b>') DO END
Suche in MemosÜber eine sequentielle Suche kann in Memos mit den Operatoren 'has' bzw. 'like' wie in Stringfeldern gesucht werden.Memofelder können auch in einen Volltextindex aufgenommen werden, was zu einer sehr schnellen Suche führt. BLOBs einlesenWie Memos werden auch BLOBs in einer eigenen Datei abgelegt. In der Tabelle selbst wird nur ein Zeiger auf den Anfang angelegt. Bei BLOBs werden jedoch zwei Arten der Einbidung unterschieden:
In beiden Fällen kann ein Typkennzeichen für die externe Datei als zusätzlicher Parameter übergeben werden. Folgende Typkennzeichen sind vordefiniert und sollten nicht für andere Dateitypen verwendet werden: 1 : BMP oder DIB
Beispiel: EmbedBlob(db,'Bild','/pics/maria.jpg',6) Das Funktionsergebnis beider Funktionen ist 0, wenn die Operation erfolgreich war, ansonsten wird der Fehlercode zurückgeliefert. Wenn LinkBlob ohne Dateinamen aufgerufen wird, liefert die Funktion den aktuell gespeicherten Pfad (Referenz). Gelinkte BLOBs sind im Zusammenhang mit der tdbengine relativ langweilig, weil für eine Referenz zu einer einer externen Datei ein normales STRING-Feld ausreicht und der Aufwand für eine zusätzliche Datei zu groß ist. Zudem merkt die Datenbank nichts davon, wenn eine Referenz in's Leere zeigt, weil die zugehörige Datei gelöscht, umbenannt oder in ein anderes Verzeichnis verschoben wurde. Anders liegt der Fall bei eingebetteten BLOBs, denn hierbei liegt eine komplette Kopie vor, die Ursprungsdatei wird demnach nicht weiter benötigt. BLOBs auslesenDas Gegenstück zu EmbedBlob liefert die Funktion CopyBlob:
Eine Sonderform dieser Form liegt vor, wenn das BLOB auf die Datei 'con' kopiert wird: CopyBlob(db,'BlobFeld','con') In diesem Fall wird das BLOB an die Standardausgabe ausgegeben (also direkt and CGI-Klienten). Zwei Funktionen geben Aufschluss über Größe und Typkennzeichen
des Blobs:
Beispiel: VARDEF t : REAL
Tipps - Tipps - TippsSie sollten weder Memos noch Blobs mit SetField eine Wert zuweisen.Sie können mit SetField(db,'BlobFeld','') ein Blobfeld löschen. Allerdings bleibt dabei die eingebundene Datei in der BLOB-Datei enthalten, es wird nur der Verweis gelöscht. Sorgen Sie dafür, dass ausser dieser 0-Zuweisung keine weiteren direkten Zuweisungen an Memo- oder Blob-Felder erfolgen. Andernfalls kann die gesamte Verwaltung so durcheinander kommen, dass die Tabelle nicht mehr brauchbar ist. Eine Falle im obigen Sinne besteht in folgenden Programmfragment: readrec(db,x); writerec(db,filesize(x)+1) Hier wird eine Kopie des Datensatzes angelegt, dabei werden auch die Memo- und Blob-Refernzen kopiert (was schnell zur Katastrophe führt). Richtig wäre: readrec(db,x); setrecord(db,db); writerec(db,filesize(x)+1) Leider funktioniert das erst ab Version 6.2.5 der tdbengine Haben Sie das Gefühl, dass bei Memos oder Blobs irgendetwas nicht
stimmt (weil beispielsweise die Änderungen in einem Memofeld plötzlich
auch in einem anderen auftauchen), so restrukturieren Sie die Tabelle mit
dem ddk. Dabei werden immer neue konstistente Memo- und Blob-Dateien angelegt.
|