Für ein Konvertierungsprogramm muß man sich doch nicht entschuldigen, oder? Jede Datenbank hat ihre Fans, Computersysteme haben noch mehr Fans, und niemand soll hier vergrämt werden. Es geht einfach um den Transport von Daten von einer Datenbank zur anderen, auch systemüberschreitend.
Hier in diesem Fall also von ATARI nach IBM-Welt, von Adimens ST nach dBase III Plus. Adimens ST hat nun ein Format für den Export, aber dieses funktioniert nur wieder nach Adimens selbst, kann von dBase nicht eingelesen werden.
dbase III Plus kann Daten in mehreren Formaten, z. B. PFS, DIF, SDF importieren. Die Beschreibung des DIF-Formates liegt mir vor, es ist relativ einfach, verwendet den ASCII-Zeichensatz, ist also das Format meiner Wahl. DIF bedeutet ‘data interchange format’, es handelt sich um eine schon ältere Norm für den Datenaustausch, die auch heute noch von vielen Programmen der PC-, aber auch der Großrechnerwelt erzeugt und gelesen werden kann. Zum Beispiel verwendet Open Access II für den Import und Export DIF-Dateien, mit allerdings anders gestalteter Felderliste.
Das Modell, in dem die Daten dargestellt werden, heißt Table, Felder werden Vectors genannt, Feldinhalte Tuples. Die Organisation der Daten erfolgt also mit Spalten und Zeilen. Da aber DIF Spalten und Zeilen umwandeln kann, werden sie Vectors und Tuples genannt. Das DIF-File besteht aus zwei Teilen, dem Kopf und dem Datenteil.
Der Aufbau des Kopfes ist der Struktur in Listing 1 zu entnehmen. Die angegebenen vier Überschriften Table, Vectors, Tuples und Data sind die strikt vorgeschriebenen Standardüberschriften, optional können auch weitere für eine Felderliste anschließen, deren Struktur ist aber sehr programmabhängig. Für dBase müßte sie im Falle der Beispieldatei folgendermaßen aussehen:
-1,0
BOT
1,0
"ANREDE"
1,0
"TITEL"
1,0
"VORNAME"
etc.
Einfacher ist es, in dBase eine leere Datenbank mit der gleichen Struktur wie der in Adimens ST zu erzeugen, wobei zu beachten ist, daß ein Feld mit Mehrfachmerkmal von Adimens ST in die entsprechende Anzahl Felder aufgelöst werden muß. So müßte ein Adimensfeld
Titel (3) = c 60;
in drei Stringfelder, etwa T1, T2 und T3, zerlegt werden. Die Struktur des Datenteils ist sehr einfach, jeder Feldinhalt wird in zwei Zeilen beschrieben
Typanzeiger, numerischer Wert
String
Grundsätzlich wird nur zwischen Zeichenfeldern und numerischen Feldern unterschieden: Typanzeiger 0 bedeutet numerisch, 1 bedeutet String.
Numerische Feldinhalte werden neben dem Typanzeiger geschrieben, der zugehörige String ist gewöhnlich V, für logische Felder, die aber in Adimens ST nicht vorkommen, könnten TRUE und FALSE verwendet werden. Zahlen mit Vorzeichen, Dezimalpunkt und Exponentialzahlen mit E und Exponent sind möglich, damit sind die Merkmalstypen Zahl, Langzahl und Dezimal des Adimens ST übertragbar.
Ein String als Feldinhalt steht unter Anführungszeichen an seiner Stelle in der zweiten Zeile, der numerische Wert daher 0.
Ein leeres Stringfeld muß mit dem sogenannten Nullstring gekennzeichnet werden, zwei Anführungszeichen ohne Zwischenraum.
Die Merkmalstypen Geld und Datum müssen für eine fehlerfreie Konvertierung zuerst durch ein Aditalkprogramm in Stringfelder geschrieben werden.
Sie können übrigens eine bestehende dBase-Datenbank als DIF-Datei ausgeben lassen und an Hand dieser die Struktur studieren. Der Befehl
COPY TO (Dateiname) TYPE DIF
verhilft Ihnen zu dieser anschaulichen Unterlage.
In diese Form muß eine Adimens-Datenbank nun gebracht werden, mit Aditalk steht dafür ein sehr gutes Werkzeug zur Verfügung. Das angegebene Programm ist allerdings kein universell anwendbares, sondern muß für jede Datenbank neu angepaßt werden. Der Aufwand dafür hält sich aber in Grenzen. Die Struktur der als Beispiel verwendeten Adimens-Adressendatenbank entnehmen Sie bitte dem Listing 2.
Das Programm DIF.TLK ist sehr einfach aufgebaut, die Bedingung der ROLL ALL-Schleife muß dafür sorgen, daß die ganze oder eben nur ein eingeschränkter Bereich Ihrer Datenbank von dem Vorgang erfaßt wird. Das .TLK-File wird auf die übliche Weise in den Zwischencode übersetzt. Mit
DO "dif"
gestartet, erzeugt es nun eine DIF-Datei namens ADR.DIF. Es ist ratsam, für genügend Platz auf der Diskette zu sorgen und sich für die Wartezeit eine Beschäftigung zu überlegen.
Diese Datei wird nun in Ihre dBase-Umgebung gebracht, sei es auf einem PC/XT/AT oder per PC ditto zu einem solchen verstümmelten ATARI. Dort soll die Adressendatei als leere Datenbankstruktur namens ADR.DBF vorhanden sein. Mit
USE adr
APPEND FROM adr.dif TYPE DIF
wird die Datenbank in dBase-Format gebracht und eingelesen. Damit ist die Konvertierung beendet.
Literatur:
DIF Technical Specification. Software Arts Products Corp. 1983
Handbücher von dBASE III PLUS Version 1.1 und ADITALK ST Version 2.1
TABLE
0,1
"" null string
VECTORS
0,x x = Felderanzahl
""
TUPLES
0,y y = Anzahl der Datensätze
""
DATA
0,0
""
DATENSATZ
-0,1
BOT beginning of tuple
1,0 Textfeld
"Feldinhalt"
0,Feldinhalt Numerisches Feld
V
0,1 Logisches Feld
TRUE
0,0 Logisches Feld
FALSE
ENDE DER DATENSÄTZE
-1,0
EOD end of data
Listing 1: Die DIF-Datei für dBase
.DATEI ADRESSEN(500);
Anrede = c 10;
Titel = c 36;
Vorname = c 25;
Name = c 36: ADRESSEN;
Firma = c 36: ADRESSEN;
Strasse = c 36;
Postf = c 13;
Plz = i 4: ADRESSEN;
Ort = c 36;
Land = c 4: ADRESSEN;
Tel = c 50;
wegen = c 50: ADRESSEN;
Listing 2: Struktur für Adimens
/**********************************************/
/* DIF.TLK übersetzt ADR in eine DIF-Datei */
/**********************************************/
OPEN "adr"
USE adressen
COUNT ALL TO recno /* fragt Anzahl der Datensätze ab */
FIRST
SET OUTPUT ON
SET OUTPUT TO "adr.dif"
? "TABLE"
? "0,1"
? '""'
? "VECTORS"
? "0,12" /* Felderanzahl */
? '""'
? "TUPLES"
? "0,"+STR(recno,3,0) /* Anzahl der Datensätze */
? '""'
? "DATA"
? "0,0"
? '""'
? "-1,0"
ROLL ALL FOR wegen > " " /* damit werden sicher alle genommen */
? "-1,0"
? "BOT" /* bottom of tuple */
? "1,0"
IF anrede > " "
? '"'+TRIM(anrede)+'"'
ELSE
? '""'
ENDIF
? "1,0"
IF titel > " "
? "'"+TRIM (titel)+'"'
ELSE
? '""'
ENDIF
? "1,0"
IF vorname > " "
? '"'+TRIM(vorname)+'"'
ELSE
? '""'
ENDIF
? "1,0"
IF name > " "
? '"'+TRIM(name)+'"'
ELSE
? '""'
ENDIF
? "1,0"
IF firma > " "
? '"'+TRIM(firma)+'"'
ELSE
? '""'
ENDIF