SAP B1 Service Layer SQLQueries: SQL ausführen und die Fehler 701, 703, 402 und -2028 beheben
Von Zain Abbas, Kodenova · Aktualisiert am
Wozu es SQLQueries gibt
Der Service Layer stellt Geschäftsobjekte wie Orders und Invoices bereit. Zum Anlegen von Belegen reicht das, für Berichte brauchen Sie aber Joins und Gruppierungen über viele Zeilen. Jede Rechnungsposition per OData abzurufen und erst in der eigenen Anwendung zu gruppieren, ist langsam.
Genau hier hilft SQLQueries. Sie speichern eine SELECT-Anweisung einmal in SAP Business One und führen sie danach jederzeit über HTTPS aus. Im Kodenova SAP-B1-Dashboard lesen wir so den Umsatz eines ganzen Jahres mit wenigen Aufrufen.
Schritt 1: Abfrage speichern
POST https://your-b1-server:50000/b1s/v1/SQLQueries
Content-Type: application/json
{
"SqlCode": "KN_SALES_01",
"SqlName": "Sales lines since a date",
"SqlText": "SELECT T0.\"DocEntry\", T0.\"DocDate\", T0.\"CardCode\", T1.\"ItemCode\", T1.\"LineTotal\" FROM OINV T0 INNER JOIN INV1 T1 ON T0.\"DocEntry\" = T1.\"DocEntry\" WHERE T0.\"CANCELED\" = 'N' AND T0.\"DocDate\" >= :dfrom"
}
Ein erfolgreicher Aufruf liefert 201 Created. SqlCode ist der Schlüssel, über den Sie die Abfrage später aufrufen. Halten Sie ihn also kurz und unveränderlich.
Schritt 2: Mit List ausführen
POST https://your-b1-server:50000/b1s/v1/SQLQueries('KN_SALES_01')/List
Content-Type: application/json
{ "ParamList": "dfrom='2025-01-01'" }
Die Antwort enthält ein Array value mit Ihren Zeilen. Große Ergebnisse kommen seitenweise: Folgen Sie odata.nextLink (v1) bzw. @odata.nextLink (v2), bis der Link nicht mehr erscheint.
Mehrere Parameter verbinden Sie mit &:
{ "ParamList": "dfrom='2025-01-01'&card='C0001'" }
Fehler 701: ungültige SQL-Syntax
Eine typische Meldung sieht so aus:
[701] Invalid SQL syntax:, line 1, character position 280,
no viable alternative at input 'T0."DocDate" >= :from'
Dieser Fehler hat uns einen ganzen Nachmittag gekostet. Das SQL war korrekt, aber der Parameter hieß :from. Der Parser las ihn als Schlüsselwort FROM. Nach dem Umbenennen in :dfrom lief die Abfrage sofort.
Weitere Ursachen für 701:
- SQL-Server-Syntax in einem HANA-Mandanten oder umgekehrt. Setzen Sie Bezeichner in doppelte Anführungszeichen und halten Sie sich an den Dialekt der Datenbank.
- Ausdrücke, die die Allow-List nicht akzeptiert, etwa bestimmte
CASE-Ausdrücke oder Funktionsaufrufe. Lesen Sie die Rohspalten und rechnen Sie in Ihrer Anwendung. - Ein abschließendes Semikolon oder ein Kommentar in
SqlText.
Fehler -2028: keine passenden Datensätze gefunden
Sie rufen SQLQueries('KN_SALES_01')/List auf und erhalten -2028. Die Abfrage existiert in diesem Mandanten nicht. Häufige Gründe:
- Die Mandantendatenbank wurde ohne Ihre gespeicherten Abfragen wiederhergestellt oder kopiert.
- Jemand hat die Abfrage gelöscht, oder eine andere Anwendung hat denselben
SqlCodeverwendet. - Sie haben sich an einem anderen Mandanten angemeldet als dem, in dem Sie die Abfrage gespeichert haben.
Eine robuste Integration fängt das selbst ab: Bei -2028 sendet sie die Abfrage erneut per POST und wiederholt List genau einmal. Zu -2028 und den anderen häufigen Codes außerhalb von SQLQueries siehe SAP B1 DI API Fehlercodes. Wir bilden unsere Codes aus einem kurzen Hash des SQL-Texts. So erhält eine geänderte Abfrage einen neuen Code und führt nie veraltetes SQL aus.
Allow-List und Berechtigungen
SQLQueries führt nicht beliebiges SQL auf beliebigen Tabellen aus. Die Anweisung wird gegen eine Allow-List auf dem Service-Layer-Server geprüft. Ist eine Tabelle nicht freigegeben, scheitert der Aufruf, obwohl das SQL korrekt ist. Lassen Sie Ihren SAP-Administrator die Allow-List prüfen, bevor Sie einen Bericht um eine gesperrte Tabelle herum konzipieren.
Der Benutzer braucht außerdem zwei Berechtigungen:
- Modify SQL Queries in Service Layer: zum Anlegen, Ändern und Löschen von Abfragen.
- Service Layer SQL Query: zum Ausführen einer bestimmten Abfrage.
Weitere SQLQueries-Fehler: 703, 402 und nicht unterstützte Funktionen
Fehler 703: Spalte existiert nicht (Alias in ORDER BY)
Eine Abfrage, die RDR1."Quantity" AS Q summiert und mit ORDER BY Q DESC endet, liefert:
703 Column 'Q' from table 'RDR1' not exist
Gemeldet wurde das für SAP B1 10.0 SP2402, auch bei einfacheren Abfragen: SQLQueries liest den Alias in ORDER BY als Spalte der Tabelle. Eine von SAP bestätigte Lösung haben wir nicht gefunden. Sortieren Sie deshalb nicht nach einem Alias, sondern sortieren Sie die Zeilen in Ihrer Anwendung.
Fehler 402: bad configuration in file b1s_sqltable.conf
b1s_sqltable.conf ist die Tabellen-Allow-List von SQLQueries, und Fehler 402 bedeutet, dass diese Datei beschädigt ist. Unter Windows liegt sie in %ProgramFiles%\SAP\SAP Business One ServerTools\ServiceLayer\Conf\, unter Linux in /usr/sap/SAPBusinessOne/ServiceLayer/conf/. Die auf SAP Community genannte Lösung unter Verweis auf SAP Note 3064927:
- Benennen Sie
b1s_sqltable.confinb1s_sqltable_backup.confum. - Öffnen Sie
b1s_sqltable.template.confund speichern Sie sie alsb1s_sqltable.conf. - Starten Sie den Service Layer neu.
- Tragen Sie die zusätzlich benötigten Tabellen wieder in die Tabellenliste ein.
Nicht unterstützte Ausdrücke und Funktionen (701)
SQLQueries akzeptiert nur einen eingeschränkten SQL-Umfang. Der Einführungsblog von SAP nennt Joins, GROUP BY, ORDER BY, LIKE sowie Funktionen wie sum, avg, max, min, left, right, distinct, count, lower, upper, isnull und ifnull. Alles außerhalb dieses Umfangs scheitert mit 701:
- UNION / UNION ALL:
Incorrect syntax near 'union'. Führen Sie zwei Abfragen aus und führen Sie die Zeilen in Ihrer Anwendung zusammen. - Berechnungen in der Select-Liste:
mismatched input '-' expecting FROM. Lesen Sie die Rohspalten und rechnen Sie in Ihrer Anwendung. - Andere Funktionen:
Cannot support this function or expression: 'DAYS_BETWEEN'.
UDT- und UDO-Tabellen werden ab 10.0 FP 2102 unterstützt. Protokolltabellen und SBO-COMMON werden nicht unterstützt.
Fehler 502 Proxy Error bei List
Ein 502 von SQLQueries List hat nicht immer mit der Ergebnisgröße zu tun. In einem Fall auf SAP Community war kyrillischer Text im Ergebnis die Ursache, dokumentiert in SAP Note 3029055 und in einem späteren Feature Pack behoben. Große Ergebnisse sollten Sie immer mit dem Header Prefer: odata.maxpagesize seitenweise abrufen, wie im Abschnitt zum serverseitigen Paging in unserem Service-Layer-Leitfaden gezeigt.
Checkliste
- Halten Sie
SqlTexteinfach: Rohspalten, Joins, WHERE und GROUP BY. - Benennen Sie einen Parameter nie nach einem SQL-Schlüsselwort.
- Fangen Sie -2028 ab, indem Sie die Abfrage neu anlegen und einmal wiederholen.
- Kein UNION, keine Berechnungen und kein Alias in ORDER BY in SqlText (701 / 703); bei 402 bauen Sie b1s_sqltable.conf aus der Vorlage neu auf.
- Folgen Sie dem nextLink, bis alle Seiten gelesen sind.
- Gleichen Sie die Summen einmal mit SAP ab. Positionssummen berücksichtigen den Belegrabatt nicht. Warum, erklären wir in Warum SAP-B1-Umsatzberichte nicht übereinstimmen.
Sie brauchen einen Bericht oder eine Integration auf Basis von SQLQueries? Lesen Sie unseren Service-Layer-Leitfaden oder kontaktieren Sie uns.
Quellen
- SAP Learning: Managing SQL Queries Using Service Layer API
- SAP Community: New SAP Business One Service Layer SQL Query
- SAP Community: Service Layer SQL Query 502 proxy error when retrieving
- SAP Community: Can't use alias in a Service Layer SQLQueries ORDER BY clause (error 703)
- SAP Community: SQL queries with Service Layer returns error code 402
- SAP Community: Incorrect syntax near UNION (SQLQueries)
Passende Leistungen
Häufige Fragen
Warum scheitert :from, während :dfrom funktioniert?
In unseren Tests hat der SQL-Parser :from als Schlüsselwort FROM interpretiert und den Fehler 701 'no viable alternative at input' zurückgegeben. Nach dem Umbenennen des Parameters in :dfrom war das Problem behoben. Vermeiden Sie Parameternamen, die SQL-Schlüsselwörtern entsprechen, etwa from, to, date, order oder select.
Was bedeutet Fehler -2028 bei SQLQueries List?
Er bedeutet 'No matching records found': Den aufgerufenen SqlCode gibt es in diesem Mandanten nicht. Das passiert nach einer Datenbankwiederherstellung, nach dem Kopieren eines Mandanten oder wenn ein anderes Tool die Abfrage gelöscht hat. Legen Sie die Abfrage neu an und rufen Sie List erneut auf.
Welche Tabellen kann SQLQueries lesen?
Nur Tabellen, die auf der Allow-List des Service Layers stehen. Gängige Beleg- und Stammdatentabellen sind in der Regel freigegeben, einige System- und Finanztabellen können dagegen gesperrt sein. Liefert eine Abfrage für eine Tabelle einen Berechtigungsfehler, prüfen Sie die Konfiguration der Allow-List auf dem Service-Layer-Server.
Kann ich CASE, CAST oder Datumsfunktionen verwenden?
SQLQueries akzeptiert nur einen eingeschränkten SQL-Umfang. In Projekten, an denen wir gearbeitet haben, wurden Ausdrücke wie CASE und einige Funktionen abgelehnt. Halten Sie das SQL einfach, lesen Sie die Rohspalten und rechnen Sie in Ihrer Anwendung.
Welche Berechtigungen braucht der Benutzer?
Zum Anlegen oder Ändern von Abfragen braucht der Benutzer die volle Berechtigung für 'Modify SQL Queries in Service Layer'. Zum Ausführen einer Abfrage braucht er die Berechtigung für diese Abfrage unter 'Service Layer SQL Query'.
Was bedeutet Fehler 402 Bad configuration in file b1s_sqltable.conf?
Die Datei mit der Tabellen-Allow-List des Service Layers ist beschädigt. Benennen Sie im Ordner Conf des Service Layers die Datei b1s_sqltable.conf als Sicherung um, speichern Sie b1s_sqltable.template.conf als neue b1s_sqltable.conf, starten Sie den Service Layer neu und tragen Sie die zusätzlich benötigten Tabellen wieder ein.
Bereit für den Start?
Sagen Sie uns, was Sie brauchen. Sie erhalten eine klare technische Antwort, einen festen Leistungsumfang und einen Preis, in der Regel innerhalb von 24 Stunden.
