SQLQueries en el Service Layer de SAP B1: cómo ejecutar SQL y corregir los errores 701, 703, 402 y -2028

Por Zain Abbas, Kodenova · Actualizado el

Respuesta cortaSQLQueries le permite guardar una sentencia SELECT en SAP Business One y ejecutarla a través del Service Layer. Envíe la consulta con POST a /SQLQueries con SqlCode, SqlName y SqlText, y luego llame a /SQLQueries('code')/List con un ParamList. El error 701 suele indicar una sintaxis no válida, como un parámetro llamado :from, que choca con la palabra clave FROM. El error -2028 significa que no se encontró la consulta guardada; vuelva a crearla y reintente.

Por qué existe SQLQueries

El Service Layer expone objetos de negocio como Orders e Invoices. Eso funciona bien para crear documentos, pero los reportes necesitan uniones (joins) y agrupaciones sobre muchas filas. Traer cada línea de factura por OData y agruparla en su aplicación es lento.

SQLQueries resuelve esto. Usted guarda una sentencia SELECT en SAP Business One una sola vez y luego la ejecuta por HTTPS siempre que la necesite. Nosotros lo usamos en el dashboard de SAP B1 de Kodenova para leer un año de ventas en unas pocas llamadas.

Paso 1: guardar la consulta

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 llamada correcta devuelve 201 Created. SqlCode es la clave con la que la llamará después, así que manténgala corta y estable.

Paso 2: ejecutarla 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 respuesta contiene un arreglo value con sus filas. Los resultados grandes llegan paginados: siga odata.nextLink (v1) o @odata.nextLink (v2) hasta que desaparezca.

Varios parámetros se unen con &:

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

Error 701: sintaxis SQL no válida

Un mensaje típico se ve así:

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

Este nos costó una tarde. El SQL era válido, pero el parámetro se llamaba :from. El analizador lo leyó como la palabra clave FROM. Renombrarlo a :dfrom lo solucionó de inmediato.

Otras causas del error 701:

  • Usar sintaxis de SQL Server en una sociedad HANA, o al revés. Ponga los identificadores entre comillas dobles y respete el dialecto de la base de datos.
  • Expresiones que la lista de permitidas no acepta, como algunas llamadas a CASE o a funciones. Seleccione columnas sin transformar y calcule en su aplicación.
  • Un punto y coma final o un comentario dentro de SqlText.

Error -2028: no se encontraron registros coincidentes

Llama a SQLQueries('KN_SALES_01')/List y obtiene -2028. La consulta no está en esa sociedad. Motivos comunes:

  • La base de datos de la sociedad se restauró o copió sin sus consultas guardadas.
  • Alguien eliminó la consulta, u otra aplicación usó el mismo SqlCode.
  • Inició sesión en una sociedad distinta de aquella en la que guardó la consulta.

Una integración robusta lo resuelve sola: ante un -2028, vuelve a enviar la consulta con POST y reintenta List una vez. Para el -2028 y los demás códigos comunes fuera de SQLQueries, consulte códigos de error de la DI API de SAP B1. Nosotros nombramos los códigos con un hash corto del texto SQL, de modo que una consulta modificada recibe un código nuevo y nunca ejecuta SQL desactualizado.

Lista de permitidas y permisos

SQLQueries no ejecuta cualquier SQL sobre cualquier tabla. Comprueba la sentencia contra una lista de permitidas en el servidor del Service Layer. Si una tabla no está permitida, la llamada falla aunque el SQL sea correcto. Pida a su administrador de SAP que revise la lista de permitidas antes de diseñar el reporte en torno a una tabla bloqueada.

El usuario también necesita dos autorizaciones:

  • Modify SQL Queries in Service Layer: para crear, modificar y eliminar consultas.
  • Service Layer SQL Query: para ejecutar una consulta concreta.

Otros errores de SQLQueries: 703, 402 y funciones no admitidas

Error 703: la columna no existe (alias en ORDER BY)

Una consulta que suma RDR1."Quantity" AS Q y termina con ORDER BY Q DESC devuelve:

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

Esto se reportó en SAP B1 10.0 SP2402, también con consultas más simples: SQLQueries lee el alias del ORDER BY como si fuera una columna de la tabla. No hemos encontrado una solución confirmada por SAP, así que no ordene por un alias. Ordene las filas en su aplicación.

Error 402: bad configuration in file b1s_sqltable.conf

b1s_sqltable.conf es la lista de tablas permitidas de SQLQueries, y el error 402 significa que el archivo está dañado. En Windows se encuentra en %ProgramFiles%\SAP\SAP Business One ServerTools\ServiceLayer\Conf\ y en Linux en /usr/sap/SAPBusinessOne/ServiceLayer/conf/. La solución publicada en SAP Community, citando la SAP Note 3064927:

  1. Renombre b1s_sqltable.conf a b1s_sqltable_backup.conf.
  2. Abra b1s_sqltable.template.conf y guárdelo como b1s_sqltable.conf.
  3. Reinicie el Service Layer.
  4. Vuelva a añadir a la lista de tablas las tablas adicionales que necesite.

Expresiones y funciones no admitidas (701)

SQLQueries acepta un subconjunto limitado de SQL. El blog de presentación de SAP enumera joins, GROUP BY, ORDER BY, LIKE y funciones como sum, avg, max, min, left, right, distinct, count, lower, upper, isnull e ifnull. Lo que queda fuera de ese subconjunto falla con el error 701:

  • UNION / UNION ALL: Incorrect syntax near 'union'. Ejecute dos consultas y combine las filas en su aplicación.
  • Aritmética en la lista de selección: mismatched input '-' expecting FROM. Seleccione las columnas sin transformar y calcule en su aplicación.
  • Otras funciones: Cannot support this function or expression: 'DAYS_BETWEEN'.

Las tablas UDT y UDO se admiten desde la versión 10.0 FP 2102. Las tablas de log y SBO-COMMON no.

Error 502 proxy error en List

Un 502 de SQLQueries List no siempre se debe al tamaño. En un caso de SAP Community, la causa era texto en cirílico en el resultado, documentado en la SAP Note 3029055 y corregido en un feature pack posterior. Para resultados grandes, pagínelos siempre con el encabezado Prefer: odata.maxpagesize, como se muestra en la paginación controlada por el servidor de nuestra guía del Service Layer.

Lista de verificación

  1. Mantenga SqlText simple: columnas sin transformar, joins, WHERE y GROUP BY.
  2. Nunca nombre un parámetro como una palabra clave de SQL.
  3. Gestione el -2028 volviendo a crear la consulta y reintentando una vez.
  4. Nada de UNION, aritmética ni alias en ORDER BY dentro de SqlText (701 / 703); ante un 402, reconstruya b1s_sqltable.conf a partir de la plantilla.
  5. Siga nextLink hasta leer todas las páginas.
  6. Concilie los totales con SAP una vez. Los totales de línea ignoran el descuento del documento, algo que explicamos en por qué no cuadran los reportes de ventas de SAP B1.

¿Necesita un reporte o una integración basados en SQLQueries? Consulte nuestra guía del Service Layer o contáctenos.

Fuentes

Servicios relacionados

Preguntas frecuentes

Preguntas frecuentes

¿Por qué :from falla pero :dfrom funciona?

En nuestras pruebas, el analizador SQL interpretó :from como la palabra clave FROM y devolvió el error 701, 'no viable alternative at input'. Renombrar el parámetro a :dfrom lo solucionó. Evite nombres de parámetros que coincidan con palabras clave de SQL, como from, to, date, order o select.

¿Qué significa el error -2028 en SQLQueries List?

Significa 'No matching records found' (no se encontraron registros coincidentes): el SqlCode que llamó no existe en esa sociedad. Ocurre tras restaurar una base de datos, copiar una sociedad o cuando otra herramienta eliminó la consulta. Vuelva a crear la consulta y llame de nuevo a List.

¿Qué tablas puede leer SQLQueries?

Solo las tablas incluidas en la lista de permitidas (allow-list) del Service Layer. Las tablas habituales de documentos y datos maestros suelen estar permitidas, mientras que algunas tablas de sistema y de finanzas pueden estar bloqueadas. Si una consulta devuelve un error de permisos para una tabla, revise la configuración de la lista de permitidas en el servidor del Service Layer.

¿Puedo usar CASE, CAST o funciones de fecha?

SQLQueries acepta un subconjunto limitado de SQL. En los proyectos en los que hemos trabajado, expresiones como CASE y algunas funciones fueron rechazadas. Mantenga el SQL simple, seleccione columnas sin transformar y haga los cálculos en su aplicación.

¿Qué permisos necesita el usuario?

Para crear o modificar consultas, el usuario necesita autorización total para 'Modify SQL Queries in Service Layer'. Para ejecutar una consulta, necesita autorización para esa consulta en 'Service Layer SQL Query'.

¿Qué significa el error 402 Bad configuration in file b1s_sqltable.conf?

El archivo de la lista de tablas permitidas del Service Layer está dañado. En la carpeta Conf del Service Layer, renombre b1s_sqltable.conf como copia de seguridad, guarde b1s_sqltable.template.conf como un nuevo b1s_sqltable.conf, reinicie el Service Layer y vuelva a añadir las tablas adicionales que necesite.

¿Listo para empezar?

Cuéntenos lo que necesita. Recibirá una respuesta técnica clara, un alcance definido y un precio fijo, normalmente en 24 horas.