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