Avvii un progetto

SQLQueries nel Service Layer di SAP B1: come eseguire SQL e risolvere gli errori 701, 703, 402 e -2028

By Zain Abbas, Kodenova · Updated

Short answerSQLQueries le permette di salvare un'istruzione SELECT in SAP Business One e di eseguirla tramite il Service Layer. Invii la query con POST a /SQLQueries con SqlCode, SqlName e SqlText, poi chiami /SQLQueries('code')/List con un ParamList. L'errore 701 indica di solito una sintassi non valida, ad esempio un parametro chiamato :from, che entra in conflitto con la parola chiave FROM. L'errore -2028 significa che la query salvata non è stata trovata: la ricrei e riprovi.

Perché esiste SQLQueries

Il Service Layer espone oggetti di business come Orders e Invoices. Va benissimo per creare documenti, ma la reportistica ha bisogno di join e raggruppamenti su molte righe. Scaricare ogni riga di fattura tramite OData e raggrupparla nella propria applicazione è lento.

SQLQueries risolve il problema. Salva una volta un’istruzione SELECT in SAP Business One e poi la esegue via HTTPS ogni volta che serve. La usiamo nella dashboard SAP B1 di Kodenova per leggere un anno di vendite con poche chiamate.

Passo 1: salvare la query

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"
}

Una chiamata riuscita restituisce 201 Created. SqlCode è la chiave che richiamerà in seguito, quindi lo tenga breve e stabile.

Passo 2: eseguirla con List

POST https://your-b1-server:50000/b1s/v1/SQLQueries('KN_SALES_01')/List
Content-Type: application/json

{ "ParamList": "dfrom='2025-01-01'" }

La risposta contiene un array value con le righe. I risultati di grandi dimensioni arrivano a pagine: segua odata.nextLink (v1) o @odata.nextLink (v2) finché non scompare.

Più parametri si uniscono con &:

{ "ParamList": "dfrom='2025-01-01'&card='C0001'" }

Errore 701: sintassi SQL non valida

Un messaggio tipico è questo:

[701] Invalid SQL syntax:, line 1, character position 280,
no viable alternative at input 'T0."DocDate" >= :from'

Questo errore ci è costato un pomeriggio. L’SQL era valido, ma il parametro si chiamava :from. Il parser lo leggeva come la parola chiave FROM. Rinominarlo in :dfrom ha risolto subito.

Altre cause dell’errore 701:

  • Usare la sintassi di SQL Server su una società HANA, o viceversa. Metta gli identificatori tra virgolette doppie e rispetti il dialetto del database.
  • Espressioni che l’allow-list non accetta, come alcuni CASE o alcune chiamate di funzione. Selezioni le colonne così come sono e faccia i calcoli nella sua applicazione.
  • Un punto e virgola finale o un commento dentro SqlText.

Errore -2028: nessun record corrispondente

Chiama SQLQueries('KN_SALES_01')/List e riceve -2028. La query non esiste in quella società. Le cause più comuni:

  • Il database della società è stato ripristinato o copiato senza le query salvate.
  • Qualcuno ha eliminato la query, oppure un’altra applicazione ha usato lo stesso SqlCode.
  • Ha effettuato l’accesso a una società diversa da quella in cui ha salvato la query.

Un’integrazione robusta gestisce il caso da sola: in caso di -2028 invia di nuovo la query con POST, poi riprova List una volta. Per -2028 e gli altri codici comuni al di fuori di SQLQueries, veda i codici di errore della DI API di SAP B1. Noi assegniamo i codici con un breve hash del testo SQL, così una query modificata riceve un nuovo codice e non esegue mai un SQL obsoleto.

Allow-list e autorizzazioni

SQLQueries non esegue qualsiasi SQL su qualsiasi tabella. Confronta l’istruzione con un elenco di tabelle consentite (allow-list) sul server del Service Layer. Se una tabella non è consentita, la chiamata fallisce anche se l’SQL è corretto. Chieda al suo amministratore SAP di verificare l’allow-list prima di progettare il report attorno a una tabella bloccata.

L’utente ha inoltre bisogno di due autorizzazioni:

  • Modify SQL Queries in Service Layer: per creare, modificare ed eliminare query.
  • Service Layer SQL Query: per eseguire una query specifica.

Altri errori di SQLQueries: 703, 402 e funzioni non supportate

Errore 703: la colonna non esiste (alias in ORDER BY)

Una query che somma RDR1."Quantity" AS Q e termina con ORDER BY Q DESC restituisce:

703 Column 'Q' from table 'RDR1' not exist

Il problema è stato segnalato su SAP B1 10.0 SP2402, anche per query più semplici: SQLQueries interpreta l’alias in ORDER BY come una colonna della tabella. Non abbiamo trovato una correzione confermata da SAP, quindi non ordini per alias. Ordini le righe nella sua applicazione.

Errore 402: configurazione errata nel file b1s_sqltable.conf

b1s_sqltable.conf è l’elenco delle tabelle consentite di SQLQueries, e l’errore 402 significa che il file è danneggiato. Su Windows si trova in %ProgramFiles%\SAP\SAP Business One ServerTools\ServiceLayer\Conf\, su Linux in /usr/sap/SAPBusinessOne/ServiceLayer/conf/. La soluzione indicata su SAP Community, che cita la SAP Note 3064927:

  1. Rinomini b1s_sqltable.conf in b1s_sqltable_backup.conf.
  2. Apra b1s_sqltable.template.conf e lo salvi come b1s_sqltable.conf.
  3. Riavvii il Service Layer.
  4. Aggiunga di nuovo all’elenco le tabelle aggiuntive che le servono.

Espressioni e funzioni non supportate (701)

SQLQueries accetta un sottoinsieme limitato di SQL. Il blog introduttivo di SAP elenca join, GROUP BY, ORDER BY, LIKE e funzioni come sum, avg, max, min, left, right, distinct, count, lower, upper, isnull e ifnull. Ciò che è fuori da questo sottoinsieme fallisce con 701:

  • UNION / UNION ALL: Incorrect syntax near 'union'. Esegua due query e unisca le righe nella sua applicazione.
  • Aritmetica nell’elenco di selezione: mismatched input '-' expecting FROM. Selezioni le colonne così come sono e calcoli nella sua applicazione.
  • Altre funzioni: Cannot support this function or expression: 'DAYS_BETWEEN'.

Le tabelle UDT e UDO sono supportate dalla 10.0 FP 2102. Le tabelle di log e SBO-COMMON non lo sono.

Errore 502 (proxy error) su List

Un 502 da SQLQueries List non dipende sempre dalle dimensioni. In un caso su SAP Community la causa era un testo in cirillico nel risultato, documentato nella SAP Note 3029055 e corretto in un feature pack successivo. Per i risultati di grandi dimensioni, li suddivida sempre in pagine con l’intestazione Prefer: odata.maxpagesize, come mostrato nella paginazione lato server della nostra guida al Service Layer.

Lista di controllo

  1. Mantenga SqlText semplice: colonne così come sono, join, WHERE e GROUP BY.
  2. Non dia mai a un parametro il nome di una parola chiave SQL.
  3. Gestisca -2028 ricreando la query e riprovando una volta.
  4. Niente UNION, aritmetica o alias in ORDER BY dentro SqlText (701 / 703); in caso di 402, ricostruisca b1s_sqltable.conf dal modello.
  5. Segua nextLink finché non ha letto tutte le pagine.
  6. Riconcili i totali con SAP almeno una volta. I totali di riga ignorano lo sconto di documento, come spieghiamo in perché i report vendite di SAP B1 non quadrano.

Le serve un report o un’integrazione basata su SQLQueries? Consulti la nostra guida al Service Layer oppure ci contatti.

Sources

Related services

FAQ

Frequently asked questions

Perché :from non funziona mentre :dfrom sì?

Nei nostri test il parser SQL ha interpretato :from come la parola chiave FROM e ha restituito l'errore 701, 'no viable alternative at input'. Rinominare il parametro in :dfrom ha risolto il problema. Eviti nomi di parametri che coincidono con parole chiave SQL, come from, to, date, order o select.

Che cosa significa l'errore -2028 su SQLQueries List?

Significa 'No matching records found' (nessun record corrispondente): il SqlCode richiamato non esiste in quella società. Succede dopo il ripristino di un database, la copia di una società o quando un altro strumento ha eliminato la query. Ricrei la query e richiami List.

Quali tabelle può leggere SQLQueries?

Solo le tabelle presenti nell'elenco delle tabelle consentite (allow-list) del Service Layer. Le tabelle più comuni di documenti e anagrafiche sono di solito consentite, mentre alcune tabelle di sistema e contabili possono essere bloccate. Se una query restituisce un errore di autorizzazione per una tabella, verifichi la configurazione dell'allow-list sul server del Service Layer.

Posso usare CASE, CAST o funzioni sulle date?

SQLQueries accetta solo un sottoinsieme limitato di SQL. Nei progetti su cui abbiamo lavorato, espressioni come CASE e alcune funzioni sono state rifiutate. Mantenga l'SQL semplice, selezioni le colonne così come sono e faccia i calcoli nella sua applicazione.

Di quali autorizzazioni ha bisogno l'utente?

Per creare o modificare query l'utente ha bisogno dell'autorizzazione completa per 'Modify SQL Queries in Service Layer'. Per eseguire una query ha bisogno dell'autorizzazione per quella query in 'Service Layer SQL Query'.

Che cosa significa l'errore 402 Bad configuration in file b1s_sqltable.conf?

Il file con l'elenco delle tabelle consentite del Service Layer è danneggiato. Nella cartella Conf del Service Layer rinomini b1s_sqltable.conf come copia di sicurezza, salvi b1s_sqltable.template.conf come nuovo b1s_sqltable.conf, riavvii il Service Layer e aggiunga di nuovo le tabelle aggiuntive che le servono.

Iniziamo?

Ci descriva di cosa ha bisogno. Riceverà una risposta tecnica chiara, un perimetro definito e un prezzo, di norma entro 24 ore.