Tasten & Command Beschreibung
=============================


Command-Gruppe "DB": Datenbank
==============================

Beispiele für den Umgang dieser Command-Gruppe finden sich in einem eigenen Profil
mit dem Namen "Database Example". Dieses befindet sich im 2. Profil-Set, also
zuvor durch Anwahl des obersten Menü-Punktes im Systray-Popmenu das Profil-Set
umschalten.

--> Caution !
The database access of RK based on MS Jet engine 3.5 (DAO 3.5).
I am sorry to say that DAO 3.6 and greater is not supported!
DAO 3.6 is used by ME, 2000, XP etc.
But this is no reason not to use the database functions of RK.
In some (or many) cases it is required to prepare the system for DAO 3.5.
Maybe than DAO 3.5 and DAO 3.6 will be parallel installed but that seems to
make no trouble.

But first you should try if you can open a database with RK (see example profile).
If you get an error message like "Class not registered, looking for Object
with CLSID ... long number ...) than it seems DAO 3.5 is not available on your
system.
Than you should make a 2nd check:
Open path "\program files\common files\microsoft shared\dao".
If this folder exists than - I think - you will find the file dao360.dll only.
This says that DAO 3.6 is installed. The file for DAO 3.5 is dao350.dll.
But it would be too easy to copy this file into this folder, because the
installation of DAO 3.5 needs a lot more files and it must be correctly registered.

Therefore the easiest way to prepare your system is to download DAO 3.5 from
freewarehits.de and to run the exe-file on your system.
The archiv additional includes a file called vb5db.dll. This must be copied into
the Windows\System folder if not already exists.

I tried this method on a clean WinME installation and it works immediately without
any trouble. But it is required to say that I (the author) can not give any
warranties and it must be done at one´s own risk !

The directly download address is:
http://www.freewarehits.de/AddFiles/dao35.zip (3.2 mb)

Die auf der Microsoft Jet-Engine aufsetzenden Datenbank-Anbindung erfordert - je nach
gewünschtem Datenbank-Zugriff - sogenannte ISAM-Treiber. Das ODBC-Verfahren ließe
sich auch einstellen (s.u.), wurde aber nicht getestet.
Folgende Datenbanken - die Installation der erforderlichen Treiber vorrausgesetzt -
werden durch RK (mindestens) unterstützt:

- Access
- DBase 3/4/5
- Excel 3/4/5/8
- FoxPro 2/2.5/2.6/3
- Lotus WK 1/3/4
- Paradox 3/4/5
- Text

Erfolgreich getestet wurden Access (.mdb), Excel (.xls) und Text (.txt).
Die Treiber sollten - zumindest bei den Office-Anwendungen - bei der Installation der
jeweiligen Programme mit-installiert worden sein.

Allerdings... auf dem RK-Entwicklungs-Rechner lief - obwohl DAO 3.5 vorhanden - zunächst
nicht viel. Der Grund war, daß die Treiber (35´er) zwar vorhanden waren, allerdings nicht
ordnungsgemäß in der Registry eingetragen. Sofern sich diese im Windows-System-Verzeichnis
befinden, kann dies folgendermaßen nachgeholt werden:

Z.B. das Ausführen-Fenster öffnen und folgende Zeilen eingeben.

Regsvr32.exe C:\Windows\System\Msexcl35.dll
Regsvr32.exe C:\Windows\System\Mstext35.dll

Danach erfolgt (hoffentlich) die Meldung, daß die Treiber erfolgreich installiert sind.

Die Treiber Msexcl40.dll/Mstext40.dll sind für DAO ab 3.6 vorgesehen und für DAO 3.5 nicht
geeignet!

Als nächstes bestand das Problem, daß die ASCII-Zeichen (Umlaute etc.) nicht ordnungsgemäß
konvertiert wurden. Um dies zu beheben, mußte manuell in die Registry eingegriffen werden:
Der entsprechde Pfad lautet (bitte suchen lassen):

Jet\3.5\Engines\Text

Folgender Schlüssel muß ggf. geändert werden:
CharacterSet von "OEM" auf "ANSI" setzen.

Ggf. bei Excel, Access etc. kontrollieren.

Diese geschilderten Probleme traten nur bei der bereits vorhandenen DAO 3.5 auf.
Bei der oben beschriebenen DAO 3.5 Installation funktionierte alles auf Anhieb.

--> Einschränkung
Beim Auslesen von Werte enthaltenen Zellen kommt es gelegentlich zu Überlauffehlern. RK fängt
diese Fehler zwar ab, kann dann aber für das betroffene Feld nur noch einen Leer-String senden.
Ferner wird auch nur das Auslesen unterstützt, beschreiben kann RK eine Datenbank durch
Direktzugriff (noch) nicht.

Vorgehensweise
--------------
Als erstes muß stets eine Datenbank geöffnet werden.
RK arbeitet intern mit 2 Zeigern. Der erste positioniert einen Datensatz, der zweite ein
Datenfeld. Welches Datenfeld beim Sende-Befehl (DB.FIELD.SEND) letztendlich an die
Anwendung gesendet wird, ist von diesen 2 Zeigern abhängig.
Nun gibt RK dem Anwender diverse Commands in die Hand, um diese Zeiger zu positionieren.
Der Select-Command eignet sich z.B. für eine einmalige Sendung eines Datenfeldes, indem der
Anwender dieses gezielt aus einer Liste heraussucht und anschließend sendet.
Andere Commands wie SET und INC sind eher für Serien-Sendungen gedacht, die z.B. in einer
Schleife untergebracht werden.

Faustregel:

1. Datenbank öffnen
2. Datensatz-Zeiger positionieren
3. Datenfeld-Zeiger positionieren
4. Senden


/DB.OPEN f[,t,p3,p4,p5]: To open database name <f> (file), sheet <t> (tabel), p3/4/5 = optional parameters
------------------------
Beim Zugriff auf eine Access-Datenbank (.mdb) oder Excel-Mappe (.xls) müssen die Parameter
<f> & <t> definiert sein. Wird der Parameter <t> nicht angegeben, so wird autom. eine Liste
angezeigt, aus der eine Tabelle ausgewählt werden muß (entspr. DB.TABLE.SELECT).
Beim Zugriff auf eine TAB-separierte Text-Datei (.txt) wird nur der Parameter <f> angegeben.
In diesen 3 Fällen erkennt RK selbstständig das Format und stellt die verbleibenden
Parameter automatisch ein.
Allerdings werden Parameter-Setzungen mit Priorität behandelt. D.h. sofern sie angegeben werden,
wird die automatische Einstellung von RK außer Kraft gesetzt.
In anderen (ungetesteten) Fällen müssen zusätzliche Angaben gemacht werden, wenigstens den p3-
Parameter betreffend.

Die Parameter im Einzelnen:

f : File:    Dateiname = Pfad zur Datei

t : Table:   Die Excel-Mappe besteht bekanntlich aus einzelnen Tabellen.
             Es kann nur auf eine zur Zeit zugegriffen werden, die hier anzugeben ist.
             Bei Access handelt es sich um die Einzel-Datei der Datenbank.
             Texte sind sozusagen ein-dimensional, so daß der Parameter hier entfällt.

             Dem Tabellen-Name in Excel muß ein $ hinzugefügt werden (warum auch immer).
             Bei Text wird automatisch ein #txt generiert.
             Bei Access ist der Tabellen-Name unverändert anzugeben.
             Andere Formate wurden nicht geprüft.

             Im Zweifelsfalle den Parameter erstmal weglassen und die Tabelle aus der stattdessen
             erscheinenden Auswahlbox auswählen. In dieser kann man die genauen Tabellen-Bezeich-
             nungen erkennen, um die gewünschte später in den t-Parameter zu übertragen.

p3: Connect: Angabe des Datenbank-Typs. Die genauen Beschreibungen lauten (Access ohne Semikolon): 

             Access
             dBASE III;
             dBASE IV;
             dBASE 5.0;
             Excel 3.0;
             Excel 4.0;
             Excel 5.0;
             Excel 8.0;
             FoxPro 2.0;
             FoxPro 2.5;
             FoxPro 2.6;
             FoxPro 3.0;
             Lotus WK1;
             Lotus WK3;
             Lotus WK4;
             Paradox 3.x;
             Paradox 4.x;
             Paradox 5.x;
             Text;

             RK benutzt standardmäßig Excel 3.0. Damit kann problemlos auch auf 8.0-Dateien
             zugegriffen werden, ist aber eben auch für ältere Versionen geeignet.

p4: Rec-Set-Type: p4 = 0 - 2. Es können folgende Typen eingestellt werden:

             0 : Table
             1 : Dynaset  (Standard-Einstellung)
             2 : Snapshot

             Im Test (mdb/xls/txt) lief alles unter Dynaset, Table funktionierte auch.
 
p5: Engine: p5 = 0 - 1. Hier kann zwischen folgenden "Treiber-Maschinen" gewählt werden:

             0 : Jet  (MS, Standard-Einstellung)
             1 : ODBC

Example: {/DB.OPEN c:\data\db.xls}
Example: {/DB.OPEN c:\data\db.mdb,sheet1}
Example: {/DB.OPEN c:\data\db.xls,sheet1$}
Example: {/DB.OPEN c:\data\db.txt}
Example: {/DB.OPEN c:\data\db.xyz,sheet1,dBASE III;}     (Parameter für dbase unbekannt!)
Example: {/DB.OPEN c:\data\db.xyz,sheet1,dBASE III;,0}
Example: {/DB.OPEN c:\data\db.xyz,sheet1,dBASE III;,2,1}


/DB.CLOSE .............: To close current database
------------------------
Das Schließen einer Datenbank ermöglicht es, wieder von anderen Anwendungen auf
die Bank zuzugreifen und gibt darüber hinaus reservierten Speicher wieder frei.

Example: {/DB.CLOSE}


/DB.FIELD.ASK .........: To set field number, defined from user while script is in process
------------------------

Example: {/DB.FIELD.ASK}


/DB.FIELD.CLIP [len] ..: To copy current field content to clip, optional maximal length [len]
------------------------

Example: {/DB.FIELD.CLIP}
Example: {/DB.FIELD.CLIP 25}

Im letzten Beispiel werden die ersten 25 Zeichen des aktuellen Datenfeldes in die
Zw´ablage kopiert.


/DB.FIELD.INC .........: To increment field number
/DB.FIELD.DEC .........: To decrement field number
------------------------

Example: {/DB.FIELD.INC}


/DB.FIELD.NMB>VAR .....: To copy field number into current VAR
/DB.FIELD.NMB<VAR .....: To set field number to current VAR
------------------------
Ermöglicht den Austausch der Feld-Nummer mit der Variablen VAR, sodaß Berechnungen
möglich sind.
(siehe Command-Gruppe VAR-Commands, Rechnen)

Example: 

{/BTCH.EXPLICIT}
{/DB.FIELD.NMB>VAR}
{/VAR.ADD 3}
{/DB.FIELD.NMB<VAR}


/DB.FIELD.SEND [len] ..: To send current field content, optional maximal length [len]
------------------------
Das Datenfeld ist das kleinste Element der Datenbank:
Datenbank -> Tabelle -> Datensatz -> Datenfeld
Nur dieses kann durch RK gesendet werden.
Ganze Datensätze sendet man daher durch eine Verkettung von DB.FIELD.SEND-Commands
im Skript. Vor dem Senden muß der Datensatz-Zeiger entsprechend positioniert werden.

Example:

{/BTCH.EXPLICIT}
{/DB.REC.SELECT}
{/BTCH.EXITIF.CANCEL}
{/DB.FIELD.SET 4}
{/DB.FIELD.SEND}{KEY.TAB}
{/DB.FIELD.SET 5}
{/DB.FIELD.SEND}{KEY.TAB}
{/DB.FIELD.SET 6}
{/DB.FIELD.SEND}{KEY.TAB}

Example: {/DB.FIELD.SEND 15}

In diesem Beispiel wird die Ausgabe auf 15 Zeichen begrenzt.


/DB.FIELD.SEND.FRMT str: To send current field content in formatted output (str=###0.00 to get 1,30)
------------------------
Gestattet die formatierte Ausgabe für Zahlen- und Datums-Feldern.

Example: {/DB.FIELD.SEND.FRMT ##0.00}
Example: {/DB.FIELD.SEND.FRMT long date}

-> Beachte!
Für Datums-Felder trifft die Beschreibung in den DAT-Commands zu (DAT.FORMAT str),
mit Ausnahme der "Alleinstehenden Parametern" (Stand Alone).


/DB.Field.SET nmb .....: To set field number to <nmb>
------------------------

Example: {/DB.Field.SET 5}


/DB.Field.VIEW ........: To show current field content in the internal text viewer
------------------------

Example: {/DB.Field.VIEW}


/DB.PROP.VIEW .........: To show current database properties in the internal text viewer
------------------------

Example: {/DB.PROP.VIEW}


/DB.REC.ASK ...........: To set record number, defined from user while script is in process
------------------------

Example: {/DB.REC.ASK}


/DB.REC.INC ...........: To increment record number
/DB.REC.DEC ...........: To decrement record number
------------------------

Example: {/DB.REC.INC}


/DB.REC.NMB>VAR .......: To copy record number into current VAR
/DB.REC.NMB<VAR .......: To set record number to current VAR
------------------------
Ermöglicht den Austausch der Datensatz-Nummer mit der Variablen VAR, sodaß Berechnungen
möglich sind.
(siehe Command-Gruppe VAR-Commands, Rechnen)

Example: 

{/BTCH.EXPLICIT}
{/DB.REC.NMB>VAR}
{/VAR.ADD 3}
{/DB.REC.NMB<VAR}


/DB.REC.SELECT ........: To set record && field number by selecting from 2 lists
------------------------
Dieses Fenster gestattet es, ein beliebiges Datenfeld eines beliebigen Datensatzes
auszuwählen. Den Datensatz selektiert man in der linken, das Datenfeld in der rechten
Liste. Die Bestimmung von Datensatz- und Datenfeld-Nummer bleibt nach dem Schließen des
Fensters erhalten, um mit ihnen ggf. weiterzuarbeiten, indem man z.B. das selektierte
Datenfeld mittels {/DB.FIELD.SEND} an eine Anwendung sendet.

Die möglichen Fenster-Einstellungen findet der Anwender durch Probieren sicher
schnell heraus.
Ein Wort zu "Auto": Diese Einstellung ermittelt, ähnlich wie in Excel, durch Prüfen
sämtlicher Datenfelder die maximal erforderliche Spaltenbreite.
Einstellungsänderungen werden - auch beim Klick auf Cancel - im Verlauf der Session
weiter benutzt. Gespeichert hingegen werden sie nur durch Klick auf OK und stehen
sodann automatisch in der kommenden Session zur Verfügung.
Text-Files besitzen nur ein Datenfeld (0), weswegen die meisten Funktionen hier deaktiviert
sind.

Example: {/DB.REC.SELECT}

--> Tip
Wird der Dialog durch "Abbrechen" geschlossen, so kann die Skript-Abarbeitung
an dieser Stelle durch den Command "BTCH.EXIT-ON-CANCEL" (siehe dort) beendet
werden.

--> Tip
Die Listenbreiten lassen sich durch drag & drop verändern, indem man den Balken zwischen
den Listen greift und verschiebt.

--> Tip
Neben den windows-seitigen Steuerungsmöglichkeiten in den Listen (CRSR-DOWN/UP) sind
zusätzlich verfügbar:

[CRSR-RIGHT] : aktiviert die rechte Liste (zwecks CRSR-DOWN/UP)
[CRSR-LEFT]  : aktiviert die linke  Liste
[Enter] .....: entspricht Klick auf OK-Knopf
[Space] .....: entspricht Klick auf OK-Knopf


/DB.REC.SET nmb .......: To set record number to <nmb>
------------------------
Der Datensatz besteht aus einer Gruppe zusammengehörender Datenfelder, z.B.
Anrede, Nachname, Vorname, Ort etc. Im Falle von Excel ist der Datensatz eine
Zellen-Zeile und das Datenfeld die einzelne Zelle.

Example: {/DB.REC.SET 155}


/DB.REC.VIEW [len] ....: To show all fields in the int. text viewer, optional max. length [len]
------------------------

Example: {/DB.REC.VIEW}
Example: {/DB.REC.VIEW 75}

Im letzten Beispiel werden 75 Zeichen (von links) sämtlicher Datenfelder (Kette) des aktuellen
Datensatzes angezeigt.

-> Beachte!
Funktionsänderung des Parameters zu RK v7.0. Ggf. Parameter anpassen.


/DB.TABLE.ASK-N .......: To set table number, defined from user while script is in process
/DB.TABLE.ASK-S .......: To set table name, defined from user while script is in process
------------------------

Example: {/DB.TABLE.ASK-N}
Example: {/DB.TABLE.ASK-S}


/DB.TABLE.SELECT ......: To select table from list
------------------------
Bei geöffneter Datenbank kann so zwischen verschiedenen Tabellen hin- und hergeschaltet werden.

Example: {/DB.TABLE.SELECT}


/DB.TABLE.SET-N nmb ...: To set table number <nmb>
/DB.TABLE.SET-S str ...: To set table name <str>
------------------------

Example: {/DB.TABLE.SET-N 4}
Example: {/DB.TABLE.SET-S profit$}