Zum Hauptinhalt springen

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");
Tip

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");
Tip

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%')
Wichtig!

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();
hinweis

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 / toString
  • join
  • orderBy
  • groupBy
  • having