DB Zugriff aus Makros
  • 13 May 2024
  • 3 Minutes to read
  • Dark
    Light
  • PDF

DB Zugriff aus Makros

  • Dark
    Light
  • PDF

The content is currently unavailable in English. You are viewing the default German version.
Article summary

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"


Was this article helpful?