Mit Pfiff programmiert: Eine Video-Verwaltung mit »Combase«

»Combase« ist eine leistungsfähige, relationale Datenbank. Seine wahren Stärken zeigt es aber erst, wenn man sich eine maßgeschneiderte Individuallösung programmiert.

Combase selbst ist eine relationale Datenbank und somit auf dem ST eigentlich nichts Besonderes mehr. Allerdings kann man in Combase auf sehr einfache Weise programmieren. Im Handbuch heißen diese Programme »Algorithmen«. Der Anwender merkt nichts von ihrer Benutzung. Er startet bei der Arbeit keine Programme oder etwa ein Makro, sondern klickt mit der Maus auf Knöpfe in Fenstern, die sich dort auch ohne dahinterliegende Programme befinden können. Die Algorithmen erweitern die Datenbank um Funktionen, die sich sonst nur schwer verwirklichen ließen. Programmieren müssen Sie dabei in der Sprache »Algo-Talk«. Aber keine Angst, mit geringstem Aufwand lassen sich schon sehr gute Ergebnisse erzielen.

Mein kleines Beispiel einer Combase-Anwendung ist eine Video-Datenbank. »Nicht schon wieder!« höre ich Sie sagen, aber diese ist anders und soll ein paar Möglichkeiten der Anwendung aufzeigen, die Sie gerade in Combase haben.

Ein Videorecorder ist mittlerweile in fast jedem Haushalt zu finden, aber ich nehme an, daß die meisten Besitzer solcher Geräte nicht gleich ein mehrere hundert Filme umfassendes Archiv aufbauen, sondern wie ich mit einer kleineren Anzahl Kassetten auch schon mal den Überblick verlieren und z.B. nur wissen wollen, auf welches Band die nächste Aufnahme paßt. Hierzu soll meine Combase-Anwendung nach Durchsicht aller Aufnahmen Vorschläge machen. Hauptzweck des Aufzeichnens ist für mich, vom Sendetermin ungebunden zu sein. Nachdem ich eine Aufnahme angesehen habe, kann Sie im Prinzip aus der Datenbank und vom Videoband verschwinden. Zu diesem Zweck möchte ich die Aufnahme in meiner Datenbank nicht gleich löschen, sondern mit einem Knopf auf „löschbar" schalten. Erst wenn tatsächlich eine neue Sendung über diese Bandstelle aufgezeichnet wird, muß der alte Eintrag aus der Datenbank verschwinden.

Eine Videodatenbank verwaltet Aufnahmen auf Videobändern. Also ist sofort klar, daß wir zwei Datenbestände verwalten müssen: Aufnahmen und Videobänder. Die Verbindung zwischen beiden ist die Tatsache, daß jede Aufnahme auf einer Videokassette zu finden ist. So etwas heißt in Combase »Relation« und das Werkzeug »ComRel« erzeugt sie. Unsere Anwendung wird diese Relation nutzen, um alle Aufnahmen in der Datenbank zu löschen, die auf einer Kassette waren, die komplett gelöscht wird, verliehen wurde oder auf andere Weise verloren ging.

Natürlich interessiert mich bei einer Aufnahme zunächst der Titel. Für das spätere Ansehen erweist sich die Bandnummer, die genaue Position und die Spieldauer als zweckdienlich. Eventuell möchte ich Aufzeichnungen etwa in der Reihenfolge ansehen, in der sie auch auf das Band kamen. Also werde ich auch das Datum eingeben. Da kein richtiges Filmarchiv entsteht, interessieren mich genaue Angaben über Regisseur, Darsteller und Produktionsjahr nicht so sehr. Trotzdem soll ein mehrzeiliges Feld für Kommentare zur Verfügung stehen.

Um eine neue Datenbank anzulegen, rufen Sie in Combase zunächst das Werkzeug »Init« auf. Datenbanken werden durch eine Maske beschrieben, die aus Feldern verschiedenster Sorte bestehen und später die Eingaben aufnehmen. Zusätzlich kommen noch Kommentare und verschiedene Sorten Knöpfe vor. Auf die »JOB-Bereiche« möchte ich hier nicht weiter eingehen. Es sei nur erwähnt, daß in so einem JOB-Bereich, den man als ein Fenster innerhalb der Maske begreifen kann, Aus- und Eingaben eines externen Programms ablaufen. Die Eingabe der Objekte verläuft immer nach dem selben Schema: Im Menu »Anlegen« des Werkzeugs »Init« wählt der Anwender das Objekt, das er plazieren möchte. Ein anschließender Doppelklick innerhalb des Maskenfensters legt die Position fest. Daraufhin öffnet Combase eine Dialogbox, um die verschiedenen Attribute des Objektes zu erfragen. Zu beachten ist, daß Sie während der späteren Arbeit mit der Datenbank nur nach Feldern suchen und sortieren können, die Sie hier als »Schlüssel« gekennzeichnet haben.

So sehen die Masken »AUFNAHME« und »BAENDER« aus

Auffallend konsequent ist die Benutzung der Funktionstasten in diesen Dialogboxen: Fl steht für den OK-Knopf, F2 für das Löschen des Objektes und die Taste F10 für den Abbruch des Dialogs. Genau die gleiche Belegung haben diese Tasten bei der späteren Dateneingabe. Dabei besitzen auch die restlichen Funktionstasten Standardfunktionen. In einer Maske legen wir die Funktionstasten einfach durch Drücken der entsprechenden Taste auf der Tastatur an. Die Funktionen für Tasten, die nicht in eine Maske eingegeben wurden, können Sie später während der Dateneingabe nicht auslösen. Das benutze ich in der Maske »BAENDER«: Dort habe ich die Funktionstaste für »Ändern« zunächst weggelassen, weil in diesem Fall die Standardfunktion nicht ausreichend wäre. Einen erweiterten Algorithmus habe ich aber noch nicht programmiert.

Zusätzlich stehen noch Knöpfe für die Tastenkombinationen Alternate-A bis Alternate-Z zur Verfügung. Sie haben keine Standardbelegung. Stattdessen legt ein für jeden Knopf einzeln zu schreibender Algorithmus ihre Funktion fest. In die Maske »AUFNAHME« habe ich einen Knopf »HILFE« eingebaut. Sein Algorithmus besteht aus einer einzigen Zeile:

Send „Manual Open HILFE.TXT"

Beim Klicken auf diesen Knopf geht an das Combase-Werkzeug »Manual« die Aufforderung, die Datei HILFE.TXT zu öffnen. Manual ist in der Lage, speziell geschriebene Hilfstexte nach Stichworten zu durchsuchen und anzuzeigen. Zum Lieferumfang von Combase gehört eine Hilfe-Datei, deren Verwendung ich oft dem Handbuch vorziehe, da der Rechner schnell nach einem bestimmten Stichwort sucht.

Sehr praktisch für viele Eingaben sind die Makrobuttons. Es handelt sich um Knöpfe, die eine feste Funktion haben. In der Maske »AUFNAHME« befindet sich ein Makrobutton, der auf einen Mausklick in das Eingabefeld das aktuelle Datum der Aufnahme einträgt. In »BAENDER« befinden sich zwei solche Knöpfe, die Standardwerte für die Bandlänge liefern. Wichtig die »composite keys«. Wie der Name schon sagt, ist das ein zusammengesetzter Schlüssel. Er dient dazu, in der Datenbank nach mehreren Kriterien gleichzeitig zu suchen und zu sortieren. Für die Suche nach einer freien Bandstelle müssen alle Aufnahmen zunächst nach der Bandnummer und anschließend nach der Startzeit auf dem jeweiligen Band untersucht werden. Also setze ich in meinem Beispiel den composite key aus den beiden Schlüsseln »BandNr« und »Start« zusammen.

Die Algorithmen für die besondere Behandlung bestimmter Funktionstasten oder für den Hilfe-Knopf sind einfache Textdateien. Ich könnte sie mit jedem Texteditor schreiben - der einfachste Weg ist aber sicher der, den Combase selbst anbietet: Ein Mausklick mit gedrückter Control-Taste während der Dateneingabe auf den gewünschten Knopf öffnet das Werkzeug »Edit« mit dem Text des zugehörigen Algorithmus. Nachdem ich diesen Text gespeichert und Edit verlassen habe, fragt Combase, ob der geänderte Algorithmus neu übersetzt werden soll. Tritt dabei ein Fehler aut, erscheint das Angebot, den Algorithmus neu zu editieren. Bevor Sie sich in die Programmierung eigener Algorithmen stürzen, sollten Sie sich den Referenzteil des Handbuchs zu diesem Thema komplett durchlesen.

Der Algorithmus, der den Datenbankeintrag für ein Band und die auf ihm enthaltenen Aufnahmen löscht, ist noch sehr einfach:

If Answer "wirklich löschen?""
			(* noch einmal nachfragen .. . *)
In AUFNAHME		(* in AUFNAHME arbeiten *)
BandNr:„BAENDER.BandNr
				(* alle Aufnahmen auf dem Band *) 
Select Key		(* anwählen. *)
Index BandNr First (* erste Aufnahme suchen *)
While Found		(* solange noch eine vorhanden *)
Delete			(* ist, löschen! *)
Skip			(* nächste suchen *)
Endwhile		(* Ende der Schleife *)
				(* zum Schluß wird der Datensatz *) 
Delete „BAENDER	(* für das Band selbst gelöscht *) 
End if

Der Algorithmus zur Suche nach einer freien Bandstelle benutzt die vordefinierte Funktion »Timeln«. Diese erhält zwei Zeitabschnitte als Parameter und berechnet die in beiden enthaltene Zeit. Von den Combase-Entwicklern eigentlich zur Vereinfachung bei Lohnabrechnungen mit verschiedenen zeitlichen Tarifzonen gedacht, bietet diese Funktion natürlich eine einfache Möglichkeit nachzusehen, ob eine vorhandene Aufnahme sich mit einer geplanten neuen überschneidet. Das Suchverfahren entspricht dem, das ich auch selbst für diese Aufgabe verwenden würde: Auf jedem Band wild nacheinander ausprobiert, ob die gewünschte neue Aufnahme sich mit einer dort vorhandenen überschneidet. Ist dies nicht der Fall, wird die mögliche Bandnummer, Start- und Endzeit als Vorschlag ausgegeben. Ist eine Aufnahme schreibgeschützt, muß dei Anfang der neuen Aufnahme hinter ihr liegen. Zusätzlich wird überprüft, ob vielleicht am Ende eines Bandes noch genug Platz ist.

$HEAP=4096 (* Speicherplatz vergrößern *)
Write "Nr."+" "+"Anfang Ende"
WriteLn
Get Mask AUFNAHME
VAR.NeuDauer := MkTime trunc(AUFNAHME.Dauer/60)
(AUFNAHME.Dauer MOD 60) 0
VAR.NeuStart := 00:00:00
VAR.NeuEnde :=VAR.NeuDauer
Index BAENDER.BandNr
Select BAENDER All
First BAENDER
Index AUFNAHME.BandInhalt
	(* AUFNAHME zuerst nach * )
Select AUFNAHME All 
	(* BandNr, dann nach Start *)
First AUFNAHME 
	(* sortieren *)
While Found
	While BAENDER.BandNr AUFNAHME.BandNr 
	(* neues Band? *)
	(* Nachsehen, ob die Aufnahme an das alte Bandende paßt! *)
VAR.Ende := MkTime trunc(BAENDER.BaridLaenge/60) (BAENDER.BandLaenge MOD 60) 0 
If VAR.NeuStart < VAR.Ende
If (TimeIn VAR.NeuStart VAR.NeuEnde VAR.NeuStart VAR.Ende) = VAR.NeuDauer 
Gosub Ausgabe 
Endif 
Endif
	(* Aufnahme an den Anfang des neuen Bandes *) 
VAR.NeuStart :=00:00:00 
VAR.NeuEnde := VAR.NeuDauer 
Skip BAENDER 
Endwhile
VAR.Dauer :=MkTime trunc (AUFNAHME.Dauer/60) (AUFNAHME.Dauer MOD 60) 0 
VAR.Ende :=AUFNAHME.Start + VAR.Dauer 
If 00:00:00 = (TimeIn VAR.NeuStart VAR.NeuEnde AUFNAHME.Start VAR.Ende)
Gosub Ausgabe 
Endif
	(* neue Aufnahme über eine Schreibgeschützte Passage "springen" lassen: *)
If AUFNAHME.Schreibschutz = 1
VAR.NeuStart := VAR.Ende
VAR.NeuEnde := VAR.NeuStart + VAR.NeuDauer
Endif
Skip AUFNAHME
Endwhile (* Ende des Programmes *)
Suspend 
LABEL Ausgabe:
Write (BAENDER.BandNr):3+" "+VAR.NeuStart+" "+VAR.NeuEnde 
WriteLn 
RETURN

Die im Programm verwendeten Variablen stammen zum Teil aus einer sogenannten »Clone«-Maske. Das ist eine Maske, in die man Daten aus einer anderen Datenbank eintragen kann. In diesem Fall allerdings benutze ich die Felder der Maske »VAR« als Zwischenspeicher für Ergebnisse während der Berechnung. Diese Videodatenbank soll Ihnen einen kleinen Überblick über die Arbeit mit Combase bieten und ist sicher nicht vollständig. Beispielsweise fehlt der Algorithmus, der bei Eingabe einer neuen Aufnahme nach Überschneidungen mit vorhandenen sucht, nicht schreibgeschützte gleich löscht und andernfalls eine Warnung ausgibt. Vielleicht haben Sie ja Lust, dies selbst einmal auszuprobieren? (wk)


Arne Schween
Aus: TOS 10 / 1992, Seite 48

Links

Copyright-Bestimmungen: siehe Über diese Seite