- 13 May 2024
- 3 Minuten zu lesen
- Drucken
- DunkelLicht
- pdf
DB Zugriff aus Makros
- Aktualisiert am 13 May 2024
- 3 Minuten zu lesen
- Drucken
- DunkelLicht
- pdf
Datenbank Laden
Mit LoadDB wird ein neues DB „Object“ angelegt.
moveITDB = LOADDB(Databasepath, Database_Filename, Readonly, Neu erstellen, Logger)
moveITDB = LOADDB(PATH + "SQLDB\", "HTDB.db", FALSE, TRUE, TRUE)
Databasepath
gibt den Pfad zur DB an, dies wird in den Makros meist PATH + „SQLDB\“ sein
Database_Filename
Das Datenbankfile sollte immer die Endung „*.db“ haben und im Ordner SQLDB abgelegt sein. SQLDB ist dabei ein Unterordner des Projektordners (siehe Pfad oben) In unserem Beispiel heißt die Datenbank HTDB.db.
Readonly
legt fest ob die DB nur gelesen werden kann oder auch geschrieben.
Neu Erstellen
auf TRUE wird diese DB bei jedem Laden neu erstellt und ist somit wieder leer.
Logger
Möchte man den Logger aktivieren so setzt man diesen auf TRUE, nun erhält man unter „C:\Temp\“ ein File („moveITDB.log.xml“). In diesem File werden alle Aktionen mit der DB mit protokolliert.
Die letzten drei Parameter sind optional und können weggelassen werden.
Wenn die Datenbank Passwort geschützt ist, was normalerweise der Fall ist, so muss man dieses nach dem Erzeugen des Datenbankobjektes so angeben (nehmen wir an, unser Passwort ist "xyz":
moveITDB.Password = "xyz"
Das Passwort wird in Zelle E4 im Excel-DB-Header eingetragen!
Eine komfortable Möglichkeit zum Laden der Datenbank ist auch die Prozedur LoadSQLDB aus libdb.bas
Das Laden der Datenbank HTDB.db des aktuellen Projektes (Passwort = "HT01") mithilfe der Prozedur LoadSQLDB könnte z.B. so aussehen:
PROCEDURE LoadHTDB
IF NOT DEFINED (HT) THEN
HT = ""
RUN public\libdb.LoadSQLDB(HT, "HT01", PATH + "SQLDB\HTDB.db", TRUE)
ENDIF
END
Das dadurch erzeugte Datenbankobjekt heißt in diesem Fall "HT".
Datenbank Methoden
CREATETABLE
Um eine Tabelle anzulegen führt man CreateTable aus.
DBOBJECT.CREATETABLE (TABLENAME, SPALTEN)
moveITDB.CREATETABLE("Address","ID INTEGER PRIMARY KEY AUTOINCREMENT, Street VARCHAR(100) NOT NULL, City VARCHAR(100) NOT NULL")
DROPTABLEIFEXISTS
Um eine Tabelle zu entfernen falls diese existiert. Liefert im Fehlerfall -1.
DBOBJECT.DROPTABLEIFEXISTS(TABLENAME)
moveITDB.DROPTABLEIFEXISTS("Address")
INSERTVALUE
Zeile einfügen mit Tabellennamen und Spaltenwerte. Hier muss auf die richtige Reihenfolge der Spaltenwerte geachtet werden. Die Spaltenwerte müssen mit Beistrich getrennt werden. Wird in einer Tabelle mit PRIMARY KEY AUTOINCREMENT geschrieben so muss in dieser Spalte null übergeben werden. Liefert im Fehlerfall -1.
DBOBJECT.INSERTVALUE(TABLENAME, SPALTENVALUES)
moveITDB.INSERTVALUE("Address", "null, 'TestAddress','TestCity'")
INSERTVALUEGETPK
Für Tabellen mit PRIMARY KEY AUTOINCREMENT kann auch diese Methode verwendet werden. Hier muss der PRIMARY KEY nicht mit null übergeben werden. Man erhält als Rückgabewert den generierten PRIMARY KEY zurück. Liefert im Fehlerfall -1.
DBOBJECT. INSERTVALUEGETPK (TABLENAME, SPALTENVALUES)
pKId = moveITDB.INSERTVALUEGETPK("Address", "'TestAddress2','TestCity2'")
EXECUTENONQUERY
Um ein beliebiges SQL Statement absetzen zu können kann ExecuteNonQuery verwendet werden. Liefert im Fehlerfall -1
DBOBJECT.EXECUTENONQUERY (SQLSTATEMENT)
Zum Beispiel um eine View zu erstellen:
moveITDB.EXECUTENONQUERY("Create VIEW PersonView AS SELECT Person.Id AS Id, Person.Name AS Name, Person.Description AS Description, Address.Street AS Street, Address.City AS City from Person JOIN Address ON Person.AddressId = Address.Id")
EXECUTESCALARSTRING
Um einen einzelnen String abfragen zu können. Dabei muss der Spaltenname bzw. der Rückgabewert (könnte auch COUNT(Id), … sein) und eine Query von wo und mit welchen Einschränkungen übergeben werden.
DBOBJECT.EXECUTESCALARSTRING(SPALTENNAME, QUERY)
Beispiel:
resultString = moveITDB.EXECUTESCALARSTRING("Name","Person WHERE Description ='TestDescription'")
resultString -> "Max"
EXECUTESCALARINT
Gleich wie ExecuteString nur bekommt man einen Integer bzw. einen Zahlenwert zurück. Wenn kein Ergebnis gefunden wird, wird -1 zurückgegeben.
DBOBJECT.EXECUTESCALARINT(SPALTENNAME, QUERY)
Beispiel:
resultint = moveITDB.EXECUTESCALARINT("Id","Person WHERE Description ='TestDescription'")
resultint -> 123
EXECUTEREADER
Möchte man mehrere Spalten bzw. Zeilen abfragen, so verwendet man ExecuteReader. Als Rückgabewert erhält man eine Liste. Bei Abfrage mehrere Zeilen und Spalten erhält man eine Liste mit Listeinträgen als Zeilen.
DBOBJECT.EXECUTEREADER(SPALTENNAME, QUERY)
lstTest = moveITDB.EXECUTEREADER("*", "PersonView")
lstTest[1] … 1. Zeile (Liste mit n-Spalten Einträgen)
lstTest[1][1] … 1. Zeile 1. Spalte
(man bekommt den Wert zurück, entweder String oder Zahlenwert)
Bei Abfrage einer Spalte oder einer Zeile bekommt man eine einfache Liste mit den Einträgen zurück.
lstTest = moveITDB.EXECUTEREADER("Name ", " Person ")
lstTest[1] … 1. Name
lstTest[1] -> "Max"
lstTest[2]-> "Anna"
lstTest[3]-> "Alex"
EXECUTEREADERDELIM
Möchte man eine Zeile oder eine Spalte als eine durch ein Trennzeichen getrennte Zeichenkette zurückbekommen so verwendet man ExecuteReaderDelim. ACHTUNG: Dies ist nur möglich wenn man eine Spalte ODER eine Zeile abfragt, beides ist nicht möglich. Delim gibt dabei das zu verwendende Trennzeichen ein.
DBOBJECT.EXECUTEREADERDELIM(SPALTENNAME, QUERY, DELIM)
cAntworten = moveITDB.EXECUTEREADERDELIM("Name","Person",",")
cAntworten -> "Max,Anna,Alex"
Weiteres Beispiel:
Hier gibt es eine Datenbank - das DB-Objekt heißt "HT, mit einer DB-Tabelle "HT_Glaeser". In dieser gibt es eine Spalte "Code" mit den Antwort-Codes der Gläser und eine Spalte "Typ" mit den zugehörigen Antwortgruppen.
Mit folgender Anweisung holen wir uns alle Gläser mit der Antwortgruppe "PpOrnamentSnd" und speichern uns das Ergebnis als String-Liste in der Variable cAntwortenMitAntwortgruppen. Als Ergebnis-Spalte setzen wir uns mit "||" die gewünschte Information aus verschiedenen Spalten zusammen.
cAntwortenMitAntwortgruppen = HT.EXECUTEREADERDELIM("Typ || ':' || Code","HT_Glaeser WHERE Typ = 'PpOrnamentSnd'",",")
cAntworten -> "PpOrnamentSnd:O523,PpOrnamentSnd:Sw,PpOrnamentSnd:Mp,PpOrnamentSnd:Sa"