QueryBuilder-Klasse
Die Klassen QueryBuilder ist veraltet und sollte nicht mehr verwendet werden. Die neue Klasse SelectBuilder bietet eine modernere und einfachere Möglichkeit, Datenbankabfragen zu erstellen.
QueryBuilder-Klasse
Die QueryBuilder-Klasse wurde verwendet, um SELECT-Datenbankabfragen zu erstellen. In der neuen Logik wird die SelectBuilder-Klasse verwendet.
QueryBuilder - Bisherige Logik
Wie in executeQuery beschrieben, wurde die QueryBuilder-Klasse in Kombination mit der Database-Klasse verwendet.
// #import "ou.sp.Library"
const query = new QueryBuilder();
query.select(["costcenter", "costcenterName"], false);
query.from("costcenter", false);
const dbUser = util.getEnvironment("OUSP_DATABASE_USER");
const dbPassword = util.getEnvironment("OUSP_DATABASE_PASSWORD");
const db = new DBConnection("odbc", "ousp", dbUser, dbPassword);
const database = new Database(db);
const table = database.executeQuery(query);
// ODER
const table = database.executeQuery(query, (column, value) => value);
const rows = table.rows.map((row) => {
// @ts-ignore
delete row.data;
return row;
});
database.close();
QueryBuilder - Neue Logik
In der neuen Logik wird die Datenbankabfrage über die Funktion execute der Klasse SelectBuilder ausgeführt.
context.enableModules();
const { SelectBuilder } = require("ou.sp.SelectBuilder");
const dbUser = util.getEnvironment("OUSP_DATABASE_USER");
const dbPassword = util.getEnvironment("OUSP_DATABASE_PASSWORD");
const db = new DBConnection("odbc", "ousp", dbUser, dbPassword);
try {
const rows = SelectBuilder
.from("costcenter", db)
.select("costcenter", "string")
.select("costcenterName", "string")
.execute();
context.returnValue = JSON.stringify(rows);
} catch (error) {
context.errorMessage = error.message;
context.returnValue = -1;
} finally {
db?.close();
}
from
Die Funktion from der QueryBuilder-Klasse wurde verwendet, um die Tabelle der Datenbankabfrage zu definieren.
from - Bisherige Logik
// #import "ou.sp.Library"
const query = new QueryBuilder();
query.from("costcenter", false);
// ODER
const query = QueryBuilder.from("costcenter", false);
from - Neue Logik
const { SelectBuilder } = require("ou.sp.SelectBuilder");
const query = SelectBuilder.from("costcenter")
Sonderfall DB-Connection
Möchte man eine Datenbankabfrage ausführen, so muss die DBConnection-Instanz als Parameter übergeben werden und ggf. ein DB-Provider (wird benötigt für limit und offset).
const { SelectBuilder } = require("ou.sp.SelectBuilder");
const query = SelectBuilder.from("costcenter", db);
Angabe eines DB-Providers:
const { SelectBuilder } = require("ou.sp.SelectBuilder");
// MSSQL
const query = SelectBuilder.from("costcenter", db, "mssql");
// MariaDB
const query = SelectBuilder.from("costcenter", db, "mariadb");
select
Die Funktion select der QueryBuilder-Klasse wurde verwendet, um die ausgewählten Spalten der Datenbankabfrage zu definieren.
select - Bisherige Logik
//#import "ou.sp.Library"
// Übergabe als Array
const query = new QueryBuilder();
query.select(["costcenter", "costcenterName"], false);
// ODER Übergabe als string
const query = new QueryBuilder();
query.select("costcenter", false);
Man konnte entweder ein string oder ein Array von string-Werten übergeben. Nachteil hier war jedoch, dass die Datentypen der Spalten nicht definiert werden konnten.
select - Neue Logik
In der neuen Logik stehen verschiedene Möglichkeiten zur Verfügung, um die ausgewählten Spalten zu definieren. Die Datentypen der Spalten müssen nun zwingend definiert werden.
Übergabe als Array
const { SelectBuilder } = require("ou.sp.SelectBuilder");
const query = SelectBuilder
.from("costcenter")
.select([
{ name: "costcenter", type: "string" },
{ name: "costcenterName", type: "string" }
]);
Übergabe als String
const query = SelectBuilder
.from("costcenter")
.select("costcenter", "string")
.select("costcenterName", "string")
Übergabe als Objekt
const query = SelectBuilder
.from("costcenter")
.select({
name: "costcenter",
type: "string"
});
Übergabe als Objekt mit Alias
const query = SelectBuilder
.from("costcenter")
.select({
name: "costcenter",
type: "string",
alias: "cc"
});
aggregate
Die Funktion aggregate der QueryBuilder-Klasse wurde verwendet, um die Aggregatfunktionen der Datenbankabfrage zu definieren.
Beispielabfrage über die "id"-Spalte mit der Aggregatsfunktion "MAX" und dem Alias "ID".
aggregate - Bisherige Logik
const builder = QueryBuilder.from("costcenter").aggregate("MAX", "id", "ID", false);
aggregate - Neue Logik
const query = SelectBuilder.from("costcenter", db).aggregate("MAX", "id", "ID");
Die Aggregatfunktionen wird auch im IntelliSense in VSCode bei execute berücksichtigt.
count
Die Funktion count der QueryBuilder-Klasse wurde verwendet, um die COUNT-Aggregatfunktionen der Datenbankabfrage zu definieren.
count - Bisherige Logik
const builder = QueryBuilder.from("costcenter").count("id", false);
// Ein Alias konnte nicht definiert werden.
count - Neue Logik
// Ohne Alias
const query = SelectBuilder.from("costcenter", db).count("id");
// Mit Alias
const query = SelectBuilder.from("costcenter", db).count("id", "count");
Die count()-Funktion wird auch im IntelliSense in VSCode bei execute berücksichtigt.
const rows = SelectBuilder.from("costcenter", db).count("id", "count").execute();
context.returnValue = rows.length > 0 ? rows[0].count : 0;
where
Die Funktion where der QueryBuilder-Klasse wurde verwendet, um die Bedingungen der Datenbankabfrage zu definieren.
where - Bisherige Logik
const builder = new QueryBuilder("costcenter");
builder.select("costcenterName").where("costcenter IS NOT NULL AND costcenter <> ''");
where - Neue Logik
In der neuen Logik stehen verschiedene Möglichkeiten zur Verfügung, um die Bedingungen der Datenbankabfrage zu definieren.
const query = SelectBuilder
.from("customer", db)
.where("costcenter IS NOT NULL")
.where("AND costcenter <> ''");
andWhere Bedingung
Mit der andWhere-Funktion kann man sich das AND sparen.
const dbUser = util.getEnvironment("OUSP_DATABASE_USER");
const dbPassword = util.getEnvironment("OUSP_DATABASE_PASSWORD");
const db = new DBConnection("odbc", "ousp", dbUser, dbPassword);
const query = SelectBuilder
.from("customer", db)
.andWhere("recipient = 'K10000'")
.andWhere("costcenter like '%Einkauf%'")
.toSQL();
// SELECT * FROM costcenter WHERE recipient = 'K10000' AND (costcenter like '%Einkauf%')
orWhere Bedingung
Mit der orWhere-Function kann man sich ein OR sparen.
const dbUser = util.getEnvironment("OUSP_DATABASE_USER");
const dbPassword = util.getEnvironment("OUSP_DATABASE_PASSWORD");
const db = new DBConnection("odbc", "ousp", dbUser, dbPassword);
const query = SelectBuilder
.from("customer", db)
.orWhere("costcenter like '%Einkauf%'")
.orWhere("costcenterName like '%Einkauf%'")
.toSQL();
// SELECT * FROM costcenter WHERE costcenter like '%Einkauf%' OR (costcenterName like '%Einkauf%')
Bei Verwendung von andWhere und orWhere werden die Bedingungen ab der zweiten Verwendung in Klammern gesetzt!
💡Neue Funktionen in SelectBuilder
distinct
Die distinct Funktion der SelectBuilder-Klasse ermöglicht es, die doppelten Zeilen der Datenbankabfrage zu entfernen.
const dbUser = util.getEnvironment("OUSP_DATABASE_USER");
const dbPassword = util.getEnvironment("OUSP_DATABASE_PASSWORD");
const db = new DBConnection("odbc", "ousp", dbUser, dbPassword);
const output = SelectBuilder.from("costcenter", db).distinct().toSQL();
// SELECT DISTINTCT * FROM costcenter
limit
Die limit Funktion der SelectBuilder-Klasse begrenzt die Anzahl der zurückgegebenen Zeilen der Datenbankabfrage.
Eine ausführliche Doku ist hier zu finden.
offset
Die offset Funktion der SelectBuilder-Klasse ermöglicht es, den Offset der zurückgegebenen Zeilen in der Datenbankabfrage zu definieren.
Eine ausführliche Doku ist hier zu finden.
toDBResultSet
Mit der toDBResultSet Funktion wird die Datenbankabfrage ausgeführt und ein DBResultSet-Objekt zurückgegeben.
const dbUser = util.getEnvironment("OUSP_DATABASE_USER");
const dbPassword = util.getEnvironment("OUSP_DATABASE_PASSWORD");
const db = new DBConnection("odbc", "ousp", dbUser, dbPassword);
const dbResultSet = SelectBuilder.from("costcenter", db).select("costcenter", "string").toDBResultSet();
dbResultSet.next();
dbResultSet.getString(0);
use
Die use Funktion ist eine Helfer-Funktion, die es ermöglicht, die DBConnection-Instanz zu übergeben.
const dbUser = util.getEnvironment("OUSP_DATABASE_USER");
const dbPassword = util.getEnvironment("OUSP_DATABASE_PASSWORD");
const db = new DBConnection("odbc", "ousp", dbUser, dbPassword);
const query = SelectBuilder
.from("costcenter")
.use(db, "mssql")
.execute();
Macht das gleiche wie:
const dbUser = util.getEnvironment("OUSP_DATABASE_USER");
const dbPassword = util.getEnvironment("OUSP_DATABASE_PASSWORD");
const db = new DBConnection("odbc", "ousp", dbUser, dbPassword);
const query = SelectBuilder
.from("costcenter", db, "mssql")
.execute();
Die use-Funktion kann weggelassen werden, wenn die DBConnection in der from-Funktion übergeben wurde.
Unveränderte Funktionen
Folgende Funktionen der QueryBuilder-Klasse wurden nicht verändert und können weiterhin in der SelectBuilder-Klasse verwendet werden:
toSQL/toStringjoinorderBygroupByhaving