Guía de la Capa de Servicio SAP B1
Guía de la Capa de Servicio SAP B1
Manual de PÚBLICO
Usuario SAP Business One 9.1, 9.2, 9.3 y 10.0, versión para SAP HANA;
SAP Business One 10.0 PL01 y posterior
Versión del documento: 1.23 – 20220222
Trabajar con la capa de servicio de SAP Business One
Todos los países
Machine Translated by Google
Convenciones tipográficas
Estilo de tipo Descripción
Ejemplo Palabras o caracteres citados de la pantalla. Estos incluyen nombres de campo, títulos de pantalla,
etiquetas de botones, nombres de menú, rutas de menú y opciones de menú.
Referencias cruzadas textuales a otros documentos.
Ejemplo Palabras o expresiones enfatizadas.
EJEMPLO Nombres técnicos de los objetos del sistema. Estos incluyen nombres de informes, nombres de
programas, códigos de transacciones, nombres de tablas y conceptos clave de un lenguaje de programación
cuando están rodeados por el texto del cuerpo, por ejemplo, SELECCIONAR e INCLUIR.
Ejemplo Salida en la pantalla. Esto incluye nombres de archivos y directorios y sus rutas, mensajes, nombres de
variables y parámetros, texto fuente y nombres de herramientas de instalación, actualización y base de datos.
Ejemplo Entrada exacta del usuario. Estas son palabras o caracteres que ingresas en el sistema exactamente como
aparecen en la documentación.
<Ejemplo> Entrada de usuario variable. Los corchetes angulares indican que reemplaza estas palabras y caracteres con
entradas apropiadas para hacer entradas en el sistema.
EJEMPLO Teclas del teclado, por ejemplo, F 2 o ENTER .
PÚBLICO Trabajar con la capa de servicio de SAP Business One
2 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Convenciones tipográficas
Machine Translated by Google
Historia del documento
• Configuración por solicitud • Opciones
de configuración (Schema, SessionTimeout)
• Esquemas definidos por el usuario
• Objetos definidos por el usuario
• Campos definidos por el usuario (gestión de metadatos) •
Recuperación de propiedades individuales •
Asociaciones y propiedades de navegación (Experimental)
• Metadatos para UDF/UDT/UDO
• Actualizaciones para objetos definidos por el usuario, campos definidos por el usuario y
mesas
• Admite $inlinecount en la consulta de OData • Agrega
los ejemplos de código para Service Layer versus DI API • Agrega las
limitaciones de Service Layer
Agregar un ejemplo de "Vista previa de un pedido" en Acciones •
Agregar Intercambio de recursos de origen cruzado (CORS)
• Agregar agregación
• Agregar archivos adjuntos
• Agregar imagen de
elemento • Agregar uso compartido de recursos de origen cruzado
• Admite consultas que no distinguen entre
mayúsculas y minúsculas • Admite consultas
con agrupación • Admite uniones
cruzadas • Admite encabezado de solicitud permitido en CORS
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Historia del documento © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 3
Machine Translated by Google
filtro de nivel de fila
Agregar controlador de configuración para la capa de servicio.
El controlador de configuración está disponible en la versión de SQL.
Actualice la herramienta JavaScript SDK Generator para el entorno de Microsoft
Windows.
Admite mecanismo ETag.
• Entidad única $expandir con $lista de selección •
Entidad de colección $expandir con $lista de selección
Agregue el monitor de registro del controlador de la capa de servicio.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
4 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Historia del documento
Machine Translated by Google
Tabla de contenido
1 Introducción................................................. .................................................... ......................... 10
1.1 Acerca de este documento ............................................... .................................................... ......................... 10
1.2 Público objetivo ................................................ .................................................... .......................... 10 1.3 Acerca
de la capa de servicio de SAP Business One ......... .................................................... ............................... 10
2 Empezando ................................................ .................................................... ..................... 11 Requisitos del
2.1 sistema .......................... .................................................... ............................................. 11 Descripción general
2.2 de la arquitectura . .................................................... .................................................... ..................... 11
2.3 Instalación de la capa de servicio de SAP Business One .................................. .......................................... 12
3 Consumir la capa de servicio de SAP Business One .................................. .......................... 14 Inicio y cierre de
3.1 sesión .................. .................................................... .................................................... ......... 15
3.1.1 Sesión ....................................... .................................................... ........................................ dieciséis
3.2 Inicio de sesión único (SSO) .................................... .................................................... .. .......................... 17 3.2.1
SSO a través de PAOS .............. . .................................................... . .................................................. ... .... 17
3.2.2 SSO a través de HTTPPOST ........................................... .................................................... ............... 19
3.3 Documento de metadatos ............................................... .................................................... ..........................20
3.4 Documento de servicio .................................................. .................................................... ............................. 22
3.5 Operaciones de creación/recuperación/actualización/eliminación (CRUD) .................................. .............................. 22
3.5.1 Creación de entidades .................. .................................................... .......................................... 23
3.5.2 Recuperación Entidades .................................................. .................................................... ............ 25
3.5.3 Actualización de entidades ............................... .................................................... ............................ 26
3.5.4 Eliminación de entidades ............... .................................................... ............................................. 27
3.5.5 Crear entidad con Sin contenido ................................................ .......................................... 27
3.6 Acciones ..... .................................................... .................................................... .......................................... 28
3.7 Opciones de consulta ............................................. .................................................... ..................................... 33 Obtener
3.7.1 todas las entidades ......... .................................................... .................................................... ........ 34
3.7.2 Obtener campos de una entidad .............................................. .................................................... ..........
34 3.7.3 Propiedades de Consulta del Tipo de Enumeración ............................... .......................................... 34
3.7.4 Propiedades de consulta del tipo de fecha y hora... .................................................... ........................
3.7.5 35 Propiedades de consulta del tipo de tiempo .................. .................................................... ...............
3.7.6 35 Paginar los pedidos seleccionados ............................... .................................................... ............
3.7.7 35 Agregación ....................................... .................................................... .................................... 36
3.7.8 Agrupación ............ .................................................... .................................................... ............... 41
3.7.9 Uniones cruzadas ............................... .................................................... .......................................... 43
3.7.10 Filtro de nivel de fila ........................................... .................................................... ......................50
3.7.11 Ampliar mejoras en la consulta ........................................... ............................................. 53 3.8 Exposición
de vista de capa semántica de SAP Business One .................................. ............................. 56 3.8.1 Despliegue de
vistas ................ .................................................... .......................................... 56 3.8 .2 Ver el alcance de la
exposición ....................................... .................................................... ........... 56 3.8.3 Ver la versión de OData de
exposición ............................... .................................................... ........... 57 3.8.4 Raíz del servicio de la capa
semántica ............................... .................................................... ............ 57 3.8.5 Metadatos del servicio de la
capa semántica ............................... .................................................... ..... 58 3.8.6 Autorización de vista de capa
semántica .................................. ............................................. 62
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Tabla de contenido © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 5
Machine Translated by Google
3.8.7 Consulta de vista de capa semántica ........................................... .................................................... .. 63 3.8.8 Exposición
de vistas personalizadas ....................................... .................................................... ... 70 3.8.9 Consulta de vistas
personalizadas .................................. .................................................... ......... 72 3.8.10 Autenticación básica de la capa
semántica .................................. ............................................. 72 3.9 Vista SQL
Exposición ................................................. .................................................... .......................... 73 Crear
3.9.1 vista ...................... .................................................... .................................................... .73
3.9.2 Vista expuesta ................................................ .................................................... ....................... 74 3.9.3 Ver punto
final de servicio .................. .................................................... .................................. 75 3.9.4 Vista de
consulta .......... .................................................... .................................................... ............. 77 Autorizar
3.9.5 vista .................................. .................................................... ....................................81
3.10 Operaciones por lotes ............................................... .................................................... .......................... 82 3.10.1 Método de
solicitud por lotes y URI ......... .................................................... ............................. 82 3.10.2 Encabezados de solicitud de
lote ................ .................................................... ....................................... 82 3.10.3 Cuerpo de solicitud de
lote .... .................................................... .................................................... ... 82 3.10.4 Conjuntos de
cambios......................................... .................................................... ............................. 83 3.10.5 Códigos de muestra de
solicitud de lote .................. .................................................... ............................. 84 3.10.6 Respuesta por
lotes ............... .................................................... .................................................. 86 Recuperación de propiedades
3.11 individuales ............................................... .................................................... ........ 89 3.12
Asociaciones ....................................... .................................................... .......................................... 90
3.12.1 Definiciones de metadatos de asociaciones y propiedades de navegación ..........................91 3.12.2 Recuperación
propiedades de navegación como entidad ............................................. .......................... 93 Recuperar propiedades de
3.12.3 navegación a través de $expand ................. .................................................. 93 3.13 Esquemas definidos por el
usuario ....................................... .................................................... .......................... 94
3.13.1 Campos de filtro.................................................. .................................................... ......................... 95
3.14 Campos definidos por el usuario (UDF) ....................................... .................................................... .................. 96 3.14.1 Gestión
de metadatos de UDF ...................... .................................................... ...................... 97 3.14.2 Operaciones
CRUD .......................... .................................................... .......................................... 99 3.15 Tablas definidas por el usuario
(UDT) . .................................................... .................................................... ........ 100 3.15.1 Gestión de metadatos de
UDT .................................. .................................................... ......... 101 3.15.2 Operaciones
CRUD .................................. .................................................... .......................... 101 3.16 Objetos definidos por el usuario
(UDO) ............... .................................................... ....................................... 102 3.16.1 Gestión de metadatos de
UDO . .................................................... .......................................... 103 3.16.2 Creando Entidad para un
UDO . .................................................... ............................................. 107 Entidad de recuperación para TÚ
3.16.3 HACES ................................................. ............................................. 108 3.16 .4 Entidad de actualización para
UDO ........................................... .................................................... ...... 110 3.16.5 Eliminación de entidad para
UDO.................................... .................................................... .......... 110 3.16.6 Entidad de cancelación/cierre para
UDO ........................... .................................................... .......... 110 3.17 Archivos
adjuntos ....................................... .................................................... ..................................................111
3.17.1 Configuración de una carpeta de archivos adjuntos .................................. .......................................... 112 3.17.2
Cargar un archivo adjunto ... .................................................... ............................................ 113 3.17.3 Descarga de archivos
adjuntos .................................................... ............................................. 117 3.17.4 Actualización del archivo
adjunto .................................................. .................................................... ...... 118 3.18 Carga de entidad de
flujo .................................. .................................................... ............................. 120 3.18.1 Ejemplo de cliente
OData ............ .................................................... ............................................ 121 3.18.2 SAP UI5
Muestra ................................................. .................................................... ............. 122 3.19 Imagen de artículo e imagen de
empleado ............................... .................................................... ..................... 123 Configuración de una carpeta de imágenes de
3.19.1 elementos .................. .................................................... .............. 124 3.19.2 Obtener una imagen de artículo o
una imagen de empleado .................. ....................................... 124 3.19.3 Actualización o carga de una imagen de
elemento . .................................................... ....................... 125 3.19.4 Eliminación de la imagen de un
elemento .................. .................................................... ....................................127
PÚBLICO Trabajar con la capa de servicio de SAP Business One
6 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Tabla de contenido
Machine Translated by Google
3.20 Extensión JavaScript ............................................... .................................................... ........................ 127 3.20.1 Motor de análisis
de JavaScript .................. .................................................... .......................... 128 3.20.2 Marco de extensión de
JavaScript ................. .................................................... .................. 128 3.20.3 Función de entrada de
JavaScript ...................... .................................................... ..................... 129 3.20.4 Asignación de URL de
JavaScript .................. .................................................... .......................... 130 3.20.5 SDK
JavaScript .................. .................................................... ............................................. 130 3.20.6 Inicio
sesión ................................................. .................................................... .......................... 143 3.20.7 Herramienta de
generación de SDK de JavaScript .............. .................................................... ....................... 143 3.20.8 Implementación de
JavaScript .................. .................................................... ............................. 144 3.20.9 Casos típicos de usuario de aplicación
de scripts ........... .................................................... .......... 146 3.20.10 Consumir servicio de script desde la
aplicación .Net .................. .......................................... 149 3.21 Intercambio de recursos de origen cruzado
(CORS) . .................................................... ....................................... 152 Habilitación de
3.21.1 CORS ........ .................................................... .................................................... ....... 152 3.21.2 Habilitar para
configurar encabezados permitidos .................................. .......................................... 152 3.21.3 Proceso
CORS . .................................................... .................................................... ............... 153 3.22 API de ping
pong ............................... .................................................... .................................................... ... 153
4 Consulta SQL ................................................ .................................................... .......................... 156 Metadatos de objetos
4.1 de negocio .................. .................................................... .......................................... 156 4.2 Operaciones
CRUD ... .................................................... .................................................... ........................ 157
4.2.1 Crear ........................ .................................................... .................................................... ..... 157
4.2.2 Recuperar por clave .................................................. .................................................... .......... 157
4.2.3 Parche ............................... .................................................... .................................................... 158
4.2.4 Borrar................................................. .................................................... ............................... 158
4.2.5 Recuperar todo ............................................... .................................................... ....................... 159
4.3 Operación de lista .................................................. .................................................... ................................... 160 Lista con
4.4 paginación ........... .................................................... .................................................... .................. 161 4.5 Lista de consultas
permitidas .................. .................................................... .................................................... ..... 163 Lista de tablas
4.5.1 permitidas .................................. .................................................... ........................ 163
4.5.2 Lista de columnas ............................................. .................................................... ......................... 164
4.6 Palabras clave SQL ............................................. .................................................... ................................... 165 4.7 Funciones
SQL ........... .................................................... .................................................... ..................... 166
4.8 Normalización de SQL ............................................... .................................................... ............................. 167
4.8.1 Normalización de tabla/columna ............................................... ....................................................... 167
4.8.2 Normalización de alias .................................................. .................................................... ........ 168
4.8.3 Normalización de funciones .................................................. .................................................... .. 168
4.9 Consulta con parámetro ............................................... .................................................... ....................... 169 4.10 Consulta de
errores y excepciones .................. .................................................... ...................................... 171 4.10.1 Tabla o columna que no está
en la lista de permitidos .. .................................................... .................................... 171
4.10.2 Error de gramática SQL ............................................. .................................................... ............. 171
4.10.3 Palabra clave/símbolo de SQL no admitido ........................................... ................................... 172 4.10.4 Múltiples
alias idénticos ........ .................................................... .......................................... 173 4.10.5 Columnas calculadas sin
alias.. .................................................... ............................. 173 4.10.6 Seleccionar todas las columnas de una
tabla ......... .................................................... ...................... 174
4.10.7 SQL LMD .............................................. .................................................... ............................. 174
4.11 Consulta con control de permisos ............................................... .................................................... .......... 175 4.12 Consideraciones
de seguridad ............................... .................................................... ............................. 176 4.12.1 Inyección
SQL .............. .................................................... .................................................... .... 176 4.12.2 Modificación de consulta
SQL de registro .................................. .................................................... ..... 177 4.12.3 Accesibilidad de datos
confidenciales .................................. .................................................... ...... 177
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Tabla de contenido © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 7
Machine Translated by Google
4.13 Limitaciones o por diseño ............................................... .................................................... ..................... 177
5 ETag de capa de servicio .............................................. .................................................... .............. 179 Introducción
5.1 a la ETag ............................... .................................................... .......................................... 179 5.2 Escenarios de
ETag ... .................................................... .................................................... .......................... 179 ETag en la creación de
5.2.1 entidades .................. .................................................... .................................. 179 ETag en recuperación
5.2.2 de entidad ............ .................................................... ....................................... 180 5.2.3 ETag en
actualización de entidad ... .................................................... .................................................... 180 5.2.4 ETag en
Eliminar entidad ........................................... .................................................... .............. 181 5.2.5 ETag en acción de
entidad ........................... .................................................... .......................... 182 Entidades con
5.3 ETag .................... .................................................... .................................................... ....... 183 5.4 Metadatos de
ETag ....................................... .................................................... .......................................... 184
6 Configuración de la capa de servicio de SAP Business One .................................. ....................... 186 Controlador de
6.1 configuración para la capa de servicio .................. .................................................... .............. 186 Opciones de
6.2 configuración para la capa de servicio ............................... .................................................... ......... 187 Configuración
6.3 por Solicitud ...................................... .................................................... .......................... 189 Monitoreo de
6.4 registro .................. .................................................... .................................................... ............... 189 Vista de lista
6.4.1 de solicitudes normales ............................... .................................................... ........... 190 Vista detallada
6.4.2 de solicitudes normales .................................. .................................................... 191 Vista de lista de
6.4.3 solicitudes de error .................................. .................................................... 192 Vista detallada de
6.4.4 solicitudes de error ........................................... .......................................... 192 Registros detallados de
6.4.5 solicitud/respuesta .. .................................................... ............................... 193
7 Limitaciones.................................................. .................................................... ......................... 194
7.1 Limitaciones de implementación del protocolo OData ............................................... .................................... 194
7.2 Limitaciones funcionales frente a SAP Business One DI API..... .................................................... ........ 194
8 Alta disponibilidad y equilibrio de carga ............................................... .................................. 195
9 PREGUNTAS MÁS FRECUENTES................................................. .................................................... ..................................... 196
10 Apéndice I: Capa de servicio frente a DI API ........................................... ................................... 198 10.1 API
CRUD ........... .................................................... .................................................... .......................... 198
10.1.1 Creando Entidades .............................................. .................................................... .............. 198
10.1.2 Recuperación de entidades .................................. .................................................... .......................... 199
10.1.3 Actualizar entidades .................. .................................................... .......................................... 200 10.1.4
Eliminación de entidades .. .................................................... .................................................... ......... 200 10.2 API de
servicios de la empresa .................................. .................................................... .......................... 201 10.3 API de
transacción .................. .................................................... .................................................... ............. 202
10.4 API de consulta ............................................... .................................................... .......................................204 10.5 API de
UDO ..... .................................................... .................................................... .................................... 205
10.5.1 Creación de UDO .............................................. .................................................... .................... 205 10.5.2
CRUD y operaciones de consulta ...................... .................................................... ................... 210
10.6 API UDF ............................................... .................................................... ............................................. 210
10.6.1 Operaciones CRUD ............................................. .................................................... .......... 211 10.6.2
Realización de operaciones en entidades con UDF ........................ .......................................... 213
11 Apéndice II: Diferencia de nomenclatura de metadatos entre la capa de servicio y DI API .......... 216 Diferencia de
11.1 nomenclatura de objetos de colección .................. .................................................... .......................... 216
PÚBLICO Trabajar con la capa de servicio de SAP Business One
8 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Tabla de contenido
Machine Translated by Google
11.2 Diferencia de denominación de objetos de negocio .................................. .................................................... 218
11.3 Diferencia de denominación de propiedades .................................. .................................................... ............... 219
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Tabla de contenido © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 9
Machine Translated by Google
1. Introducción
1.1 Acerca de este documento
Este documento cubre los usos básicos de SAP Business One Service Layer y explica los detalles técnicos de la creación de un servicio web
escalable y estable utilizando SAP Business One Service Layer.
1.2 Público objetivo
Le recomendamos que consulte este documento si está: • Desarrollando
aplicaciones basadas en API de capa de servicio • Planificando su
primera implementación de equilibrio de carga • Mejorando el
rendimiento de su sistema • Asegurando la estabilidad
de su sistema bajo una carga de trabajo pesada
Este documento está destinado a los administradores de sistemas que son responsables de configurar, administrar y mantener una
instalación de capa de servicio de SAP Business One. La familiaridad con su sistema operativo y su entorno de red es beneficiosa, al igual
que una comprensión general de la administración del servidor de aplicaciones web.
Este documento también es relevante para los desarrolladores de software que crean complementos para SAP Business One.
1.3 Acerca de la capa de servicio de SAP Business One
SAP Business One Service Layer es una nueva generación de API de extensión para consumir datos y servicios de SAP Business One. Se basa
en protocolos centrales como HTTP y OData, y proporciona una forma uniforme de exponer objetos de negocios con funciones completas sobre un
servidor web altamente escalable y de alta disponibilidad. Actualmente, Service Layer es compatible con OData versión 3, versión 4 y algunas
bibliotecas de cliente de OData seleccionadas, por ejemplo, WCF para desarrolladores de .Net; [Link] para desarrolladores de JavaScript.
Nota
Puede usar los siguientes URI para cambiar las versiones de OData:
o /b1s/v1/$metadata es para odata v3
o /b1s/v2/$metadata es para odata v4
PÚBLICO Trabajar con la capa de servicio de SAP Business One
10 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Introducción
Machine Translated by Google
2 Primeros pasos
2.1 Requisitos del sistema
SAP Business One Service Layer se ejecuta en los sistemas operativos SUSE Linux Enterprise y Microsoft Windows (a partir de SAP Business
One 10.0 PL01). Es un servidor de aplicaciones basado en el servidor web Apache HTTP.
SAP Business One Service Layer se puede implementar en uno de dos modos diferentes:
• Un modo integrado, que se instala en el mismo servidor de base de datos para mantener el entorno del sistema tan simple como
posible
• Un modo distribuido, instalando en máquinas separadas para obtener más poder de cómputo para mayor concurrencia
rendimiento
Para conocer los requisitos de hardware, como la capacidad de memoria o la cantidad de núcleos de CPU, consulte las especificaciones
de hardware de SAP HANA y la Guía de requisitos de hardware para SAP Business One.
Para obtener más información, consulte Platform Support Matrix junto con SAP Productivity Availability Matrix y Administrator's Guides for
SAP Business One (versiones para Microsoft SQL y SAP HANA) en SAP Help Portal.
2.2 Descripción general de la arquitectura
SAP Business One Service Layer tiene una arquitectura de 3 niveles: los clientes se comunican con el servidor web mediante HTTP/OData
y el servidor web depende de la base de datos para la persistencia de los datos.
Dentro del servidor web, varios componentes clave están involucrados en el manejo de las solicitudes HTTP basadas en OData entrantes: • El
analizador de OData analiza la URL solicitada y los métodos HTTP (GET/POST/PATCH/DELETE), los traduce a los objetos comerciales que
se operarán. on y llama al método respectivo de cada objeto para operaciones de creación/recuperación/actualización/
eliminación (CRUD). A la inversa, OData Parser también recibe los datos devueltos de los objetos comerciales, los traduce a código de
retorno HTTP y representantes de datos JSON, y responde al cliente original.
• El DI Core es la interfaz para acceder a los objetos y servicios de SAP Business One, la misma que utiliza SAP Business One DI API. Como
resultado, Service Layer API y DI API tienen definiciones idénticas para los objetos y las propiedades de los objetos, lo que suaviza la
curva de aprendizaje para los desarrolladores que ya han adquirido experiencia en el desarrollo de DI API.
• El administrador de la sesión implementa la permanencia de la sesión, trabajando con el balanceador de carga de la capa de servicio, de
modo que las solicitudes del mismo cliente sean manejadas por el mismo nodo de la capa de servicio.
• OBServer es el cuerpo de la lógica empresarial que se ocupa del trabajo real, por ejemplo, cálculo de impuestos, contabilización, etc. Service
Layer logra un alto rendimiento y escalabilidad al aprovechar el procesamiento múltiple.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Empezando © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 11
Machine Translated by Google
Para lograr una disponibilidad y escalabilidad aún mayores, recomendamos implementar varias instancias de capa de servicio con un balanceador de
carga al frente. Los beneficios incluyen lo siguiente:
• Las solicitudes de los clientes pueden enviarse a diferentes instancias de la capa de servicio y ejecutarse en paralelo.
• Si Service Layer está instalado en un modo distribuido y hay una falla de hardware en una máquina host, Service Layer es lo suficientemente inteligente como
para volver a enviar solicitudes de clientes a otra instancia en vivo sin pedirles a los usuarios que vuelvan a iniciar sesión.
2.3 Instalación de la capa de servicio de SAP Business One
La capa de servicio es un servidor de aplicaciones que proporciona acceso web a los servicios y objetos de SAP Business One y utiliza el servidor Apache
HTTP (o simplemente Apache) como equilibrador de carga, que funciona como un punto de tránsito para las solicitudes entre el cliente y varios miembros
del equilibrador de carga. . La arquitectura de la capa de servicio es
ilustrado a continuación:
PÚBLICO Trabajar con la capa de servicio de SAP Business One
12 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Empezando
Machine Translated by Google
Recomendación
Como la comunicación entre el balanceador de carga y los miembros del balanceador de carga se transmite a través de
HTTP en lugar de HTTPS, debe configurar el firewall en cada máquina miembro del balanceador de carga de tal manera que solo se
permitan visitas del balanceador de carga a los miembros del balanceador de carga.
Puede configurar Service Layer de una de las siguientes maneras:
• [Recomendado] El balanceador de carga y todos los miembros del balanceador de carga están instalados en la misma máquina.
• El balanceador de carga y los miembros del balanceador de carga están instalados en diferentes máquinas físicas. Tenga en cuenta que
al menos un miembro del balanceador de carga debe estar instalado en la misma máquina que el balanceador de carga.
No se admite la instalación remota de Service Layer. Por ejemplo, si pretende instalar el equilibrador de carga en el servidor A y dos
miembros del equilibrador de carga en los servidores B y C, debe ejecutar el asistente de configuración de componentes del servidor en cada
servidor por separado.
Para obtener más información, consulte el capítulo Instalación de la capa de servicio en las Guías del administrador de SAP Business
One (versión para SQL y versión para SAP HANA).
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Empezando © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 13
Machine Translated by Google
3 Consumir la capa de servicio de SAP Business One
Esta sección explica cómo consumir SAP Business One Service Layer y proporciona ejemplos. Para obtener una lista completa de las entidades
y acciones expuestas, consulte los metadatos devueltos por su servicio o la referencia API de SAP Business One Service Layer.
Antes de interactuar con Service Layer, consulte la siguiente tabla para conocer los elementos y términos clave:
URL raíz del servicio Identifica la raíz de la API de la capa de servicio. La [Link]
capa de servicio admite HTTPS de forma Ejemplo:
predeterminada. [Link]
Nota
Para usar la versión 3 de OData, envíe lo siguiente
Solicitud HTTP:
[Link]
Para usar la versión 4 de OData, envíe lo siguiente
Solicitud HTTP:
[Link]
de entidades o de una sola entidad. Ejemplo:
[Link]
ccsme
Ejemplo:
[Link]
$top=2&$orderby=itemcode
• POST /Iniciar sesión
Solicitudes de capa de servicio y
respuestas
PÚBLICO Trabajar con la capa de servicio de SAP Business One
14 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
Recomendación
Para probar Service Layer sin desarrollar un programa, puede instalar la extensión del navegador "POSTMAN" en Google Chrome o instalar
complementos equivalentes en otros navegadores.
3.1 Inicio y cierre de sesión
Antes de realizar cualquier operación en la capa de servicio, primero debe iniciar sesión en la capa de servicio.
Envíe esta solicitud HTTP para iniciar sesión:
POST [Link]
{"CompanyDB": "US506", "UserName": "gerente", "Contraseña": "1234"}
Si el inicio de sesión es exitoso, obtendrá la siguiente respuesta:
HTTP/1.1 200 Aceptar
EstablecerCookie: B1SESSION=PTRzIjYKweN61Lx1ZG0J3ARxfjcU0Shy;HttpOnly;
EstablecerCookie: ROUTEID=.node1; camino=/b1s
"una [Link]":
"[Link]
"SessionId": "PTRzIjYKweN61Lx1ZG0J3ARxfjcU0Shy",
"Versión": "1000110",
"Tiempo de espera de la sesión": 30
La respuesta de la solicitud de inicio de sesión indica que Service Layer inserta una cookie en el encabezado de respuesta, con el nombre de
cookie 'B1SESSION' y el valor de cookie 'PTRzIjYKweN61Lx1ZG0J3ARxfjcU0Shy' respectivamente. Además, el servidor Apache devuelve otro
elemento de cookie (ROUTEID=.node1) para garantizar la adherencia del equilibrador de carga.
Envíe esta solicitud HTTP para cerrar sesión:
POST /Cerrar sesión
Cookie: B1SESSION=PTRzIjYKweN61Lx1ZG0J3ARxfjcU0Shy; ID DE RUTA=.nodo1
Si el cierre de sesión es exitoso, obtendrá la siguiente respuesta, sin ningún contenido de respuesta:
HTTP/1.1 204 Sin contenido
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 15
Machine Translated by Google
3.1.1 Sesión
Una sesión se inicia con una solicitud de inicio de sesión y finaliza con una solicitud de cierre de sesión. Cada sesión válida tiene una ID de
sesión única que se distingue por una cadena similar a GUID. Para realizar solicitudes posteriores después del inicio de sesión,
los elementos de cookies B1SESSION y ROUTEID son obligatorios y ambos se configurarán en cada encabezado de solicitud. Por
ejemplo, para obtener un artículo con ID='i001', envíe la siguiente solicitud con una cookie:
OBTENER /Artículos('i001')
Cookie: B1SESSION=PTRzIjYKweN61Lx1ZG0J3ARxfjcU0Shy; ID DE RUTA=.nodo1
Si escribe una aplicación de cliente en el modo de escritorio de Windows (no en el modo de acceso del navegador), no olvide agregar el
elemento de la cookie en el encabezado HTTP, como en el ejemplo anterior de cierre de sesión. De lo contrario, puede recibir el error
"Sesión no válida":
HTTP/1.1 401 no autorizado
"error" : {
"código": 301,
"mensaje" : {
"lang": "enus",
"value" : "Sesión inválida o ya se agotó el tiempo de espera de la sesión".
Nota
Si su aplicación está escrita en JavaScript y se ejecuta en el modo de acceso del navegador, no necesita configurar la cookie cada
vez que envía una solicitud, ya que la mayoría de los navegadores web pueden manejar la cookie de manera
transparente.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
dieciséis
© 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
3.2 Inicio de sesión único (SSO)
A partir de SAP Business One 9.2, versión para SAP HANA, además del inicio de sesión normal, Service Layer también admite SSO.
Service Layer, como proveedor de servicios (SP), implementa el proceso SSO a través del protocolo SAML2 sobre SLD, que
funciona como proveedor de servicios de identidad (IDP). Service Layer admite dos métodos de SSO:
• HTTPPOST: utilizado en el entorno del navegador
• PAOS (Reverse HTTP Binding for SOAP Specification): utilizado para el cliente sin navegador
Se recomienda implementar Service Layer en la misma máquina Linux que SLD. Si lo implementa en dos máquinas separadas,
la hora debe sincronizarse entre las dos máquinas antes de que se implemente el proceso de SSO.
Nota
Service Layer SSO no funciona con la cuenta de Windows enlazada mediante el nombre principal del servicio (SPN).
3.2.1 SSO a través de PAOS
requisitos previos
Para mantener una sesión, es esencial iniciar sesión primero en SLD, antes de iniciar sesión en Service Layer a través de SSO.
Flujo de inicio de sesión único
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 17
Machine Translated by Google
Pasos Descripción
1. Publique una solicitud de inicio de sesión en Service Layer con el encabezado PAOS como se muestra a continuación:
POST /b1s/v1/ssob1s/HTTP/1.1
Aceptar: aplicación/[Link]+xml
PAOS: ver='urna:libertad:paos:200308';'urna:oasis:nombres:tc:SAML:2.0:perfiles:SSO:ecp'
2. Desde el encabezado de respuesta, obtenga el JSESSIONID del encabezado SetCookie como la sesión SSO entre
Capa de servicio y el cliente:
Conjunto de cookies: JSESSIONID=5AE19B213830AF766BCC477DF4A40AE5;
Agregue JSESSIONID en solicitudes posteriores a Service Layer, para que el cliente pueda mantener una sesión con Service Layer
durante todo el proceso de SSO. Del cuerpo de respuesta, obtenga la ubicación del IDP y el cuerpo del jabón.
contenido.
3. Reenvíe el contenido del cuerpo del jabón del paso 2 a la ubicación del IDP, con el ID de sesión mantenido entre el
cliente y SLD como la cookie de solicitud.
4. IDP emite una respuesta firmada que contiene información de inicio de sesión del usuario.
5. El cliente reenvía la respuesta firmada a Service Layer, con el ID de sesión de SSO recuperado del paso 2.
6. Si se pasa la autenticación, la capa de servicio responde con el estado de http 200.
7. El cliente publica una solicitud de inicio de sesión en Service Layer con el ID de sesión de SSO en la cookie de solicitud como se muestra a continuación:
POST /b1s/v1/ssob1s HTTP/1.1
Cookie: JSESSIONID=5AE19B213830AF766BCC477DF4A40AE5
8. En caso de éxito, la capa de servicio responde con:
HTTP/1.1 200 Aceptar
EstablecerCookie: B1SESSION=PTRzIjYKweN61Lx1ZG0J3ARxfjcU0Shy;HttpOnly;
EstablecerCookie: ROUTEID=.node1; camino=/b1s
{ "SessionId": "PTRzIjYKweN61Lx1ZG0J3ARxfjcU0Shy", "Versión": "920110",
"Tiempo de espera de la sesión": 30}
"una [Link]":
"[Link]
"SessionId": "PTRzIjYKweN61Lx1ZG0J3ARxfjcU0Shy",
"Versión": "1000110",
"Tiempo de espera de la sesión": 30
9. Con B1SESSION y ROUTEID, los clientes pueden acceder a los recursos de Service Layer.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
18 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
3.2.2 SSO a través de HTTPPOST
Flujo de inicio de sesión único
Pasos Descripción
El flujo de SSO a través del cliente del navegador es básicamente el mismo que el SSO a través de PAOS, excepto por lo siguiente:
1. Los clientes del navegador finalizan el proceso SSO a través de HTTPPOST.
2. Los clientes del navegador redirigen automáticamente la solicitud y la respuesta de la capa de servicio mediante el envío automático
Formularios HTML.
3. Entre el paso 3 y el paso 4, se devuelve un formulario SLD de inicio de sesión si el usuario no inicia sesión en SLD antes del inicio de
el proceso SSO. Después del inicio de sesión de SLD, la respuesta del paso 4 es redirigir a la capa de servicio.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 19
Machine Translated by Google
3.3 Documento de Metadatos
Los metadatos describen la capacidad del servicio. Define principalmente tipos, entidades (por ejemplo, objetos de SAP Business One)
y acciones (por ejemplo, servicios de SAP Business One).
Envíe la siguiente solicitud HTTP para recuperar metadatos:
GET /$metadatos
Utilizando los socios comerciales y los pedidos de cliente de SAP Business One como ejemplos, puede ver las siguientes secciones
en los metadatos:
<! sección 1.1 >
<EnumType Name="TiposBoCard">
<Nombre del miembro="cCliente" Valor="C"/>
<Nombre del miembro="cProveedor" Valor="S"/>
<Nombre de miembro="cLid" Valor="L"/>
</EnumType>
<! sección 1.2 >
<EntityType Name="Socio comercial">
<Clave>
<PropertyRef Name="CódigoTarjeta"/>
</Clave>
<Property Name="CardCode" Nullable="false" Type="[Link]"/>
<Nombre de la propiedad="Nombre de la tarjeta" Tipo="[Link]"/>
<Nombre de la propiedad="Tipo de tarjeta" Tipo="[Link]"/>
...
</EntityType>
<! sección 1.3 >
<ComplexType Name="DocumentParams">
<Property Name="DocEntry" Nullable="false" Type="Edm.Int32"/>
</TipoComplejo>
<! sección 1.4 >
<EntityType Name="Documento">
<Clave>
<PropertyRef Name="DocEntrada"/>
</Clave>
<Property Name="DocEntry" Nullable="false" Type="Edm.Int32"/>
<Nombre de la propiedad="NúmeroDocumento" Tipo="Edm.Int32"/>
<Nombre de propiedad="TipoDocumento" Tipo="[Link]"/>
...
PÚBLICO Trabajar con la capa de servicio de SAP Business One
20 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
<Propiedad Nombre="LíneasDocumento" Tipo="Colección(SAPB1.LíneaDocumento)"/>
...
</EntityType>
<! sección 1.5 >
<Nombre TipoComplejo="LíneaDocumento">
<Nombre de propiedad="Número de línea" Nullable="falso" Tipo="Edm.Int32"/>
<Nombre de propiedad="ItemCode" Tipo="[Link]"/>
<Nombre de la propiedad="Descripción del artículo" Tipo="[Link]"/>
<Propiedad Nombre="Cantidad" Tipo="[Link]"/>
...
</TipoComplejo>
<! sección 2 >
<La acción es enlazable="verdadero" Nombre="Cerrar">
<Nombre del parámetro="Documento" Tipo="[Link]"/>
</Acción>
<! sección 3 >
<EntityContainer Name="ServiceLayer">
<EntitySet EntityType="[Link]" Name="BusinessPartners"/>
<EntitySet EntityType="[Link]" Name="Pedidos"/>
...
</EntityContainer>
Las secciones de metadatos anteriores indican cómo se exponen las entidades y las
acciones: • En la Sección 3, puede ver que se exponen las entidades BusinessPartners y Orders. Puedes realizar
operaciones estándar de creación/recuperación/actualización/eliminación (CRUD) en ellos.
• En la Sección 2, puede ver que se define una acción enlazable llamada Cerrar y se puede enlazar al tipo
[Link]. Como los pedidos son de este tipo de entidad, los pedidos tienen una acción
Cerrar (POST /Orders(id)/Close).
Nota
Metadatos para UDF/UDT/UDO:
En SAP Business One 9.1 nivel de parche 05 y posterior, la información de los campos definidos por el usuario (UDF), las
tablas definidas por el usuario (UDT) y los objetos definidos por el usuario (UDO) se agregan a los metadatos. Dado que
las diferentes bases de datos de empresas de SAP Business One tienen diferentes UDF/UDT/UDO, los metadatos del servicio
pueden variar si se conecta a una base de datos de empresas diferente.
Para los UDT, solo se agrega el tipo "sin objeto" a los metadatos. Los UDT se tratan como entidades simples que tienen
solo una tabla principal. Por lo tanto, las herramientas de terceros, como MS WCF, pueden generar código
para UDF/UDT/UDO a partir de los metadatos.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 21
Machine Translated by Google
3.4 Documento de servicio
El documento de servicio es una lista de entidades expuestas. Utilice la URL del servicio raíz para recuperar el documento de servicio.
Envía la solicitud HTTP:
CONSEGUIR /
La respuesta es:
HTTP/1.1 200 Aceptar
"valor": [
"name": "CuadroDeCuentas",
"tipo": "Conjunto de entidades",
"url": "CuadroDeCuentas"
},
"name": "Etapas de ventas",
"tipo": "Conjunto de entidades",
"url": "Etapas de ventas"
},
...
3.5 Operaciones de creación/recuperación/actualización/eliminación (CRUD)
El protocolo OData define una forma estándar de crear/recuperar/actualizar/eliminar (CRUD) una entidad. Las operaciones CRUD son todas
similares. Puede consultar el documento de referencia de la API para obtener más detalles (vea la captura de pantalla a continuación).
PÚBLICO Trabajar con la capa de servicio de SAP Business One
22 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
3.5.1 Creación de entidades
Use el verbo HTTP POST y el contenido de una entidad para crear la entidad.
Para la mayoría de los casos, la respuesta de éxito también es el contenido de la entidad.
Ejemplo
Cómo crear un cliente (socio comercial) denominado "c1"
Envía esta solicitud HTTP:
POST /Socios comerciales
"CódigoTarjeta": "c1",
"Nombre de la tarjeta": "cliente c1",
"TipoTarjeta": "cCliente"
Todos los campos válidos están definidos en su tipo [Link] en la sección de metadatos 1.2.
Tenga en cuenta que CardType es de tipo Enumeración (BoCardTypes, definido en la sección de metadatos 1.1). La capa de
servicio acepta tanto el nombre como el valor de la enumeración. Así que estas dos declaraciones son equivalentes:
{"TipoTarjeta": "cCliente",}
{"Tipo de tarjeta": "C",}
En caso de éxito, el servidor devuelve el código HTTP 201 (Creado) y el contenido de la entidad es el siguiente:
HTTP/1.1 201 Creado
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 23
Machine Translated by Google
"CódigoTarjeta": "c1",
"Nombre de la tarjeta": "cliente c1",
"TipoTarjeta": "cCliente",
"Código de grupo": 100,
...
En caso de error, el servidor devuelve el código HTTP 4XX (por ejemplo, 400) y el mensaje de error como contenido es el siguiente
(supongamos que existe el cliente "c1"):
HTTP/1.1 400 Solicitud incorrecta
"error": {
"código": 10,
"mensaje": {
"lang": "eses",
"value": "1320000140 Código de socio comercial 'c1' ya asignado a un socio comercial; ingrese un código de
socio comercial único"
Ejemplo
Cómo crear una orden de venta con dos líneas de documento
El contenido POST entidad Pedidos es de tipo Documento y se define en la sección de metadatos 1.4.
DocumentLines, conocido como el subobjeto de la orden de venta, es una colección del tipo complejo DocumentLine,
que se define en la sección de metadatos 1.5. En formato JSON, es una matriz entre corchetes [].
Envía esta solicitud HTTP:
POST /Pedidos
"CódigoTarjeta": "c1",
"DocDate": "20140401",
"DocDueDate": "20140401",
"Líneas de Documento": [
"Código del artículo": "i1",
"PrecioUnitario": 100,
"Cantidad": 10,
"CódigoImpuesto": "T1",
},
PÚBLICO Trabajar con la capa de servicio de SAP Business One
24 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
"Código del artículo": "i2",
"PrecioUnitario": 120,
"Cantidad": 8,
"CódigoImpuesto": "T1",
},
En caso de éxito, el servidor devuelve 201 (Creado) y el contenido de la entidad es el siguiente:
HTTP/1.1 201 Creado
"EntradaDocumento": 22,
"Número de documento": 11,
"DocType": "dDocument_Items",
...
"Líneas de Documento": [
"Número de línea": 0,
"Código del artículo": "i1",
...
},
"Número de Línea": 1,
"Código del artículo": "i2",
...
],
...
3.5.2Recuperación de entidades
Utilice el verbo HTTP GET y los campos clave para recuperar la entidad.
Ejemplo
Cómo obtener el cliente "c1" en el ejemplo anterior
Como se define en la sección de metadatos 1.2, CardCode es la propiedad clave (el tipo es una cadena). Para
recuperar el cliente "c1", envíe la solicitud HTTP:
OBTENER /Socios comerciales ('c1')
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 25
Machine Translated by Google
OBTENER /Socios comerciales (Código de tarjeta = 'c1')
El servicio devuelve el código HTTP 200 que indica éxito con el contenido del objeto en formato JSON:
HTTP/1.1 200 Aceptar
"CódigoTarjeta": "c1",
"Nombre de la tarjeta": "cliente c1",
"TipoTarjeta": "cCliente",
"Código de grupo": 100,
...
Ejemplo
Cómo obtener la orden de venta en el ejemplo anterior
Como se define en la sección de metadatos 1.4, DocEntry es la propiedad clave (el tipo es Int32). Para recuperar la orden de
venta, envíe la solicitud HTTP:
OBTENER /Pedidos(22)
OBTENER pedidos (DocEntry = 22)
Nota
Se requieren comillas simples para valores de cadena como 'c1', y no se requieren comillas simples alrededor de valores enteros como
como 22
Si la clave de entidad contiene varias propiedades, envíe la solicitud HTTP:
GET /SalesTaxAuthorities(Código='AK',Tipo=3)
3.5.3Actualización de entidades
Utilice el verbo HTTP PATCH o PUT para actualizar la entidad. En general, se recomienda PATCH.
La diferencia entre PATCH y PUT es que PATCH ignora (mantiene el valor) aquellas propiedades que no se dan en la solicitud, mientras
que PUT las establece en el valor predeterminado o en nulo.
Ejemplo
Cómo actualizar el nombre del cliente "c1"
Envía la solicitud HTTP:
PARCHE /Socios comerciales('c1')
"CardName": "Nombre del cliente actualizado"
En caso de éxito, el código HTTP 204 se devuelve sin contenido.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
26 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
HTTP/1.1 204 Sin contenido
Nota
Las propiedades de solo lectura (por ejemplo, CardCode) no se pueden actualizar. Se ignoran silenciosamente si se asignan en la
solicitud.
3.5.4 Eliminación de entidades
Utilice el verbo HTTP DELETE y los campos clave para eliminar la entidad.
Ejemplo
Cómo eliminar el cliente "c1"
Envía la solicitud HTTP:
ELIMINAR /Socios comerciales('c1')
En caso de éxito, el código HTTP 204 se devuelve sin contenido.
HTTP/1.1 204 Sin contenido
Nota
No puede eliminar el pedido de cliente en SAP Business One. Si intenta eliminar la orden de venta No.22:
ELIMINAR /Pedidos(22)
Se reporta un error al denegar la operación:
HTTP/1.1 400 Solicitud incorrecta
"error": {
"código": 5006,
"mensaje": {
"lang": "eses",
"value": "La acción solicitada no es compatible con este objeto".
3.5.5Crear entidad sin contenido
Teniendo en cuenta el hecho de que devolver todo el contenido de la entidad al crear una entidad puede no ser adecuado para el escenario
exigente de alto rendimiento, la capa de servicio proporciona una forma de responder sin contenido especificando un encabezado especial
Preferir con el valor devolver sin contenido. Por ejemplo:
POST /b1s/v1/Artículos HTTP/1.1
Preferir: devolución sin contenido
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 27
Machine Translated by Google
"Código de artículo": "i011"
En caso de éxito, el código HTTP 204 se devuelve sin contenido, en lugar de crear el recurso 201 habitual.
HTTP/1.1 204 Sin contenido
Ubicación: /b1s/v1/Artículos('i011')
Preferencia aplicada: devolución sin contenido
Nota
El encabezado de respuesta incluye Preferencia aplicada para confirmar que el servidor acepta esta opción de preferencia.
El URI del recurso creado se encuentra en el encabezado Ubicación.
3.6 Acciones
Además de las operaciones CRUD de entidad básica, Service Layer le proporciona dos tipos de acciones:
• Acción vinculada (vinculada a la entidad para operaciones que no sean CRUD) •
Acción global (utilizada principalmente para exponer los servicios de SAP Business One)
La solicitud y la respuesta para cada acción se describen en los metadatos. Por ejemplo, la función de inicio de sesión que se presentó
anteriormente es una acción global. Puede encontrar su definición en los metadatos.
Nota
"Acción" es un concepto de la versión 4 de OData. En la versión 3 de OData, se llama "Importación de función".
Puede usar el verbo HTTP POST para acciones de OData.
Ejemplo
Cómo usar la acción enlazada
En la sección de metadatos 2.1, puede ver una acción enlazable llamada "Cerrar" con el primer parámetro enlazado al tipo de
Documento:
<! sección 2.1 >
<La acción es enlazable="verdadero" Nombre="Cerrar">
<Nombre del parámetro="Documento" Tipo="[Link]"/>
</Acción>
Como los pedidos son de tipo Documento, eso significa que los pedidos tienen una acción "Cerrar". Puede enviar la siguiente
solicitud HTTP para cerrar el documento No. 22:
POST /Pedidos(22)/Cerrar
PÚBLICO Trabajar con la capa de servicio de SAP Business One
28 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
Ejemplo
Cómo usar la acción global En
SAP Business One DI API, puede usar el objeto [Link] para operar las actividades en SAP Business
One. Sin embargo, en el nivel de parche 01 de SAP Business One 9.1, desde la capa de servicio, no puede encontrar la
entidad Actividad. Entonces, ¿cómo usarlo?
Al buscar en los metadatos, puede encontrar las definiciones de acción, de la siguiente manera:
<Nombre de la acción="ActivitiesService_GetActivity">
<Parameter Name="ActivityParams" Type="[Link]"/>
<ReturnType Type="[Link]"/>
</Acción>
<Nombre de la acción="ActivitiesService_AddActivity">
<Nombre del parámetro="Actividad" Tipo="[Link]"/>
<ReturnType Type="[Link]"/>
</Acción>
Tenga en cuenta que el ejemplo sigue el formato de la versión 4 de OData. Para la versión 3 de OData, se usa "Importar
función" en lugar de "Acción". El resultado es el siguiente:
<Importar Función Nombre="ActivitiesService_GetActivity">
<Parameter Name="ActivityParams" Type="[Link]"/>
<ReturnType Type="[Link]"/>
</Importación de funciones>
<FunctionImport Name="ActivitiesService_AddActivity">
<Nombre del parámetro="Actividad" Tipo="[Link]"/>
<ReturnType Type="[Link]"/>
</Importación de funciones>
Muestra que puede usar ActivitiesService para obtener y agregar objetos de actividad. Los tipos relacionados también se definen
en los metadatos, de la siguiente manera:
<ComplexType Name="ActivityParams">
<Property Name="ActivityCode" Nullable="false" Type="Edm.Int32"/>
</TipoComplejo>
<ComplexType Name="Actividad">
<Property Name="ActivityCode" Nullable="false" Type="Edm.Int32"/>
<Nombre de la propiedad="CódigoTarjeta" Tipo="[Link]"/>
<Nombre de la propiedad="Notas" Tipo="[Link]"/>
...
</TipoComplejo>
Para agregar una actividad, envíe la solicitud HTTP:
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 29
Machine Translated by Google
POST /ActivitiesService_AddActivity
"Actividad":{
"Código de actividad": 1,
"Código de tarjeta": "c1"
En caso de éxito, devuelve el contenido de tipo [Link] como se define.
Para obtener una actividad, envíe la solicitud HTTP:
POST /ActivitiesService_GetActivity
"Parámetros de actividad": {
"Código de actividad": 1
En caso de éxito, devuelve el contenido de tipo [Link] como se define.
Tenga en cuenta que desde el nivel de parche 02 de SAP Business One 9.1 y posteriores, "Actividad" se ha expuesto como una entidad
y, por lo tanto, las acciones globales se ocultaron de forma predeterminada.
Ejemplo
Vista previa de un pedido
Una acción oculta llamada OrdersService_Preview le permite obtener una vista previa de un pedido para crear sin crearlo realmente.
Sus metadatos son los siguientes:
<Nombre de la acción="OrdersService_Vista previa">
<Nombre del parámetro="Documento" Tipo="[Link]"/>
<ReturnType Type="[Link]"/>
</Acción>
Una orden para crear se puede previsualizar de esta manera:
POST /b1s/v1/OrdersService_Preview
"Documento": {
"CódigoTarjeta": "c1",
"DocDate": "20140401",
"DocDueDate": "20140401",
"Líneas de Documento": [
"Código del artículo": "i1",
PÚBLICO Trabajar con la capa de servicio de SAP Business One
30 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
"PrecioUnitario": 100,
"Cantidad": 10,
"Código de impuestos": ""
En caso de éxito, el servidor devuelve el código HTTP 200 (OK) y parte de la respuesta es la siguiente:
HTTP/1.1 200 Aceptar
"DocEntry": nulo,
"DocNum": nulo,
"DocType": "dDocument_Items",
"Impreso": "psNo",
"DocDate": "20140401",
"DocDueDate": "20140401",
"CódigoTarjeta": "c1",
"Nombre de la tarjeta": "cliente 1",
"DocTotal": 1000,
"DocCurrency": "$",
"JournalMemo": "Órdenes de Venta 0af7516860cd4",
"FechaImpuesta": "20140401",
"DocObjectCode": "17",
"DocTotalSys": 1000,
"EstadoDocumento": "bost_Open",
"DescuentoTotal": 0,
"Líneas de Documento": [
"Número de línea": 0,
"Código del artículo": "i1",
"Descripción del artículo": "i01",
"Cantidad": 10,
"Fecha de envío": "20140401",
"Precio": 100,
"PrecioDespués del IVA": 100,
"Moneda": "$",
"CódigoAlmacén": "01",
"CódigoCuenta": "_SYS00000000081",
"Código de impuestos": "",
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 31
Machine Translated by Google
"Total de línea": 1000,
"Impuesto Total": 0,
"PrecioUnitario": 100,
"LineStatus": "bost_Open",
"Cantidad del paquete": 10,
"Tipo de línea": "dlt_Regular",
"CantidadAbiertaSC": 1000,
"DocEntry": nulo,
"UoMCode": "Manual",
"Cantidad de inventario": 10,
......
],
......
PÚBLICO Trabajar con la capa de servicio de SAP Business One
32 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
3.7 Opciones de consulta
Las opciones de consulta dentro de la URL de la solicitud pueden controlar cómo la capa de servicio procesa una solicitud en
particular. La siguiente tabla muestra las opciones de consulta admitidas por Service Layer.
Las funciones admitidas actualmente
para $filter son: /Orders?$filter=DocEntry lt 8 y (DocEntry lt 8 o
• comienza con DocEntry gt 116) y CardCode eq 'c1'
• Termina con
contiene
subcadena de /Pedidos?$filter=DocEntry lt 8 y ((DocEntry lt 8 o
DocEntry gt 116) y comienza con(CardCode,'c1'))
Los operadores lógicos y relacionales
soportados actualmente incluyen:
• y
/Artículos?$filtro=no
o
(comienza con (ItemName, 'item') y
• le (menor que o igual a) • lt
ForeignName eq nulo)
(menor que) • ge
(mayor que o igual a) • gt (mayor que)
• eq (igual a) • ne (distinto
de)
no
Nota
El operador no es compatible a partir
del nivel de parche 01 9.1.
Los paréntesis también son compatibles.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 33
Machine Translated by Google
/Items/$count?&filter=ItemCode eq
'prueba'
$inlinecount Permite a los clientes solicitar la cantidad de recursos Para obtener más información, consulte la sección inlinecount a
coincidentes en línea con los recursos en continuación.
la respuesta.
Nota
La opción de consulta $inlinecount
se aplica solo a los protocolos OData
3.0. Esta característica está disponible
en SAP Business One 9.1 nivel de
parche 06 y posteriores.
La combinación de opciones de consulta permite que Service Layer admita cualquier escenario de consulta complejo, manteniendo la
interfaz API lo más simple posible.
3.7.1 Obtener todas las entidades
Puede utilizar las siguientes formas de obtener todos los registros de entidad:
OBTENER /Artículos
OBTENER /Artículos?$select=*
3.7.2Obtener campos de una entidad
Puede utilizar las siguientes formas de obtener campos de elementos:
GET /Items('i1')?$select=ItemCode,ItemName,ItemPrices
o
GET /Items(ItemCode='i1')?$select=ItemCode,ItemName,ItemPrices
3.7.3Propiedades de consulta del tipo de enumeración
El valor de enumeración y el nombre de enumeración se admiten en una opción de consulta. Puede usar las siguientes formas de
obtener todos los clientes:
GET /BusinessPartners?$filter=CardType eq 'C'
o
GET /BusinessPartners?$filter=TipoTarjeta eq 'cCliente'
Tenga en cuenta que 'C' es un valor de enumeración, mientras que 'cCliente' es un nombre de enumeración.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
34 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
3.7.4Propiedades de consulta del tipo de fecha y hora
Se admiten múltiples formatos de fecha. Por ejemplo:
OBTENER /Pedidos?$filter=DocDate eq '20140423'
OBTENER /Pedidos?$filter=DocDate eq '20140423'
OBTENER /Pedidos?$filter=DocDate eq datetime'20140423'
OBTENER /Pedidos?$filter=DocDate eq datetime'20140423'
OBTENER /Pedidos?$filter=DocDate eq '20140423T[Link]'
OBTENER /Pedidos?$filter=DocDate eq '20140423000000'
Tenga en cuenta que SAP Business One ignora las partes HORA/MINUTO/SEGUNDO. El prefijo de palabra clave de fecha y hora también se
puede agregar antes del valor de fecha y hora.
3.7.5Propiedades de consulta del tipo de tiempo
Se admiten múltiples formatos de hora. Por ejemplo:
OBTENER /Pedidos?$filter=DocTime eq '[Link]'
OBTENER /Pedidos?$filter=DocTime eq '18:38'
OBTENER /Pedidos?$filter=DocTime eq '183800'
OBTENER /Pedidos?$filter=DocTime eq '1838'
OBTENER /Pedidos?$filter=DocTime eq '20140618T[Link]Z'
OBTENER /Pedidos?$filter=DocTime eq '20140618T18:38'
Tenga en cuenta que SAP Business One ignora las partes AÑO/MES/DÍA; sólo las partes HORA/MINUTO son efectivas.
3.7.6 Paginar los pedidos seleccionados
El mecanismo de paginación se implementa a través de top y skip. Permite que los datos se obtengan fragmento por fragmento.
Por ejemplo, después de enviar la solicitud HTTP:
OBTENER /Órdenes
El servicio devuelve:
HTTP/1.1 200 Aceptar
"valor": [
{"EntradaDocumento": 7,"NúmeroDocumento": 2,...},
{"EntradaDocumento": 8,"NúmeroDocumento": 3,...},
...
{"EntradaDocumento": 26,"NúmeroDocumento": 21,...}
],
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 35
Machine Translated by Google
"[Link]": "/b1s/v1/Pedidos?$skip=20"
La anotación [Link] está contenida en el cuerpo del enlace del siguiente fragmento.
Nota
Para OData V3, la siguiente anotación de enlace es [Link]; Para OData V4, la siguiente anotación de enlace es
@[Link].
El tamaño de página predeterminado es 20. Puede personalizar el tamaño de página cambiando las siguientes opciones:
o Establecer la opción de configuración PageSize en conf/[Link]. o Use la
anotación recomendada de OData [Link] en el encabezado Preferir de la solicitud:
OBTENER /Órdenes
Preferir:[Link]=50
... (otros encabezados)
La respuesta contiene el encabezado HTTP PreferenceApplied para indicar si se acepta la solicitud y cómo:
HTTP/1.1 200 Aceptar
Preferencia aplicada: [Link]=50
...
Si PageSize o [Link] se establece en 0, el mecanismo de paginación se desactiva.
La opción por solicitud [Link] es anterior a la opción de configuración PageSize.
3.7.7 Agregación
A partir de SAP Business One 9.1 parche nivel 12, versión para SAP HANA, Service Layer admite parcialmente la agregación.
El comportamiento de agregación se desencadena mediante la opción de consulta $apply. Cualquier expresión agregada que especifique un
método de agregación DEBE definir un alias para el valor agregado resultante. Las expresiones agregadas definen el alias utilizando la palabra
clave "as", seguida de un SimpleIdentifier. El alias introducirá una propiedad dinámica en el conjunto de resultados agregado. La propiedad dinámica
introducida se agrega al tipo que contiene la expresión original.
Actualmente, los métodos de agregación admitidos incluyen suma, promedio, mínimo, máximo, conteo y conteo distinto.
[Link] suma
El método de agregación estándar sum se puede aplicar a valores numéricos para devolver la suma de los valores no nulos, o nulo si no hay
valores no nulos.
Por ejemplo, para sumar el DocRate de los Pedidos, envíe una solicitud como:
GET /b1s/v1/Orders?$apply=aggregate(DocRate con suma como TotalDocRate)
En caso de éxito, la respuesta es la siguiente:
"[Link]": "$metadata#Pedidos(TotalDocRate)",
PÚBLICO Trabajar con la capa de servicio de SAP Business One
36 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
"valor" : [
"[Link]": nulo,
"TotalDocRate": 4.0
El SQL equivalente en la base de datos es:
SELECCIONE SUM(T0."DocRate") COMO "TotalDocRate" DE "ORDR" T0
[Link] promedio
El promedio del método de agregación estándar se puede aplicar a valores numéricos para devolver la suma de los valores no nulos
dividida por el recuento de los valores no nulos, o nulo si no hay valores no nulos.
Por ejemplo, para calcular el VatSum promedio de las Órdenes, envíe una solicitud como:
GET /b1s/v1/Orders?$apply=aggregate(VatSum con promedio como AvgVatSum )
En caso de éxito, la respuesta es la siguiente:
"[Link]": "$metadata#Pedidos(AvgVatSum)",
"valor" : [
"[Link]": nulo,
"AvgVatSum": 1,70
El SQL equivalente en la base de datos es:
SELECCIONE AVG(T0."VatSum") COMO "AvgVatSum" DESDE "ORDR" T0
[Link] máx.
El método de agregación estándar max se puede aplicar a valores con un dominio totalmente ordenado para devolver el mayor de los valores no
nulos, o nulo si no hay valores no nulos. La propiedad de resultado tendrá el mismo tipo que la propiedad de entrada.
Por ejemplo, para obtener el máximo DocEntry de los Pedidos, envíe una solicitud como:
GET /b1s/v1/Orders?$apply=agregate(DocEntry con max como MaxDocEntry)
En caso de éxito, la respuesta es la siguiente:
"[Link]": "$metadata#Pedidos(MaxDocEntry)",
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 37
Machine Translated by Google
"valor" : [
"[Link]": nulo,
"Entrada MaxDoc": 6
El SQL equivalente en la base de datos es:
SELECCIONE MAX(T0."DocEntry") COMO "MaxDocEntry" DESDE "ORDR" T0
[Link] minutos
El método de agregación estándar min se puede aplicar a valores con un dominio totalmente ordenado para devolver el menor de los
valores no nulos, o nulo si no hay valores no nulos. La propiedad de resultado tendrá el mismo tipo que la propiedad de entrada.
Por ejemplo, para obtener el DocEntry mínimo de los Pedidos, envíe una solicitud como:
GET/b1s/v1/Orders?$apply=agregate(DocEntry con min como MinDocEntry)
En caso de éxito, la respuesta es la siguiente:
"[Link]": "$metadata#Pedidos(MinDocEntry)",
"valor" : [
"[Link]": nulo,
"EntradaMinDoc": 2
El SQL equivalente en la base de datos es:
SELECCIONE MIN(T0."DocEntry") COMO "MinDocEntry" DESDE "ORDR" T0
[Link] contardistinto
El método de agregación countdistinct cuenta los valores distintos, omitiendo cualquier valor nulo.
Por ejemplo, para contar el CardCode distinto de los Pedidos, envíe una solicitud como:
GET /b1s/v1/Orders?$apply=aggregate(CardCode with countdistinct as CountDistinctCardCode)
En caso de éxito, la respuesta es la siguiente:
"[Link]": "$metadata#Pedidos(CountDistinctCardCode)",
PÚBLICO Trabajar con la capa de servicio de SAP Business One
38 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
"valor" : [
"[Link]": nulo,
"CountDistinctCardCode": "2"
El SQL equivalente en la base de datos es:
SELECCIONE CONTEO(T0 DISTINTO."CódigoTarjeta") COMO "CódigoTarjetaDistintaCuenta" DESDE "ORDR" T0
[Link] cuenta
El valor de la propiedad virtual $count es el número de instancias en el conjunto de entrada. Siempre debe especificar un alias y no debe
especificar un método de agregación.
Por ejemplo, para contar el número de Pedidos, envíe una solicitud como:
OBTENER /b1s/v1/Pedidos?$aplicar=agregado($cuentar como PedidosCuenta)
En caso de éxito, la respuesta es la siguiente:
"[Link]": "$metadata#Pedidos(Número de pedidos)",
"valor" : [
"[Link]": nulo,
"Número de pedidos": 4
El SQL equivalente en la base de datos es:
SELECCIONE COUNT(T0."DocEntry") COMO "OrdersCount" FROM "ORDR" T0
[Link] conteo en línea
La opción de consulta $inlinecount permite a los clientes solicitar la cantidad de recursos coincidentes en línea con los recursos en la
respuesta. Esto es más útil cuando un servicio implementa la paginación del lado del servidor, ya que permite a los clientes recuperar la
cantidad de recursos coincidentes incluso si el servicio decide responder con una sola página de recursos coincidentes.
Debe especificar la opción de consulta $inlinecount con un valor de todas las páginas o ninguno (o no especificado); de lo contrario, el servicio
devuelve un código de estado HTTP de 400 Bad Request.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 39
Machine Translated by Google
• La opción de consulta $inlinecount con un valor de todas las páginas especifica que el recuento total de entidades que coinciden con la
solicitud debe devolverse junto con el resultado. El siguiente ejemplo devuelve el número total de bancos en el conjunto de resultados
junto con los bancos.
OBTENER /Bancos?$inlinecount=allpages
"[Link]": "5",
"valor": [
{ "CódigoBanco": "banco001", ... },
{ "CódigoBanco": "banco002", ... },
{ "CódigoBanco": "banco003", ... },
{ "CódigoBanco": "banco004", ... },
{ "CódigoBanco": "banco005", ... }
• La opción de consulta $inlinecount con un valor de ninguno (o no especificado) significa que el servicio no debe
devolver un conteo. Por ejemplo:
GET /Bancos?$inlinecount=none
"valor": [
{ "CódigoBanco": "banco001", ... },
{ "CódigoBanco": "banco002", ... },
{ "CódigoBanco": "banco003", ... },
{ "CódigoBanco": "banco004", ... },
{ "CódigoBanco": "banco005", ... }
La opción de consulta $inlinecount también puede funcionar con $top y $filter. • El siguiente
ejemplo devuelve los dos primeros bancos y el recuento de todos los bancos.
OBTENER /Bancos?$inlinecount=allpages&$top=2
"[Link]": "5",
"valor": [
{ "CódigoBanco": "banco001", ... },
{ "CódigoBanco": "banco002", ... }
• El siguiente ejemplo devuelve el recuento de todos los bancos con BankCode mayor que "bank003".
GET /Bancos?$inlinecount=allpages&$filter=CódigoBanco gt 'banco003'
PÚBLICO Trabajar con la capa de servicio de SAP Business One
40 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
"[Link]": "2",
"valor": [
{ "CódigoBanco": "banco004", ... },
{ "CódigoBanco": "banco005", ... }
3.7.8 Agrupación
El comportamiento de agrupación se activa mediante la opción de consulta apply y la palabra clave groupby. Esta palabra clave especifica
las propiedades de agrupación, una lista separada por comas de una o más rutas de propiedad de un solo valor que se encuentra entre
paréntesis. La misma ruta de propiedad no debe aparecer más de una vez; las rutas de propiedad redundantes pueden considerarse
válidas, pero no deben alterar el significado de la solicitud.
Nota
A partir de SAP Business One 9.2 PL03, versión para SAP HANA, se admite la agrupación.
[Link] Grupo simple
Simplemente encierre las propiedades del grupo entre paréntesis. Por ejemplo, para agrupar los pedidos por CardCode, DocEntry,
envíe la siguiente solicitud:
GET /b1s/v1/Orders?$apply=groupby((CódigoTarjeta, EntradaDocumento))
O
/b1s/v1/Pedidos?$apply=groupby((Pedidos/CódigoTarjeta, Pedidos/EntradaDocumento))
En caso de éxito, la respuesta es la siguiente:
"[Link]": "$metadata#Pedidos(CódigoTarjeta, EntradaDocumento)",
"valor" : [
"[Link]": nulo,
"Código de tarjeta": "c001",
"EntradaDocumento" : 2
},
"[Link]": nulo,
"Código de tarjeta": "c002",
"EntradaDocumento" : 3
},
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 41
Machine Translated by Google
"[Link]": nulo,
"Código de tarjeta": "c001",
"EntradaDocumento" : 5
},
"[Link]": nulo,
"Código de tarjeta": "c001",
"EntradaDocumento" : 6
El SQL equivalente en la base de datos SAP es:
SELECCIONE T0."CódigoTarjeta", T0."EntradaDocumento" DESDE "ORDR" T0 GRUPO POR T0."CódigoTarjeta",
T0."EntradaDocumento"
[Link] Grupo con método de agregación
Service Layer también admite la combinación de agrupación con agregación. Por ejemplo, para agregar la propiedad DocNum al
agrupar CardCode, envíe la siguiente solicitud:
GET /b1s/v1/Orders?$apply=groupby((CódigoTarjeta), agregado(NúmDoc con suma como TotalNúmDoc))
En caso de éxito, la respuesta es la siguiente:
"[Link]": "$metadata#Pedidos(CódigoTarjeta,TotalDocNum)",
"valor" : [
"[Link]": nulo,
"Código de tarjeta": "c001",
"TotalDocNum": 8
},
"[Link]": nulo,
"Código de tarjeta": "c002",
"TotalDocNum": 2
El SQL equivalente en la base de datos es:
SELECCIONE T0."CódigoTarjeta", SUM(T0."DocNum") COMO "TotalDocNum" DESDE "ORDR" T0 GROUP BY
T0."CódigoTarjeta"
PÚBLICO Trabajar con la capa de servicio de SAP Business One
42 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
[Link] Grupo con método de agregación y filtro
SL le permite filtrar antes de agrupar. Estas dos operaciones están separadas por una barra diagonal (/) para expresar que se aplican
consecutivamente. Por ejemplo, para filtrar antes de agrupar con el método de agregación, envíe la siguiente solicitud:
GET /b1s/v1/Orders?$apply=filter(Orders/CardCode eq 'c001')/groupby((CardCode), added(DocNum with sum as TotalDocNum))
En caso de éxito, la respuesta es la siguiente:
"[Link]": "$metadata#Pedidos(CódigoTarjeta,TotalDocNum)",
"valor" : [
"[Link]": nulo,
"Código de tarjeta": "c001",
"TotalDocNum": 8
El SQL equivalente en la base de datos es:
SELECCIONE T0."CódigoTarjeta", SUM(T0."DocNum") COMO "TotalDocNum" DESDE "ORDR" T0 DONDE
T0."CódigoTarjeta" = 'c001' AGRUPADO POR T0."CódigoTarjeta"
Nota
La opción de filtro también se puede especificar como se muestra a continuación, que es funcionalmente equivalente.
GET /b1s/v1/Orders?$apply=groupby((CódigoTarjeta), agregado(Nú[Link] con suma como
Nú[Link]))&$filter=(Pedidos/CódigoTarjeta ne 'c001')
3.7.9 Uniones cruzadas
CrossJoins es compatible a partir de SAP Business One 9.2, versión para el nivel de parche 07 de SAP HANA.
OData admite la consulta de entidades relacionadas mediante la definición de propiedades de navegación en el modelo de datos.
Estas rutas de navegación ayudan a guiar a los consumidores regulares en la comprensión y navegación de las relaciones. En algunos
casos, sin embargo, las solicitudes deben abarcar conjuntos de entidades sin asociaciones predefinidas. Estas solicitudes se pueden
enviar al recurso especial $crossjoin en lugar de a un conjunto de entidades individuales.
[Link] Combinaciones cruzadas con expandir
Expandir a través de dos entidades
Para expandir a través de dos entidades de acuerdo con las condiciones de filtro dadas, una solicitud como la siguiente,
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 43
Machine Translated by Google
GET /b1s/v1/$crossjoin(Orders,BusinessPartners)?$expand=Orders($select=DocEntry, DocNum),BusinessPartners($select=CardCode)&$filter=Orders/
CardCode eq BusinessPartners/CardCode and Orders/DocNum archivo 3 y
comienza con (Socios comerciales/Código de tarjeta, 'c00')
resultados en:
"[Link]": "$metadata#Colección([Link])",
"valor" : [
"Compañeros de negocio" : {
"Código de tarjeta": "c002"
},
"Pedidos" : {
"EntradaDocumento" : 3,
"DocNum" : 2
},
"Compañeros de negocio" : {
"Código de tarjeta": "c001"
},
"Pedidos" : {
"DocEntrada": 2,
"DocNum": 1
},
"Compañeros de negocio" : {
"Código de tarjeta": "c001"
},
"Pedidos" : {
"DocEntrada": 5,
"DocNum" : 3
El SQL equivalente en la base de datos es:
"SELECCIONE T0."DocEntry", T0."DocNum", T1."CardCode" FROM "ORDR" T0 ,"OCRD" T1 DONDE
T0."CódigoTarjeta" = T1."CódigoTarjeta" Y T0."NúmeroDocumento" <= 3 Y T1."CódigoTarjeta" Como 'c00%'
PÚBLICO Trabajar con la capa de servicio de SAP Business One
44 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
Expansión en más entidades La capa de
servicio también admite la expansión en más entidades. Una solicitud como la siguiente,
CONSEGUIR
/b1s/v1/$crossjoin(Pedidos,Socios comerciales,Actividades)?$expand=Pedidos($select=DocEntry
DocNum), BusinessPartners($select=CardCode),Activities($select=ActivityCode)&$filter=Pedidos/CardCode eq BusinessPartners/CardCode y BusinessPartners/
CardCode eq
Actividades/CódigoTarjeta
resultados en:
"[Link]": "$metadata#Colección([Link])",
"valor" : [
"Actividades" : {
"Código de actividad": 1
},
"Compañeros de negocio" : {
"Código de tarjeta": "c001"
},
"Pedidos" : {
"DocEntrada": 2,
"DocNum": 1
},
"Actividades" : {
"Código de actividad": 1
},
"Compañeros de negocio" : {
"Código de tarjeta": "c001"
},
"Pedidos" : {
"DocEntrada": 5,
"DocNum" : 3
},
"Actividades" : {
"Código de actividad": 1
},
"Compañeros de negocio" : {
"Código de tarjeta": "c001"
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 45
Machine Translated by Google
},
"Pedidos" : {
"EntradaDocumento" : 6,
"DocNum" : 4
El SQL equivalente en la base de datos es:
SELECCIONE T0."DocEntry", T0."DocNum", T1."CardCode", T1."CardName", T2."ClgCode" DESDE
"ORDEN" T0 , "OCRD" T1, "OCLG" T2 DONDE T0."CódigoTarjeta" = T1."CódigoTarjeta" Y
T1."CódigoTarjeta" = T2."CódigoTarjeta"
Más ejemplos
CONSEGUIR
/b1s/v1/$crossjoin(SalesOpportunities,BusinessPartners)?$expand=SalesOpportunities($se lect=CardCode,CustomerName,StartDate),BusinessPartners($select=EmailAddress,
CardName)&$filter=SalesOpportunities/StartDate le '20170920' y
Socios comerciales/Código de tarjeta eq Oportunidades de venta/Código de tarjeta
"[Link]": "$metadata#Colección([Link])",
"valor": [
"Oportunidades de Venta": {
"CódigoTarjeta": "c2",
"NombreCliente": "cliente c22",
"Fecha de inicio": 2017092
},
"Compañeros de negocio": {
"Dirección de correo electrónico": nulo,
"CardName": "cliente c22"
},
"Oportunidades de Venta": {
"CódigoTarjeta": "c1",
"NombreCliente": "cliente c11",
"Fecha de inicio": 2017092
},
"Compañeros de negocio": {
PÚBLICO Trabajar con la capa de servicio de SAP Business One
46 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
"Dirección de correo electrónico": nulo,
"CardName": "cliente c11"
[Link] Uniones cruzadas con cálculo
Service Layer le permite realizar operaciones aritméticas simples en las propiedades seleccionadas y las condiciones de filtrado.
Las operaciones admitidas incluyen:
• añadir
• sub
yo tengo
• división
Por ejemplo, una solicitud como la siguiente,
/b1s/v1/$crossjoin(Orders,BusinessPartners)?$expand=Orders($select=DocEntry mul (DocNum sub 1) as DocSeq),BusinessPartners($select=CardCode,
CardName)&$filter=Orders/CardCode eq BusinessPartners /CardCode and Orders/DocEntry ge Orders/DocNum sub
resultados en:
"[Link]": "$metadata#Colección([Link])",
"valor" : [
"Compañeros de negocio" : {
"Código de tarjeta": "c001",
"Nombre de la tarjeta": nulo
},
"Pedidos" : {
"DocSeq": 0
},
"Compañeros de negocio" : {
"Código de tarjeta": "c002",
"Nombre de la tarjeta": nulo
},
"Pedidos" : {
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 47
Machine Translated by Google
"DocSeq": 3
},
"Compañeros de negocio" : {
"Código de tarjeta": "c001",
"Nombre de la tarjeta": nulo
},
"Pedidos" : {
"DocSeq": 18
El SQL equivalente en la base de datos es:
SELECCIONE T0."DocEntry" * (T0."DocNum" 1) AS "DocSeq", T1."CardCode", T1."CardName"
DESDE "ORDR" A0 , "OCRD" T1 DONDE T0."CódigoTarjeta" = T1."CódigoTarjeta" Y T0."EntradaDoc"
>= T0."DocNum" 3
[Link] Uniones cruzadas con agregación
Para agregar las propiedades de Pedidos y BusinessPartners, envíe la siguiente solicitud:
/b1s/v1/$crossjoin(Pedidos,Socios comerciales)?$apply=filter(Pedidos/CódigoTarjeta eq Socios comerciales/CódigoTarjeta)/groupby((Socios
comerciales/CódigoTarjeta, Pedidos/EntradaDocumento),agregar(Pedidos(NúmeroDocumento with countdistinct as
DistinctDocNum)) )
En caso de éxito, el servidor responde esto:
"[Link]": "$metadata#Colección([Link])",
"valor" : [
"Compañeros de negocio" : {
"Código de tarjeta": "c001"
},
"Pedidos" : {
"DistinctDocNum": 1,
"EntradaDocumento" : 2
},
PÚBLICO Trabajar con la capa de servicio de SAP Business One
48 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
"Compañeros de negocio" : {
"Código de tarjeta": "c002"
},
"Pedidos" : {
"DistinctDocNum": 1,
"EntradaDocumento" : 3
},
"Compañeros de negocio" : {
"Código de tarjeta": "c001"
},
"Pedidos" : {
"DistinctDocNum": 1,
"EntradaDocumento" : 5
El SQL equivalente en la base de datos es:
SELECCIONE T1."CódigoTarjeta", T0."EntradaDocumento", CONTAR(DISTINCT T0."DocNum") COMO "DistinctDocNum"
DESDE "ORDR" A0 , "OCRD" T1 DONDE T0."CódigoTarjeta" = T1."CódigoTarjeta" GROUP BY
T1."CódigoTarjeta", T0."EntradaDocumento"
Ejemplos de max
GET /b1s/v1/$crossjoin(Pedidos,BusinessPartners)?$apply=filter(Pedidos/CardCode eq BusinessPartners/CardCode)/
groupby((BusinessPartners/CardCode),agregate(Pedidos(DocNum con max como MaxDocNum)))
es equivalente a:
SELECCIONE T1."CódigoTarjeta", MAX(T0."DocNum") COMO "MaxDocNum" DESDE "ORDR" T0 , "OCRD" T1 DONDE
T0."CódigoTarjeta" = T1."CódigoTarjeta" GRUPO POR T1."CódigoTarjeta"
Ejemplos de contar
GET /b1s/v1/$crossjoin(Pedidos,Socios comerciales)?$apply=filter(Pedidos/CódigoTarjeta eq Socios comerciales/CódigoTarjeta)/
groupby((Socios comerciales/CódigoTarjeta),agregar(Pedidos/$contar como CountDocEntry))
es equivalente a:
SELECCIONE T1."CódigoTarjeta", COUNT(T0."DocEntry") COMO "CountDocEntry" DESDE "ORDR" T0 , "OCRD"
T1 DONDE T0."CódigoTarjeta" = T1."CódigoTarjeta" GRUPO POR T1."CódigoTarjeta"
Nota
Simplemente cruzar entidades de unión sin ninguna opción de consulta no funcionaría, ya que esto rara vez tiene un uso práctico y
obtendría grandes volúmenes de datos en condiciones extremas. Por ejemplo, una solicitud como la siguiente,
/b1s/v1/$crossjoin(Pedidos,Socios comerciales)
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 49
Machine Translated by Google
resultados en:
"error": {
"código": 1000,
"mensaje": {
"lang": "eses",
"value": "consulta $crossjoin no válida"
3.7.10 Filtro de nivel de fila
A partir de SAP Business One 9.2 PL11, versión para SAP HANA, Service Layer le permite realizar un filtrado a nivel de línea (por ejemplo,
filtrado de línea de documento).
Para cumplir completamente con OData, Service Layer expone un nuevo servicio de consulta para el filtro de nivel de fila, que se
implementa en función de las capacidades de $crossjoin separando QueryPath y QueryOption en la URL de consulta.
[Link] Metadatos para el servicio de consulta
Query Service se expone a la manera de FunctionImport de la siguiente manera:
<Importación de funciones Name="QueryService_PostQuery" ReturnType="[Link]" m:HttpMethod="POST">
<Parameter Name="QueryOption" Type="[Link]"/>
<Parameter Name="QueryPath" Type="[Link]"/>
</Importación de funciones>
[Link] Ejemplos para el servicio de consultas
Filtro al unir el encabezado del documento y la línea del documento
Una solicitud como la siguiente,
POST /b1s/v1/QueryService_PostQuery
"QueryPath": "$crossjoin(Pedidos,Pedidos/Líneas de Documento)",
"QueryOption": "$expand=Pedidos($select=DocEntry,
DocNum),Pedidos/DocumentLines($select=ItemCode,LineNum)&$filter=Pedidos/DocEntry eq
PÚBLICO Trabajar con la capa de servicio de SAP Business One
50 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
Pedidos/Líneas de documento/Entrada de documento y Pedidos/Entrada de documento ge 3 y
Pedidos/Líneas de documento/Número de línea eq 0"
resultados en:
"[Link]": "$metadata#Colección([Link])",
"valor" : [
"Pedidos" : {
"DocEntrada" : 9,
"Número de documento": 5
},
"Órdenes/Líneas de Documento" : {
"Código de artículo": "i1",
"Número de línea": 0
},
"Pedidos" : {
"DocEntrada": 12,
"Número de documento": 6
},
"Órdenes/Líneas de Documento" : {
"Código de artículo": "i1",
"Número de línea": 0
},
...
"Pedidos" : {
"DocEntrada": 20,
"DocNum": 12
},
"Órdenes/Líneas de Documento" : {
"Código de artículo": "i1",
"Número de línea": 0
},
"Pedidos" : {
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 51
Machine Translated by Google
"DocEntrada" : 44,
"DocNum": 22
},
"Órdenes/Líneas de Documento" : {
"Código de artículo": "i1",
"Número de línea": 0
Filtrar al unir el encabezado del documento y la línea del documento con paréntesis
Una solicitud como la siguiente,
POST /b1s/v1/QueryService_PostQuery
"QueryPath": "$crossjoin(Pedidos,Pedidos/Líneas de Documento)",
"QueryOption": "$expand=Pedidos($select=DocEntry,
DocNum),Pedidos/DocumentLines($select=ItemCode,LineNum)&$filter=Pedidos/DocEntry eq
Pedidos/Líneas de documento/Entrada de documento y (Pedidos/Líneas de documento/Número de línea eq 0 o
Orders/DocumentLines/LineNum eq 1 or Orders/DocumentLines/LineNum eq 2)"
resultados en:
"[Link]": "$metadata#Colección([Link])",
"valor" : [
"Pedidos" : {
"DocEntrada" : 9,
"Número de documento": 5
},
"Órdenes/Líneas de Documento" : {
"Código de artículo": "i1",
"Número de línea": 0
},
"Pedidos" : {
"EntradaDocumento" : 3,
"DocNum": 1
PÚBLICO Trabajar con la capa de servicio de SAP Business One
52 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
},
"Órdenes/Líneas de Documento" : {
"Código de artículo": "i1",
"Número de línea": 0
},
...
"Pedidos" : {
"DocEntrada": 28,
"DocNum": 17
},
"Órdenes/Líneas de Documento" : {
"Código de artículo": "i2",
"Número de línea": 1
},
"Pedidos" : {
"DocEntrada" : 44,
"DocNum": 22
},
"Órdenes/Líneas de Documento" : {
"Código de artículo": "i2",
"Número de línea": 1
Nota
La respuesta es una cadena sin formato con la misma estructura que JSON y el tipo de contenido es texto/simple. Algunas bibliotecas
de utilidades JSON se pueden usar para convertir la respuesta en una estructura JSON válida para analizar.
3.7.11 Expandir mejoras de consulta
A partir de SAP Business One 10.0 FP 2105, se ha mejorado la capacidad de consulta de expansión de OData. Puede especificar una
cláusula $select en el $expand.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 53
Machine Translated by Google
[Link] Entidad única
Esta mejora permite que una sola entidad amplíe sus propiedades de navegación. Por ejemplo, envía la siguiente consulta a la capa de servicio:
CONSEGUIR
[Link]
ItemName)&$select=Subject HTTP/1.1
Obtienes la siguiente respuesta:
"@[Link]":
"[Link]
"Socio de negocios": {
"CódigoTarjeta": "c1",
"PersonaContacto": "contacto001"
},
"Artículo": {
"Código del artículo": "i001",
"ItemName": "nombre i001"
},
"Asunto": "asunto1"
Esta consulta tiene las dos variantes siguientes, lo que significa que las siguientes dos consultas producirían el mismo resultado.
• OBTENER
[Link]
ItemName, Asunto HTTP/1.1
• OBTENER
[Link]
Item/ItemCode,
Elemento/Nombre del elemento, Asunto HTTP/1.1
[Link] Entidad de Recaudación
Esta mejora permite que cada entidad de una colección amplíe sus propiedades de navegación. Por ejemplo, envía la siguiente consulta a la capa de servicio:
CONSEGUIR
[Link]
ItemName)&$select=Subject HTTP/1.1
Obtienes la siguiente respuesta:
"@[Link]": "[Link]
"valor": [
PÚBLICO Trabajar con la capa de servicio de SAP Business One
54 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
"Socio de negocios": {
"CódigoTarjeta": "c1",
"PersonaContacto": "contacto001"
},
"Artículo": {
"Código del artículo": "i001",
"ItemName": "nombre i001"
},
"Asunto": "asunto1"
},
"Socio de negocios": {
"CódigoTarjeta": "c1",
"PersonaContacto": "contacto001"
},
"Artículo": {
"Código del artículo": "i001",
"ItemName": "nombre i001"
},
"Asunto": "asunto2"
},
"Socio de negocios": {
"CódigoTarjeta": "c1",
"PersonaContacto": "contacto001"
},
"Artículo": {
"Código del artículo": "i001",
"ItemName": "nombre i001"
},
"Asunto": "asunto3"
Esta consulta tiene las dos variantes siguientes, lo que significa que las dos consultas siguientes producirían los mismos resultados.
• OBTENER
[Link]
Item/ItemName, Asunto HTTP/1.1
• OBTENER
[Link]
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 55
Machine Translated by Google
socio comercial/persona de contacto, socio comercial/código de tarjeta, artículo/código de artículo,
Elemento/Nombre del elemento, Asunto HTTP/1.1
3.8 Exposición de vista de capa semántica de SAP Business One
Semantic Layer View es para SAP Business One, versión solo para SAP HANA.
A partir de SAP Business One 9.3 PL02, versión para SAP HANA, la capa de servicio permite descubrir y exponer automáticamente las vistas de la
capa semántica, que están disponibles al implementar los modelos de SAP HANA en el análisis de SAP Business One con tecnología de SAP HANA. De
esta manera, la Capa Semántica funciona como un servicio web OData que puede ser consumido por clientes que utilizan el protocolo OData.
3.8.1 Despliegue de Vistas
Las vistas de la capa semántica están por encima del servicio analítico de SAP Business One y se dividen en dos categorías: vistas integradas del sistema
y vistas personalizadas.
El autor de la primera categoría generalmente es SAP y puede implementar las vistas siguiendo estos pasos después de instalar Analytic Service:
1. Abra la página de inicio de análisis de SAP Business One. (La URL es básicamente como: https://
databaseserver:40000/Enablement/)
2. Navegue a la pestaña Empresa 3. Haga
clic en el botón Inicializar para iniciar el proceso de inicialización.
Después de la inicialización, las vistas deberían estar disponibles en el paquete de contenido de la instancia actual de SAP HANA en SAP HANA
Studio.
Para la implementación de la vista del cliente, consulte las secciones siguientes.
3.8.2 Ver alcance de exposición
La capa semántica tiene varios tipos de vistas. No todas las vistas son apropiadas para estar en el ámbito de exposición.
• Para las vistas integradas del sistema, solo las vistas que cumplan con todas las condiciones a continuación son elegibles para la exposición:
o Con el tipo de vista de cálculo. o Con el
sufijo Query en su nombre, por ejemplo, SalesOrderDetailQuery, BalanceSheetQuery y
pronto.
• Para las vistas personalizadas, siempre que la vista sea de tipo cálculo, la vista es elegible para exposición.
Todas las vistas aptas no se exponen de forma predeterminada. Para exponerlos, puede realizar manualmente los siguientes pasos:
1. Inicie el cliente SAP Business One.
2. Abra la ventana Gestión de modelos de SAP HANA .
3. Seleccione las vistas y marque la casilla de verificación Exponer de la capa de servicio correspondiente .
PÚBLICO Trabajar con la capa de servicio de SAP Business One
56 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
4. Reinicie la capa de servicio para efectuar los cambios.
3.8.3Ver la versión de OData de exposición
Teniendo en cuenta que la versión 4 de OData es el protocolo más reciente y predominante en el mundo de OData, el servicio de capa
semántica está expuesto en esta versión de forma predeterminada. Otra ventaja que viene con esto es que la implementación de la versión 4
de OData haría posible que el servicio de la capa semántica se integre con aquellos componentes de SAP (p. ej., IDE WEB), que admitieron
o admitirán OData 4.
Mientras tanto, OData 3 también es compatible, pero no es la versión de OData compatible predeterminada. Los clientes deben establecer
el encabezado de solicitud ODataMaxVersion: 3.0 o MaxDataServiceVersion: 3.0 para especificar OData 3.
3.8.4 Raíz de servicio de capa semántica
Para distinguir el servicio de capa semántica de la capa de servicio, la URL raíz de este servicio es /b1s/v1/[Link].
Al acceder con éxito a esta URL, la respuesta es la siguiente:
HTTP/1.1 200 Aceptar
"@[Link]": "[Link]
"valor": [
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 57
Machine Translated by Google
"name": "PurchaseOrderFulfillmentCycleTimeQuery",
"tipo": "Conjunto de entidades",
"url": "PurchaseOrderFulfillmentCycleTimeQuery"
},
"name": "Consulta de análisis de saldo de proveedor",
"tipo": "Conjunto de entidades",
"url": "Consulta de análisis de saldo de proveedor"
},
"name": "ConsultaPrecioPromedioDeCompra",
"tipo": "Conjunto de entidades",
"url": "ConsultaPrecioPromedioDeCompra"
},
...
Nota
@[Link] es una anotación de OData 4.
3.8.5 Metadatos del servicio de capa semántica
La URL de los metadatos del servicio es la siguiente:
OBTENER /b1s/v1/[Link]/$metadatos
Al acceder con éxito a los metadatos, el servicio devuelve:
<?versión xml="1.0" codificación="UTF8"?>
<edmx:Versión Edmx="4.0"
xmlns:edmx="[Link]
<edmx:Servicios de datos>
<Espacio de nombres de esquema="SAPB1"
xmlns="[Link]
<EntityType Name="Precio de Compra PromedioConsulta">
<Clave>
<PropiedadRef Nombre="id__"/>
</Clave>
<Property MaxLength="160" Name="LineDocumentOwner" Nullable="true"
Escriba="[Link]"/>
PÚBLICO Trabajar con la capa de servicio de SAP Business One
58 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
<Property MaxLength="15" Name="PaymentMethodCode" Nullable="true"
Escriba="[Link]"/>
<Nombre de propiedad="FechaDePublicaciónSQL" Nullable="true" Tipo="[Link]"/>
...
<Property Name="id__" Nullable="false" Type="Edm.Int32"/>
</EntityType>
<EntityType Name="OnTimeReceiptStatisticsQuery">
<Clave>
<PropiedadRef Nombre="id__"/>
</Clave>
<Property MaxLength="160" Name="DocumentOwner" Nullable="true"
Escriba="[Link]"/>
<Property Name="NumberOfPurchaseOrder" Nullable="true"
Escriba="Edm.Int32"/>
<Property Name="id__" Nullable="false" Type="Edm.Int32"/>
</EntityType>
<EntityContainer Name="SemanticLayer">
<EntitySet EntityType="[Link]"
Name="PurchaseOrderFulfillmentCycleTimeQuery"/>
...
<EntitySet EntityType="[Link]"
Name="BalanceSheetComparisonQueryParameters">
<NavigationPropertyBinding Path="BalanceSheetComparisonQuery"
Target="BalanceSheetComparisonQuery"/>
</Conjunto de entidades>
...
<EntitySet EntityType="[Link]"
Nombre="KPICashFlowStatementQueryParameters">
<NavigationPropertyBinding Path="KPICashFlowStatementQuery"
Destino="KPICashFlowStatementQuery"/>
</Conjunto de entidades>
</EntityContainer>
</Esquema>
</edmx:Servicios de datos>
</edmx:Edmx>
Nota
Consulte ODataCSDL (Common Schema Definition Language) para obtener más información sobre el formato de
metadatos.
Version="4.0" en los metadatos indica que el servicio expone recursos con OData 4.
Todas las vistas de la capa semántica se exponen como entidades, ya que OData solo permite realizar consultas sobre entidades. Debido
a la especificación de OData, cada entidad debe tener al menos una clave principal. Sin embargo, esto es contradictorio con el hecho de que
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 59
Machine Translated by Google
las vistas no tienen claves desde la perspectiva de la base de datos. Para abordar este problema de manera genérica, se define una
propiedad virtual id__ como la clave de entidad para las vistas típicas, como se ve en el siguiente ejemplo.
<!>Para la vista [Link]/SalesOrderDetailQuery<>
<EntityType Name="SalesOrderDetailQuery">
<Clave>
<PropiedadRef Nombre="id__"/>
</Clave
<Property Name="DocumentNumber" Nullable="true" Type="Edm.Int32"/>
<Property Name="Propietario" Nullable="true" Type="[Link]"/>
<Nombre de la propiedad="Tipo de envío" Nullable="true" Tipo="[Link]"/>
......
<Property Name="DueQuarter" Nullable="true" Type="[Link]"/>
<Property Name="DueMonth" Nullable="true" Type="[Link]"/>
<Nombre de la propiedad="Beneficio brutoLC" Nullable="true" Tipo="[Link]"/>
<Property Name="LineTotalAmountLC" Nullable="true" Type="[Link]"/>
<Property Name="id__" Nullable="false" Type="Edm.Int32"/>
</EntityType>
<EntitySet EntityType="SalesOrderDetailQuery"
Name="ConsultaDetallePedidoVenta"/>
El tipo de entidad y el conjunto de entidades de vista SalesOrderDetailQuery están ambos en el nombre de SalesOrderDetailQuery. No
se necesitan otros metadatos para esta vista. Sin embargo, no todas las vistas son tan simples como eso. Algunas vistas
tienen marcadores de posición, por ejemplo, [Link]/BalanceSheetQuery, como a continuación:
SELECCIONAR DE
"_SYS_BIC"."[Link]/BalanceSheetQuery"('LUGAR DE LUGAR'=('$$P_AddVoucher$$', 'N'), 'LUGAR DE LUGAR'=('$
$P_FinancialPeriod$$','2017' ))"
Para exponer este tipo de vista, solo un tipo de entidad y un conjunto de entidades no son suficientes para expresarlo.
Los marcadores de posición correspondientes también deben exponerse de manera adecuada. Otra característica de esta vista es
que no se puede ejecutar directamente en el estudio SAP HANA. Solo con los parámetros de marcador de posición se puede acceder
a esta vista.
Para hacer frente a esta situación, es sensato separar esta vista en dos tipos de entidades, exponerlas respectivamente y luego
asociarlas con la navegación.
<EntityType Name="BalanceSheetQuery">
<Clave>
<PropiedadRef Nombre="id__"/>
</Clave>
<Property MaxLength="15" Name="AccountCode" Nullable="true"
Escriba="[Link]"/>
<Property MaxLength="20" Name="FinancialPeriodCode" Nullable="true"
Escriba="[Link]"/>
<Property Name="FiscalYear" Nullable="true" Type="Edm.Int16"/>
PÚBLICO Trabajar con la capa de servicio de SAP Business One
60 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
<Property MaxLength="100" Name="AccountName" Nullable="true"
Escriba="[Link]"/>
<Property MaxLength="200" Name="SegmentationAccountCode" Nullable="true"
Escriba="[Link]"/>
<Nombre de la propiedad="FiscalYearOpeningBalanceLC" Nullable="true"
Escriba="[Link]"/>
<Property Name="FiscalYearOpeningBalanceSC" Nullable="true"
Escriba="[Link]"/>
<Nombre de la propiedad="FinancialPeriodClosingBalanceLC" Nullable="true"
Escriba="[Link]"/>
<Nombre de la propiedad="FinancialPeriodClosingBalanceSC" Nullable="true"
Escriba="[Link]"/>
<Property Name="id__" Nullable="false" Type="Edm.Int32"/>
</EntityType>
<EntitySet EntityType="BalanceSheetQuery" Name="BalanceSheetQuery"/>
<EntityType Name="BalanceSheetQueryParameter">
<Clave>
<PropertyRef Name="P_FinancialPeriod"/>
<PropertyRef Name="P_AddVoucher"/>
</Clave>
<Property MaxLength="20" Name="P_FinancialPeriod" Nullable="false"
Escriba="[Link]"/>
<Property DefaultValue="N" MaxLength="1" Name="P_AddVoucher" Nullable="false"
Escriba="[Link]"/>
<NavigationProperty Name="BalanceSheetQuery"
Socio="BalanceSheetQueryParameters" Type="Colección([Link])"/>
</EntityType>
<EntitySet EntityType="[Link]"
Name="BalanceSheetQueryParameters">
<NavigationPropertyBinding Path="BalanceSheetQuery"
Target="BalanceSheetQuery"/>
</Conjunto de entidades>
De esta forma, se puede navegar por BalanceSheetQuery desde BalanceSheetQueryParameters con marcadores de posición de la
siguiente manera.
CONSEGUIR
/b1s/v1/[Link]/BalanceSheetQueryParameters(P_FinancialPeriod='2017',P_AddVoucher='N')
/BalanceSheetQuery
Nota
NavigationPropertyBinding, Path y Target son tres atributos introducidos en la versión 4 de OData para describir las
propiedades de navegación de un conjunto de entidades.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 61
Machine Translated by Google
Acceder directamente a BalanceSheetQuery y BalanceSheetQueryParameters sin claves daría como resultado
error.
3.8.6 Autorización de vista de capa semántica
Para los formularios de SAP Business One, solo los usuarios autorizados tienen el privilegio de acceder a las vistas correspondientes.
De forma predeterminada, un usuario normal no tiene permiso para acceder a las vistas. Intentar acceder resultaría en una falla.
Por ejemplo, inicie sesión en Service Layer con un usuario normal (por ejemplo, user1) y luego envíe una solicitud para recuperar
BalanceSheetQuery.
CONSEGUIR
/b1s/v1/[Link]/BalanceSheetQueryParameters(P_FinancialPeriod='2017',P_AddVoucher='N')
/BalanceSheetQuery
Servicio de devoluciones:
HTTP/1.1 401 no autorizado
"error": {
"código": 1,
"mensaje": {
"lang": "eses",
"value": "No hay permiso para acceder a esta vista 'BalanceSheetQuery' para el
usuario actual 'usuario1'"
Para otorgar el permiso de visualización a un usuario normal, inicie sesión en el cliente SAP Business One con el superusuario y luego abra la
ventana Autorizaciones generales desde Inicialización del sistema > Autorizaciones.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
62 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
Nota
Los superusuarios tienen permiso para acceder a todas las vistas expuestas.
La autorización actualizada para el usuario normal no entraría en vigor inmediatamente. Para obtener los datos más recientes, cierre sesión
y vuelva a iniciar sesión en el servicio o simplemente reinicie el servicio.
3.8.7 Consulta de vista de capa semántica
El servicio de capa semántica le permite realizar consultas OData básicas en vistas expuestas, lo que hace posible que se use en algunos
escenarios flexibles.
Suponga que todas las consultas se realizan en el esquema SBODEMOUS.
[Link] Obtener todos los registros desde la vista
OBTENER /b1s/v1/[Link]/AveragePurchasingPriceQuery
es equivalente a
SELECCIONAR * , número_fila() sobre() como "id__" DESDE
"_SYS_BIC"."[Link]/AveragePurchasingPriceQuery" T0 En caso de éxito, la respuesta es la
siguiente:
HTTP/1.1 200 Aceptar
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 63
Machine Translated by Google
"@[Link]":
"[Link]
"valor": [
...
"Importe de compraLC": 5000,
"CompraCantidadEnInventarioUdM": 100,
"PrecioUnitario PromedioLC": 50,
"id__": 1
},
...
"Importe de compraLC": 2000,
"CompraCantidadEnInventarioUdM": 10,
"PrecioUnitario PromedioLC": 200,
"id__": 2
},
...
[Link] Vista de consulta con opciones de consulta
El servicio de capa semántica le permite recuperar datos con combinaciones de opciones de consulta.
Por ejemplo, envíe la siguiente solicitud al servicio:
CONSEGUIR
/b1s/v1/[Link]/AveragePurchasingPriceQuery?$select=Año de publicación, Código de socio comercial&$s kip=1&$filter=Año de publicación eq '2017' y
comienza con (Código de socio comercial, '1')&$orderby=Año de publicación
En caso de éxito, la respuesta es la siguiente:
HTTP/1.1 200 Aceptar
"@[Link]":
"[Link]
"valor": [
"AñoPublicación": "2017",
"Código de socio comercial": "1071287676"
PÚBLICO Trabajar con la capa de servicio de SAP Business One
64 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
},
"AñoPublicación": "2017",
"Código de socio comercial": "1100270398"
},
"AñoPublicación": "2017",
"Código de socio comercial": "124052273"
},
"AñoPublicación": "2017",
"Código de socio comercial": "1785286082"
[Link] Consulta de vista por clave
Como se mencionó anteriormente, la propiedad virtual id__ se creó solo para cumplir con las especificaciones de OData. A pesar de que su funcionamiento
es similar al de una llave, solo permite realizar algunas consultas sencillas.
Obtener una línea por clave de entidad
GET /b1s/v1/[Link]/PromedioPrecioDeCompraConsulta(1)
es equivalente a
SELECCIONAR * , número_fila() sobre() como "__RowNum__" DESDE
"_SYS_BIC"."[Link]/Item" T0 LÍMITE 1 DESPLAZAMIENTO 1
En caso de éxito, la respuesta es la siguiente:
HTTP/1.1 200 Aceptar
"@[Link]":
"[Link]
"DueDateSQL": "20170516",
"FechaDocumento": "20170516",
"AñoDocumento": "2017",
...
"CuartoDocumento": "T2",
"DocumentoMes": "05",
"Administrador": "NULL",
Trabajar con la capa de servicio de SAP Business One PÚBLICO
"Importe de compraLC": 5000,
"CompraCantidadEnInventarioUdM": 100,
"PrecioUnitario PromedioLC": 50,
"id__": 1
Obtener propiedades por clave de entidad
CONSEGUIR
/b1s/v1/[Link]/PromedioPrecioCompraConsulta(1)?$select=AñoPublicación,CódigoSocioEmpresarial
En caso de éxito, la respuesta es la siguiente:
HTTP/1.1 200 Aceptar
"@[Link]":
"https//databaseserver:50000/b1s/v1/[Link]/$metadata#AveragePurchasingPriceQuery/$ent ity",
"AñoPublicación": "2017",
"NegocioPartnerCode": "d3fb9f1c72a04"
Obtener entidad de parámetro por clave de
entidad Solo se permite acceder a una entidad que termina en Parámetro mediante clave. Por ejemplo, envíe una solicitud de la siguiente manera:
/b1s/v1/[Link]/BalanceSheetQueryParameters(P_FinancialPeriod='2017',P_AddVoucher='N')
En caso de éxito, la respuesta es la siguiente:
HTTP/1.1 200 Aceptar
"@[Link]":
"[Link]
"P_AddVoucher": "N",
"P_FinancialPeriod": "2017"
Recuperarlo sin especificar una clave de entidad da como resultado el siguiente mensaje de error:
HTTP/1.1 400 Solicitud incorrecta
"error": {
"código": 1,
"mensaje": {
"lang": "eses",
"value": "No se permite acceder directamente a los parámetros de vista".
PÚBLICO Trabajar con la capa de servicio de SAP Business One
66 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
Nota
Existen algunas limitaciones de consulta innatas en la propiedad virtual id__. No dependa en exceso de él para realizar consultas complicadas.
[Link] Vista de consulta con marcadores de posición
Una vista con marcadores de posición se consulta navegando desde su entidad de parámetro correspondiente.
Por ejemplo, para consultar BalanceSheetQuery, debe navegar desde BalanceSheetQueryParameters de la siguiente manera:
CONSEGUIR
/b1s/v1/[Link]/BalanceSheetQueryParameters(P_FinancialPeriod='2017',P_AddVoucher='N')
/BalanceSheetQuery?$select=FiscalYear, AccountCode
que es equivalente a
SELECCIONE Año fiscal, Código de cuenta DESDE
"_SYS_BIC"."[Link]/BalanceSheetQuery"('MARCADOR'=('$$P_AddVoucher$$', 'N'),'MARCADOR'=('$$P_FinancialPeriod$$','2016' ))
En caso de éxito, la respuesta es la siguiente:
HTTP/1.1 200 Aceptar
"@[Link]":
"[Link]
"valor": [
"Año fiscal": 2017,
"CódigoCuenta": "_SYS00000000049"
},
"Año fiscal": 2017,
"CódigoCuenta": "_SYS00000000009"
},
...
"Año fiscal": 2017,
"CódigoCuenta": "_SYS00000000029"
],
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 67
Machine Translated by Google
"@[Link]":
"BalanceSheetQueryParameters(P_FinancialPeriod='2017',P_AddVoucher='N')/BalanceSheetQuery?$select=FiscalYear,%20AccountCode&$skip=20"
Además, la consulta por clave también es compatible con las vistas de marcador de posición.
CONSEGUIR
/b1s/v1/[Link]/BalanceSheetQueryParameters(P_FinancialPeriod='2017',P_AddVoucher='N')
/BalanceSheetQuery(1)
CONSEGUIR
/b1s/v1/[Link]/BalanceSheetQueryParameters(P_FinancialPeriod='2017',P_AddVoucher='N')
/BalanceSheetQuery(1)?$select=FiscalYear, AccountCode
Nota
@[Link] es el literal de anotación de paginación en la versión 4 de OData.
[Link] Vista de consulta con agregación
En SAP HANA Studio, puede obtener una vista previa de los datos de la vista de consulta desde múltiples dimensiones, como se muestra en la
siguiente captura de pantalla:
La grilla producida es la siguiente:
PÚBLICO Trabajar con la capa de servicio de SAP Business One
68 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
2017 10 2 50
El SQL equivalente para esto es:
SELECCIONE "Año de publicación", "Mes de publicación", COUNT(*) AS "ItemCode_COUNT",
SUM("PrecioUnitarioPromedioLC") AS "PrecioUnitarioPromedioLC_SUM"
DESDE "_SYS_BIC"."[Link]/AveragePurchasingPriceQuery"
GRUPO POR "AñoPublicación", "MesPublicación"
ORDENAR POR "AñoPublicación" ASC, "MesPublicación" ASC
Para simular esto en el servicio de capa semántica, envíe una solicitud de la siguiente manera:
GET /b1s/v1/[Link]/AveragePurchasingPriceQuery?$apply=groupby((PostingYear, PostingMonth), added($count as
ItemCode_COUNT, AverageUnitPriceLC with sum as AverageUnitPriceLC_SUM))&$orderby=PostingYear asc,PostingMonth asc
En caso de éxito, la respuesta es la siguiente:
HTTP/1.1 200 Aceptar
"@[Link]":
"$metadata#AveragePurchasingPriceQuery(PostingYear,PostingMonth,ItemCode_COUNT,Promedio
PrecioUnitarioLC_SUM)",
"valor": [
"AñoPublicación": "2017",
"MesPublicación": "10",
"ItemCode_COUNT": 2,
"PrecioUnitario PromedioLC_SUM": 50
}
Desde esta perspectiva, para un escenario de agregación simple, el servicio de capa semántica es capaz de producir un resultado
similar al que produce SAP HANA Studio. Sin embargo, esto no significa que el servicio sea funcionalmente completamente equivalente a
SAP HANA Studio. Las capacidades de agregación de servicios podrían mejorarse gradualmente en parches posteriores.
Otros ejemplos
Para consultar el número de registros de una vista (por ejemplo, AveragePurchasingPriceQuery), simplemente agregue la palabra
clave $count de la siguiente manera:
OBTENER /b1s/v1/[Link]/Precio de Compra PromedioConsulta/$count
En caso de éxito, la respuesta es la siguiente:
HTTP/1.1 200 Aceptar
14
El $count también se puede aplicar a las vistas con marcadores de posición, visto en los siguientes ejemplos:
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 69
Machine Translated by Google
CONSEGUIR
/b1s/v1/[Link]/ItemRecommendationQueryParameters(CurrentUserCode=1)/ItemRecommendatio nQuery/$count
CONSEGUIR
/b1s/v1/[Link]/BalanceSheetQueryParameters(P_FinancialPeriod='2017',P_AddVoucher='N')
/BalanceSheetQuery/$recuento
3.8.8 Exposición de vistas personalizadas
Además de las vistas integradas del sistema, las vistas diseñadas por el cliente también se pueden exponer como servicio OData.
Para lograr esto, primero use la última herramienta de paquete de modelo de SAP HANA para generar un paquete de modelo comprimido después
de exportar los modelos de SAP HANA diseñados desde SAP HANA Studio. En cuanto a cómo descargar y utilizar esta herramienta, consulte la Nota
SAP 2008991 o este blog.
En comparación con las versiones anteriores, en SAP HANA Model Packaging Wizard para SAP Business One, se agrega una columna denominada
Habilitar para la capa de servicio con el tipo de casilla de verificación que se muestra a continuación:
PÚBLICO Trabajar con la capa de servicio de SAP Business One
70 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
Para esta columna recién introducida, los comportamientos se describen de la siguiente manera:
• Está deshabilitado para todas las vistas, excepto las vistas con tipo de cálculo.
• El valor predeterminado está desmarcado.
• Si está marcado, se agrega un nuevo parámetro SLEnable="Y" al archivo de información del modelo SAP HANA [Link]. • La herramienta
de empaquetado de la nueva versión es compatible con las vistas exportadas de la versión anterior.
<Nombre del modelo="xxxx" type="CalculationView" menu="mymenu" IAEnable="N" SLEnable="Y"
SLExponer="Y" />
• Si SLEnable = "N" o no hay etiqueta SLEnable en [Link], las vistas correspondientes deben deshabilitarse en la ventana de SAP HANA Model
Management .
Una vez que el paquete del modelo esté listo, abra la ventana SAP HANA Model Management en el cliente de SAP Business One, importe el
paquete y haga clic en el botón Implementar para iniciar el proceso de implementación de la siguiente manera:
Nota
o Las vistas personalizadas no pueden tener el mismo nombre que la vista integrada del sistema, incluso con una ruta de paquete
diferente. De lo contrario, el servicio responderá con un error.
o Asimismo, el mecanismo de autorización también se puede aplicar a las vistas personalizadas. o Una
funcionalidad significativa de exponer vistas personalizadas es proporcionar una alternativa a la
RecordSet en DI API, que no se permite exponer en Service Layer por consideraciones de seguridad y compatibilidad.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 71
Machine Translated by Google
3.8.9 Consulta de vistas personalizadas
Del mismo modo, todas las consultas admitidas en las vistas integradas del sistema también se pueden realizar en vistas personalizadas. Vea los
siguientes ejemplos:
Obtener todos los registros de la vista
OBTENGA [Link]
Consultar un registro desde la vista
OBTENER OBTENER [Link]
Obtener datos con proyección, filtrar y ordenar por
OBTENGA [Link]
'FA10004'&$orderby=ItemCode desc,ItemGroup
Obtener datos con agregación
OBTENGA [Link]
OBTENER [Link]
como MaxItemCode))
3.8.10 Autenticación básica de la capa semántica
La capa semántica le permite acceder a las vistas a través de la autenticación básica en los navegadores. Para obtener más
información, consulte [Link]
Sin embargo, la autenticación básica solo le permite ingresar el nombre de usuario y la contraseña. No hay un tercer cuadro de entrada para la base de
datos de la empresa.
Para solucionar este problema, la solución combina el nombre de usuario de SAP Business One y la base de datos de la empresa en un formato JSON
como nombre de usuario para la autenticación básica.
Por ejemplo, para el navegador Microsoft Edge, inicie sesión de la siguiente manera:
PÚBLICO Trabajar con la capa de servicio de SAP Business One
72 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
Nota
La autenticación básica es otro mecanismo de inicio de sesión solo para el servicio de capa semántica. No se permite reutilizar
la sesión autenticada para acceder a los recursos de la capa de servicio (por ejemplo, socios comerciales,
pedidos).
3.9 Exposición de vista SQL
A partir de SAP Business One 10.0 PL02, Service Layer en Microsoft SQL Server puede descubrir y exponer automáticamente las vistas SQL
personalizadas regulares en el protocolo OData V3/V4.
3.9.1 Crear vista
Abra SQL Server Management Studio, cree una vista (por ejemplo, B1_ItemPriceB1SLQuery) en la base de datos de la empresa (por
ejemplo, SBODEMOUS) de la siguiente manera:
USAR [SBODEMOUS]
IR
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 73
Machine Translated by Google
/****** Objeto: Ver [dbo].[B1_ItemPriceB1SLQuery] Fecha del script:
13/12/2019 [Link] ******/
ESTABLECER ANSI_NULLS EN
IR
ESTABLECER QUOTED_IDENTIFIER EN
IR
CREAR VISTA [dbo].[B1_ItemPriceB1SLQuery] COMO
SELECCIONE T0.[Código de artículo], T0.[Lista de precios], T0.[Entrada de unidad], T0.[Precio], T0.[Moneda], T0.[Tipo de precio]
DESDE [dbo].[ITM1] T0
UNIÓN TODOS
SELECCIONE T0.[Código de artículo], T0.[Lista de precios], T0.[Entrada de unidad], T0.[Precio], T0.[Moneda], T0.[Tipo de precio]
DESDE [dbo].[ITM9] T0
IR
Nota
Para garantizar que la vista sea reconocida por Service Layer, debe cumplir con los siguientes requisitos:
o Asegúrese de que la vista esté bajo el esquema dbo.
o Asegúrese de que el nombre de la vista termine con B1SLQuery.
3.9.2Exponer vista
De forma predeterminada, las vistas personalizadas no se exponen en la capa de servicio. Para exponer vistas personalizadas, Service Layer trae
una nueva entidad SQLViews para ayudar a lograr esto.
Por ejemplo, publique la siguiente solicitud sin ninguna carga útil para exponer B1_ItemPriceB1SLQuery:
POST /b1s/v1/SQLViews('B1_ItemPriceB1SLQuery')/Exponer
En caso de éxito, el servicio no devuelve contenido con el código de respuesta 204.
Para cancelar la exposición, pruebe el comando Unexpose de SQLViews:
POST /b1s/v1/SQLViews('B1_ItemPriceB1SLQuery')/Desexponer
En un entorno práctico, exponer las vistas una por una puede llevar mucho tiempo. Para manipular todas las vistas a la vez, use el asterisco
*
para representar a todos:
POST /b1s/v1/SQLViews('*')/Exponer
POST /b1s/v1/SQLViews('*')/Desexponer
Dado que se expone como una entidad, puede consultar las propiedades básicas de la vista de la siguiente manera:
OBTENER /b1s/v1/SQLViews('B1_ItemPriceB1SLQuery')
PÚBLICO Trabajar con la capa de servicio de SAP Business One
74 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
En caso de éxito, la respuesta es como:
HTTP/1.1 200 Aceptar
"una [Link]":
"[Link]
"Nombre": "B1_ItemPriceB1SLQuery",
"TipoDB": "MSSQL",
"NombreEsquema": "dbo",
"Fecha de creación": "20200214"
Y aquí están los metadatos relevantes:
<EntityType Name="SQLView">
<Clave>
<PropiedadRef Nombre="Nombre"/>
</Clave>
<Property Name="Name" Nullable="false" Type="[Link]"/>
<Nombre de propiedad="TipoDB" Tipo="[Link]"/>
<Nombre de propiedad="NombreEsquema" Tipo="[Link]"/>
<Property Name="CreateDate" Type="[Link]"/>
</EntityType>
<EntitySet EntityType="[Link]" Name="SQLViews"/>
<FunctionImport IsBindable="true" Name="Exponer" m:HttpMethod="POST">
<Parameter Name="SQLViewParams" Type="[Link]"/>
</Importación de funciones>
<FunctionImport IsBindable="true" Name="Unexpose" m:HttpMethod="POST">
<Parameter Name="SQLViewParams" Type="[Link]"/>
</Importación de funciones>
3.9.3 Ver punto final de servicio
Al igual que en el servicio de la capa semántica, se utiliza un punto final único para el servicio de visualización, como se muestra a continuación:
OBTENER /b1s/v1/[Link]
Para recuperar los metadatos, agregue $metadata al punto final:
OBTENER /b1s/v1/[Link]/$metadatos
En caso de éxito, el servicio devuelve:
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 75
Machine Translated by Google
<?versión xml="1.0" codificación="UTF8"?>
<edmx:Edmx Versión="1.0" xmlns:edmx="[Link]
<edmx:Servicios de datos m:Versión del servicio de datos="3.0"
m:MaxDataServiceVersion="3.0"
xmlns:m="[Link]
<Espacio de nombres de esquema="SAPB1" xmlns="[Link]
<EntityType Name="B1_ItemPriceB1SLQuery">
<Clave>
<PropiedadRef Nombre="id__"/>
</Clave>
<Property MaxLength="100" Name="ItemCode" Nullable="false" Type="[Link]"/>
<Property Name="PriceList" Nullable="false" Type="Edm.Int16"/>
<Nombre de propiedad="UomEntry" Nullable="true" Type="Edm.Int32"/>
<Property Name="Precio" Nullable="true" Precision="19" Scale="6" Type="[Link]"/>
<Property MaxLength="6" Name="Currency" Nullable="true" Type="[Link]"/>
<Property MaxLength="1" Name="PriceType" Nullable="true" Type="[Link]"/>
<Property Name="id__" Nullable="false" Type="Edm.Int32"/>
</EntityType>
<EntityContainer Name="B1SView">
<EntitySet EntityType="SAPB1.B1_ItemPriceB1SLQuery" Name="B1_ItemPriceB1SLQuery"/>
</EntityContainer>
</Esquema>
</edmx:Servicios de datos>
</edmx:Edmx>
El servicio de visualización también es compatible con OData V4. Estas son las URL de V4 para el punto final y los metadatos,
respectivamente.
OBTENER /b1s/v2/[Link]
OBTENER /b1s/v2/[Link]/$metadatos
Nota
o Consulte ODataCSDL (Common Schema Definition Language) para obtener más información sobre el
formato de metadatos.
o Todas las vistas se exponen como entidades, ya que OData solo permite realizar consultas sobre entidades. Debido a la
Especificación de OData, cada entidad debe tener al menos una clave principal. Sin embargo, esto es contradictorio con
el hecho de que las vistas no tienen claves desde la perspectiva de la base de datos. Para abordar este problema de manera
genérica, se define una propiedad virtual id__ como la clave de entidad para las vistas típicas, como se ve desde la
última propiedad del tipo de entidad en los metadatos.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
76 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
3.9.4 Vista de consulta
El servicio de visualización le permite realizar consultas OData básicas en vistas expuestas, lo que resulta útil en algunos escenarios
flexibles.
Nota
Todos los siguientes ejemplos utilizan OData V3 para demostrar cómo realizar la consulta de vista. También se puede aplicar OData
V4.
[Link] Vista de consulta por clave
Como se mencionó anteriormente, la propiedad virtual id__ se crea solo para cumplir con la especificación de OData. A pesar de que
funciona de forma similar a una tecla, solo permite realizar algunas consultas sencillas.
[Obtener una línea por clave de entidad]
La solicitud a continuación
OBTENER /b1s/v1/[Link]/B1_ItemPriceB1SLQuery(1)
es equivalente a
[Moneda] , T0.[TipoPrecio] , número_fila() SOBRE (ordenar por getdate()) como
[id__] DESDE [dbo].[B1_ItemPriceB1SLQuery] A0 PEDIDO POR CURRENT_TIMESTAMP
COMPENSAR 0 FILAS OBTENER LAS SIGUIENTES 1 FILAS SOLO PARA NAVEGAR
En caso de éxito, la respuesta es como:
HTTP/1.1 200 Aceptar
"una [Link]":
"[Link]
"Código del artículo": "i001",
"Lista de Precios": 1,
"EntradaUom": 1,
"Precio": 0,
"Moneda": nulo,
"TipoPrecio": "M",
"id__": 1
}
[Obtener propiedades por clave de entidad]
Solicitud de la siguiente manera:
OBTENER /b1s/v1/[Link]/B1_ItemPriceB1SLQuery(1)?$select=ItemCode,PriceList
En caso de éxito, la respuesta es como:
HTTP/1.1 200 Aceptar
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 77
Machine Translated by Google
"una [Link]":
"[Link]
"Código del artículo": "i001",
"Lista de precios": 1
Nota
o Hay algunas limitaciones de consulta innatas en la propiedad virtual id__. No dependas excesivamente de él.
para realizar consultas complicadas.
o La consulta por clave es solo para cumplir con la especificación OData. No es un caso de usuario típico en una producción.
ambiente.
[Link] Recuperar registros con paginación
Teniendo en cuenta que puede haber cientos de miles de registros que una vista devolvería en un viaje de ida y vuelta, el mecanismo de paginación
está habilitado de forma predeterminada para evitar cualquier problema potencial de carrera de recursos en el lado del servicio.
Por ejemplo, una solicitud como la siguiente
OBTENER /b1s/v1/[Link]/B1_ItemPriceB1SLQuery
da como resultado la siguiente respuesta:
HTTP/1.1 200 Aceptar
"una [Link]":
"[Link]
"valor": [
"Código del artículo": "i001",
"Lista de Precios": 1,
"EntradaUom": 1,
"Precio": 0,
"Moneda": nulo,
"TipoPrecio": "M",
"id__": 1
},
...
"Código del artículo": "i001",
"Lista de Precios": 2,
"EntradaUom": 1,
PÚBLICO Trabajar con la capa de servicio de SAP Business One
78 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
"Precio": 0,
"Moneda": nulo,
"TipoPrecio": "M",
"id__": 20
],
"[Link]": "B1_ItemPriceB1SLQuery?$skip=20"
El tamaño de página predeterminado es 20. Para cambiarlo (por ejemplo, a 40) desde el lado del cliente, agregue una entrada Preferida en el
encabezado de la solicitud:
OBTENER /b1s/v1/[Link]/B1_ItemPriceB1SLQuery
Preferir:[Link]=40
[Link] Consulta de registros con opciones de consulta
El servicio de visualización le permite recuperar datos con combinaciones de opciones de consulta.
Por ejemplo, envíe la siguiente solicitud al servicio:
OBTENER /b1s/v1/[Link]/B1_ItemPriceB1SLQuery?
$select=CódigoArtículo,TipoPrecio&$filter=TipoPrecio eq 'M'
En caso de éxito, la respuesta es como:
HTTP/1.1 200 Aceptar
"una [Link]":
"[Link]
"valor": [
"Código del artículo": "i001",
"TipoPrecio": "M"
},
"Código del artículo": "i001",
"TipoPrecio": "M"
},
"Código del artículo": "i001",
"TipoPrecio": "M"
},
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 79
Machine Translated by Google
"Código del artículo": "i001",
"TipoPrecio": "M"
},
...
"Código del artículo": "i002",
"TipoPrecio": "M"
[Link] Vista de consulta con agregación
Para obtener el número de registro total de B1_ItemPriceB1SLQuery, envíe una solicitud de este tipo:
OBTENER /b1s/v1/[Link]/B1_ItemPriceB1SLQuery/$count
En caso de éxito, la respuesta es como:
HTTP/1.1 200 Aceptar
Tipo de contenido: texto/sin formato; juego de caracteres = utf8;
40
Para obtener el ItemCode máximo de B1_ItemPriceB1SLQuery, envíe una solicitud como:
GET /b1s/v1/[Link]/B1_ItemPriceB1SLQuery?$apply=aggregate(ItemCode con max como MaxItemCode)
En caso de éxito, la respuesta es como:
HTTP/1.1 200 Aceptar
"[Link]": "$metadata#B1_ItemPriceB1SLQuery(MaxItemCode)",
"valor": [
"MaxItemCode": "i002"
El SQL equivalente en Microsoft SQL Server es:
SELECCIONE MAX(T0.[ItemCode]) COMO 'MaxItemCode' DE [dbo].[B1_ItemPriceB1SLQuery] T0
Para realizar una agregación compleja con group by, envíe una solicitud como:
GET /b1s/v1/[Link]/B1_ItemPriceB1SLQuery?$apply=groupby((ItemCode, PriceType), added($count as ItemCode_COUNT, Price
with sum as SumPrice))&$orderby=ItemCode asc,PriceType asc
En caso de éxito, la respuesta es como:
PÚBLICO Trabajar con la capa de servicio de SAP Business One
80 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
HTTP/1.1 200 Aceptar
"una [Link]":
"$metadata#B1_ItemPriceB1SLQuery(ItemCode,PriceType,ItemCode_COUNT,SumPrice)",
"valor": [
"Código del artículo": "i001",
"TipoPrecio": "M",
"ItemCode_COUNT": 10,
"PrecioSuma": 0
},
"Código del artículo": "i002",
"TipoPrecio": "M",
"ItemCode_COUNT": 10,
"PrecioSuma": 0
El SQL equivalente en Microsoft SQL Server es:
SELECCIONE T0.[ItemCode], T0.[PriceType], COUNT(*) AS 'ItemCode_COUNT', SUM(T0.[Price]) AS 'SumPrice' FROM [dbo].
[B1_ItemPriceB1SLQuery] T0 GROUP BY T0.[ItemCode] , T0.[TipoPrecio] ORDENAR POR T0.[CódigoArtículo],T0.
[TipoPrecio] COMPENSACIÓN 0 FILAS BUSCAR LAS PRÓXIMAS 20 FILAS
SOLO PARA NAVEGAR
3.9.5 Autorizar vista
Al igual que en SAP Business One, solo los usuarios autorizados tienen el privilegio de acceder a las vistas correspondientes.
De forma predeterminada, un usuario normal no tiene permiso para acceder a las vistas; intentar hacerlo terminaría en un fracaso.
Por ejemplo, inicie sesión en Service Layer con un usuario normal y luego envíe una solicitud para recuperar B1_ItemPriceB1SLQuery:
GET /b1s/v1/[Link]/B1_ItemPriceB1SLQuery Como se esperaba,
el servicio devuelve:
HTTP/1.1 403 Prohibido
"error" : {
"código": 804,
"mensaje" : {
"lang": "enus",
"value": "Sin permiso para acceder a esta vista
'B1_ItemPriceB1SLQuery' para el usuario actual".
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 81
Machine Translated by Google
Para otorgar el permiso de visualización a un usuario normal, realice lo siguiente: 1. Inicie
sesión en el cliente SAP Business One con un superusuario.
2. Abra la ventana Autorizaciones (Inicialización del sistema >Autorizaciones).
3. Cambie Sin autorización a Autorización completa.
Nota
o Los superusuarios tienen permiso completo para acceder a todas las vistas expuestas.
o Es posible que la autorización actualizada para el usuario normal no surta efecto inmediatamente. Para obtener lo último
datos, espere un momento (por ejemplo, un minuto) para permitir que se actualice el mecanismo de caché de permisos interno.
o La autorización de la vista se restablece a Sin autorización si la vista se actualiza al estado no expuesto.
3.10 Operaciones por lotes
Service Layer admite la ejecución de múltiples operaciones enviadas en una sola solicitud HTTP mediante el uso de procesamiento por lotes. Una solicitud
por lotes debe representarse como un mensaje MIME (Extensiones de correo de Internet multipropósito) de varias partes v1.0.
3.10.1 Método de solicitud por lotes y URI
Utilice siempre el método HTTP POST para enviar una solicitud por lotes. Una solicitud por lotes se envía como una única solicitud HTTP POST al extremo
del lote de un servicio, ubicado en el URI $batch relativo a la raíz del servicio.
POST [Link]
3.10.2 Encabezados de solicitud por lotes
La solicitud por lotes debe contener un encabezado de tipo de contenido que especifique un tipo de contenido de varias partes/mixto y una especificación
de límite como:
Tipo de contenido: multipart/mixed;boundary=<Límite del lote>
La especificación de límites se utiliza en la sección Cuerpo de la solicitud por lotes .
3.10.3 Cuerpo de solicitud de lote
El cuerpo de una solicitud por lotes se compone de una serie de solicitudes individuales y conjuntos de cambios, cada uno representado como una parte MIME
distinta y separados por el límite definido en el encabezado ContentType.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
82 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
<Límite del lote>
<subsolicitud1>
<Límite del lote>
<subsolicitud2>
<Límite del lote>
Tipo de contenido: multipart/mixed;boundary=<Límite del conjunto de cambios>
<Límite del conjunto de cambios>
<subchangesetrequest1>
<Límite del conjunto de cambios>
<subchangesetrequest2>
<Límite del conjunto de cambios>
<Límite del lote>
El servicio procesa las solicitudes dentro de una solicitud por lotes de forma secuencial.
Cada subsolicitud debe incluir un encabezado de tipo de contenido con valor application/http y un encabezado de codificación
de transferencia de contenido con valor binario.
Tipo de contenido: aplicación / http
Codificación de transferencia de contenido: binario
<cuerpo de subsolicitud>
El cuerpo de la subsolicitud incluye el contenido de la solicitud real.
Ejemplo
POST /b1s/v1/Artículos
<Contenido de elementos en formato Json>
OBTENER /b1s/v1/Artículo('i001')
Tenga en cuenta que se necesitan dos líneas vacías después de la línea de solicitud GET. La primera línea vacía es parte
del encabezado de la solicitud GET y la segunda es el cuerpo vacío de la solicitud GET, seguido de un CRLF.
3.10.4 Conjuntos de cambios
Un conjunto de cambios es una unidad atómica de obras. Significa que cualquier subsolicitud fallida en un conjunto de cambios hará que todo
el conjunto de cambios se revierta. Los conjuntos de cambios no deben contener solicitudes GET u otros conjuntos de cambios.
Las solicitudes de conjuntos de cambios secundarios básicamente tienen el mismo formato que las solicitudes secundarias fuera de los conjuntos de
cambios, excepto por una característica adicional: la referencia a Content ID.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 83
Machine Translated by Google
Hacer referencia a Content ID: las nuevas entidades creadas por una solicitud POST dentro de un conjunto de cambios pueden ser
referenciadas por solicitudes posteriores dentro del mismo conjunto de cambios haciendo referencia al valor del encabezado de ContentID
con el prefijo $. Cuando se usa de esta manera, $<ContentID> actúa como un alias para el URI que identifica la nueva entidad.
Ejemplo
Cómo usar el conjunto de cambios con ContentID
1. Crea un pedido.
2. Utilice $<ContentID> para modificar el pedido que acaba de crear.
<Límite del lote>
Tipo de contenido: multipart/mixed;boundary=<Límite del conjunto de cambios>
<Límite del conjunto de cambios>
Tipo de contenido: aplicación / http
Codificación de transferencia de contenido: binario
ID de contenido: 1
POST /b1s/v1/Artículos
<Contenido de elementos en formato Json>
<Límite del conjunto de cambios>
Tipo de contenido: aplicación / http
Codificación de transferencia de contenido: binario
ID de contenido: 2
PARCHE /b1s/v1/$1
<Contenido de actualización de elementos en formato Json>
<Límite del conjunto de cambios>
<Límite del lote>
Tenga en cuenta que ContentID solo existe en las subsolicitudes del conjunto de cambios:
o Para la versión 3 de OData, no es necesario usar ContentID a menos que necesite usarlo como referencia. o Para la versión 4 de
OData, este encabezado es un campo obligatorio, ya sea que lo use o no.
3.10.5 Códigos de muestra de solicitud de lotes
Los códigos de ejemplo de esta sección muestran una solicitud por lotes completa que contiene las siguientes operaciones:
• Una solicitud de consulta
• Un conjunto de cambios que contiene las siguientes solicitudes:
o Insertar entidad (con ContentID = 1)
PÚBLICO Trabajar con la capa de servicio de SAP Business One
84 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
o Solicitud de actualización (con ContentID = 2)
Códigos de muestra
POST [Link]
Versión de OData: 4.0
Tipo de contenido: multiparte/mixto;límite=batch_36522ad7fc754b568c7156071383e77b
batch_36522ad7fc754b568c7156071383e77b
Tipo de contenido: aplicación/http
Codificación de transferencia de contenido: binario
OBTENER /b1s/v1/Artículos('i001')
batch_36522ad7fc754b568c7156071383e77b
Tipo de contenido: multiparte/mixto;límite=cambio_77162fcdb8da41aca9f89357efbbd
changeset_77162fcdb8da41aca9f89357efbbd
Tipo de contenido: aplicación/http
Codificación de transferencia de contenido: binario
ID de contenido: 1
POST /b1s/v1/Artículos('i002')
Tipo de contenido: aplicación/json
<Cuerpo del elemento de formato Json (i002)>
changeset_77162fcdb8da41aca9f89357efbbd
Tipo de contenido: aplicación/http
Codificación de transferencia de contenido: binario
ID de contenido: 2
PARCHE /b1s/v1/$1
Tipo de contenido: aplicación/json
<Cuerpo de actualización del elemento de formato Json (i002)>
changeset_77162fcdb8da41aca9f89357efbbd
batch_36522ad7fc754b568c7156071383e77b
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 85
Machine Translated by Google
3.10.6 Respuesta por lotes
Esta sección contiene las respuestas por lotes después de ejecutar las solicitudes por lotes.
[Formato de solicitud de lote no válido]
El servicio devuelve el código de error HTTP: 400 Solicitud incorrecta con información de error en el cuerpo si el formato de la solicitud no es válido.
Ejemplo
"error" : {
"código": 1000,
"error interno": {
"contexto": nulo,
"rastreo": nulo
},
"mensaje" : {
"lang": "enus",
"value": "¡Cuerpo de solicitud de lote incompleto!"
[Formato de solicitud de lote válido]
El servicio devuelve el código HTTP: 202 Accept (OData Version 3) o 200 OK (OData Version 4) si el formato de la solicitud es válido. El cuerpo
de la respuesta que se devuelve al cliente depende del resultado de la ejecución de la solicitud.
• Si la ejecución de la solicitud por lotes es exitosa, cada subsolicitud tendrá una subrespuesta correspondiente en el
cuerpo de respuesta.
Ejemplo
batchresponse_d878cedca0ad4025823e5ee1aaffa288
Tipo de contenido: aplicación / http
Codificación de transferencia de contenido: binario
HTTP/1.1 200 Aceptar
Tipo de contenido: aplicación/json; odata = metadatos mínimos; juego de caracteres = utf8
Longitud del contenido: 14729
<Cuerpo de elemento de formato Json (i001)>
batchresponse_d878cedca0ad4025823e5ee1aaffa288
Tipo de contenido:multiparte/mixto;límite=cambiosetresponse_8bfb3c36dbf746a0bdfe
670bbac86eb2
changesetresponse_8bfb3c36dbf746a0bdfe670bbac86eb2
Tipo de contenido: aplicación / http
Codificación de transferencia de contenido: binario
PÚBLICO Trabajar con la capa de servicio de SAP Business One
86 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
ID de contenido: 1
HTTP/1.1 201 Creado
Tipo de contenido: aplicación/json; odata = metadatos mínimos; conjunto de caracteres = utf8
Longitud del contenido: 14641
Ubicación:[Link]
<Cuerpo de elemento de formato Json (i002)>
changesetresponse_8bfb3c36dbf746a0bdfe670bbac86eb2
Tipo de contenido: aplicación / http
Codificación de transferencia de contenido: binario
ID de contenido: 2
HTTP/1.1 204 Sin contenido
changesetresponse_8bfb3c36dbf746a0bdfe670bbac86eb2
batchresponse_d878cedca0ad4025823e5ee1aaffa288 • Si la ejecución de la
solicitud por lotes no es exitosa, el lote dejará de ejecutarse una vez que falle una subsolicitud.
Tenga en cuenta que cuando hay una falla en el conjunto de cambios, solo se devuelve una respuesta para este conjunto de cambios,
sin importar cuántas subsolicitudes existan en este conjunto de cambios. Por ejemplo, en el siguiente ejemplo, la operación
CREAR elemento falla porque ya existe un elemento con el mismo código de elemento en la base de datos.
Ejemplo
batchresponse_3aa0885d245c4164b9a49c27f7a2c4d1
Tipo de contenido: aplicación / http
Codificación de transferencia de contenido: binario
HTTP/1.1 200 Aceptar
Tipo de contenido: aplicación/json; odata = metadatos mínimos; conjunto de caracteres = utf8
Longitud del contenido: 14729
<Cuerpo de elemento de formato Json (i001)>
batchresponse_3aa0885d245c4164b9a49c27f7a2c4d1
Tipo de contenido: aplicación / http
Codificación de transferencia de contenido: binario
HTTP/1.1 400 Solicitud incorrecta
Tipo de contenido: aplicación/json; odata = metadatos mínimos; conjunto de caracteres = utf8
Longitud del contenido: 233
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 87
Machine Translated by Google
"error" : {
"código" : 10,
"error interno": {
"contexto": nulo,
"rastreo": nulo
},
"mensaje" : {
"lang": "enus",
"value" : "El código de artículo 'i002' ya existe"
batchresponse_3aa0885d245c4164b9a49c27f7a2c4d1
Ejemplo
Cree un pedido y cancélelo en una sola transacción
POST [Link]
tipo de contenido: multiparte/mixto;límite=batch_36522ad7fc754b568c71
56071383e77b
batch_36522ad7fc754b568c7156071383e77b
tipo de contenido: multiparte/mixto;límite=cambio_77162fcdb8da41aca9f8
9357efbbd
changeset_77162fcdb8da41aca9f89357efbbd
tipo de contenido: aplicación/http
codificación de transferencia de contenido: binario
ID de contenido: 1
publicar pedidos
anfitrión: anfitrión
"código de tarjeta": "c1",
"docduedate": "20170720",
"líneas de documentos": [
"código de artículo": "i1",
PÚBLICO Trabajar con la capa de servicio de SAP Business One
88 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
"Cantidad: 1",
"código fiscal": "t1",
"precio unitario": "30"
changeset_77162fcdb8da41aca9f89357efbbd
tipo de contenido: aplicación/http
codificación de transferencia de contenido: binario
publicar $1/cancelar
anfitrión: anfitrión
changeset_77162fcdb8da41aca9f89357efbbd
batch_36522ad7fc754b568c7156071383e77b
3.11 Recuperación de propiedades individuales
Nota
Esta característica está disponible en SAP Business One 9.1 nivel de parche 04 y posteriores.
Nota
No se admite la recuperación de las propiedades de un tipo complejo. Por ejemplo, la siguiente solicitud no es posible:
OBTENER /Órdenes(1)/ExtensiónImpositiva/IdImpuesto0
Recuperación de valores de propiedad
Para recuperar los valores de propiedades individuales, envíe solicitudes HTTP de la siguiente manera:
OBTENER /Pedidos(1)/DocEntrada
El servicio devuelve cualquiera de los siguientes:
• Si existe DocEntry 1:
HTTP/1.1 200 Aceptar
"valor": 1
• Si DocEntry 1 no existe:
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 89
Machine Translated by Google
HTTP/1.1 200 Aceptar
"[Link]": verdadero
Para la versión 4 de OData, se agrega una "@" adicional antes de "[Link]" en la respuesta.
Recuperación de valores brutos de propiedad
Para recuperar los valores sin procesar de propiedades individuales, envíe solicitudes HTTP de la siguiente manera:
OBTENER /Pedidos(1)/DocEntry/$valor
El servicio devuelve:
HTTP/1.1 200 Aceptar
Para valores nulos, el servicio devuelve un error 404 No encontrado, como se muestra a continuación:
HTTP/1.1 404 No encontrado
"error": {
"código": 2028,
"error interno": {
"contexto": nulo,
"rastreo": nulo
},
"mensaje": {
"lang": "eses",
"value": "Recurso no encontrado para la propiedad: DocEntry"
3.12 Asociaciones
Nota
Esta característica está disponible en SAP Business One 9.1 nivel de parche 05 y posteriores.
Dos entidades pueden estar asociadas (relacionadas independientemente) de una forma u otra. La asociación se representa opcionalmente
en la propiedad de navegación de cada extremo de la asociación (una de las dos entidades asociadas).
PÚBLICO Trabajar con la capa de servicio de SAP Business One
90 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
Por ejemplo, si se han definido una asociación y las propiedades de navegación correspondientes para las entidades de pedido y cliente
en los metadatos, puede enviar la siguiente solicitud HTTP para asociar el cliente con un pedido en particular:
OBTENER pedidos(1)/Socio comercial
Si ya sabía que la propiedad CardCode del pedido es "c1", la solicitud anterior es igual a GET BusinessPartners('c1').
Puede continuar operando en esta entidad como en GET BusinessPartners('c1'). Por ejemplo, para obtener el nombre extranjero del
cliente, las siguientes dos solicitudes también son iguales:
• GET Orders(1)/BusinessPartner/ForeignName
• OBTENER Socios Comerciales('c1')/Nombre Extranjero
3.12.1 Definiciones de metadatos de asociaciones y propiedades de
navegación
Las asociaciones y las propiedades de navegación se definen en los metadatos del servicio. Tome pedidos y socios comerciales,
por ejemplo:
<! sección 1 >
<Nombre de la Asociación="FK_Documentos_Socios Comerciales">
<End Type="[Link]" Rol="BusinessPartners" Multiplicidad="0..1" />
<Fin Tipo="[Link]" Rol="Documentos" Multiplicidad="*" />
<Restricción de referencia>
<Rol principal="Socios comerciales">
<PropertyRef Name="CódigoTarjeta" />
</Principal>
<Rol dependiente="Documentos">
<PropertyRef Name="CódigoTarjeta" />
</dependiente>
</RestricciónReferencial>
</Asociación>
<! sección 2 >
<EntityType Name="Socio comercial">
<Clave>
<PropertyRef Name="CódigoTarjeta"/>
</Clave>
<Property Name="CardCode" Nullable="false" Type="[Link]"/>
<Nombre de la propiedad="Nombre de la tarjeta" Tipo="[Link]"/>
<Nombre de la propiedad="Tipo de tarjeta" Tipo="[Link]"/>
...
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 91
Machine Translated by Google
<NavigationProperty Name="Pedidos" Relación="SAPB1.FK_Documentos_BusinessPartners"
FromRole="Socios comerciales" ToRole="Pedidos" />
<NavigationProperty Name="Facturas"
Relación="SAPB1.FK_Documentos_Socios comerciales" FromRole="Socios comerciales"
ToRole="Facturas" />
...
</EntityType>
<! sección 3 >
<EntityType Name="Documento">
<Clave>
<PropertyRef Name="DocEntrada"/>
</Clave>
<Property Name="DocEntry" Nullable="false" Type="Edm.Int32"/>
<Nombre de la propiedad="NúmeroDocumento" Tipo="Edm.Int32"/>
<Nombre de propiedad="TipoDocumento" Tipo="[Link]"/>
...
<NavigationProperty Name="Socio comercial"
Relación="SAPB1.FK_Documentos_Socios comerciales" FromRole="Documentos"
ToRole="Socios comerciales" />
</EntityType>
<! sección 4 >
<AssociationSet Association="SAPB1.FK_Documents_BusinessPartners"
Name="FK_Orders_Business Partners">
<End EntitySet="Pedidos" Rol="Documentos"/>
<End EntitySet="Socios comerciales" Rol="Socios comerciales"/>
</Conjunto de asociaciones>
<AssociationSet Association="SAPB1.FK_Documents_BusinessPartners"
Name="FK_Facturas_Socios Comerciales">
<End EntitySet="Facturas" Rol="Documentos"/>
<End EntitySet="Socios comerciales" Rol="Socios comerciales"/>
</Conjunto de asociaciones>
Los metadatos definen la asociación entre BusinessPartners y Orders de la siguiente manera:
• La Sección 1 define una asociación "1:*" (1:n) entre BusinessPartners y Documentos, unidos en el
condición [Link] = [Link].
• La Sección 2 define dos propiedades de navegación Pedidos y Facturas en el tipo de entidad BusinessPartner. • La Sección 3 define
una propiedad de navegación BusinessPartner en el tipo de entidad Documento. • La sección 4 define dos conjuntos
de asociaciones con la misma asociación FK_Documents_BusinessPartners. El
El primer conjunto de asociaciones es Pedidos y socios comerciales y el segundo es Facturas y
Compañeros de negocio.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
92 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
3.12.2 Recuperar propiedades de navegación como entidad
Siempre que las propiedades de navegación estén definidas en los extremos de la asociación, puede navegar de un lado a otro entre los
extremos de la asociación. La navegación no es necesariamente bidireccional; puede ser unidireccional.
De acuerdo con los metadatos (sección 2 en Definiciones de metadatos de asociaciones y propiedades de navegación), se ha definido
una propiedad de navegación Órdenes para el tipo de entidad BusinessPartner (el tipo de entidad establecido BusinessPartners).
Para obtener los pedidos asociados con el socio comercial "c1", envíe la siguiente solicitud:
OBTENER BusinessPartners('c1')/Pedidos
Esta solicitud es igual a la siguiente solicitud:
OBTENER pedidos?$filter=CardCode eq 'c1'
De acuerdo con los metadatos (sección 3 en Definiciones de metadatos de asociaciones y propiedades de navegación), el tipo de entidad
Documento tiene una propiedad de navegación Socios comerciales. Para obtener el cliente asociado con el pedido (DocEntry: 1), envíe la
siguiente solicitud:
OBTENER pedidos(1)/Socio comercial
Puede extender su cadena de solicitud aún más en la URL. Por ejemplo, para obtener todos los pedidos del cliente asociado con el pedido 1,
envíe la siguiente solicitud:
OBTENER Pedidos(1)/Socio comercial/Pedidos
3.12.3 Recuperando propiedades de navegación a través de $expand
Con la opción de consulta de OData $select y $expand, las propiedades de navegación se pueden recuperar al igual que otras propiedades.
Por ejemplo, para recuperar al cliente como propiedad de un pedido, envíe la siguiente solicitud:
OBTENER pedidos(1)?$select=*,BusinessPartner&$expand=BusinessPartner
Puede obtener la propiedad de código de cliente de un pedido y la propiedad de nombre extranjero del cliente asociado enviando la
siguiente solicitud:
OBTENER Pedidos(1)?$select=CódigoTarjeta,SocioNegocio/NombreExtranjero&$expand=SocioNegocio
$expand también se puede aplicar a las colecciones. Por ejemplo, puede enviar la siguiente solicitud para recuperar las propiedades
BusinessPartner de todos los pedidos:
OBTENER pedidos?$select=*,BusinessPartner&$expand=BusinessPartner
Nota
Las siguientes dos solicitudes tienen el mismo efecto:
OBTENER Pedidos(1)?$select=CódigoTarjeta,SocioComercial/NombreExtranjero
OBTENER Pedidos(1)?$select=CódigoTarjeta
Para el primero, BusinessPartner/ForeignName se ignora ya que la propiedad de navegación BusinessPartner no
se expande.
Nota
$expand trabajar con colecciones puede tener problemas de rendimiento. Le recomendamos que no envíe este tipo de solicitudes
con frecuencia.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 93
Machine Translated by Google
3.13 Esquemas definidos por el usuario
Nota
Esta característica está disponible en SAP Business One 9.1 nivel de parche 03 y posteriores.
Una orden de venta típica devuelta por Service Layer:
{
"EntradaDocumento": 71,
"Número de documento": 51,
"DocType": "dDocument_Items",
"Manuscrito": "tNO",
"Impreso": "psNo",
...
"Líneas de Documento": [
"Número de línea": 0,
"Código del artículo": "i1",
"ItemDescription": "elemento 1",
"Cantidad": 10,
"Fecha de envío": "20140401",
"Precio": 100,
...
},
"Número de Línea": 1,
"Código del artículo": "i2",
"ItemDescription": "elemento 2",
"Cantidad": 8,
"Fecha de envío": "20140401",
"Precio": 120,
...
],
...
Si la estructura de datos existente no satisface sus necesidades o desea restringir la cantidad de campos, puede crear sus propios
esquemas. Tenga en cuenta que los esquemas definidos por el usuario se basan en entidades.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
94 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
requisitos previos
Antes de trabajar con un esquema definido por el usuario, asegúrese de lo siguiente:
• Ha creado un archivo de esquema en la carpeta <Directorio de instalación>/ServiceLayer/conf.
Nota
Si desea enviar solicitudes directamente a través de un miembro del balanceador de carga que está instalado en una máquina diferente del
balanceador de carga, debe asegurarse de que también exista una copia del archivo de esquema en la máquina miembro.
• Ha definido el esquema en formato JSON, de acuerdo a sus necesidades.
Nota
Cualquier cambio en el archivo de esquema entra en vigor inmediatamente después de guardar el archivo. No es necesario que reinicie el
servicio de la capa de servicio.
• Si desea utilizar el esquema predeterminado definido en el archivo [Link] en lugar de especificar el esquema en
solicitudes, ha hecho que el nombre del archivo de esquema sea idéntico al valor de la opción de configuración de esquema. Para obtener más
información, consulte Opciones de configuración para la capa de servicio.
3.13.1 Filtrar campos
La base de datos de una empresa suele contener muchos más campos de los necesarios. Puede definir sus propios esquemas con estructuras de
datos "recortadas".
Ejemplo
Cómo restringir la salida de datos a un número limitado de campos
En la carpeta conf, cree un archivo llamado [Link] y edite el archivo como se muestra a continuación:
"Documento": [
"EntradaDocumento",
"NúmeroDocumento",
"Líneas de Documento",
],
"LíneaDocumento": [
"Número de línea",
"Código del objeto",
"Cantidad"
Este esquema restringe los campos de salida de la siguiente manera:
o Por tipo (EntityType o ComplexType en los metadatos) Documento (incluidas todas las
entidades de documento): DocEntry, DocNum y DocumentLines
o Para tipo DocumentLine: LineNum, ItemCode y Cantidad
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 95
Machine Translated by Google
El servicio devuelve:
HTTP/1.1 200 Aceptar
Esquema B1S: [Link]
...(otros encabezados HTTP)...
"EntradaDocumento": 71,
"Número de documento": 51,
"Líneas de Documento": [
"Número de línea": 0,
"Código del artículo": "i1",
"Cantidad": 10
},
"Número de Línea": 1,
"Código del artículo": "i2",
"Cantidad": 8
Nota
El archivo de esquema a menudo se denomina {xxx}.schema, pero no es obligatorio. Puede usar cualquier nombre, por ejemplo, myschema.
En SAP Business One 9.1 nivel de parche 04 y posterior, un archivo de esquema llamado [Link] está disponible después de la
instalación. Puede usarlo directamente de la siguiente manera:
OBTENER /Órdenes
Esquema B1S: [Link]
3.14 Campos definidos por el usuario (UDF)
En SAP Business One 9.1 nivel de parche 04 y versiones anteriores, los campos definidos por el usuario (UDF) se tratan como propiedades dinámicas de
una entidad OData. Una entidad que tiene una propiedad dinámica es de "tipo abierto", es decir, en el nodo XML EntityType en los metadatos, tiene el
atributo OpenType=true.
A partir del nivel de parche PL04 de SAP Business One 9.1, puede administrar los metadatos de las UDF y realizar operaciones CRUD en las
UDF como en las entidades normales.
A partir del nivel de parche PL05 de SAP Business One 9.1, las UDF aparecen en la definición de la entidad en los metadatos.
Nota
Todas las UDF en SAP Business One tienen el prefijo "U_".
PÚBLICO Trabajar con la capa de servicio de SAP Business One
96 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
3.14.1 Gestión de metadatos de UDF
Esta característica está disponible en SAP Business One 9.1 nivel de parche 04 y posteriores.
Puede realizar operaciones CRUD en UDF como en entidades normales. Sin embargo, debe tener en cuenta que las operaciones
DDL en las tablas pueden ser costosas en la base de datos si muchos objetos hacen referencia a las tablas (por ejemplo, procedimientos,
funciones y vistas). Puede llevar más tiempo del esperado crear o eliminar UDF, especialmente en documentos de marketing.
Creación de UDF
Utilice el método POST para crear una UDF. Por ejemplo, para crear una UDF denominada "u1" en la tabla OCRD (datos maestros de
socios comerciales), envíe la siguiente solicitud HTTP:
POST /UserFieldsMD
"Nombre": "u1",
"Tipo": "db_Alpha",
"Tamaño 10,
"Descripción": "udf 1",
"Subtipo": "st_Ninguno",
"NombreTabla": "OCRD"
El servicio devuelve:
HTTP/1.1 201 Creado
"Nombre": "u1",
"Tipo": "db_Alpha",
"Tamaño 10,
"Descripción": "udf 1",
"Subtipo": "st_Ninguno",
"Tabla Vinculada": nulo,
"Valor predeterminado": nulo,
"NombreTabla": "OCRD",
"ID de campo": 0,
"Editar tamaño": 10,
"Obligatorio": "tNO",
"LinkedUDO": nulo,
"ValoresValidosMD": []
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 97
Machine Translated by Google
Para mantener la coherencia de los datos, cuando crea una UDF en una tabla en particular, la UDF se crea automáticamente en otras
tablas relacionadas. En el ejemplo anterior, además de OCRD, la UDF "u1" también se crea en la tabla ACRD (la tabla de archivo para el
objeto Business Partner). Si crea una UDF en una tabla de filas de órdenes de venta RDR1, la UDF se crea automáticamente
en todas las tablas de líneas de documentos de marketing (por ejemplo, filas de órdenes de compra POR1, filas de entrega DLN1, filas de
facturas INV1), así como en la tabla de archivo para filas de documentos ADO1.
Para obtener más información, consulte Creación de entidades.
Recuperar UDF
Para recuperar un UDF, envíe una solicitud HTTP como el ejemplo a continuación:
OBTENER /UserFieldsMD (Nombre de tabla = 'OCRD', ID de campo = 0)
Para obtener más información, consulte Recuperación de entidades.
Consulta de UDF
Las opciones de consulta estándar de OData también son compatibles con las UDF. Por ejemplo, ha olvidado el nombre de la tabla y el ID de
la UDF, pero aún recuerda el nombre de la UDF; puede consultar la UDF de la siguiente manera:
GET /UserFieldsMD?$filter=Nombre eq 'u1'
El servicio devuelve:
"valor": [
"Nombre": "u1",
"NombreTabla": "ACRD",
"ID de campo": 0,
...
...
},
"Nombre": "u1",
"NombreTabla": "OCRD",
"ID de campo": 0,
...
De la respuesta anterior, puede ver que además de la tabla OCRD, también se ha creado UDF "u1" en la tabla
ACRD.
Para obtener más información, consulte Opciones de consulta.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
98 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
Actualización de UDF
Para cambiar la descripción y el tamaño de una UDF, envíe una solicitud HTTP como el ejemplo a continuación:
PARCHE /UserFieldsMD(TableName='OCRD', FieldID=0)
"Editar tamaño": 20,
"Descripción": "Identificación interna",
Nota
No puede cambiar propiedades como el tipo de archivo (Tipo).
Para obtener más información, consulte Actualización de entidades.
Eliminación de UDF
Para eliminar un UDF, envíe una solicitud HTTP como el ejemplo a continuación:
ELIMINAR /UserFieldsMD(TableName='OCRD', FieldID=0)
3.14.2 Operaciones CRUD
Al igual que con las entidades normales, puede realizar operaciones CRUD en UDF, consultar UDF, etc.
Ejemplo
Cómo agregar socios comerciales con una UDF "U_BPSpecRemarks"
Envía la solicitud HTTP:
POST /Socios comerciales
"Código de tarjeta": "bpudf_004",
...
"U_BPSpecRemarks": "Primeros socios comerciales con comentarios de UDF agregados por Chrome".
El servicio devuelve:
HTTP/1.1 200 Aceptar
"Código de tarjeta": "bpudf_004",
...
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Consumir la capa de servicio de SAP Business One © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 99
Machine Translated by Google
"U_BPSpecRemarks": "Primeros socios comerciales con comentarios de UDF agregados por Chrome.",
...
Ejemplo
Cómo consultar entidades usando UDF
Envía la solicitud HTTP:
GET /BusinessPartners?$filter=startswith(U_BPSpecRemarks, 'First')
El servicio devuelve:
HTTP/1.1 200 Aceptar
"valor": [
"Código de tarjeta": "bpudf_001",
...
"U_BPSpecRemarks": "Primeros socios comerciales con comentarios de UDF.",
},
"Código de tarjeta": "bpudf_003",
...
"U_BPSpecRemarks": "Primeros socios comerciales con comentarios de UDF agregados por Chrome.",
},
...
3.15 Tablas definidas por el usuario (UDT)
Puede acceder directamente a las tablas definidas por el usuario (UDT) del tipo "sin objeto" en SAP Business One 9.1 nivel de parche 05
y posteriores. Los UDT de tipo "sin objeto" se tratan como entidades simples que solo tienen una tabla principal. Los UDT de tipo "sin
objeto" no pueden ser utilizados por UDO (los UDO utilizan UDT de tipo "datos maestros", "filas de datos maestros", "documento"
o "filas de documento").
En los siguientes ejemplos, agregaremos UDT "MYTBL" de tipo "sin objeto" y luego la capa de servicio lo expondrá como una
entidad denominada "U_MYTBL".
PÚBLICO Trabajar con la capa de servicio de SAP Business One
100 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
3.15.1 Gestión de metadatos de UDT
Puede administrar metadatos UDT a través de la capa de servicio en SAP Business One 9.1 nivel de parche 04 y posterior.
Ejemplo
Cómo crear UDT "MYTBL" como una tabla "sin objeto"
Envía la solicitud HTTP:
POST /UserTablesMD
"NombreTabla": "MYTBL",
"TableDescription": "Mi Mesa",
"TableType": "bott_NoObject"
Tenga en cuenta que:
o El nombre de la tabla usa letras mayúsculas. Este nombre se usará cuando obtenga los metadatos de esta nueva tabla a través de
GET /UserTablesMD('MYTBL').
o La tabla real en la base de datos es "@MYTBL". Este nombre se utilizará cuando agregue campos definidos por el usuario.
Ejemplo
Cómo agregar campos "F1" a la tabla "MYTBL"
Envíe la solicitud HTTP para agregar el campo "F1" con tipo "Alfanumérico":
POST /UserFieldsMD
"Nombre": "F1",
"Tipo": "db_Alpha",
"Tamaño 10,
"Descripción": "Nombre del cliente",
"Subtipo": "st_Ninguno",
"NombreTabla": "@MYTBL"
3.15.2 Operaciones CRUD
Al igual que con las entidades regulares, puede realizar operaciones CRUD en UDT.
La capa de servicio asigna los UDT a las entidades agregando el prefijo "U_". Por ejemplo, UDT "MYTBL" obtiene el nombre de entidad
"U_MYTBL".
Ejemplo
Cómo crear entidades para UDT "MYTBL"
Envía la solicitud HTTP:
Trabajar con la capa de servicio de SAP Business One PÚBLICO
POST /U_MYTBL
"Código":"C",
"Nombre":"NombreC",
"U_F1":"datos de prueba"
Cómo recuperar los registros de UDT "MYTBL" (El código es el campo clave)
Envía la solicitud HTTP:
OBTENER /U_MYTBL('C')
O
GET /U_MYTBL(Código='C')
Cómo obtener una lista clave de todos los pedidos de los usuarios
Envía la solicitud HTTP:
OBTENER /U_MYTBL?$select=Código
Cómo obtener un registro cuyo nombre sea igual a 'CName'
Envía la solicitud HTTP:
GET /U_MYTBL?$filter=Nombre eq 'CName'
Cómo actualizar el valor de registro de "U_F1"
Envía la solicitud HTTP:
PARCHE /U_MYTBL('C')
"U_F1": "datos de prueba actualizados"
Cómo borrar el registro
Envía la solicitud HTTP:
ELIMINAR /U_MYTBL('C')
3.16 Objetos definidos por el usuario (UDO)
Nota
Las operaciones CRUD son posibles para UDO en SAP Business One 9.1 parche nivel 03 y posteriores.
Puede administrar los metadatos de UDO en Service Layer en SAP Business One 9.1 nivel de parche 04 y posteriores.
Puede acceder a los UDT a través de Service Layer directamente en SAP Business One 9.1 nivel de parche 05 y posterior.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
102 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
En SAP Business One 9.1 nivel de parche 05 y posterior, la información de UDT, UDO y UDF se incluye en los metadatos de OData
[Link]
En SAP Business One 9.2 nivel de parche 11 y posterior, se admite la función Cancelar/Cerrar de UDO.
Dependiendo de las necesidades de su negocio, puede crear sus propios objetos para administrar datos personalizados y crear funciones
personalizadas. Cada objeto definido por el usuario debe registrarse con una tabla principal definida por el usuario y, opcionalmente,
con uno o más UDT secundarios. Cada UDT contiene uno o más campos definidos por el usuario (UDF). El tipo de objeto de un UDT principal
debe ser Datos maestros o Documento, mientras que el tipo de objeto de un UDT secundario debe ser Filas de datos maestros o Filas de
documentos.
3.16.1 Gestión de metadatos de UDO
Esta característica está disponible en SAP Business One 9.1 nivel de parche 04 y posteriores.
Service Layer requiere el mismo procedimiento para crear un UDO que en la aplicación cliente de SAP Business One o mediante la DI API.
El siguiente procedimiento ilustra cómo crear un UDO "MyOrder" con la siguiente definición:
CustomerName Alfanumérico
DocTotal Unidades y Totales / Importe
Nombre del árticulo Alfanumérico
Precio Unidades y Totales / Precio
Cantidad Unidades y Totales / Cantidad
Procedimiento
1. Para crear la tabla principal "MiPedido", envíe la siguiente solicitud HTTP:
POST /UserTablesMD
"TableName": "MiPedido",
"TableDescription": "Mis Pedidos",
"TableType": "bott_Documento"
El servicio devuelve:
HTTP/1.1 201 Creado
"NombreTabla": "MI PEDIDO",
"TableDescription": "Mis Pedidos",
"TableType": "bott_Documento",
Trabajar con la capa de servicio de SAP Business One PÚBLICO
"Archivable": "tNO",
...
Nota
El nombre es el identificador único de un UDT y sufre los siguientes cambios automáticos después de su creación:
o Se añade un prefijo "@" al nombre. o El nombre
se convierte a mayúsculas.
Por ejemplo, si define un nombre de UDT como "MyOrder", el nombre de UDT real en la base de datos es "@MYORDER".
Para obtener los metadatos de esta tabla, envíe la solicitud HTTP:
GET /UserTablesMD('MI PEDIDO')
2. Agregue UDF a la tabla "MyOrder".
1. Para crear el campo "CustomerName", envíe la siguiente solicitud HTTP:
POST /UserFieldsMD
"Nombre": "Nombre del cliente",
"Tipo": "db_Alpha",
"Tamaño 10,
"Descripción": "Nombre del cliente",
"Subtipo": "st_Ninguno",
"NombreTabla": "@MIORDEN"
2. Para crear el campo "DocTotal", envíe la siguiente solicitud HTTP:
POST /UserFieldsMD
"Nombre": "DocTotal",
"Tipo": "db_Float",
"Descripción": "Cantidad total",
"Subtipo": "st_Sum",
"NombreTabla": "@MIORDEN"
3. Para crear la tabla secundaria "MyOrderLines", envíe la siguiente solicitud HTTP:
POST /UserTablesMD
"NombreTabla": "MisLíneasDePedido",
"TableDescription": "Mis Líneas de Orden",
"TableType": "bott_DocumentLines"
Al igual que con la tabla principal, el nombre real de esta tabla es "@MYORDERLINES".
PÚBLICO Trabajar con la capa de servicio de SAP Business One
104 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
4. Agregue UDF a la tabla "MyOrderLines".
1. Para crear el campo "ItemName", envíe la siguiente solicitud HTTP:
POST /UserFieldsMD
"Nombre": "Nombre del elemento",
"Tipo": "db_Alpha",
"Tamaño 10,
"Descripción": "Nombre del artículo",
"Subtipo": "st_Ninguno",
"NombreTabla": "@MYORDERLINES"
2. Para crear el campo "Precio", envíe la siguiente solicitud HTTP:
POST /UserFieldsMD
"Nombre": "Precio",
"Tipo": "db_Float",
"Descripción": "Precio Unitario",
"Subtipo": "st_Precio",
"NombreTabla": "@MYORDERLINES"
3. Para crear el campo "Cantidad", envíe la siguiente solicitud HTTP:
POST /UserFieldsMD
"Nombre": "Cantidad",
"Tipo": "db_Float",
"Descripción": "Cantidad",
"Subtipo": "st_Quantity",
"NombreTabla": "@MYORDERLINES"
5. Para registrar UDO "MyOrder", envíe la siguiente solicitud HTTP:
POST /UserObjectsMD
"Código": "MiPedido",
"Nombre": "Mis pedidos",
"TableName": "MiPedido",
"TipoObjeto": "documento_boud",
"UserObjectMD_ChildTables": [
"NombreTabla": "MisLíneasDePedido",
"NombreObjeto": "MisLíneasDePedido"
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Nota
El nombre de propiedad de una colección de subobjetos es "<Código de subobjetos>Colección" y el código UDT es, de forma
predeterminada, el mismo que el nombre UDT. Por lo tanto, si pretende utilizar un UDT como tabla secundaria para un UDO y el
nombre del UDT (TableName) contiene espacios, le recomendamos que cambie el código del UDT (ObjectName) durante
el registro. Por ejemplo, si un código UDT es "Mis líneas de pedido", el nombre de propiedad correspondiente sería "Mi
colección de líneas de pedido".
Adición de claves de usuario
Puede agregar claves de usuario a las tablas definidas por el usuario. Por ejemplo, para crear una clave única en la columna CustomerName,
envíe la siguiente solicitud HTTP:
POST /UserKeysMD
"NombreTabla": "@MIORDEN",
"ÍndiceClave": "1",
"NombreClave": "IX_0",
"Único": "tYES",
"UserKeysMD_Elements": [
"ColumnAlias": "Nombre del Cliente"
El servicio devuelve:
"NombreTabla": "@MIORDEN",
"ÍndiceClave": "0",
"NombreClave": "IX_0",
"Único": "tYES",
"UserKeysMD_Elements": [
"SubKeyIndex": "0",
"ColumnAlias": "Nombre del Cliente"
},
Para obtener los metadatos de esta clave, envíe la siguiente solicitud HTTP:
GET /UserKeysMD(TableName='@MYORDER', KeyIndex=0)
PÚBLICO Trabajar con la capa de servicio de SAP Business One
106 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
3.16.2 Crear entidad para un UDO
Al igual que con las entidades regulares, puede realizar operaciones CRUD en UDO, consultar UDO, crear esquemas definidos por el usuario
basados en UDO, etc.
Para crear una entidad UDO, envíe una solicitud HTTP para agregar un pedido con 2 artículos, como:
POST /MiPedido
"U_CustomerName": "c1",
"U_DocTotal": 620,
"MyOrderLinesCollection": [
"U_ItemName": "elemento1",
"Precio_U": 100,
"U_Cantidad": 3
},
"U_ItemName": "elemento2",
"Precio_U": 80,
"U_Cantidad": 4
Nota
El nombre de propiedad de la colección de subobjetos es "{código de subobjetos}Colección", por ejemplo, el código de
subobjetos es MyOrderLines (por defecto, el mismo que el nombre de UDT si no lo cambia), por lo que el nombre de propiedad
es MyOrderLinesCollection.
En caso de éxito, el servidor responde de la siguiente manera:
HTTP/1.1 201 Creado
"EntradaDocumento": 10,
"Número de documento": 2,
...
"U_CustomerName": "c1",
"U_DocTotal": 620,
"MyOrderLinesCollection": [
"Número de Línea": 1,
Trabajar con la capa de servicio de SAP Business One PÚBLICO
"U_ItemName": "elemento1",
"Precio_U": 100,
"U_Cantidad": 3
},
"Número de Línea": 2,
"U_ItemName": "elemento2",
"Precio_U": 80,
"U_Cantidad": 4
}
Al definir un archivo de esquema basado en un UDO, se requiere el nombre del objeto en lugar del ID (que es el identificador único de un
UDO). Como el sistema no le impide crear un UDO con un nombre idéntico a un UDO existente o un objeto del sistema, debe prestar especial
atención para mantener la unicidad del nombre del UDO. Tenga en cuenta que la URL y los contenidos de la solicitud aún requieren la ID de
UDO.
3.16.3 Entidad de recuperación para UDO
Puede obtener el pedido a través de un campo clave. DocEntry es el campo clave del pedido.
OBTENER /MiPedido(10)
O
OBTENER /MiPedido(DocEntry=10)
En caso de éxito, se devuelve el código HTTP 200 con el contenido del objeto que es el mismo que devuelve addentity.
HTTP/1.1 200 Aceptar
"EntradaDocumento": 10,
...
Las opciones de consulta también son compatibles. Puede obtener una lista clave de todos los pedidos de los usuarios.
OBTENER /MiPedido?$select=DocEntrada
Servicio de devoluciones:
HTTP/1.1 200 Aceptar
"valor": [
{"EntradaDocumento": 1},
{"EntradaDocumento": 2},
PÚBLICO Trabajar con la capa de servicio de SAP Business One
108 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
...
{"EntradaDocumento": 13}
],
Para obtener pedidos de usuarios con un nombre de cliente específico y un dinero total superior a 1000:
GET /MyOrder?$filter=U_CustomerName eq 'c1' y U_DocTotal gt 1000
El esquema definido por el usuario también es compatible con UDO.
Por ejemplo, creó un archivo llamado [Link] en la carpeta conf:
"MiPedido": ["EntradaDocumento", "U_NombreCliente"],
"MisLíneasDePedido": ["U_ItemName", "U_Quantity"]
Nota
o Use el nombre UDO (no el código UDO) para definir el esquema si el nombre no es el mismo que el código. o De forma
predeterminada, el nombre del objeto es el mismo que el código del objeto (es decir, el ID único) y el subobjeto
El nombre es el mismo que el código del subobjeto (es decir, el nombre de la tabla de usuario). Puede cambiar el nombre del
objeto o el nombre del subobjeto durante el registro. El código se usará en la URL y el contenido de la solicitud, y el nombre se
usará en el esquema definido por el usuario.
o El nombre de UDO puede contener un espacio, por ejemplo, "Líneas de pedido".
Luego envía la solicitud:
OBTENER /MiPedido(1)
Esquema B1S: [Link]
Usted obtiene:
HTTP/1.1 200 Aceptar
Esquema B1S: [Link]
"EntradaDocumento": 10,
"U_CustomerName": "c1",
"MyOrderLinesCollection": [
"U_ItemName": "elemento1",
"U_Cantidad": 3
},
"U_ItemName": "elemento2",
"U_Cantidad": 4
Trabajar con la capa de servicio de SAP Business One PÚBLICO
3.16.4 Entidad de actualización para UDO
Puede actualizar el pedido, por ejemplo, cambiar la cantidad del artículo 2 de 4 a 5 para este pedido de ventas. Nota: U_DocTotal también debe
cambiar a medida que cambia la cantidad.
PARCHE /MiPedido(10)
"U_DocTotal": 700,
"MisLíneasDePedido": [
"Número de Línea": 2,
"U_Cantidad": 5
En caso de éxito, el código HTTP 204 se devuelve sin contenido.
HTTP/1.1 204 Sin contenido
Nota
PUT/PATCH/MERGE son compatibles para la actualización. PATCH y MERGE son lo mismo. Consulte el capítulo Actualización de
entidades para conocer las diferencias entre PATCH y PUT.
3.16.5 Eliminación de entidad para UDO
Utilice el verbo HTTP DELETE y los campos clave para eliminar la entidad.
ELIMINAR /MiPedido(10)
En caso de éxito, el código HTTP 204 se devuelve sin contenido.
HTTP/1.1 204 Sin contenido
3.16.6 Entidad de cancelación/cierre para UDO
De forma predeterminada, no puede cerrar ni cancelar la UDO. Para habilitar esto, primero envíe una solicitud de parche a UserObjectsMD
como se muestra a continuación:
PÚBLICO Trabajar con la capa de servicio de SAP Business One
110 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
PATCH UserObjectsMD('MiPedido')
{ "CanClose": "tYES", "CanCancel": "tYES" }
Para cancelar el pedido,
POST /MiPedido(10)/Cancelar
Para cerrar el pedido,
POST /MiPedido(10)/Cerrar
En caso de éxito, el código HTTP 204 se devuelve sin contenido.
HTTP/1.1 204 Sin contenido
Los metadatos relacionados son los siguientes:
<EntitySet EntityType="[Link]" Name="MyOrder"/>
<FunctionImport IsBindable="true" Name="Cancel">
<Parameter Name="MYORDERParams" Type="[Link]"/>
</Importación de funciones>
<FunctionImport IsBindable="true" Name="Cerrar">
<Parameter Name="MYORDERParams" Type="[Link]"/>
</Importación de funciones>
3.17 Archivos adjuntos
A partir de SAP Business One 9.1 parche nivel 12, versión para SAP HANA, la manipulación de archivos adjuntos se admite a través de
la capa de servicio. La lista de tipos de archivos adjuntos admitidos es:
• pdf
• documento
• docx
• jpg •
jpeg
• png
• texto
• xls
• ppt
Trabajar con la capa de servicio de SAP Business One PÚBLICO
3.17.1 Configuración de una carpeta de archivos adjuntos
Una carpeta de archivos adjuntos es generalmente una carpeta compartida en la plataforma Windows para el cliente SAP Business One.
Para la capa de servicio que se ejecuta en SAP HANA en Linux, no se permite acceder directamente a esta carpeta compartida. Para que
la carpeta de archivos adjuntos también sea accesible para la capa de servicio, se requiere el Sistema de archivos de Internet común
(CIFS). Para obtener más información sobre CIFS, puede visitar: https://
[Link]/enus/library/[Link] [Link]
Realice los siguientes pasos para
configurar: 1. Cree una carpeta compartida
de red con permisos de lectura y escritura en Windows (por ejemplo,
\\<servidor de base de datos>\temp\SL\attachments2) y configúrelo como la carpeta de archivos adjuntos en Configuración general en el
cliente SAP Business One.
2. Cree un directorio adjunto correspondiente en Linux (por ejemplo, /mnt/attachments2).
3. Monte la carpeta de Linux en la carpeta de Windows ejecutando un comando como este:
mount t cifs o nombreusuario=xxxxx,contraseña=******,modo_archivo=0777,modo_directorio=0777 "//<servidorbase de datos>/
temp/SL/adjuntos2/" /mnt/adjuntos2
Nota
Recuerde escapar en caso de que el nombre de usuario o la contraseña contengan caracteres especiales (por ejemplo, \, $). Por
ejemplo:
PÚBLICO Trabajar con la capa de servicio de SAP Business One
112 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
montaje t cifs o
nombredeusuario=global\\i066088,contraseña=1234\$4321,file_mode=0777,dir_mode=0777 "//<servidor de base de
datos>/temp/andy/attachments2/" /mnt/attachments2
Recuerde que la carpeta compartida es una carpeta de red en lugar de una carpeta local en Windows. De lo contrario, Service Layer
no podrá acceder a él.
Ejemplo
Cómo montar automáticamente cuando se inicia el servidor Linux
Para facilitar la configuración a los clientes, se puede aprovechar /etc/fstab para que se monte automáticamente en la carpeta
compartida de Windows una vez que se reinicie el servidor Linux. Un enfoque para lograr esto es el siguiente:
1. Inicie sesión como usuario raíz y cree un archivo de credenciales (por ejemplo, /etc/mycifspass) con lo siguiente
contenido:
nombre de usuario=xxxxx
contraseña=******
modo_archivo=0777
dir_mode=0777
2. Abra el archivo de configuración del sistema /etc/fstab y agregue una línea, de la siguiente manera:
//<servidor de base de datos>/temp/SL/attachments2/ /mnt/attachments2 cifs credentials=/etc/mycifspass
0 0
3. Reinicie el servidor Linux; la carpeta compartida de Windows se monta automáticamente.
3.17.2 Subir un archivo adjunto
Teniendo en cuenta que el archivo de origen para cargar puede estar en la misma máquina que Service Layer o en una máquina
separada, Service Layer debe admitir estos dos casos.
[Link] Subir archivo de origen a la capa de servicio local
[Aplicable para Service Layer en SAP HANA y SQL Server]
Este caso es similar al manejo de archivos adjuntos por parte del cliente SAP Business One, ya que el archivo de origen y el cliente SAP
Business One están siempre en la misma máquina.
Nota
El archivo a subir en este caso está en Linux. También se puede aplicar a los archivos de Windows.
Para este caso, cargue el archivo de origen (por ejemplo, /home/builder/src_attachment/my_attach_1.dat) como archivo adjunto enviando
una solicitud como:
POST /b1s/v1/Archivos adjuntos2
Trabajar con la capa de servicio de SAP Business One PÚBLICO
"Archivos adjuntos2_líneas": [
"SourcePath": "/inicio/constructor/src_attachment",
"Nombre de archivo": "mi_archivo_adjunto_1",
"FileExtension": "eso"
En caso de éxito, la respuesta es la siguiente:
HTTP/1.1 201 Creado
"EntradaAbsoluta": "1",
"Archivos adjuntos2_líneas": [
"SourcePath": "/inicio/constructor/src_attachment",
"Nombre de archivo": "mi_archivo_adjunto_1",
"Extensión de archivo": "eso",
"Fecha del archivo adjunto": "20160325",
"ID de usuario": "1",
"Anular": "tNO"
El archivo de origen se guarda en la carpeta de archivos adjuntos de destino en Linux (/mnt/attachments2).
Abra la carpeta de Windows (\\<servidor de base de datos>\temp\SL\attachments); el archivo de origen también se guarda allí.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
114 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
[Link] Subir archivo de origen a una capa de servicio remota
[Aplicable para Service Layer en SAP HANA y SQL Server]
Como un servicio web, la mayoría de las veces la capa de servicio y el archivo de origen para cargar pueden estar en máquinas separadas,
lo cual es bastante diferente al caso del archivo adjunto en el cliente SAP Business One.
Una forma de agregar un archivo adjunto para este caso es usar el método HTTP POST. La solicitud debe contener un encabezado
de tipo de contenido que especifique un tipo de contenido de datos de formulario/partes múltiples y una especificación de límite como:
Tipo de contenido: multipart/formdata;boundary=<Límite>
El cuerpo está separado por el límite definido en el encabezado ContentType, como:
<Límite>
ContenidoDisposición: formulariodatos; nombre="archivos"; nombre de archivo="<archivo1>"
Tipo de contenido: <tipo de contenido del archivo1>
<contenido del archivo1>
<Límite>
ContenidoDisposición: formulariodatos; nombre="archivos"; nombre de archivo="<archivo2>"
Tipo de contenido: <tipo de contenido del archivo2>
<contenido del archivo2>
<Límite>
Por ejemplo, si desea empaquetar dos archivos en un archivo adjunto para publicar, envíe la solicitud de la siguiente manera:
POST /b1s/v1/Archivos adjuntos2 HTTP/1.1
Tipo de contenido: multipart/formdata; límite=WebKitFormBoundaryUmZoXOtOBNCTLyxT
WebKitFormBoundaryUmZoXOtOBNCTLyxT
ContenidoDisposición: formulariodatos; nombre="archivos"; nombre de archivo = "lí[Link]"
Tipo de contenido: texto/simple
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Introducción
B1 Service Layer (SL) es una nueva generación de API de extensión para consumir objetos B1
y servicios
vía web service con alta escalabilidad y alta disponibilidad.
WebKitFormBoundaryUmZoXOtOBNCTLyxT
ContenidoDisposición: formulariodatos; nombre="archivos"; nombre de archivo = "lí[Link]"
Tipo de contenido: imagen/jpeg
<datos binarios de imagen>
WebKitFormBoundaryUmZoXOtOBNCTLyxT
En caso de éxito, la respuesta es la siguiente:
HTTP/1.1 201 Creado
"una [Link]":
"[Link]
"Entrada absoluta": "3",
"Archivos adjuntos2_líneas": [
"SourcePath": "/tmp/sap_b1_i066088/ServiceLayer/Adjuntos2/",
"Nombre de archivo": "línea1",
"Extensión de archivo": "txt",
"Fecha del archivo adjunto": "20160406",
"ID de usuario": "1",
"Anular": "tNO"
},
"SourcePath": "/tmp/sap_b1_i066088/ServiceLayer/Adjuntos2/",
"Nombre de archivo": "línea2",
"Extensión de archivo": "png",
"Fecha del archivo adjunto": "20160406",
"ID de usuario": "1",
"Anular": "tNO"
Nota
o El límite DEBE ir precedido de dos guiones () en el cuerpo de la solicitud. o El último límite en el
cuerpo de la solicitud DEBE agregarse con dos guiones adicionales ().
PÚBLICO Trabajar con la capa de servicio de SAP Business One
116 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
o Si Service Layer devuelve un mensaje sobre la creación de un archivo de error en Linux, indica que alguien ha cambiado
accidentalmente el permiso del directorio de archivos adjuntos temporales. Para este caso, abra una terminal de Linux con
privilegios de usuario raíz y ejecute los siguientes comandos para recuperar el permiso. sudo chown R
b1service0:b1service0 /tmp/sap_b1_b1service0 sudo chmod R 755 /tmp/sap_b1_b1service0
3.17.3 Descarga de archivos adjuntos
De forma predeterminada, la primera línea del archivo adjunto se descarga si hay varias líneas de archivo adjunto en un archivo adjunto.
Para descargarlo, se requiere que se agregue $value al final de la URL de recuperación del archivo adjunto. Por ejemplo:
OBTENER /b1s/v1/Archivos adjuntos2(3)/$valor
En caso de éxito, la respuesta en el navegador es la siguiente:
Si desea descargar una línea de archivo adjunto que no sea la primera línea de archivo adjunto, debe especificar el nombre completo del
archivo (incluida la extensión del archivo) en la URL de solicitud. Por ejemplo:
OBTENER /b1s/v1/Archivos adjuntos2(3)/$valor?nombre de archivo='lí[Link]'
En caso de éxito, la respuesta en el navegador es la siguiente:
Trabajar con la capa de servicio de SAP Business One PÚBLICO
3.17.4 Actualización del archivo adjunto
Service Layer le permite actualizar un archivo adjunto a través de PATCH y hay dos casos típicos para esta operación.
Ejemplo
Cómo actualizar una línea de adjunto existente Si la
línea de adjunto para actualizar ya existe, simplemente se reemplaza por la nueva línea de adjunto. Por ejemplo:
PARCHE /b1s/v1/Archivos adjuntos2(3) HTTP/1.1
Tipo de contenido: multipart/formdata; límite=WebKitFormBoundaryUmZoXOtOBNCTLyxT
WebKitFormBoundaryUmZoXOtOBNCTLyxT
ContenidoDisposición: formulariodatos; nombre="archivos"; nombre de archivo = "lí[Link]"
Tipo de contenido: texto/simple
Introducción (actualizado)
B1 Service Layer (SL) es una nueva generación de API de extensión para consumir objetos y servicios B1 a través de un
servicio web con alta escalabilidad y alta disponibilidad.
WebKitFormBoundaryUmZoXOtOBNCTLyxT
En caso de éxito, el código HTTP 204 se devuelve sin contenido.
HTTP/1.1 204 Sin contenido
Para verificar la línea de archivo adjunto actualizada, envíe una solicitud como:
OBTENER /b1s/v1/Archivos adjuntos2(3)/$valor?nombre de archivo='lí[Link]'
En caso de éxito, la respuesta en el navegador es la siguiente:
PÚBLICO Trabajar con la capa de servicio de SAP Business One
118 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
Ejemplo
Cómo agregar una línea de archivo adjunto si no existe Si
la línea de archivo adjunto para actualizar no existe, la nueva línea de archivo adjunto se agrega a la última línea de archivo
adjunto existente. Por ejemplo:
PARCHE /b1s/v1/Archivos adjuntos2(3) HTTP/1.1
Tipo de contenido: multipart/formdata; límite=WebKitFormBoundaryUmZoXOtOBNCTLyxT
WebKitFormBoundaryUmZoXOtOBNCTLyxT
ContenidoDisposición: formulariodatos; nombre="archivos"; nombre de archivo="lí[Link]"
Tipo de contenido: imagen/jpeg
<datos binarios>
WebKitFormBoundaryUmZoXOtOBNCTLyxT
En caso de éxito, el código HTTP 204 se devuelve sin contenido.
HTTP/1.1 204 Sin contenido
Para verificar la línea de archivo adjunto recién creada, envíe una solicitud de la siguiente manera:
OBTENER /b1s/v1/Archivos adjuntos2(3)/$valor?nombre de archivo='lí[Link]'
En caso de éxito, la respuesta en el navegador es la siguiente:
Nota
o Desde la perspectiva de la lógica empresarial, no se permite eliminar un archivo adjunto o una línea de archivo adjunto.
o Debido a consideraciones de seguridad, el archivo adjunto para cargar DEBE tener menos de 50M. Si no, SL responde
con un mensaje de error como el siguiente:
Solicitud de entidad 413 muy extensa
<!DOCTYPE HTML PÚBLICO "//IETF//DTD HTML 2.0//EN">
Trabajar con la capa de servicio de SAP Business One PÚBLICO
<html>
<cabeza>
<title>413 Entidad de solicitud demasiado grande</title>
</cabeza>
<cuerpo>
<h1>Entidad de solicitud demasiado grande</h1>
El recurso solicitado
<br />/b1s/v1/Archivos adjuntos2
<br />
no permite solicitar datos con solicitudes POST, ni la cantidad de datos proporcionados en
la solicitud supera el límite de capacidad.
<p>
Además, una entidad de solicitud 413 demasiado grande
se encontró un error al intentar usar un ErrorDocument para
manejar la solicitud.
</p>
</cuerpo>
</html>
3.18 Carga de entidad de transmisión
A partir de SAP Business One 10.0 FP 2202, Service Layer permite a los usuarios cargar una entidad de flujo con el
mecanismo Slug. Slug es un encabezado de entidad HTTP cuya presencia en un POST a una colección constituye una solicitud del
cliente para usar el valor del encabezado como parte de cualquier URI que normalmente se usaría para recuperar la entrada o los
recursos de medios que se crearán. Para obtener información sobre Slug, consulte sus especificaciones.
En la capa de servicio, las siguientes entidades tienen capacidades de transmisión y se pueden usar para aprovechar el
mecanismo Slug:
• Anexos2
• Imágenes
Si observa sus metadatos, verá que dicha entidad de transmisión tiene un atributo especial HasStream="true", lo que significa que el tipo de
entidad es una entidad de medios y representa una transmisión de medios, como una foto.
<EntityType HasStream="true" Name="Adjuntos2" OpenType="true">
<Clave>
<PropertyRef Name="AbsoluteEntry"/>
</Clave>
<Property Name="AbsoluteEntry" Nullable="false" Type="Edm.Int32"/>
<Nombre de la propiedad="Archivos adjuntos2_Líneas"
Tipo = "Colección (SAPB1.Attachments2_Line)"/>
</EntityType>
PÚBLICO Trabajar con la capa de servicio de SAP Business One
120 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
La siguiente sección brindará algunos ejemplos que demuestran cómo usar Slug para trabajar con Service Layer.
3.18.1 Ejemplo de cliente OData
El fragmento de código siguiente utiliza la biblioteca de cliente oData para cargar un archivo adjunto a la capa de servicio. Para obtener
más detalles sobre cómo usar la biblioteca del cliente oData para trabajar con la capa de servicio, consulte Cliente OData para la capa de
servicio.
// POST /b1s/v2/Archivos adjuntos2
Adjuntos2 adjunto = new Adjuntos2();
slContext.AddToAttachments2(archivo adjunto);
string path = [Link]([Link]().Location);
string imageFile = ruta + @".\SAP[Link]";
// Abre un archivo de imagen y guárdalo como flujo.
FileStream imageStream = new FileStream(imageFile, [Link]);
[Link](archivo adjunto, imageStream, verdadero, "imagen/jpeg", "[Link]");// imagen/jpeg => jpeg jpg jpe
// Cargue el archivo y obtenga la respuesta.
ChangeOperationResponse changeResponse = [Link]().FirstOrDefault() as ChangeOperationResponse;
// Obtener la entidad creada en el servicio y comprobar si la entidad es la esperada.
var entidadDescriptor = [Link] as EntityDescriptor;
Uri editLink = [Link];
Regex regex = new Regex(@"/b1s/v2/attachments2\((?<entrada>\d+)\)", [Link]);
Coincidencia coincidencia = [Link]([Link]);
Partido de vuelta. ¿Éxito? Convert.ToInt32([Link]["entrada"].Valor): 0;
Capture la solicitud y encontrará que el encabezado Slug está allí para indicar el nombre del archivo.
POST [Link]
Babosa: [Link]
Versión de OData: 4.0
ODataMax Versión: 4.0
Aceptar: aplicación/json;[Link]=minimal;
Aceptar juego de caracteres: UTF8
Agente de usuario: [Link]/7.9.0
Cookie: B1SESSION=3a8f8e84e1f411eb80000a0027000008; HttpOnly;
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Conexión: KeepAlive
Tipo de contenido: imagen/jpeg
Anfitrión: servicelayerhost:50000
Longitud del contenido: 6315
<el contenido binario de una imagen>
3.18.2 Ejemplo de SAP UI5
El siguiente fragmento de código utiliza el libaray SAP UI5 para trabajar con la capa de servicio en el lado del navegador.
Interfaz de usuario para el cargador de archivos
<mvc:Ver
controllerName="[Link]"
xmlns:l="[Link]ño"
xmlns:u="[Link]"
xmlns:mvc="[Link]"
xmlns="sap.m"
xmlns:semantic="[Link]"
class="viewPadding">
<semantic:SemanticPage
identificación = "página"
headerPinnable="falso"
toggleHeaderOnTitleClick="falso">
<semántico:títuloEncabezado>
<Title text="{i18n>adjuntoVerTitulo}"/>
</semantic:titleHeading>
<semántico:contenido>
<l:Disposición Vertical>
<u:Cargador de archivos
id="adjuntoUploader"
nombre="adjuntarArchivoSubir"
uploadUrl="/b1s/v2/Archivos adjuntos2"
tooltip="Sube tu archivo adjunto"
uploadComplete="adjuntarHandleUploadComplete"/>
<Botón
text="Subir archivo adjunto"
prensa="adjuntarHandleUploadPress"/>
PÚBLICO Trabajar con la capa de servicio de SAP Business One
122 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
</l:Disposición vertical>
</semántica:contenido>
</semantic:SemanticPage>
</mvc:Ver>
Interacción para el cargador de archivos
[Link](['sap/m/MessageToast', 'sap/ui/core/mvc/Controller'],
función (MessageToast, Controlador) {
"uso estricto";
return [Link]("[Link]", {
adjuntarHandleUploadPress: función (oEvento) {
var oAttachmentUploader = [Link]("attachmentUploader");
[Link]().then(function() {
[Link](verdadero);
[Link](falso);
[Link](nuevo
[Link]({
nombre: "Babosa",
valor: "[Link]"
}));
[Link]();
[Link]();
}, función (error) {
[Link]("No se puede leer el archivo. Es posible que tenga
cambió.");
}).entonces(función () {
[Link]();
});
},
});
});
3.19 Imagen del artículo e imagen del empleado
A partir de SAP Business One 9.1 parche nivel 12, versión para SAP HANA, Service Layer presenta una nueva entidad de
flujo ItemImages para admitir las operaciones CRUD de la entidad ItemImages. Los metadatos de esta entidad son:
<EntityType Name="ItemImage" m:HasStream="true">
<Clave>
<PropertyRef Name="ItemCode"/>
Trabajar con la capa de servicio de SAP Business One PÚBLICO
</Clave>
<Property Name="ItemCode" Nullable="false" Type="[Link]"/>
<Property Name="Picture" Nullable="false" Type="[Link]"/>
</EntityType>
A partir de SAP Business One 9.3 parche nivel 12, versión para SAP HANA, las imágenes de empleados están disponibles para usted en
la capa de servicio.
3.19.1 Configuración de una carpeta de imágenes de elementos
La carpeta de imágenes de elementos es una carpeta compartida en la plataforma Windows para el cliente SAP Business One. Para que sea
accesible para Service Layer en Linux, se requiere CIFS. Los pasos de configuración para la carpeta de imágenes de elementos son similares a los
de la carpeta de archivos adjuntos, de la siguiente manera:
1. Cree una carpeta compartida con permisos de lectura y escritura en Windows (por ejemplo, \\<servidor
de base de datos>\temp\SL\itemimages) y configúrela como carpeta de imágenes de elementos en Configuración general del cliente SAP
Business One. Asegúrese de que la ruta de la carpeta sea una ruta de red.
2. Cree una carpeta en Linux (por ejemplo, /mnt/itemimages).
3. Monte la carpeta de Linux en la carpeta de Windows ejecutando un comando como:
mount t cifs o nombreusuario=xxxxx,contraseña=******,file_mode=0777,dir_mode=0777 "//<servidorbase de datos>/temp/SL/
itemimages" /mnt/itemimages
Para montar automáticamente cuando se inicia el servidor Linux, siga los mismos pasos que para la carpeta de archivos adjuntos.
3.19.2 Obtener una imagen de artículo o una imagen de empleado
Desde el cliente de SAP Business One, puede especificar una imagen de artículo para un artículo o una imagen de empleado para
un empleado.
Para obtener la imagen del elemento a través de la capa de servicio, envíe una solicitud como:
OBTENER /b1s/v1/ItemImages('i001')/$valor
En caso de éxito, la respuesta en el navegador es la siguiente:
PÚBLICO Trabajar con la capa de servicio de SAP Business One
124 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
Nota
Se requiere que se agregue $value al final de la URL de recuperación de ItemImages.
Si se omite $value, la respuesta es la siguiente:
"una [Link]":
"[Link]
"[Link]": "ItemImages('i001')/$valor",
"[Link]": "imagen/jpeg",
"CódigoArtículo": "'i001'",
"Imagen": "sap_1.jpg"
}
Para obtener la imagen del empleado a través de Service Layer, envíe una solicitud como:
GET b1s/v1/EmployeeImages('EmployeeID')
3.19.3 Actualizar o cargar una imagen de artículo
Service Layer también le permite cargar o actualizar la imagen de un artículo a través de PATCH. La solicitud debe contener un encabezado
de tipo de contenido que especifique un tipo de contenido de varias partes/mixto y una especificación de límites como:
Tipo de contenido: multipart/formdata;boundary=<Límite>
El cuerpo está separado por el límite definido en el encabezado ContentType, como:
<Límite>
ContenidoDisposición: formulariodatos; nombre="archivos"; nombre de archivo="<archivo>"
Tipo de contenido: <tipo de contenido del archivo>
<contenido del archivo>
Trabajar con la capa de servicio de SAP Business One PÚBLICO
<Límite>
El requisito previo es que el elemento debe existir. Si el elemento no tiene una imagen, por ejemplo, el elemento con ItemCode=
'i001', una solicitud de parche como la siguiente carga una imagen. De lo contrario, la solicitud reemplaza la imagen del elemento
existente.
PARCHE /b1s/v1/ItemImages('i001') HTTP/1.1
Tipo de contenido: multipart/formdata; límite=WebKitFormBoundaryUmZoXOtOBNCTLyxT
WebKitFormBoundaryUmZoXOtOBNCTLyxT
ContenidoDisposición: formulariodatos; nombre="archivos"; nombre de archivo="sap_2.jpg"
Tipo de contenido: imagen/jpeg
<datos binarios de imagen>
WebKitFormBoundaryUmZoXOtOBNCTLyxT
En caso de éxito, el código HTTP 204 se devuelve sin contenido.
HTTP/1.1 204 Sin contenido
Para verificar el actualizado, envíe una solicitud como:
OBTENER /b1s/v1/ItemImages('i001')/$valor
En caso de éxito, la respuesta en el navegador es la siguiente:
Nota
Solo con fines de prueba, puede usar el complemento POSTMAN de Chrome para actualizar la imagen de un artículo.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
126 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
3.19.4 Eliminación de una imagen de artículo
Para eliminar la imagen de un artículo, envíe una solicitud como:
ELIMINAR /b1s/v1/ItemImages('i001')
En caso de éxito, el código HTTP 204 se devuelve sin contenido.
HTTP/1.1 204 Sin contenido
Nota
No está permitido publicar una imagen del artículo. Puede evitar esa limitación cargando una imagen de artículo a través de PATCH.
No está permitido consultar imágenes de artículos. Para solucionar este problema, consulte el código de artículo y la imagen de los
artículos de la entidad.
3.20 Extensión JavaScript
A partir de SAP Business One 9.2 PL04, Service Layer permite a los usuarios desarrollar su propia aplicación de extensión incorporando
JavaScript en el lado del servidor.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
3.20.1 Motor de análisis de JavaScript
Service Layer utiliza Chrome V8 Engine (en adelante, V8) como motor de análisis de JavaScript debido a las siguientes consideraciones:
• El rendimiento del análisis es de gran importancia para la capa de servicio, y V8 es un motor de secuencias de comandos conocido
por su excelente rendimiento.
• Service Layer y V8 están escritos en C++. Esto haría que la integración fuera más fluida y fácil.
El motor JavaScript V8 es un motor JavaScript de código abierto desarrollado por The Chromium Project para el navegador
web Google Chrome. Para obtener más información sobre V8, consulte [Link]
3.20.2 Marco de extensión de JavaScript
Para facilitar el desarrollo de una aplicación de extensión, Service Layer proporciona un marco JavaScript para que los usuarios
operen fácilmente los objetos y servicios comerciales. El siguiente diagrama muestra la estructura básica del marco.
Nota
o Además de DICore y SLCore, V8, como un nuevo componente de C++, está integrado en Service Layer. o Service
Layer agrega la capa de interoperabilidad de C++/JavaScript para ser responsable de la interacción entre
JavaScript y C++.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
128 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
o Además de la capa de interoperabilidad, JavaScript SDK está diseñado para ocultar los detalles interactivos y proporcionar una
API simplificada y de alto nivel para la capa de aplicación.
o Teniendo en cuenta el hecho de que cambiar el contexto entre C++ y la pila de JavaScript no es bueno para el
rendimiento, uno de los objetivos de proporcionar el SDK es disminuir la frecuencia del cambio de contexto.
o Se sugiere que la aplicación de extensión de JavaScript de los usuarios se desarrolle en base al SDK de JavaScript.
3.20.3 Función de entrada de JavaScript
Como cada archivo ejecutable tiene una función de entrada principal , cada archivo de script tiene que definir funciones de entrada.
Convencionalmente, es mejor definir cuatro funciones de entrada en cada archivo de script, correspondientes a las operaciones CRUD en las entidades.
Cada función de entrada tiene un método HTTP del mismo nombre. Al recibir una solicitud, se activa la función de entrada que
tiene el mismo nombre que el método http de esta solicitud.
//La función de entrada para la solicitud http con el método GET
función OBTENER(){
...
//La función de entrada para la solicitud http con el método POST
función POST(){
...
//La función de entrada para solicitud http con el método PATCH
función PARCHE(){
...
//La función de entrada para solicitud http con el método DELETE
función ELIMINAR(){
...
Nota
Debido a un problema de compatibilidad de palabras clave en JavaScript, cada función de entrada debe estar en mayúsculas; de
lo contrario, la función no será reconocida.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
3.20.4 Asignación de URL de JavaScript
Los archivos de secuencia de comandos se activan para ejecutarse mediante el envío de solicitudes a la URL de secuencia de comandos específica. Para diferenciar la URL
de la secuencia de comandos de una URL normal, Service Layer proporciona una ruta de recurso de URL específica para las secuencias de comandos agregando /
script a la ruta original /b1s/v1 o /b1s/v2 como se muestra a continuación:
/b1s/v1/secuencia de comandos/
/b1s/v2/secuencia de comandos/
Teniendo en cuenta el hecho de que diferentes socios pueden definir el script con el mismo nombre, Service Layer identifica qué
script ejecutar al combinar el nombre del socio y el nombre del script como identificador único. La regla de mapeo para el patrón de
URL es:
/b1s/v1/script/{{nombre del socio}}/{{nombre del script}}
Las solicitudes enviadas a URL con el patrón anterior se envían a la función de script correspondiente definida por el socio
correspondiente.
Ejemplo
La siguiente solicitud activará la ejecución de la función POST definida en [Link] proporcionada por el socio mtcsys.
POST /b1s/v1/script/mtcsys/elementos
Nota
Un requisito previo es asegurarse de que el socio implemente el archivo de script con el archivo ard correspondiente
en SLD. Para obtener más detalles sobre cómo implementar scripts, consulte el capítulo Implementación de JavaScript.
SDK de JavaScript 3.20.5
Al igual que DIAPI, el SDK de JavaScript está destinado a proporcionar un grupo de API para que los programadores operen
fácilmente en servicios comerciales y objetos comerciales. Las API consisten en CRUD de entidad, consulta de entidad,
transacciones, excepciones y solicitud/respuesta http.
JavaScript, como lenguaje de programación de tipo débil, tiene muchas características dinámicas favorables incorporadas. Sin
embargo, en aras de la experiencia de programación y la eficiencia de la codificación, el SDK de JavaScript está diseñado como
una biblioteca de lenguaje estático, para aprovechar al máximo las funcionalidades de autocompletado e IntelliSense proporcionadas
por el IDE moderno. El recomendado es Visual Studio 2013/2015 con un complemento de
[Link] ([Link]
Por supuesto, también puede optar por programar dinámicamente y disfrutar de las funciones flexibles integradas con JavaScript.
Nota
Este SDK está diseñado para seguir deliberadamente la especificación común de JavaScript y se aproxima a la
gramática de [Link], que es exactamente la razón por la que se recomienda el complemento de [Link].
PÚBLICO Trabajar con la capa de servicio de SAP Business One
130 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
[Link] API de solicitud HTTP
Las funciones de solicitud http que se enumeran a continuación están empaquetadas en el módulo [Link], que es un módulo esencial,
necesario para manejar las solicitudes http.
Nombre de la API Descripción de la API
obtenerContenido() Devuelve el contenido sin procesar de la carga útil de la solicitud.
getJsonObject() Devuelve el formato JSON de la carga útil de la solicitud.
getMethod() Devuelve el verbo http, por ejemplo, GET, POST, PATCH, DELETE.
Devuelve el tipo MIME del cuerpo de la solicitud (p. ej.
getContentType()
APLICACIÓN/JSON)
Devuelve el valor de un parámetro de solicitud como una cadena o nulo si el parámetro
getParameter(nombre)
no existe.
Devuelve una matriz de objetos String que contienen los nombres de los parámetros
getParameterNames()
contenidos en esta solicitud.
getEntityKey() Devuelve la clave de entidad de la parte del recurso de URL.
getHeader(nombre) Devuelve el valor del encabezado de solicitud especificado como una cadena.
[Link] API de respuesta Http
Las funciones de respuesta http que se enumeran a continuación están empaquetadas en el módulo [Link], que es un módulo esencial,
necesario para manejar la respuesta http.
Nombre de la API Descripción de la API
setHeader(nombre, valor) Agrega un encabezado de respuesta con el nombre y el valor dados.
setContentType(contentType) Establece el tipo de contenido de la respuesta que se envía al cliente.
Establece la codificación de caracteres (juego de caracteres MIME) de la respuesta que
setCharSet(juego de caracteres)
se envía al cliente, por ejemplo, en UTF8.
setStatus(estado) Establece el código de estado para esta respuesta.
setContent(contenido) Establece el contenido en el cuerpo de la respuesta.
Envía la respuesta al cliente con el estado y contenido http opcional
enviar (estado, contenido)
Ejemplo
Para manejar una solicitud como la siguiente,
PARCHE /b1s/v1/script/mtcsys/items('i001')?key1=val1 & key2=val2
Versión del servicio de datos: 3.0
Trabajar con la capa de servicio de SAP Business One PÚBLICO
"ItemName": "nuevo nombre"
aplicar el siguiente script:
var http = require('[Link]');
función PARCHE() {
[Link]("Probando la solicitud http y la API de respuesta http...")
var derecha = {};
[Link] = [Link]();
ret.método = [Link]();
[Link] = [Link]();
[Link] = [Link]("DataServiceVersion");
[Link] = [Link]();
if ([Link] && [Link]) {
[Link](función (parámetro) {
ret[parámetro] = [Link](parámetro);
});
[Link] = [Link]();
[Link]([Link].APPLICATION_JSON);
[Link]([Link].HTTP_OK);
[Link](ret);
[Link]();
En caso de éxito, la capa de servicio devuelve:
HTTP/1.1 200 Aceptar
"contenido": {
"ItemName": "nuevo nombre"
},
"método": "PARCHE",
"contentType": "texto/normal; juego de caracteres=UTF8",
"versión del servicio de datos": "3.0",
"nombresparam": [
"clave1",
PÚBLICO Trabajar con la capa de servicio de SAP Business One
132 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
"clave2"
],
"clave1": "val1",
"clave2": "val2",
"clave": "'i001'"
Nota
o Similar a [Link], require es una función global para importar un módulo y devolver una referencia a ese módulo. El ejemplo anterior
indica que http es una referencia del módulo [Link]. o solicitud y respuesta son dos miembros de http, que
representan un HttpRequest creado previamente
instancia y una instancia de HttpResponse, respectivamente.
o Para facilitar la programación HTTP, el módulo [Link] también define constantes de utilidad HTTP, por
ejemplo, HttpStatus, ContentType.
[Link] API CRUD de entidad
Cada entidad expuesta admite operaciones CRUD de forma predeterminada. Las API relevantes se empaquetan en el módulo
[Link].
• En la mayoría de los casos, para realizar operaciones CRUD en una entidad, primero debe crear una instancia de entidad, si la
el nombre de la entidad se conoce de antemano. Luego llame al siguiente grupo de API definidas en el prototipo de EntitySet:
Prototipo de EntitySet
Nombre de la API Descripción de la API
Crea una entidad por el contenido y la función de devolución de llamada opcional en la
agregar (contenido, devolución de llamada)
creación.
Recupera una entidad por la clave y la función de devolución de llamada opcional en la
obtener (clave, devolución de llamada)
recuperación.
actualización (contenido, clave, Actualiza una entidad por el contenido, la clave y la función de devolución de llamada
devolución de llamada) opcional en la actualización.
Elimina una entidad por la clave y la función de devolución de llamada opcional al
eliminar (tecla, devolución de llamada)
eliminarla.
... ...
• Para el escenario donde el nombre de la entidad no se conoce de antemano o la entidad es un UDO creado dinámicamente, primero debe crear una
instancia de ServiceLayerContext. Luego llame al siguiente grupo de API contra esta instancia.
Prototipo de ServiceLayerContext
Nombre de la API Descripción de la API
Crea una entidad por el nombre, el contenido y la función de devolución de llamada
agregar (nombre, contenido, devolución de llamada)
opcional en la creación.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Nombre de la API Descripción de la API
Recupera una entidad por el nombre, la clave y la función de devolución de llamada
get (nombre, clave, devolución de llamada)
opcional en la recuperación.
actualización (nombre, contenido, clave, Actualiza una entidad por el nombre, el contenido y la clave y la función de devolución
devolución de llamada) de llamada opcional en la actualización.
Elimina una entidad por el nombre, la clave y la función de devolución de
eliminar (nombre, clave, devolución de llamada)
llamada opcional al eliminarla.
... ...
Ejemplo
Para manejar una solicitud como la siguiente,
POST /b1s/v1/script/mtcsys/test_items_more
aplicar el siguiente script:
var ServiceLayerContext = require('[Link]');
var Elemento = require('EntityType/[Link]');
var http = require('[Link]');
var test_item_code = "i001";
función POST() {
var slContext = nuevo ServiceLayerContext();
var derecha = [];
var elemento = nuevo elemento ();
[Link] = test_item_code;
var dataSrvRes = [Link](elemento);
si (![Link]()) {
lanzar [Link]([Link].HTTP_BAD_REQUEST, "error al crear la entidad")
[Link]({ "operación": [Link]ón, "estado": [Link]
});
clave var = test_item_code;
var dataSrvRes = [Link](clave);
si (![Link]()) {
tirar
[Link]([Link].HTTP_INTERNAL_SERVER_ERROR, "recuperar error de entidad")
PÚBLICO Trabajar con la capa de servicio de SAP Business One
134 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
[Link]({ "operación": [Link]ón, "estado": [Link]
});
[Link] = 'nuevo_elemento_nombre';
dataSrvRes = [Link]("Elementos", elemento, clave);//equivalente a
[Link](elemento, clave);
si (![Link]()) {
tirar
[Link]([Link].HTTP_INTERNAL_SERVER_ERROR, "error de entidad de actualización")
[Link]({ "operación": [Link]ón, "estado": [Link]
});
dataSrvRes = [Link]("Elementos", clave);//equivalente a
[Link](clave);
si (![Link]()) {
tirar
[Link]([Link].HTTP_INTERNAL_SERVER_ERROR, "error al eliminar la entidad")
[Link]({ "operación": [Link]ón, "estado": [Link]
});
[Link]([Link].HTTP_OK, ret);
En caso de éxito, la capa de servicio devuelve:
HTTP/1.1 200 Aceptar
"operación": "añadir",
"estado": 201
},
"operación": "obtener",
"estado": 200
},
"operación": "actualizar",
"estado": 204
},
Trabajar con la capa de servicio de SAP Business One PÚBLICO
"operación": "eliminar",
"estado": 204
[Link] API de consulta de entidad
Las API de consulta se empaquetan en el módulo [Link] y, de forma similar a la API CRUD, se definen tanto en el prototipo
EntitySet como en el ServiceLayerContext.
Prototipo de EntitySet
Nombre de la API Descripción de la API
Realiza una consulta que distingue entre mayúsculas y minúsculas y
consulta (opción de consulta, no distingue entre mayúsculas y minúsculas)
devuelve las entidades que satisfacen las opciones de consulta.
Realiza una consulta que distingue entre mayúsculas y minúsculas y
contar (opción de consulta, no distingue entre mayúsculas y minúsculas) devuelve el número de entidades que satisfacen las opciones de
consulta.
... ...
Prototipo de ServiceLayerContext
Nombre de la API Descripción de la API
Realiza una distinción entre mayúsculas y minúsculas o mayúsculas y minúsculas
consulta (nombre, opción de consulta, no distingue entre mayúsculas y minúsculas) consulta y devuelve las entidades con el nombre dado y
satisfaciendo las opciones de consulta.
Realiza una distinción entre mayúsculas y minúsculas o mayúsculas y minúsculas
contar (nombre, opción de consulta, no distingue entre mayúsculas y minúsculas) consulta y devuelve el número de las entidades con el nombre
dado y satisfaciendo las opciones de consulta.
... ...
Nota
El parámetro isCaseInsensible es solo para la base de datos de SAP HANA. Si está trabajando con la base de datos de SAP HANA, de forma
predeterminada, la consulta distingue entre mayúsculas y minúsculas, debido a la intercalación Unicode predeterminada para la base de datos
de SAP HANA. Especificar el indicador isCaseInsensitive como verdadero generaría una consulta que no distingue entre mayúsculas y minúsculas.
Sin embargo, el rendimiento de la consulta no sería tan eficaz como con una consulta que no distingue entre mayúsculas y minúsculas.
A partir de SAP Business One 9.2 PL07, versión para SAP HANA, se admite la consulta que no distingue entre mayúsculas y minúsculas.
Ejemplo
Para manejar una solicitud como la siguiente,
OBTENER /b1s/v1/script/mtcsys/test_query_businesspartner
aplicar el siguiente script:
var ServiceLayerContext = require('[Link]');
var http = require('[Link]');
PÚBLICO Trabajar con la capa de servicio de SAP Business One
136 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
función OBTENER () {
var queryOption = "$select=CardName, CardCode & $filter=contains(CardCode,
'c1') & $top=5 & $orderby=CardCode";
var slContext = nuevo ServiceLayerContext();
var retCaseSensitive = [Link](queryOption);
var retCaseInsensible = [Link]("BusinessPartners", queryOption, true);
[Link]([Link].HTTP_OK);
[Link]({ "CaseSensitive": [Link](),
"Insensible a mayúsculas y minúsculas": retInsensible a mayúsculas y minú[Link]() });
[Link]();
En caso de éxito, la capa de servicio devuelve:
HTTP/1.1 200 Aceptar
"Distingue mayúsculas y minúsculas": [
"CódigoTarjeta": "c1",
"CardName": "cliente c11"
],
"Insensible a mayúsculas y minúsculas": [
"CódigoTarjeta": "c1",
"CardName": "cliente c11"
},
"Código de tarjeta": "C11",
"Nombre de la tarjeta": nulo
},
"Código de tarjeta": "C12",
"Nombre de la tarjeta": nulo
Ejemplo
Para manejar una solicitud que no distingue entre mayúsculas y minúsculas:
Trabajar con la capa de servicio de SAP Business One PÚBLICO
GET /b1s/v1/BusinessPartners?$filter=contains(CódigoTarjeta,
'c2')&$select=CódigoTarjeta
B1SInsensible a mayúsculas y minúsculas: verdadero
En caso de éxito, la capa de servicio devuelve:
HTTP/1.1 200 Aceptar
"valor": [
"Código de tarjeta": "C20000"
},
"Código de tarjeta": "C23900"
},
"Código de tarjeta": "c21"
},
"Código de tarjeta": "c22"
[Link] API de transacciones
Las API de transacciones, como las que se enumeran a continuación, están empaquetadas en el módulo [Link], que es un módulo esencial, necesario
para controlar las transacciones.
Nombre de la API Descripción de la API
iniciarTransacción Inicia una transacción.
cometerTransacción Confirma una transacción.
revertirTransacción Revierte una transacción
estáEnTransacción Devuelve verdadero si la operación actual está en una transacción
Ejemplo
Para manejar una solicitud como la siguiente,
POST /b1s/v1/script/mtcsys/test_create_businesspartner
PÚBLICO Trabajar con la capa de servicio de SAP Business One
138 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
"CódigoTarjeta": "c001",
"Nombre de la tarjeta": "c001"
},
"CódigoTarjeta": "c002",
"Nombre de la tarjeta": "c002"
},
"CódigoTarjeta": "c003",
"Nombre de la tarjeta": "c003"
},
"CódigoTarjeta": "c004",
"Nombre de la tarjeta": "c004"
},
"CódigoTarjeta": "c005",
"Nombre de la tarjeta": "c005"
aplicar el siguiente script:
var ServiceLayerContext = require('[Link]');
var http = require('[Link]');
var BusinessPartner = require('EntityType/[Link]');
función POST() {
var slContext = nuevo ServiceLayerContext();
var bpList = [Link]();
if (!(bpList instancia de Array)) {
lanzar [Link]([Link].HTTP_BAD_REQUEST, "no válido
formato de carga útil");
[Link]();
for (var i = 0; i < [Link]; ++i) {
var res = [Link](bpList[i]);
si (![Link]()) {
[Link]();
lanzar [Link]([Link].HTTP_BAD_REQUEST, [Link]());
Trabajar con la capa de servicio de SAP Business One PÚBLICO
};
[Link]();
[Link]([Link].TEXT_PLAIN);
[Link]([Link].HTTP_OK, "transacción confirmada");
En caso de éxito, la capa de servicio devuelve:
HTTP/1.1 200 Aceptar
transacción comprometida
Envíe esta solicitud nuevamente, Service Layer devuelve:
HTTP/1.1 400 Solicitud incorrecta
"error" : {
"código": 600,
"mensaje" : {
"lang": "enus",
"value" : "1320000140 Código de socio comercial 'c001' ya asignado a un socio comercial; ingrese
un código de socio comercial único"
Nota
o Los programadores deben ser conscientes de que las operaciones de transacción son costosas y grandes transacciones
degradar el rendimiento del servicio web. Por lo tanto, Service Layer impone una limitación en el tamaño de la transacción.
El total de operaciones en una transacción no debe ser más de 10. o Tenga en cuenta
que las siguientes transacciones deben llamarse como pares:
startTransaction/commitTransaction o startTransaction/rollbackTransaction.
[Link] API de excepción
[Link].1 Excepción de compilación
Service Layer responde con un mensaje de error al cliente si hay un error de compilación en el script de un usuario.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
140 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
Ejemplo
var Documento = require('EntityType/[Link]');
//Error de tipo: ';' debiera ser ','
var línea = [Link]({
Código de artículo: 'i001'; Cantidad: 2, Precio unitario: 10
});
var líneas = nuevo [Link]();
[Link](linea);
El código anterior daría como resultado un mensaje de error como el siguiente:
"error": {
"código": 511,
"mensaje": {
"lang": "eses",
"valor": "Error de script: error de compilación [SyntaxError: Token inesperado
;]".
[Link].2 Excepción de tiempo de ejecución
Service Layer responde con un mensaje de error al cliente si hay un error de tiempo de ejecución en el script de un usuario.
Ejemplo
var ServiceLayerContext = require('[Link]');
//var Banco = require('TipoEntidad/[Link]');
var banco = nuevo Banco();
banco.CódigoBanco = 'banco01';
var res = new ServiceLayerContext().[Link](banco);
si (![Link]á bien) {
El código anterior daría como resultado un mensaje de error como el siguiente:
HTTP/1.1 400 Solicitud incorrecta
"error": {
Trabajar con la capa de servicio de SAP Business One PÚBLICO
"código": 512,
"mensaje": {
"lang": "eses",
"valor": "Error de secuencia de comandos: error de tiempo de ejecución [Error de referencia: el banco no está
definido]".
[Link].3 Excepción de usuario
La capa de servicio también permite a los usuarios propagar excepciones de forma explícita lanzando ScriptException exportado desde el módulo
http.
Ejemplo
var ServiceLayerContext = require('[Link]');
var Orden = require('EntityType/[Link]');
var http = require('[Link]');
var slContext = nuevo ServiceLayerContext();
var res = [Link](10000);
si (![Link]()) {
lanzar una nueva [Link]([Link].HTTP_NOT_FOUND, "la dada
no se encuentra el pedido");
El código anterior daría como resultado un mensaje de error como el siguiente:
HTTP/1.1 404 No encontrado
"error": {
"código": 600,
"mensaje": {
"lang": "eses",
"value": "no se encontró la orden dada"
PÚBLICO Trabajar con la capa de servicio de SAP Business One
142 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
3.20.6 Registro
Actualmente, no se admite el script de depuración. Sin embargo, los usuarios pueden registrar la información clave durante la
programación de scripts utilizando la API [Link]:
[Link]('¡Hola, Scripting de capa de servicio!');
Nota
consola es un objeto global. Literalmente, la salida de este objeto debe imprimirse en la consola. Sin embargo, teniendo
en cuenta que Service Layer es un servicio de backend, la salida se redirige a los archivos de registro en
{Ruta de instalación de SL}/logs/script/.
3.20.7 Herramienta de generación de SDK de JavaScript
Teniendo en cuenta que en cada parche puede haber nuevos objetos comerciales expuestos o nuevos cambios realizados
en los objetos existentes, el SDK se ajustará en consecuencia para adaptarse a los cambios.
Mantener manualmente el SDK no solo requeriría un gran esfuerzo, sino que también sería propenso a errores. Para abordar
automáticamente este problema, se proporciona una herramienta llamada Metadata2JavaScript para generar el SDK de acuerdo
con los metadatos, ya que los metadatos reflejan todos los cambios en los objetos comerciales.
Esta herramienta admite la generación del SDK de dos formas (tomemos el entorno Linux como ejemplo):
• Desde un archivo de metadatos local:
Metadata2JavaScript a {archivo de metadatos local} o {carpeta de salida, el valor predeterminado es ./b1s_sdk}
Metadata2JavaScript addr {archivo de metadatos local} output {carpeta de salida, el valor predeterminado es ./b1s_sdk}
Por ejemplo:
Metadata2JavaScript a [Link] o ./salida
• Desde una instancia de capa de servicio remota:
Metadata2JavaScript a {SL base url} u {usuario} p {contraseña} c {empresa} o {carpeta de salida, el valor
predeterminado es ./b1s_sdk}
o
Metadata2JavaScript addr {SL base url} user {usuario} password {contraseña} company {company} output {carpeta
de salida, el valor predeterminado es ./b1s_sdk}
Por ejemplo:
Metadata2JavaScript addr [Link]
Nota
Esta herramienta se publica junto con Service Layer y está disponible en la carpeta bin de la ruta de instalación de
Service Layer.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Como esta herramienta depende de JAVA JRE, antes de ejecutarla, asegúrese de que las variables de entorno JAVA relevantes
se exporten correctamente.
En el entorno Linux, configure JAVA_HOME como se muestra a continuación:
exportar JAVA_HOME=/usr/sap/SAPBusinessOne/Common/sapjvm_8/jre
exportar RUTA=$JAVA_HOME/bin:$RUTA
Anteriormente, la herramienta Metadata2Javascript solo estaba disponible en el entorno Linux. A partir de SAP Business One 10.0 FP
2011, esta herramienta también está disponible en el entorno de Microsoft Windows. Hay ligeras diferencias cuando usas la herramienta:
• En el entorno Linux, ingresa el comando que comienza con Metadata2JavaScript. • En el entorno de Microsoft
Windows, ingresa el comando que comienza con java jar
[Link].
En los ejemplos anteriores, para el entorno de Microsoft Windows, cambie el comando a lo siguiente:
java jar [Link] a [Link] o ./salida
java jar [Link] addr [Link]
empresa SBODEMOUS
3.20.8 Implementación de JavaScript
Service Layer reutiliza el administrador de extensiones para administrar el ciclo de vida de los archivos de script. Al igual que el complemento
DIAPI, las aplicaciones de extensión desarrolladas por Service Layer también se implementan en SLD.
Suponga que tiene un archivo de script [Link]; siga los siguientes pasos para implementarlo:
1. Cree un archivo ard llamado [Link] en el siguiente formato para describir el meta de este archivo de script. Mientras tanto,
el archivo ard también se puede usar para determinar la ruta de URL del script.
<?versión xml="1.0" codificación="utf8"?>
<AddOnRegData xmlns:xsi="[Link]
2001/XMLSchema"
SlientInstallation="" SlientUpgrade="" Partnernmsp="mtcsysnm"
Versión de esquema="3.0"
Escriba="ServiceLayerScript" OnDemand="" OnPremise=""
ExtName="ElementosExt"
ExtVersion="1.00" Contdata="sa" Socio="mtcsys" DBType="HANA"
TipoCliente="S">
<ServiceLayerScripts>
<Script Name="elementos" FileName="[Link]"></Script>
</ServiceLayerScripts>
<XApps>
<XApp Name="" Path="" FileName="" />
</XApps>
</AddOnRegData>
PÚBLICO Trabajar con la capa de servicio de SAP Business One
144 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
2. Comprima el archivo ard y el archivo script en un archivo zip (p. ej., [Link]).
3. Cargue [Link] al administrador de extensiones desde el Asistente de importación de extensiones.
4. Desde el Asistente de asignación de extensiones, asigne la aplicación de extensión a una empresa.
5. Inicie sesión en la empresa con Service Layer y acceda al script con la siguiente URL:
Trabajar con la capa de servicio de SAP Business One PÚBLICO
/b1s/v1/script/mtcsys/elementos
Nota
o La URL del script es una combinación del nombre del socio y el nombre del script separados por un '/' adjunto al
URL base de la capa de servicio /b1s/v1/.
o Actualmente, Service Layer no admite la compresión de varios archivos de script en un archivo ard. o Para obtener más
detalles sobre cómo implementar aplicaciones de extensión, consulte la guía Cómo
Empaquete e implemente las extensiones de SAP Business One para una implementación ligera.
o En el archivo ard, no nombre el valor del atributo Socio como prueba, ya que prueba es una palabra reservada
para pruebas internas.
3.20.9 Casos típicos de usuario de aplicación de script
[Link] Transacciones Complejas
Las secuencias de comandos se pueden usar en escenarios de transacciones, lo cual es un complemento importante para las operaciones por lotes de OData.
El siguiente es un ejemplo para agregar un pedido y una entrega en función del pedido en una transacción, lo que sería imposible sin secuencias de
comandos.
Ejemplo
var ServiceLayerContext = require('[Link]');
var http = require('[Link]');
var Orden = require('EntityType/[Link]');
var NotaDeEntrega = require('EntityType/[Link]');
/*
*
Función de entrada para la solicitud HTTP POST.
*
*/
función POST() {
var pedido = nuevo pedido();
pedido.CódigoTarjeta = 'c1';
[Link] = nueva Fecha();
[Link] = nueva fecha ();
var línea = nuevo [Link]();
lí[Link] = 'i1';
lí[Link] = 1;
PÚBLICO Trabajar con la capa de servicio de SAP Business One
146 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
lí[Link] = 10;
var linea2 = nuevo [Link]();
[Link] = 'i2';
lí[Link] = 1;
[Link] = 10;
[Link] = new [Link]();
[Link](línea);
[Link](línea2);
var slContext = nuevo ServiceLayerContext();
//comenzar la transacción
[Link]();
var res = [Link](orden);
si (![Link]()) {
[Link]();
devuelve [Link]([Link].HTTP_BAD_REQUEST, [Link]);
// obtener el pedido recién creado del cuerpo de la respuesta.
var newOrder = [Link]([Link]);
//crear una entrega basada en el pedido
var NotaDeEntrega = new NotaDeEntrega();
[Link] = [Link];
[Link] = [Link];
NotaDeEntrega.CódigoTarjeta = nuevoPedido.CódigoTarjeta;
[Link] = new [Link]();
for (var lineNum = 0; lineNum < [Link]; ++lineNum) {
var línea = new [Link]();
lí[Link] = 17;
lí[Link] = [Link];
lí[Link] = lineNum;
[Link](línea);
res = [Link](deliveryNote);
si (![Link]()) {
[Link]();
Trabajar con la capa de servicio de SAP Business One PÚBLICO
devuelve [Link]([Link].HTTP_BAD_REQUEST, [Link]);
}demás{
[Link]();
devuelve [Link]([Link].HTTP_CREATED, [Link]);
[Link] Lógica empresarial personalizada (por ejemplo, UDO)
Otro caso típico de secuencias de comandos es agregar lógica comercial personalizada durante el proceso de operación de objetos
definidos por el usuario (UDO). El siguiente es un ejemplo para realizar algunas validaciones y calcular el DocTotal al crear el UDO denominado
MyOrder.
Ejemplo
POST /b1s/v1/script/mtcsys/test_myorder
"U_CustomerName": "c1",
"U_DocTotal": 0,
"MyOrderLinesCollection": [
"U_ItemName": "i1",
"Precio_U": 100,
"U_Cantidad": 3
},
"U_ItemName": "i2",
"Precio_U": 80,
"U_Cantidad": 4
Aplique el siguiente script para manejar la solicitud anterior:
función POST() {
//Antes de crear el UDO, los usuarios pueden agregar lógica adicional.
var miPedido = [Link]();
var slContext = nuevo ServiceLayerContext();
PÚBLICO Trabajar con la capa de servicio de SAP Business One
148 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
//Ejemplo 1: lógica agregada para validar si cada artículo existe y el stock de artículos es suficiente.
[Link](función (línea) {
var dataSvcRes = [Link](line.U_ItemName);
if (![Link]()) {
lanza una nueva [Link]([Link].HTTP_NOT_FOUND, "elemento
extraviado");
} demás {
//Convierta el tipo débil en tipo fuerte llamando a [Link]. El
la conversión no es imprescindible.
//También puede usar [Link]
var item = [Link]([Link]);
if (artí[Link] < línea.U_Cantidad) {
lanza una nueva [Link]([Link].HTTP_BAD_REQUEST,
"no hay suficientes artículos en stock");
});
//Ejemplo 2: lógica agregada para calcular el DocTotal
miPedido.U_DocTotal = 0;
[Link](función (línea) {
miPedido.U_DocTotal += (línea.U_Precio * línea.U_Cantidad);
});
//Agregar este UDO
var res = [Link]("MiPedido", miPedido);
si ([Link]á bien()) {
[Link]([Link].HTTP_CREATED, [Link]);
} demás {
[Link]([Link].HTTP_BAD_REQUEST, [Link]);
3.20.10 Consumir servicio de script desde la aplicación .Net
Por razones de flexibilidad, SL permite que la respuesta del script sea altamente personalizada. No es apropiado definir los metadatos fijos para el scripting y, como
tal, no es posible usar el marco WCF único para consumir el servicio de script. Como alternativa, se sugiere programar con la biblioteca .NET Web Http
combinada con WCF, ilustrada con el siguiente fragmento de código.
[Accesorio de prueba]
Trabajar con la capa de servicio de SAP Business One PÚBLICO
clase ScriptOrdersTest: [Link]
[Configuración]
configuración de vacío público ()
[Link] += delegado(objeto
remitente, certificado X509Certificate, cadena X509Chain, SslPolicyErrors ssl) { return true; };
ServicePointManager.Expect100Continue = falso;
[Link] = 2000;
cadena privada m_cookie = [Link];
Uri privado m_baseUri = nuevo Uri ([Link]().SL_URL);
privado int m_docEntry = 0;
[Prueba]
test01_create vacío público ()
Orden del documento = nuevo documento ();
pedido.CódigoTarjeta = "c1";
[Link] = [Link];
[Link] = [Link];
línea DocumentLine = new DocumentLine();
[Link] = 1;
lí[Link] = "i1";
lí[Link] = 1;
lí[Link] = 10;
[Link](línea);
línea DocumentLine = new DocumentLine();
[Link] = 2;
lí[Link] = "i2";
lí[Link] = 1;
lí[Link] = 10;
[Link](línea);
intentar
PÚBLICO Trabajar con la capa de servicio de SAP Business One
150 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
var setting = new JsonSerializerSettings() { NullValueHandling =
[Link] };
cadena json = [Link] (orden, configuración);
datos var = Codificació[Link](json);
Solicitud HttpWebRequest = (HttpWebRequest)[Link](nuevo Uri(m_baseUri, "script/test/
test_orders"));
[Link] = nuevo
[Link]([Link])
;
solicitud.Método = "POST";
[Link] = false;
[Link]["Cookie"] = m_cookie;
[Link] = "aplicación/json;odata=minimalmetadata";
[Link] = [Link];
usando (var stream = [Link]())
[Link](datos, 0, [Link]);
Respuesta HttpWebResponse = (HttpWebResponse)[Link]();
[Link]([Link], [Link]);
var responseString = new
StreamReader([Link]()).ReadToEnd();
Documento nuevaEntidad =
[Link]<Documento>(responseString);
[Link]([Link] > 0);
[Link]([Link](),
orden.Lí[Link]());
[Link]();
m_docEntry = [Link];
captura (excepción WebException)
{
Respuesta WebResponse = [Link];
si (respuesta == nulo)
lanzar SetResultMessage(ex);
var responseString = new
StreamReader([Link]()).ReadToEnd();
throw SetResultMessage (nueva excepción (responseString));
Trabajar con la capa de servicio de SAP Business One PÚBLICO
captura (excepción ex)
lanzar SetResultMessage(ex);
3.21 Intercambio de recursos de origen cruzado (CORS)
A partir del nivel de parche 08 de SAP Business One 9.1, versión para SAP HANA, se admite CORS para permitir que los orígenes confiables
accedan al recurso de la capa de servicio. Para obtener más información sobre CORS, consulte los enlaces a continuación: http://
enable[Link]/ http://
[Link]/en/tutorials/cors/#tocwithcredentials
3.21.1 Habilitación de CORS
De forma predeterminada, se rechaza una solicitud de dominio cruzado debido a la configuración de seguridad del navegador. Para habilitar
CORS, abra [Link] y agregue dos elementos de configuración. Por ejemplo:
"CorsEnable": verdadero,
"CorsAllowedOrigins": "[Link]
Puede consultar Opciones de configuración para la capa de servicio para obtener más detalles sobre las configuraciones de CORS.
3.21.2 Habilitar para configurar encabezados permitidos
A partir de SAP Business One 9.2, versión para el nivel de parche 07 de SAP HANA, los encabezados de solicitud pueden configurarse en
[Link].
De forma predeterminada, solo se permite el tipo de contenido y la aceptación en el proceso de CORS. Sin embargo, bajo algunas
condiciones, se necesitan otros encabezados, por ejemplo, B1SCaseInsensible. Para satisfacer este requisito, agregue la opción de
configuración CorsAllowedHeaders en [Link]. Por ejemplo:
"CorsAllowedHeaders":"tipo de contenido, aceptar, B1SInsensible a mayúsculas y minúsculas"
Nota
Puede consultar Opciones de configuración para la capa de servicio para obtener más detalles sobre las configuraciones de CORS.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
152 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
3.21.3 Proceso CORS
Una vez que CORS está habilitado, los navegadores primero emiten una solicitud de OPCIONES (una solicitud de verificación previa),
que es como pedir permiso al servidor para realizar la solicitud real. Una vez que se han otorgado los permisos, el navegador realiza la
solicitud real. El navegador maneja los detalles de estas dos solicitudes de forma transparente. La respuesta de verificación previa también se
puede almacenar en caché para que no se emita en cada solicitud. Tome las solicitudes recibidas por Service Layer como ejemplo:
[11936] 5 b1s_handler: OPCIONES /b1s/v1/Iniciar sesión desde [Link]
[11936] 6 b1s_handler: POST /b1s/v1/Iniciar sesión desde [Link]
[11936] 7 b1s_handler: OPCIONES /b1s/v1/Artículos de [Link]
[11936] 8 b1s_handler: POST /b1s/v1/Artículos de [Link]
3.22 API de ping pong
A partir del nivel de parche 10 de SAP Business One 9.3, versión para SAP HANA, Service Layer proporciona un nuevo método API de Ping
Pong que puede mejorar la depuración, el soporte, las pruebas de red y la supervisión de componentes. El propósito de esta API es proporcionar
una respuesta directa del servidor Apache para que pueda eliminar el tiempo de procesamiento interno de SAP Business One de cualquier
depuración del rendimiento de la red. (Esto es diferente de todas las demás API de capa de servicio que se pasan al núcleo de SAP
Business One para su procesamiento antes de devolver un resultado). En respuesta a una solicitud PING, el servidor Apache (equilibrador
de carga o nodo) responderá directamente con una respuesta PONG simple.
Esta API podría usarse para cumplir con los siguientes escenarios:
• Aislar la latencia de la red de la latencia de procesamiento de SAP Business One • Verificar
la precisión de la hora del servidor •
Supervisar o depurar la disponibilidad de la API de la capa de
servicio • Supervisar el equilibrador de carga y los nodos por separado (importante para la implementación de varios servidores)
Ejemplo
Los siguientes escenarios son algunos ejemplos de cómo utilizar la API de Ping Pong:
o Escenario 1: no se especifica un punto final, el equilibrador de carga responderá
Pedido:
[Link]
Respuesta:
HTTP/1.1 200 Aceptar
o Escenario 2: Balanceador de carga de capa de servicio de ping
Pedido:
[Link]
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Respuesta:
HTTP/1.1 200 Aceptar
o Escenario 3: el nodo especificado responderá
Pedido:
[Link]
Respuesta:
HTTP/1.1 200 Aceptar
o Escenario 4: el nodo especificado responderá
Pedido:
[Link]
Respuesta:
HTTP/1.1 200 Aceptar
{ "mensaje": "pong", "remitente": "nodo2", "marca de tiempo": "1552263107.648"}
o Escenario 5: no se especifica ningún nodo, el nodo 1 responderá
Pedido:
[Link]
Respuesta:
HTTP/1.1 200 Aceptar
o Escenario 6: el nodo 4 está inactivo
Pedido:
[Link]
Respuesta:
HTTP/1.1 503 Servicio no disponible
{ "mensaje": "Servicio no disponible"}
o Escenario 7 Nodo 5 no existe
Pedido:
[Link]
Respuesta:
HTTP/1.1 503 Servicio no disponible
PÚBLICO Trabajar con la capa de servicio de SAP Business One
154 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consumir la capa de servicio de SAP Business One
Machine Translated by Google
{ "mensaje": "el nodo 5 no existe", "marca de tiempo": "remitente": "equilibrador de carga",
"1554363934.431"}
Trabajar con la capa de servicio de SAP Business One PÚBLICO
4 Consulta SQL
A partir de SAP Business One 10.0 FP 2011, la capa de servicio en Microsoft SQL Server y SAP HANA admite una consulta SQL
altamente flexible.
A través de la capa de servicio, se permite consumir las vistas de la base de datos para recuperar datos no expuestos, lo que es un
buen complemento para OData Query. Sin embargo, es imposible implementar estas vistas automáticamente, por lo que se necesitan
varios pasos manuales para requerir acceso completo a SAP HANAbox.
Para reducir el esfuerzo manual de implementar vistas, se proporciona una solución para mejorar aún más la capacidad de consulta de la
capa de servicio, con el objetivo de:
• Proporcionar una forma más dinámica de realizar una consulta de forma segura y controlable •
Proporcionar una forma más ligera de realizar una consulta que la implementación de la vista Semántica/SQL
• Proporcionar una forma más sencilla de realizar una consulta utilizando un subconjunto limitado de SQL, sin necesidad de aprender un
nuevo lenguaje de consulta similar a LINQ, HQL o DBQI/DBD
4.1 Metadatos de objetos comerciales
La entidad SQLQuery se expone en la capa de servicio, con los siguientes metadatos:
<EntityType Name="SQLQuery">
<Clave>
<PropertyRef Name="SqlCode"/>
</Clave>
<Property Name="SqlCode" Nullable="false" Type="[Link]"/>
<Nombre de la propiedad="NombreSql" Tipo="[Link]"/>
<Nombre de propiedad="SqlText" Tipo="[Link]"/>
<Nombre de propiedad="ParamList" Tipo="[Link]"/>
<Property Name="CreateDate" Type="[Link]"/>
<Property Name="UpdateDate" Type="[Link]"/>
</EntityType>
<EntitySet EntityType="[Link]" Name="SQLQueries"/>
Además de los métodos CRUD ordinarios, se expone una lista de funciones limitadas adicional como se muestra a continuación, con
el fin de realizar la ejecución de la instrucción SQL representada por esta entidad.
<FunctionImport IsBindable="true" Name="List" ReturnType="[Link]">
<Parameter Name="SQLQueryParams" Type="[Link]"/>
<Parameter Name="ParamList" Type="[Link]"/>
</Importación de funciones>
<ComplexType Name="SQLQueryParams">
PÚBLICO Trabajar con la capa de servicio de SAP Business One
156 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consulta SQL
Machine Translated by Google
<Nombre de propiedad="SqlCode" Tipo="[Link]"/>
</TipoComplejo>
<ComplexType Name="SQLQueryResult" OpenType="true">
<Nombre de propiedad="SqlText" Tipo="[Link]"/>
</TipoComplejo>
4.2 Operaciones CRUD
SQLQuery puede realizar las operaciones CRUD básicas. Los siguientes son algunos ejemplos de cómo realizar estas operaciones en
Microsoft SQL Server, que son muy similares a SAP HANA.
4.2.1 Crear
Pedido
POST [Link]
"Código Sql": "sql04",
"SqlName": "queryOnItem",
"SqlText": "seleccione ItemCode, ItemName, ItmsGrpCod de oitm"
}
Respuesta
HTTP/1.1 201 Creado
"[Link]": "[Link]
"[Link]": "Con"44486B13CDA82E54A31194A3588857803F9D1E57"",
"Código SQL": "sql04",
"SqlName": "consulta en elemento",
"SqlText": "seleccione [ItemCode], [ItemName], [ItmsGrpCod] de [OITM]",
"ParamList": nulo,
"CrearFecha": "20201008",
"Actualización": "20201008"
4.2.2 Recuperar por clave
Pedido
Trabajar con la capa de servicio de SAP Business One PÚBLICO
OBTENGA [Link]
Respuesta
HTTP/1.1 200 Aceptar
"[Link]": "[Link]
"[Link]": "Con"44486B13CDA82E54A31194A3588857803F9D1E57"",
"Código SQL": "sql04",
"SqlName": "consulta en elemento",
"SqlText": "seleccione [ItemCode], [ItemName], [ItmsGrpCod] de [OITM]",
"ParamList": nulo,
"CrearFecha": "20201008",
"Actualización": "20201008"
4.2.3 Parche
Pedido
PARCHE [Link]
"SqlName": "queryOnItem",
"SqlText": "seleccione ItemCode, ItemName de oitm"
Respuesta
HTTP/1.1 204 Sin contenido
4.2.4 Eliminar
Pedido
ELIMINAR [Link]
Respuesta
HTTP/1.1 204 Sin contenido
PÚBLICO Trabajar con la capa de servicio de SAP Business One
158 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consulta SQL
Machine Translated by Google
4.2.5 Recuperar todo
Al igual que con las otras entidades, el mecanismo de paginación entra en vigor en este caso para evitar posibles problemas de recursos en el
lado del servidor.
Pedido
OBTENGA [Link]
Preferir: [Link]=5
Tipo de contenido: aplicación/json; conjunto de caracteres = UTF8
Respuesta
HTTP/1.1 200 Aceptar
Preferencia aplicada: [Link]=5
Tipo de contenido: aplicación/json;odata=minimalmetadata;charset=utf8
"[Link]": "[Link]
"valor": [
"Código Sql": "sql01",
"SqlName": "consultaEnPedido",
"SqlText": "seleccione [DocEntry], [DocTotal], [DocDate], [Comentarios] de
[ORDR] donde [DocTotal] > :docTotal",
"ParamList": "docTotal",
"CrearFecha": "20201008",
"Actualización": "20201008"
},
"Código Sql": "sql02",
"SqlName": "consultaEnPedido",
"SqlText": "seleccione [DocEntry], [DocType] de [ORDR] t1 donde no existe (seleccione t2.[DocEntry] de
[RDR1] t2 donde t1.[DocEntry] = t2.[DocEntry])",
"ParamList": nulo,
"CrearFecha": "20201008",
"Actualización": "20201008"
},
"Código Sql": "sql03",
"SqlName": "consultaEnPedido",
"SqlText": "seleccione [DocEntry] de [ORDR] t1 donde [DocEntry] en (seleccione t2.[DocEntry] de [RDR1] t2) o [DocEntry]
no en (seleccione t2.[DocEntry] de [INV1] t2 )",
"ParamList": nulo,
Trabajar con la capa de servicio de SAP Business One PÚBLICO
"CrearFecha": "20201008",
"Actualización": "20201008"
},
"Código Sql": "sql04",
"SqlName": "consultaEnPedido",
"SqlText": "seleccione [DocEntry], [DocType] de [ORDR] t1 donde [DocEntry]
no es nulo y t1.[Comentarios] es nulo",
"ParamList": nulo,
"CrearFecha": "20201008",
"Actualización": "20201008"
},
"Código Sql": "sql06",
"SqlName": "queryOnItem",
"SqlText": "seleccione [DocEntry] de [ORDR] donde [CreateDate] != '202010
03'",
"ParamList": nulo,
"CrearFecha": "20201008",
"Actualización": "20201008"
],
"[Link]": "¿Consultas SQL?$skip=5"
4.3 Operación de lista
La función List es una función limitada para ejecutar la consulta representada por una SQLQuery específica. Una vez que se crea
una entidad SQLQuery, la función List se puede invocar de la siguiente manera con el verbo GET o POST:
OBTENGA [Link]
POST [Link]
En caso de éxito, el servicio devuelve una carga JSON que contiene las columnas exactas en la cláusula de selección de SQL.
HTTP/1.1 200 Aceptar
"[Link]": "[Link]
"SqlText": "seleccione [ItemCode], [ItemName], [ItmsGrpCod] de [OITM]",
"valor" : [
"Código de artículo": "i001",
"Nombre del elemento": "i001",
PÚBLICO Trabajar con la capa de servicio de SAP Business One
160 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consulta SQL
Machine Translated by Google
"ItmsGrpCod": 100
},
"Código de artículo": "i002",
"Nombre del elemento": "i002",
"ItmsGrpCod": 100
},
"Código de artículo": "i003",
"Nombre del elemento": "i003",
"ItmsGrpCod": 100
},
"Código de artículo": "i004",
"Nombre del elemento": "i004",
"ItmsGrpCod": 100
},
"Código de artículo": "i005",
"Nombre del elemento": "i005",
"ItmsGrpCod": 100
},
...
4.4 Lista con Paginación
El mecanismo de paginación en el lado del servidor es IMPRESCINDIBLE para la función de lista de SQLQueries de entidad, ya que puede
proteger el recurso del servidor para que no se agote en caso de que se devuelvan millones de registros en un viaje de ida y vuelta, o en el caso
de un usuario descuidado que se une a múltiples registros grandes. tablas sin aplicar condiciones de filtrado.
Sin embargo, con fines de flexibilidad, la capa de servicio permite a los clientes cambiar el tamaño de paginación predeterminado
especificando el siguiente encabezado de solicitud:
Preferir: [Link]=<Tu tamaño de página preferido>
Por ejemplo, una solicitud de este tipo con un tamaño de página = 5,
OBTENGA [Link]
Preferir: [Link]=5
Tipo de contenido: aplicación/json; conjunto de caracteres = UTF8
daría como resultado la siguiente respuesta, en la que el enlace de la página siguiente se indica mediante el campo [Link].
Trabajar con la capa de servicio de SAP Business One PÚBLICO
HTTP/1.1 200 Aceptar
Preferencia aplicada: [Link]=5
Tipo de contenido: aplicación/json;odata=minimalmetadata;charset=utf8
"[Link]": "[Link]
"SqlText": "SELECCIONE [ItemCode], lower([ItemCode]) como [lowerItemCode],
upper([ItemCode]) como [upperItemCode] DESDE [OITM]",
"valor" : [
"Código de artículo": "i001",
"código de elemento inferior": "i001",
"código de elemento superior": "I001"
},
"Código de artículo": "i002",
"código de elemento inferior": "i002",
"código de elemento superior": "I002"
},
"Código de artículo": "i003",
"código de elemento inferior": "i003",
"código de elemento superior": "I003"
},
"Código de artículo": "i004",
"código de elemento inferior": "i004",
"código de elemento superior": "I004"
},
"Código de artículo": "i005",
"código de elemento inferior": "i005",
"código de elemento superior": "I005"
],
"[Link]": "SQLQueries('sql0001')/List?&$skip=5"
El SQL subyacente en Microsoft SQL y SAP HANA es:
SELECT * FROM (SELECT [ItemCode], lower([ItemCode]) as [lowerItemCode],
upper([ItemCode]) como [upperItemCode] DESDE [OITM])B1S_DUMMY_TABLE ORDER BY
CURRENT_TIMESTAMP OFFSET 0 FILAS FETCH SIGUIENTE 5 FILAS SOLAMENTE para Microsoft SQL
PÚBLICO Trabajar con la capa de servicio de SAP Business One
162 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consulta SQL
Machine Translated by Google
SELECCIONE "ItemCode", lower("ItemCode") como "lowerItemCode", upper("ItemCode") como "upperItemCode" DESDE "OITM"
LIMIT 5 OFFSET 0 para SAP HANA
4.5 Lista de consultas permitidas
Debido a consideraciones de seguridad y confidencialidad de los datos, no todas las tablas y columnas de la base de datos de la empresa
pueden consultarse.
4.5.1 Lista de permitidos de tablas
Actualmente, solo se puede acceder a las tablas de la siguiente lista de permitidos:
• Información de la empresa
(CINF) • Administración (OADM)
• Extensión de administración (ADM1) •
Preferencias de impresión (OADP)
• Divisas (OCRN) • Datos
maestros del socio comercial (OCRD, OCRP, CRD1) • Documentos de
ventas (OQUT+ QUT114, ORDR +RDR114, ODLN+DLN114, ORRR+RRR114, ORDN+RDN1
14, ODPI+DPI114, OINV+INV114, ORIN+RIN114)
• Documentos de Compra (OPRQ+PRQ114, OPQT+PQT114, OPOR+POR114, OPDN+PDN114,
OPRR+PRR114, ORPD+RPD114, ODPO+DPO114, OPCH+PCH114, ORPC+RPC114)
• Giros (ODRF+DRF114) • Pagos
(ORCT, RCT1, RCT2, RCT3, RCT4 + OVPM, VPM1, VPM2, VPM3, VPM4) • Códigos bancarios (ODSC) • Cuentas
bancarias propias (DSC1) •
Funciones ocultas (OHFC) ) • Período de
contabilización (OFPR) • Categoría
de períodos (OACP) • Sucursal
(OBPL) • Vacaciones (OHLD +
HLD1) • Tablas de
almacén y existencias (OITM, OITW,
OIBQ, OBIN, OBTQ, OBBQ, OBTN, OSRQ, OSBQ, OSRN ) Tablas relacionadas con actividades (OCLG, OCLT, OCLS) Archivos adjuntos
(ATC1) Tasas de cambio (ORTT) Datos maestros de recursos
(ORSC, RSC1, RSC2, RSC3,
RSC4, RSC5, RSC6) Datos
maestros de etapa de ruta (OSRT) • Lista de materiales (OITT, ITT1, ITT2)
Trabajar con la capa de servicio de SAP Business One PÚBLICO
• Orden de producción (OWOR, WOR1, WOR4) •
Capacidad de recursos (ORCJ) •
Recomendaciones de pedidos (ORCM) • Lista
de precios y precios (OPLN, ITM1)
4.5.2 Lista de columnas
De forma predeterminada, se puede acceder a todas las columnas de las tablas de la lista de permitidos. Para controlar con mayor precisión la accesibilidad,
también se puede definir la lista de columnas para las tablas anteriores.
Por ejemplo, suponga que la lista es:
{
"ListaTabla": [
"ADM1",
"ORDENAR",
"CINF"
],
"ColumnaExcluirLista": {
"ORDEN": [
"Fecha de Creación",
"Fecha de actualización"
],
"CINF": [
"Algo",
"AliasUpd",
"TrailDays"
},
"ColumnaIncluirLista": {
"ADM1": [
"PeríodoActual",
"Calle"
Intente acceder a las columnas definidas en ColumnExcludeList en la siguiente solicitud,
POST [Link]
"Código Sql": "sql06",
"SqlName": "queryOnItem",
PÚBLICO Trabajar con la capa de servicio de SAP Business One
164 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consulta SQL
Machine Translated by Google
"SqlText": "seleccione Versión, Algo de CINF"
daría como resultado el siguiente error:
HTTP/1.1 400 Solicitud incorrecta
"error" : {
"código": 703,
"mensaje" : {
"lang": "enus",
"valor": "Columna 'Algo' de la tabla 'CINF' no accesible"
Nota
Internamente, la lista de tablas permitidas se mantiene en un archivo de configuración llamado b1s_sqltable.conf en la siguiente
carpeta: <carpeta de instalación de la capa de servicio>/conf/b1s_sqltable.conf.
El contenido está en formato JSON. Los socios pueden cambiar la lista de permitidos de la tabla y definir la lista de columnas
de acuerdo con sus propios requisitos específicos. Asegúrese de que los nombres de las tablas o de las columnas estén
exactamente en las mismas mayúsculas y minúsculas que están definidos en la base de datos.
4.6 Palabras clave de SQL
Teniendo en cuenta la brecha entre el conjunto de palabras clave de consulta en SAP HANA y Microsoft SQL Server, no todas las palabras
clave son compatibles con la capa de servicio. Desde la perspectiva del uso práctico, la capa de servicio está diseñada para admitir el siguiente
subconjunto de palabras clave de SQL, que son las más utilizadas por los socios.
Palabras clave de SQL Ejemplo
Seleccionar... De... Dónde seleccione ItemCode, ItemName, ItmsGrpCod de oitm donde 1
Código de artículo > 'i01'
[Link] > 0
y, o, no seleccione [Link], [Link] de ORDR t1 donde no [Link] = 1 y [Link]
= 1 o [Link] <> '1234'
Paréntesis seleccione [Link], [Link] de ORDR t1 donde no ([Link] = 1 o
[Link] <> '1234') y [Link]
= 1
En medio y ... seleccione "DocEntry" de ordr donde "DocEntry" ENTRE 1 Y
10
ordenar por seleccione [Link], [Link], [Link] from ORDR t1 order by [Link]
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Palabras clave de SQL Ejemplo
Agrupar por seleccione DocStatus, DocType, conteo (*) como GroupCount del grupo ordr por DocStatus,
DocType con conteo (*) > 0
No es nulo seleccione DocEntry, DocType from ordr t1 donde DocEntry no está
nulo y [Link] es nulo
constantes SELECCIONE 1 como c1, 'cadena' 1 como c2 DE OITM
Como seleccione CardCode de ordr donde CardCode como 'c%'
Arriba seleccione los 2 principales DocStatus, DocType de ordr
Unión (Todos) seleccione [Link] de rdr1 t1 union all select [Link]
de inv1 t1
En seleccione DocEntry from ordr t1 donde DocEntry in (seleccione [Link] from rdr1 t2)
o DocEntry no esté (seleccione [Link] from inv1 t2)
existe seleccione DocEntry, DocType de ordr t1 donde existe (seleccione 1 de rdr1 t2 donde [Link]
= [Link])
Unir internamente seleccione [Link], [Link] from ordr t1 unión interna rdr1 t2 en [Link] = [Link]
Izquierda combinación externa seleccione [Link], [Link] from ordr t1 left únase a rdr1 t2 en [Link] = [Link]
Unión derecha (exterior) seleccione [Link], [Link] from ordr t1 únase a la derecha rdr1 t2 en [Link] =
[Link]
Unión completa (externa) seleccione [Link], [Link] from ordr t1 FULL OUTER JOIN rdr1 t2 en [Link] =
[Link]
Unión mixta seleccione [Link], [Link], [Link] from ordr t1 unión interna rdr1 t2 en
[Link] = [Link] unión izquierda
ocrd t3 en t1.CódigoTarjeta = t3.CódigoTarjeta
4.7 Funciones SQL
Actualmente, solo se admiten las funciones de agregación y un conjunto limitado de otras funciones. Se considerarían más funciones para
soporte en el futuro de acuerdo con los requisitos de los clientes.
Funciones SQL
soy promedio seleccione sum("DocTotal") como sumDocTotal, avg("DocTotal") como avgDocTotal de ordr
Máximo minimo seleccione min("DocTotal") como minDocTotal, max("DocTotal") como
maxDocTotal de pedido
PÚBLICO Trabajar con la capa de servicio de SAP Business One
166 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consulta SQL
Machine Translated by Google
Funciones SQL
Distinto, Contar seleccione contar (distinct docEntry) como countDistinct, contar (*) como
cnt de pedido
Si es nulo, es nulo seleccione DocEntry, isnull(comentarios, 'comentarios nulos') como mssqlComments,
ifnull(Comentarios, 'comentarios nulos') como
hanaComentarios de ordr
Inferior superior SELECCIONE ItemCode, lower(ItemCode) as lowerItemCode,
upper(ItemCode) as upperItemCode FROM [OITM] donde lower(ItemCode) = 'i001'
Izquierda derecha SELECCIONE ItemCode, right(ItemCode, 1) as rightItemCode,
LEFT(ItemCode, 1) as leftItemCode FROM oitm
4.8 Normalización SQL
Teniendo en cuenta la brecha de la gramática SQL entre SAP HANA y Microsoft SQL Server, las instrucciones SQL que se ejecutan en
Microsoft SQL Server no necesariamente pueden funcionar en SAP HANA y viceversa. En consecuencia, en la mayoría de los casos, se
espera que los usuarios finales compongan dos conjuntos de SQL, uno para Microsoft SQL Server y otro para SAP HANA. Esto no es amigable
para los desarrolladores.
Para superar este problema, la capa de servicio analizaría y normalizaría internamente los identificadores de SQL sin procesar en función de la
base de datos subyacente, de modo que los usuarios finales tuvieran una experiencia de desarrollo unificada.
4.8.1 Normalización de tabla/columna
Debido a la diferencia de intercalación de la base de datos, en SAP Business One, SAP HANA distingue entre mayúsculas y minúsculas, mientras
que Microsoft SQL Server no lo hace. Esto significa que para una declaración SQL en SAP HANA, cualquier columna debe tener comillas dobles
para hacer una coincidencia precisa con la columna predefinida. De lo contrario, se producirá un error de nombre de columna no válido.
Por ejemplo, las siguientes sentencias SQL
seleccione itemcode, itemName, itmsGrpCod de oitm donde ItemCode > 'i01' SQL sin formato
se convertiría a las siguientes declaraciones en Microsoft SQL Server y SAP HANA respectivamente.
seleccione [ItemCode], [ItemName], [ItmsGrpCod] de [OITM] donde [ItemCode] > 'i01' normalizado en Microsoft SQL Server
seleccione "ItemCode", "ItemName", "ItmsGrpCod" de "OITM" donde "ItemCode" > 'i01'
normalizado en SAP HANA
Incluso si las columnas ya se han incluido con [] o "" en el SQL sin procesar, como se muestra a continuación:
seleccione [código de artículo], [nombre de artículo], [itmsGrpCod] de [oitm] donde [Código de artículo] > 'i01'
SQL sin procesar
seleccione "código de artículo", "nombre de artículo", "itmsGrpCod" de "oitm" donde "Código de artículo" > 'i01'
SQL sin procesar
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Service Layer todavía puede hacer la normalización correspondiente. Esto está destinado principalmente al escenario en el
que una instrucción SQL ya se ha normalizado en el estudio SAP HANA o en el estudio de Microsoft SQL Server, y los
usuarios solo desean usar exactamente la misma instrucción para crear una consulta SQL en la capa de servicio.
4.8.2 Normalización de alias
Tanto las columnas como las tablas pueden tener un alias. Si bien la normalización del alias de la tabla no es significativa, la
normalización del alias de la columna es IMPRESCINDIBLE en la cláusula de selección de SQL, ya que es el nombre clave del objeto
JSON en el cuerpo de la respuesta.
Por lo tanto, la normalización de alias de columna es principalmente para garantizar que la capa de servicio devuelva el contenido
JSON coherente tanto en SAP HANA como en Microsoft SQL Server.
Por ejemplo, las siguientes sentencias SQL
seleccione [Link] como Col1 , [Link] como Col2 de ORDR t1 donde [Link] > 0
SQL sin procesar
se convertiría a las siguientes declaraciones en Microsoft SQL Server y SAP HANA respectivamente:
seleccione t1.[DocEntry] como [Col1] t1.[DocEntry] , t1.[DocNum] como [Col2] de [ORDR] t1 donde
> 0 normalizado en Microsoft SQL Server
seleccione t1."DocEntry" como "Col1" , t1."DocNum" como "Col2" de "ORDR" t1 donde
t1."DocEntry" > 0 normalizado en SAP HANA
Sin la normalización de alias, en SAP HANA, el alias de la columna se convertiría a mayúsculas de forma predeterminada. Como
resultado, el SQL generado real sería:
seleccione t1."DocEntry" como COL1 0 alias , t1."DocNum" como COL1 de ORDR t1 donde t1."DocEntry" >
en mayúsculas en SAP HANA
En consecuencia, el nombre de la clave en el objeto JSON de respuesta estaría en mayúsculas y, por lo tanto, daría como resultado un
comportamiento incoherente en comparación con la salida en Microsoft SQL Server.
4.8.3 Normalización de funciones
A veces, las funciones con diferentes nombres entre SAP HANA y Microsoft SQL Server tienen la misma funcionalidad. Un ejemplo
típico es IsNull en Microsoft SQL Server e IfNull en SAP HANA. Esto significa que Microsoft SQL Server no admite IfNull y SAP HANA no admite
IsNull. Sin embargo, IfNull es el equivalente funcional de IsNull.
En este caso, con el fin de proporcionar una interfaz uniforme para los desarrolladores, la capa de servicio está diseñada para admitir ambos,
al normalizar IsNull a IfNull en SAP HANA e IfNull a IsNull en Microsoft SQL Server.
seleccione DocEntry, ISNULL(comentarios, 'comentarios nulos') como mssqlComments, IFNULL(Comentarios, 'comentarios nulos') como
hanaComments de ordr SQL sin formato
seleccione [DocEntry], ISNULL([Comentarios], 'comentarios nulos') como [mssqlComments],
ISNULL([Comentarios], 'comentarios nulos') como [hanaComments] de [ORDR] normalizado en
Servidor SQL de Microsoft
PÚBLICO Trabajar con la capa de servicio de SAP Business One
168 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consulta SQL
Machine Translated by Google
seleccione "DocEntry", IFNULL("Comentarios", 'comentarios nulos') como "mssqlComments",
IFNULL("Comentarios", 'comentarios nulos') como "hanaComments" de "ORDR normalizado en SAP
TRABAJAR
4.9 Consulta con parámetro
Al igual que ODBC o JDBC, en la capa de servicio, se permite crear una consulta con marcadores de posición de parámetros y luego
ejecutar la consulta especificando el valor del parámetro. Se utiliza una marca de dos puntos (:) para definir un parámetro con nombre,
vinculándolo a una columna específica.
Por ejemplo, envíe una solicitud de este tipo para crear una consulta parametrizada:
POST [Link]
"Código Sql": "sql01",
"SqlName": "consultaEnPedido",
"SqlText": "seleccione DocEntry, DocTotal, DocDate, comentarios de ordr donde DocTotal
> :docTotal"
En caso de éxito, el servicio devuelve:
HTTP/1.1 201 Creado
"[Link]": "[Link]
"[Link]": "Con"44486B13CDA82E54A31194A3588857803F9D1E57"",
"Código SQL": "sql01",
"SqlName": "consulta en pedido",
"SqlText": "seleccione [DocEntry], [DocTotal], [DocDate], [Comentarios] de [ORDR]
donde [DocTotal] > :docTotal",
"ParamList": "docTotal",
"CrearFecha": "20201008",
"Actualización": "20201008"
Para ejecutar la consulta, hay dos formas en la capa de servicio: una es establecer una carga usando POST y la otra es especificar un
parámetro de consulta usando GET.
• Por CORREO
POST [Link]
"ParamList": "docTotal=10.1"
• Por OBTENER
OBTENER [Link]
El resultado de la consulta es:
Trabajar con la capa de servicio de SAP Business One PÚBLICO
HTTP/1.1 200 Aceptar
"[Link]": "[Link]
"SqlText": "seleccione [DocEntry], [DocTotal], [DocDate], [Comentarios] de [ORDR]
donde [DocTotal] > :docTotal",
"valor" : [
"Comentarios": "",
"DocDate": "20201007",
"DocEntrada": 1,
"DocTotal" : 2000.0
},
"Comentarios": "",
"DocDate": "20201007",
"DocEntrada": 2,
"DocTotal" : 2000.0
},
"Comentarios": "",
"DocDate": "20201007",
"EntradaDocumento" : 3,
"DocTotal" : 2000.0
},
"Comentarios": "",
"DocDate": "20201007",
"DocEntrada" : 4,
"DocTotal" : 2000.0
},
"Comentarios": "",
"DocDate": "20201007",
"DocEntrada": 5,
"DocTotal" : 2000.0
],
"[Link]": "SQLQueries('sql01')/List?docTotal=10.1&$skip=5"
Si hay más de un parámetro, los parámetros deben estar separados por &, como se muestra a continuación:
stringParam1='val1'&integerParam2=val2
PÚBLICO Trabajar con la capa de servicio de SAP Business One
170 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consulta SQL
Machine Translated by Google
4.10 Consulta de errores y excepciones
Para alcanzar los niveles más altos de flexibilidad y comodidad, la capa de servicio permite a los usuarios ingresar el código SQL sin formato,
que es extremadamente propenso a errores. Como tal, la capa de servicio debería ser capaz de manejar varios tipos de errores y excepciones.
El siguiente es un resumen de las categorías de error.
4.10.1 Tabla o columna que no está en la lista de permitidos
Pedido
POST [Link]
"Código Sql": "sql06",
"SqlName": "queryOnItem",
"SqlText": "seleccione CardCode de OCRD t1 donde existe (seleccione 1 de CRD2 t2 donde
t1.CódigoTarjeta = t2.CódigoTarjeta)"
Respuesta
HTTP/1.1 400 Solicitud incorrecta
"error" : {
"código": 702,
"mensaje" : {
"lang": "enus",
"value" : "Tabla 'CRD2' no accesible"
4.10.2 Error de gramática SQL
Pedido
POST [Link]
Trabajar con la capa de servicio de SAP Business One PÚBLICO
"Código Sql": "sql01",
"SqlName": "consultaEnPedido",
"SqlText": "seleccione DocEntry de orden t1 pedido por DocEntry dsc"
Respuesta
HTTP/1.1 400 Solicitud incorrecta
"error": {
"código": 701,
"mensaje": {
"lang": "eses",
"value": "Sintaxis SQL no válida: seleccione DocEntry from ordr t1 order by
DocEntry dsc, línea 1, posición de carácter 47, sintaxis incorrecta cerca de 'dsc'".
4.10.3 Palabra clave/símbolo de SQL no admitido
Pedido
POST [Link]
"Código Sql": "sql01",
"SqlName": "consultaEnPedido",
"SqlText": "seleccione \"ItemCode\", longitud(\"ItemCode\") como lenItemCode de oitm"
Respuesta
HTTP/1.1 400 Solicitud incorrecta
"error": {
"código": 701,
"mensaje": {
"lang": "eses",
"valor": "Sintaxis SQL no válida: seleccione \"ItemCode\", longitud(\"ItemCode\") como
lenItemCode de oitm, línea 1, posición de carácter 19, no se puede admitir esta función o expresión: 'longitud'"
PÚBLICO Trabajar con la capa de servicio de SAP Business One
172 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consulta SQL
Machine Translated by Google
4.10.4 Múltiples alias idénticos
Como JSON no permite varios campos con el mismo nombre, no se admiten dos o más columnas con el mismo alias en la lista de selección.
Pedido
POST [Link]
"Código Sql": "sql0002",
"SqlName": "consulta002",
"SqlText": "seleccione max(itemCode) como min_itemCode, min(itemCode) como min_itemCode
de la OITM"
Respuesta
HTTP/1.1 400 Solicitud incorrecta
"error" : {
"código": 701,
"mensaje" : {
"lang": "enus",
"valor": "Sintaxis SQL no válida: seleccione max(itemCode) como min_itemCode,
min(itemCode) como min_itemCode de OITM, línea 1, posición de carácter 55, nombre múltiple para columna o alias de columna
'min_itemCode', especifíquelo con un alias diferente".
}
4.10.5 Columnas calculadas sin alias
Para este caso, el autor de la consulta SQL debe especificar un alias único para las columnas calculadas, de modo que la capa de servicio
sepa cómo formatear la carga útil de salida.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
4.10.6 Seleccionar todas las columnas de una tabla
En la mayoría de los casos, no es necesario seleccionar todas las columnas de una tabla y, en algunas situaciones, esto podría
comprometer la sensibilidad de los datos y provocar problemas de rendimiento. Por lo tanto, por diseño, la capa de servicio no le permite usar
select *.
Pedido
POST [Link]
"Código Sql": "sql01",
"SqlName": "consultaEnPedido",
"SqlText": "seleccionar * de ORDR"
Respuesta
HTTP/1.1 400 Solicitud incorrecta
"error": {
"código": 701,
"mensaje": {
"lang": "eses",
"valor": "Sintaxis de SQL no válida: seleccione * de ORDR, línea 1, carácter
posición 7, no se puede admitir el asterisco (*) en la lista de selección".
*
Sin embargo, si la selección está en la subconsulta, como en el siguiente ejemplo, está permitido.
seleccione DocEntry, DocType de ordr t1 donde existe (seleccione * de rdr1 t2 donde [Link] = [Link])
4.10.7 SQL DML
Todas las declaraciones DML, por ejemplo, actualizar, modificar, insertar, eliminar, etc., no pueden ejecutarse.
Pedido
POST [Link]
"Código Sql": "sql01",
"SqlName": "consultaEnPedido",
"SqlText": "actualizar ORDR establecer comentarios = '1234'"
PÚBLICO Trabajar con la capa de servicio de SAP Business One
174 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consulta SQL
Machine Translated by Google
Respuesta
HTTP/1.1 400 Solicitud incorrecta
"error": {
"código": 701,
"mensaje": {
"lang": "eses",
"valor": "Sintaxis de SQL no válida: línea 1, posición de carácter 0, no coincide
ingrese 'actualizar' esperando {SELECT, '('}"
4.11 Consulta con control de permisos
Al igual que las vistas de capa semántica, solo los usuarios autorizados tienen autorización para acceder a las consultas correspondientes.
De forma predeterminada, un usuario normal no tiene permiso para ejecutar consultas. Intentar hacerlo terminaría en un fracaso. Por ejemplo, inicie
sesión en la capa de servicio con un usuario normal (usuario1) y luego envíe una solicitud para invocar la función de lista en una SQLQueries
existente (por ejemplo, con clave = 'SalesQuery1'):
OBTENGA [Link]
Como era de esperar, el servicio devuelve:
HTTP/1.1 403 Prohibido
"error": {
"código": 6006,
"mensaje": {
"lang": "eses",
"value": "No tienes permiso para realizar esta acción"
Para otorgar permiso a un usuario normal, inicie sesión en el cliente SAP Business One con un superusuario, luego abra la ventana Autorizaciones
generales desde el menú Administración > Inicialización del sistema > Autorizaciones, busque la consulta SQL específica del asunto Consulta
SQL de capa de servicio , y luego cambie Sin autorización a Autorización completa.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Nota
o Los superusuarios tienen pleno permiso para realizar cualquier operación en las consultas SQL.
o Por diseño, los usuarios normales tampoco tienen permiso para crear/eliminar/actualizar consultas SQL.
Sin embargo, se concede la autorización de recuperación.
o En aras del rendimiento, es posible que la autorización actualizada para el usuario normal no surta efecto de inmediato.
Para obtener los datos más recientes, espere un momento (por ejemplo, un minuto) para permitir que se actualice el
mecanismo de caché de permisos interno.
4.12 Consideraciones de seguridad
4.12.1 Inyección SQL
La inyección de SQL probablemente ocurriría en caso de vinculación de parámetros. Para evitar esto, la capa de servicio valida
internamente el valor del parámetro de entrada tokenizando o utilizando la técnica de preparación de sentencias SQL.
Por ejemplo, hay una Consulta SQL con id = 'sql08' y tiene el siguiente texto SQL:
seleccione [ItemCode], [ItemName], [ItmsGrpCod] de OITM donde ItemCode = :itemCode
PÚBLICO Trabajar con la capa de servicio de SAP Business One
176 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consulta SQL
Machine Translated by Google
Tales solicitudes como las siguientes darían como resultado un error.
Pedido
POST [Link]
"ParamList": "itemCode='i001';truncar tabla OITM"
Respuesta
HTTP/1.1 400 Solicitud incorrecta
"error": {
"código": 704,
"mensaje": {
"lang": "eses",
"value": "Error de parámetro".
4.12.2 Modificación de consulta SQL de registro
De acuerdo con los estándares del producto, SQL es un tipo de código de programación y, por lo tanto, debe tener registros para el cambio de
código.
Para realizar un seguimiento de la modificación de la consulta SQL, el historial se puede encontrar en la tabla ASQL, que es la tabla de registro para el
objeto comercial de la consulta SQL.
4.12.3 Accesibilidad de datos confidenciales
Además de los datos comerciales, en la base de datos también hay algunos datos confidenciales internos que no queremos mostrar a los usuarios
finales. Para prohibir que los usuarios accedan a la información, los socios pueden definir una lista de columnas permitidas para cada tabla para
lograr este propósito.
4.13 Limitaciones o por diseño
• Anteriormente, los objetos definidos por el usuario (UDO) y las tablas definidas por el usuario (UDT) no eran compatibles con las consultas. A partir de
Se admite SAP Business One 10.0 FP 2102, UDO/UDT.
• La tabla LOG (por ejemplo, AITM, ACRD) no es compatible con la consulta.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
• No se admite SBOCOMMON o SBOCOMMON para realizar
consultas. • No se admite la propiedad de los datos.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
178 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Consulta SQL
Machine Translated by Google
5 ETag de capa de servicio
5.1 Introducción a la etiqueta electrónica
El control de concurrencia optimista es una metodología de concurrencia típicamente aplicada a los sistemas transaccionales. Por lo general,
se usa en sistemas de administración de bases de datos relacionales con conflictos de actualización de datos poco comunes, en los que las
transacciones pueden completarse sin el costo de administrar bloqueos, lo que lleva a un mayor rendimiento.
Aunque la naturaleza sin estado de HTTP hace que el bloqueo no sea factible para las interfaces de usuario web, HTTP proporciona una forma
alternativa de control de concurrencia optimista integrado. La respuesta a una solicitud GET inicial puede incluir una ETag para que las solicitudes
PATCH posteriores la utilicen en el encabezado IfMatch. Cualquier solicitud PATCH con una ETag desactualizada en el encabezado IfMatch
se puede rechazar.
En el protocolo HTTP, ETag es la abreviatura de etiqueta de entidad y se usa para identificar versiones específicas de un
recurso. Es un identificador opaco cuyos valores exactos dependen de la implementación. Los valores de ETag ocurren en dos
variedades: validación fuerte y débil. Para obtener más información sobre ETag, consulte [Link]
En la capa de servicio, usamos una validación débil, lo que garantiza que la representación del recurso sea semánticamente equivalente al
mismo valor de ETag. El formato es el siguiente:
ETag: con "cadena hash"
A partir de SAP Business One 10.0 FP 2102, la capa de servicio puede admitir mecanismos Etag que cumplan con la especificación OData,
principalmente con el fin de evitar actualizaciones ciegas simultáneas en un objeto.
5.2 Escenarios de ETag
5.2.1 ETag en la creación de entidades
Para este escenario, la información de ETag está disponible en la respuesta, lo que refleja la versión del recurso recién creado en una cadena
con hash.
Por ejemplo, envíe una solicitud de este tipo para crear un artículo:
PUBLICAR [Link]
Tipo de contenido: texto/sin formato; juego de caracteres = UTF8
{"Código del artículo": "i002"}
En caso de éxito, la capa de servicio responde con la ETag en el encabezado y el cuerpo de la respuesta.
HTTP/1.1 201 Creado
Ubicación: [Link]
Etiqueta electrónica: con "356A192B7913B04C54574D18C28D46E6395428AB"
Trabajar con la capa de servicio de SAP Business One PÚBLICO
"@[Link]": "[Link]
"@[Link]": "Con"356A192B7913B04C54574D18C28D46E6395428AB"",
"Código de artículo": "i002",
"Nombre del elemento": nulo,
...
5.2.2Etag en recuperación de entidad
La ETag también se puede aplicar al escenario de recuperación de entidades y le permite obtener la última versión del recurso.
Por ejemplo, envíe una solicitud de este tipo para recuperar un artículo:
OBTENGA [Link]
En caso de éxito, la capa de servicio responde con la ETag en el encabezado y el cuerpo de la respuesta.
HTTP/1.1 200 Aceptar
Etiqueta electrónica: con "356A192B7913B04C54574D18C28D46E6395428AB"
"@[Link]": "[Link]
"@[Link]": "Con"356A192B7913B04C54574D18C28D46E6395428AB"",
"Código de artículo": "i002",
"Nombre del elemento": nulo,
...
5.2.3Etag en actualización de entidad
El comportamiento predeterminado cuando PATCH una entidad es cambiar directamente la entidad, sin importar si la entidad ya ha sido
modificada por otra persona. Sin embargo, para la mayoría de los escenarios, al igual que el cliente SAP Business One, no queremos que
ocurra este comportamiento de anulación.
Para lograr esto, necesitamos especificar el encabezado IfMatch con el valor de la ETag en la solicitud. De esta manera, la capa de servicio
evitaría que se produzca la anulación al devolver un mensaje de error.
Por ejemplo, suponga que alguien cambia el elemento con la clave 'i002' justo antes de enviar una solicitud PATCH:
PARCHE [Link]
Si coincide: con "356A192B7913B04C54574D18C28D46E6395428AB"
{"Nombre del elemento": "nombre2"}
La capa de servicio responde:
PÚBLICO Trabajar con la capa de servicio de SAP Business One
180 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. ETag de capa de servicio
Machine Translated by Google
HTTP/1.1 412 Precondición fallida
Tipo de contenido: application/json;charset=utf8
"error": {
"código": "2039",
"message": "Otro usuario u otra operación modificó datos; para continuar, abra
la ventana de nuevo (ODBC 2039)"
Si no se producen cambios, la capa de servicio responde con lo siguiente, lo que indica que la actualización se realizó correctamente:
HTTP/1.1 204 Sin contenido
5.2.4Etag en eliminación de entidad
El comportamiento predeterminado cuando ELIMINA una entidad es eliminar directamente la entidad si existe o devolver un error 404, indicando
que la entidad no se encuentra. Para algunos escenarios, solo desea eliminar una entidad con una versión específica y mostrar un mensaje de
error si la versión no existe. Para lograr esto, especifique el encabezado IfMatch con el valor de la ETag en la solicitud.
Por ejemplo, envía una solicitud para obtener un artículo de la siguiente manera:
OBTENGA [Link]
En caso de éxito, la capa de servicio responde:
HTTP/1.1 200 Aceptar
Tipo de contenido: application/json;charset=utf8
"@[Link]": "[Link]
"@[Link]": "Con"356A192B7913B04C54574D18C28D46E6395428AB"",
"Código del artículo": "i002",
"Nombre del elemento": "i002",
...
Luego, otro usuario envía una solicitud PATCH para actualizar este elemento:
PARCHE [Link]
"ItemName": "nuevo nombre"
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Después de verificar cierta información básica con este elemento, envía una solicitud para eliminar este elemento con ETag:
ELIMINAR [Link]
Si coincide: con "356A192B7913B04C54574D18C28D46E6395428AB"
La capa de servicio responde con el siguiente mensaje de error ya que la entidad que desea eliminar ya ha sido actualizada por otros:
HTTP/1.1 412 Precondición fallida
Tipo de contenido: application/json;charset=utf8
"error": {
"código": "2039",
"message": "Otro usuario u otra operación modificó datos; para continuar, abra
la ventana de nuevo (ODBC 2039)"
5.2.5ETag en acción de entidad
El comportamiento predeterminado de una acción enlazable es aplicar directamente la acción a la entidad enlazada, sin importar si otra persona
ya ha cambiado la entidad.
Sin embargo, para algunos escenarios, solo desea realizar la acción en una entidad con una versión específica y esperar que el servicio
devuelva un mensaje de error si la versión no existe o fue actualizada por otro. Para lograr esto, especifique el encabezado IfMatch con
el valor de la ETag en la solicitud.
Por ejemplo, envía una solicitud para obtener un pedido de la siguiente manera:
OBTENGA [Link]
En caso de éxito, la capa de servicio responde:
HTTP/1.1 200 Aceptar
Tipo de contenido: application/json;charset=utf8
"@[Link]": "[Link]
"@[Link]": "Con"356A192B7913B04C54574D18C28D46E6395428AB"",
"EntradaDocumento": 8,
"Número de documento": 8,
...
PÚBLICO Trabajar con la capa de servicio de SAP Business One
182 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. ETag de capa de servicio
Machine Translated by Google
Luego, otro usuario envía una solicitud PATCH para actualizar este pedido:
PARCHE [Link]
"Comentarios": "es mi pedido"
Después de verificar cierta información básica con este pedido, envía una solicitud para cancelar este pedido con la ETag:
PUBLICAR [Link]
Si coincide: con "356A192B7913B04C54574D18C28D46E6395428AB"
La capa de servicio responde con el siguiente mensaje de error ya que la entidad a cancelar ya ha sido actualizada por otros:
HTTP/1.1 412 Precondición fallida
Tipo de contenido: application/json;charset=utf8
"error": {
"código": "2039",
"message": "Otro usuario u otra operación modificó datos; para continuar, abra
la ventana de nuevo (ODBC 2039)"
5.3 Entidades con ETag
A partir de SAP Business One 10.0 FP 2102, los siguientes objetos comerciales están habilitados con el mecanismo Etag:
• Notas de Entrega de Compra
• CorrecciónCompraFacturaReversión
• Borradores
• Notas de crédito
• Facturas
• Solicitud de devolución de mercancías
• Solicitudes de compra • Entradas
de generación de inventario • Salidas
de generación de inventario
• Órdenes
• Notas de entrega •
Pagos iniciales de compra
Trabajar con la capa de servicio de SAP Business One PÚBLICO
• Devoluciones
• Factura de corrección
• Corrección Factura Anulación
• Factura de Compra de Corrección
• Facturas de compra
• Notas de crédito de compra
• Pagos iniciales
• CompraDevoluciones
• Órdenes de Compra
• Solicitud de devolución
• Citas
• Cotizaciones de compra
• Actividades
• Gastos Adicionales
• artículos
• Socios Comerciales
5.4 Metadatos de ETag
En OData V4, el Etag está representado por una anotación en el conjunto de entidades.
<EntitySet EntityType="[Link]" Name="BusinessPartners">
<Annotation Term="[Link]">
<Colección>
<PropertyPath>Versión de datos</PropertyPath>
</Colección>
</Anotación>
...
</Conjunto de entidades>
La anotación es con el atributo de término [Link], lo que indica que el modo de simultaneidad interna
es optimista.
Dentro de la anotación, se presenta una colección de propiedades para indicar las propiedades relevantes utilizadas para lograr la concurrencia
optimista.
Sin embargo, OData V3 usa diferentes metadatos para reflejar la ETag, como se muestra a continuación.
<EntityType Name="Socio comercial">
<Clave>
<PropertyRef Name="CódigoTarjeta"/>
</Clave>
...
<Property ConcurrencyMode="Fixed" Name="DataVersion" Type="Edm.Int32"/>
</EntityType>
PÚBLICO Trabajar con la capa de servicio de SAP Business One
184 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. ETag de capa de servicio
Machine Translated by Google
ConcurrencyMode especifica que el valor de esa propiedad declarada debe usarse para comprobaciones de simultaneidad optimistas.
Esencialmente, las propiedades declaradas marcadas con un ConcurrencyMode fijo se vuelven parte de una concurrencia
simbólico.
Dado que OData V4 es el protocolo predominante en la actualidad, se recomienda enfáticamente que utilice OData V4 para consumir la capa de
servicio.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
6 Configuración de la capa de servicio de SAP Business One
El asistente de instalación establece las opciones de configuración comunes cuando instala el balanceador de carga de la capa de servicio o
los miembros del balanceador. Las opciones de configuración están en el archivo de configuración conf/[Link].
A partir de SAP Business One 10.0 (PL00 para la versión de SAP HANA y PL02 para la versión de Microsoft SQL), está disponible un
controlador de configuración para Service Layer. Proporciona una interfaz fácil de usar para actualizar los parámetros de configuración y
hacer que surtan efecto.
6.1 Controlador de configuración para la capa de servicio
Nota
En SAP Business One (versión de Microsoft SQL), antes de usar el controlador, ejecute la verificación de la política de ejecución
de Windows PowerShell y asegúrese de que la política de ejecución sea "Sin restricciones". Para hacerlo, realice lo siguiente:
Abra Windows PowerShell (64 bits) y use el comando GetExecutionPolicy para verificar la política de ejecución actual. Si no es
"Sin restricciones", use el comando SetExecutionPolicy Unrestricted
para configurarlo
Puede acceder a Service Layer Controller de SAP Business One después de instalar Service Layer, utilizando la URL [Link]
IP>:<port>/ServiceLayerController.
En el controlador de capa de servicio de SAP Business One, puede:
• Detener o forzar el reinicio del servicio de la capa de servicio. •
Agregar y eliminar dinámicamente nodos de capa de servicio. •
Especificar las opciones de configuración para controlar el comportamiento de la capa de servicio. Para detalles sobre la configuración
opciones, consulte Opciones de configuración para la capa de servicio.
• Descargue los registros de la capa de servicio y los archivos de volcado.
Nota
Limitación: Service Layer Controller no admite la administración de todos los nodos en el modo de instalación de distribución
(es decir, algunos nodos están instalados en una máquina, mientras que el balanceador de carga está instalado en otra
máquina). Esta limitación se aplica tanto a la versión de SAP HANA como a la versión de Microsoft SQL.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
186 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Configuración de la capa de servicio de SAP Business One
Machine Translated by Google
6.2 Opciones de configuración para la capa de servicio
También puede especificar las opciones de configuración para controlar el comportamiento del servicio en el archivo <Directorio de
instalación>/ServiceLayer/conf/[Link]. El archivo está en formato JSON y las opciones distinguen entre mayúsculas y minúsculas.
Una vez que guarde los cambios, todas las opciones de configuración surtirán efecto después de reiniciar Service Layer.
Nota
Para 9.1 PL00PL03, la ruta del archivo es <Directorio de
instalación>/ServiceLayer/b1s/modules/[Link].
El archivo de configuración se aplica solo a los componentes de la capa de servicio local. Si ha instalado algunos miembros del
balanceador de carga en diferentes máquinas desde el balanceador de carga, debe asegurarse de tener una copia del esquema
El archivo también existe en cada máquina miembro.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Opciones de conexión del servidor
El servidor SLD comparte la misma dirección.
El valor predeterminado es 30 (minutos).
Otras opciones
Compatible con WCF El valor predeterminado booleano es falso.
Si el valor se establece en True, el componente WCF de Microsoft puede consumir la capa de servicio.
La aplicación soluciona algunas limitaciones de WCF y el comportamiento de la aplicación es el siguiente:
• EnumType se reemplaza por [Link], ya que EnumType no es
compatible con WCF en metadatos.
• El nombre de la propiedad no puede ser el mismo que el nombre del tipo. Por ejemplo,
[Link] cambia automáticamente de nombre a
[Link].
• Use el tipo [Link] en lugar de [Link], ya que Microsoft .net no tiene un tipo de tiempo y usa
TimeSpan en su lugar, que no es compatible con SAP Business One.
• A partir de SAP Business One 9.1, versión para el nivel de parche 10 de SAP HANA, las partes de
navegación y asociación de los metadatos están expuestas a WCF.
El valor predeterminado es 20.
El valor predeterminado está vacío.
El valor es un nombre de archivo en la carpeta conf, que define las propiedades necesarias para cada tipo
de metadatos. Para obtener más información, consulte Esquemas definidos por el usuario.
CorsHabilitar
Booleano Disponible a partir de la versión 9.1, nivel de parche 08.
El valor predeterminado es falso. Funciona como un interruptor para habilitar CORS (Cross Origin Resource
Sharing).
Si este elemento se establece en verdadero, la capa de servicio comprobará el valor de
CorsAllowedOrigins.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
188 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Configuración de la capa de servicio de SAP Business One
Machine Translated by Google
Este elemento surte efecto solo si CorsEnable es verdadero. Es una lista de cadenas
separadas por punto y coma donde cada cadena es una representación de un origen
confiable. Por ejemplo:
"CorsAllowedOrigins":"[Link]
3"
"*"
CorsAllowedOrigins también se puede configurar como de todos para apoyar las solicitudes
los orígenes. Sin embargo, en entornos de producción, no se recomienda debido a
problemas de seguridad.
ers
El valor predeterminado es ("tipo de contenido, aceptar").
Este elemento surte efecto solo si CorsEnable es verdadero. Es una lista de cadenas separadas
por comas donde cada cadena es una representación de un nombre de encabezado de solicitud.
Por ejemplo:
"CorsAllowedHeaders":"tipo de contenido, aceptar, B1SPageSize"
6.3 Configuración por Solicitud
Excepto por las opciones de conexión, Service Layer admite la limitación de todas las opciones de configuración al nivel de solicitud.
Puede configurar el encabezado HTTP personalizado de Service Layer para sobrescribir la configuración en [Link] solo para la solicitud actual.
Para configurar sus ajustes para la solicitud actual, debe utilizar el siguiente formato:
B1S<nombreelementoconfiguración>: <valor>
Por ejemplo:
• Compatible con B1SWCF: Verdadero
• B1STamaño de página: 100
Nota
Esta característica está disponible en SAP Business One 9.1 nivel de parche 01 y posteriores.
6.4 Supervisión de registros
A partir de SAP Business One 10.0 FP 2202, el controlador de la capa de servicio se ha mejorado para admitir el monitor de registro de la capa de
servicio con las siguientes funcionalidades:
• Una vista de lista para solicitudes normales
• Una vista de detalles para grupos de solicitudes normales •
Una vista de lista para solicitudes de error
• Una vista de detalles para grupos de solicitudes de error
• Registros detallados de solicitudes/respuestas para solucionar problemas
Trabajar con la capa de servicio de SAP Business One PÚBLICO
En la página de inicio de Service Layer Controller, se agrega una nueva pestaña Monitor para mostrar los registros, y puede elegir un día reciente de
registros seleccionándolo de una lista desplegable. Por ejemplo, los días van desde 1 día hasta 10 días.
Para todas las vistas, se muestra un control de paginación que le permite examinar las solicitudes página por página. De forma predeterminada, se
muestran 20 filas por página.
6.4.1 Vista de lista de solicitudes normales
La vista de lista de solicitudes normales muestra la información básica para un grupo determinado de solicitudes.
Campo Descripción
No. El número de la solicitud en la vista de lista.
Método El método HTTP para una solicitud.
URL La URL de una solicitud.
Contar El número de ocurrencias para una solicitud determinada.
Detalle Un enlace en el que se puede hacer clic para acceder a la vista detallada.
La vista de lista está agrupada por Método y URL. Puede hacer clic en el icono de actualización en la esquina superior derecha para obtener los registros
más recientes.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
190 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Configuración de la capa de servicio de SAP Business One
Machine Translated by Google
6.4.2 Vista detallada de solicitudes normales
La vista detallada de un grupo de solicitudes normales muestra información más detallada.
Campo Descripción
Tiempo La hora en que se atiende la solicitud.
URL La URL de la solicitud.
Duración El tiempo que tarda el servidor en gestionar la solicitud.
sid El ID de sesión para la solicitud.
Nodo El ID del nodo que maneja la solicitud.
Código HTTP El código HTTP para la solicitud.
Pid El número de proceso que maneja la solicitud.
IP del cliente La IP del cliente desde el que se envía la solicitud.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
6.4.3 Vista de lista de solicitudes de error
La vista de lista de solicitudes de error muestra la información básica de un grupo de solicitudes de error.
Campo Descripción
No. El número de la solicitud en la vista de lista.
Método El método HTTP para una solicitud.
URL La URL de una solicitud.
Contar El número de ocurrencias para una solicitud determinada.
Detalles Un enlace en el que se puede hacer clic para acceder a la vista detallada.
La vista de lista está agrupada por Método y URL. Puede elegir el icono de actualización en la esquina superior derecha para obtener los registros
más recientes.
6.4.4 Vista detallada de solicitudes de error
La vista detallada de un grupo de solicitudes de error muestra información más detallada.
Campo Descripción
Tiempo La hora en que se atiende la solicitud.
URL La URL de una solicitud.
Duración El tiempo que tarda el servidor en gestionar la solicitud.
sid El ID de sesión para la solicitud.
Nodo El ID del nodo que maneja la solicitud.
Código HTTP El código HTTP para la solicitud.
Pid El número de proceso que maneja la solicitud.
IP del cliente La IP del cliente desde el que se envía la solicitud.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
192 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Configuración de la capa de servicio de SAP Business One
Machine Translated by Google
6.4.5 Registros detallados de solicitud/respuesta
Este registro es para solucionar problemas. En la Configuración de la capa de servicio, haga clic en la casilla de verificación Registros de
solicitud y respuesta para habilitar o deshabilitar el registro. Hay disponible una lista desplegable que le permite descargar archivos
de registro según la duración seleccionada.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
7 Limitaciones
Esta sección enumera las limitaciones de SAP Business One Service Layer.
7.1 Limitaciones de implementación del protocolo OData
En la perspectiva de implementación del protocolo OData, la capa de servicio tiene las siguientes limitaciones:
• OData versión 1.0 y OData versión 2.0 no son compatibles. • La solicitud/
respuesta de formato XML no es compatible con las operaciones CRUD de entidad general. • No se permite acceder a
la propiedad de tipo complejo (detalles en la sección Recuperación de Propiedades Individuales). • No se admite la gestión directa de valores
y propiedades. • Lote de OData: no se admite la reversión, una operación por
lotes de OData. • La opción de metadatos odata=fullmetadata para la versión 3 de OData
no es compatible. • La opción de metadatos [Link]=full para la versión 4 de OData no es
compatible. • NavigationProperty en los metadatos está habilitado solo para la versión 3 de OData (no
habilitado para la versión 4 de OData). • Consulta OData: los operadores aritméticos (por ejemplo, add/sub/mul/div/mod) en las consultas
OData no son compatibles
todavía.
• Consulta de OData: algunas funciones de consulta de OData aún no son compatibles, por ejemplo, funciones de datos, funciones
matemáticas, funciones de mayúsculas y minúsculas, funciones de cadena. Para obtener detalles sobre estas funciones,
consulte [Link]
7.2 Limitaciones funcionales frente a SAP Business One DI API
En comparación con las funcionalidades de SAP Business One DI API, Service Layer tiene las siguientes limitaciones:
• El objeto comercial RecordSet (SQL directo) no es compatible. • Service
Layer no admite la operación de ImportFromXML y ExportToXML. • UDO/UDF/UDT recién creado no es
accesible a menos que se reinicie la capa de servicio. • Las transacciones de usuario no son compatibles.
No hay una operación tipo DI StartTransaction/EndTransaction.
Las transacciones se usan internamente en cada solicitud (incluida la solicitud por lotes de OData), pero no pueden cruzar solicitudes.
Nota
La capa de servicio no admite JSONP, ya que esta característica es opcional.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
194 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Limitaciones
Machine Translated by Google
8 Alta disponibilidad y equilibrio de carga
En el contexto de las aplicaciones móviles accesibles basadas en la web, la prestación de servicios de alta disponibilidad se
vuelve cada vez más importante. Service Layer está bien diseñado y probado exhaustivamente para garantizar que estará continuamente
operativo durante un período de tiempo significativo en un sistema de producción.
De forma predeterminada, Service Layer instala módulos de procesamiento múltiple de Apache (MPM) y está configurado como un clúster
de equilibrio de carga. Un equilibrador de carga central distribuye las cargas HTTP entre sus nodos según la cantidad de solicitudes.
Además, Service Layer implementa sesiones pegajosas para evitar un inicio de sesión innecesario, lo que se considera un trabajo pesado
en SAP Business One, porque las solicitudes de la misma sesión siempre se reenviarán al mismo nodo de trabajo. Esos nodos de trabajo
se pueden implementar en un sistema en clúster, donde la redundancia de hardware y software ayuda a escalar el rendimiento y
proporciona una alta disponibilidad.
En un caso excepcional, si el balanceador de carga detecta que uno de sus nodos ha fallado, reenvía las solicitudes posteriores
a otro nodo válido. El nodo receptor valida la sesión a través de la información de sesión compartida almacenada en la base de datos. Si
es válido, el nodo receptor inicia sesión automáticamente en el usuario, sin interrumpir las acciones del usuario ni solicitar las
credenciales del usuario. Los usuarios finales no notarán la falla del nodo interno, excepto por un ligero retraso en la respuesta del
sistema.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
9 Preguntas frecuentes
1. ¿Cuáles son las diferencias entre Service Layer y otras API de extensión de SAP Business One, como DI API?
y en el servidor?
Service Layer se basa en la tecnología central DI, que también es la base de DI API y DI Server.
Por lo tanto, las tres API de extensión comparten definiciones de objetos comerciales similares. Sin embargo, sus diferencias son significativas:
o DI API se deriva de la tecnología COM de Microsoft y se adapta mejor al entorno nativo de Windows; o DI Server apunta a
escenarios de integración de datos basados en SOAP y prefiere la arquitectura de servicios web; o Service Layer es un servicio de
datos compatible con OData con una curva de aprendizaje más suave, que permite
Web Mashup, o desarrollo de complementos sin esfuerzo en varios lenguajes (Java, JavaScript, .NET) utilizando bibliotecas
de terceros. Para obtener una lista de todas las bibliotecas de clientes de OData, consulte [Link]
Service Layer también es un servidor de aplicaciones web completo con capacidades de alta disponibilidad y
rendimiento escalable.
2. La capa de servicio es compatible con OData y RESTful, ¿cuáles son las otras implicaciones de pasar a dicha arquitectura de servicios
web?
Service Layer proporciona resultados livianos y más rápidos y transacciones simples (por ejemplo, operaciones CRUD). Consultar
objetos es solo una cuestión de cambiar el URI de manera uniforme. La operación por lotes es compatible con escenarios de transacciones
avanzadas donde se deben aplicar múltiples solicitudes de forma atómica.
Service Layer puede no ser una buena opción para implementar transacciones complejas o distribuidas donde la administración del estado del
lado del servidor es un requisito imprescindible.
3. ¿Por qué Service Layer admite dos tipos de actualización?
Los dos tipos de actualización difieren en el verbo HTTP que se envía en la solicitud:
o Una solicitud PUT indica una actualización de reemplazo. Todos los valores de propiedad especificados en el cuerpo de la solicitud son
reemplazado. Las propiedades que faltan se establecen en sus valores predeterminados.
o Una solicitud de PATCH indica una actualización diferencial. Solo se reemplazan exactamente esos valores de propiedad en el cuerpo de la
solicitud. Las propiedades que faltan no se alteran.
En la mayoría de los casos, la solicitud de parche es el enfoque recomendado para actualizar los datos de los objetos.
4. ¿Qué sucede si mi cliente HTTP no es compatible con el método PATCH?
A partir del nivel de parche 04 9.1, puede usar el método POST para anular el método PATCH. Para ello, utilice el método POST y especifique
en el encabezado HTTP XHTTPMethodOverride el método que se va a anular. Por ejemplo, las siguientes dos solicitudes son iguales:
o PARCHE /Pedidos(1)
o POST /Pedidos(1)
Anulación del método XHTTP: PARCHE
Tenga en cuenta que el método POST también puede anular los métodos PUT, MERGE y DELETE.
5. ¿El servicio se inicia automáticamente con el sistema?
Sí, para Service Layer que se ejecuta en SAP HANA. Como Service Layer se instala como una serie de servicios de Linux llamados b1s y
b1s<port>, puede verificar esos servicios a través de este comando (ejecutar como usuario root):
# chkconfig | grepb1s
En mi entorno devuelve:
PÚBLICO Trabajar con la capa de servicio de SAP Business One
196 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Preguntas más frecuentes
Machine Translated by Google
b1s apagado
b1s50000 en
b1s50001 en
b1s50002 en
b1s50003 en
herramientas de servidor sapb1 en
b1s50000 es para el balanceador de carga y otros, como 50001~50003, son para los 3 nodos de servicio. "on" significa que el servicio puede
iniciarse automáticamente con el sistema.
Puede desactivarlo para cada nodo:
# chkconfig b1s50000 apagado
# chkconfig b1s50001 apagado
# chkconfig b1s50002 apagado
# chkconfig b1s50003 apagado
Por supuesto que puedes volver a encenderlo:
# chkconfig b1s50003 en
6. ¿Funciona si el cliente SAP HANA no está instalado en la ubicación predeterminada?
De forma predeterminada, la versión x64 del cliente SAP HANA se instala en /usr/sap/hdbclient. A partir del nivel de parche 04 9.1, la capa de
servicio puede funcionar incluso si el cliente SAP HANA no está instalado en la ubicación predeterminada.
Nota: Esto se hace detectando el cliente SAP HANA en este archivo: /var/
opt/.hdb/{hostname}/[Link]
En versiones anteriores, solucione este problema creando un enlace de símbolo en la ubicación predeterminada a su nueva ubicación, por
ejemplo
# mkdir /usr/sap
# ln s /su/ruta/hdbclient /usr/sap/hdbclient
O agregue la ruta del cliente HANA en la ruta del sistema: busque el archivo /etc/[Link], agregue su ruta al final y
correr:
# ldconfig
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Preguntas más frecuentes
© 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. 197
Machine Translated by Google
10 Apéndice I: Capa de servicio versus DI API
Esta sección explica las diferencias en cómo invocar las API para finalizar las funcionalidades correspondientes en SAP Business One Service
Layer versus SAP Business One DI API.
Las API se dividen en diferentes categorías en términos de operaciones para la entidad CRUD, transacción, consulta, servicio
de la empresa y UDO.
10.1 API CRUD
Tomamos el objeto Order como un ejemplo típico para ilustrar cómo invocar las API CRUD.
10.1.1 Creación de entidades
EN LLAMAS
[Link] oEmpresa;
...
[Link] de documentos =
(Documentos)[Link]([Link]);
pedido.CódigoTarjeta = "c001";
[Link] = [Link];
[Link] = [Link];
//Añadir líneas de elementos
[Link] = "i001";
pedido.Lí[Link] = 1;
[Link] = "T1";
[Link] = 100;
orden.Lí[Link]();
//Agregue este pedido recién creado
int retCode = [Link]();
PÚBLICO Trabajar con la capa de servicio de SAP Business One
198 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Apéndice I: Capa de servicio versus DI API
Machine Translated by Google
Capa de servicio
POST /Pedidos
"CódigoTarjeta": "c001",
"DocDate": "20140401",
"DocDueDate": "20140401",
"Líneas de Documento": [
"Código del artículo": "i001",
"PrecioUnitario": 100,
"Cantidad: 1,
"CódigoImpuesto": "T1"
10.1.2 Entidades de recuperación
EN LLAMAS
[Link] de documentos =
(Documentos)[Link]([Link]);
bool bRet = [Link](2);
si (bRet)
[Link]([Link]());
Capa de servicio
OBTENER /Pedidos(2)
Trabajar con la capa de servicio de SAP Business One PÚBLICO
10.1.3 Actualización de entidades
EN LLAMAS
[Link] de documentos =
(Documentos)[Link]([Link]);
[Link](2);
[Link] = "Nuevos comentarios";
[Link]();
Capa de servicio
PARCHE /Pedidos(2)
"Comentarios":"Nuevos comentarios"
10.1.4 Eliminación de entidades
EN LLAMAS
[Link] de documentos =
(Documentos)[Link]([Link]);
[Link](2);
[Link]();
Capa de servicio
ELIMINAR /Pedidos(2)
PÚBLICO Trabajar con la capa de servicio de SAP Business One
200 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Apéndice I: Capa de servicio versus DI API
Machine Translated by Google
10.2 API de servicios de la empresa
Tomamos los objetos GetCompanyInfo y UpdateCompanyInfo como ejemplos para mostrar cómo invocar las API de servicios de la
empresa.
EN LLAMAS
ObtenerInfoDeLaEmpresa
[Link] companyService = [Link]();
[Link] companyInfo = [Link]();
[Link]("inicial: versión de la empresa:{0}, nombre de la empresa: {1}, nombre de la empresa: {2},"
[Link], [Link],
[Link]);
Actualizar información de la empresa
...//siguiendo el fragmento de código anterior
[Link] = [Link];
[Link](companyInfo);
infoempresa = [Link]();
[Link]("actualizado: versión de la empresa:{0}, nombre de la empresa: {1}, nombre de la empresa: {2},"
[Link], [Link],
[Link]);
Capa de servicio
ObtenerInfoDeLaEmpresa
POST /CompanyService_GetCompanyInfo
Actualizar información de la empresa
POST /CompanyService_UpdateCompanyInfo
"Información de la compañía": {
"Versión": 910160,
"EnableExpensesManagement": "tYES",
...
Trabajar con la capa de servicio de SAP Business One PÚBLICO
"AutoCreateCustomerEqCard": "tYES",
...
Nota
Este tipo de API en la capa de servicio se llama FunctionImport o Action en la terminología de OData.
10.3 API de transacciones
Service Layer no proporciona API explícitamente sobre transacciones porque el protocolo OData no tiene estado. Sin embargo, la solicitud
por lotes se puede publicar para realizar la funcionalidad comparable.
EN LLAMAS
[Link]ón();
elementos [Link] = [Link]([Link]);
[Link] = "item_001";
[Link] = "item_001_name";
artí[Link]();
si (artí[Link]("artículo_001"))
[Link] = "item_001_name nuevo";
[Link]();
[Link](BoWfTransOpt.wf_Commit);
demás
[Link](BoWfTransOpt.wf_RollBack);
}
Capa de servicio
POST /$lote
PÚBLICO Trabajar con la capa de servicio de SAP Business One
202 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Apéndice I: Capa de servicio versus DI API
Machine Translated by Google
Tipo de contenido: multiparte/mixto;límite=batch_36522ad7fc754b568c7156071383e77b
batch_36522ad7fc754b568c7156071383e77b
Tipo de contenido: multiparte/mixto;límite=cambio_77162fcdb8da41aca9f89357efbbd
changeset_77162fcdb8da41aca9f89357efbbd
Tipo de contenido: aplicación/http
Codificación de transferencia de contenido: binario
ID de contenido: 1
POST /b1s/v1/Artículos
Tipo de contenido: aplicación/json
{"Código del artículo":"artículo_001", "Nombre del artículo":"artículo_001_nombre"}
changeset_77162fcdb8da41aca9f89357efbbd
Tipo de contenido: aplicación/http
Codificación de transferencia de contenido: binario
ID de contenido: 2
PARCHE /b1s/v1/Artículos('item_001')
Tipo de contenido: aplicación/json
{"Nombre del elemento":"elemento_001_nombre nuevo"}
changeset_77162fcdb8da41aca9f89357efbbd
batch_36522ad7fc754b568c7156071383e77b
Nota
Las dos primeras líneas indican que esta solicitud es una solicitud por lotes y el encabezado de la solicitud debe establecerse
en 'ContentType: multipart/mixed;boundary=batch_36522ad7fc754b568c7156071383e77b'.
La parte restante es el cuerpo del lote exacto.
o Las operaciones múltiples en el cuerpo del lote deben incluirse en un conjunto de cambios para que se traten como un
operación atómica.
o La solicitud por lotes no ofrece la posibilidad de que los clientes reviertan las transacciones. Si todas las operaciones son
exitosa, el lote realiza automáticamente esta transacción.
o Puede encerrar una lógica comercial compleja en una transacción a través de DI API, mientras que no puede hacerlo a través de
Capa de servicio.
Para obtener más información sobre las especificaciones de lotes, consulte [Link]
version30/batchprocessing/.
Trabajar con la capa de servicio de SAP Business One PÚBLICO
10.4 API de consulta
DI API expone el objeto Recordset para ejecutar SQL nativo para implementar una consulta, mientras que Service Layer utiliza la consulta OData para finalizar la
funcionalidad equivalente.
EN LLAMAS
[Link] oRecordSet =
[Link]([Link]);
[Link]("Seleccione \"CódigoTarjeta\", \"NombreTarjeta\" de OCRD donde \"CódigoTarjeta\" >= 'C001'");
mientras (![Link])
[Link]("{0}={1},{2}={3}", [Link](0).Nombre,
[Link](0).Valor,
[Link](1).Nombre, [Link](1).Valor);
[Link]();
Capa de servicio
GET /BusinessPartners?$select=CódigoTarjeta, NombreTarjeta&$filter=CódigoTarjeta ge 'C001'
"una [Link]":
"[Link]
"valor": [
"Código de tarjeta": "ce7a456eead44",
"Nombre de la tarjeta": "bb72965fb0764a81859fa2bde7b5b356"
},
...
"Código de tarjeta": "ce8da8a1d6744",
"Nombre de la tarjeta": "cbdb91d71a294e649ce80bd0a72704b8"
PÚBLICO Trabajar con la capa de servicio de SAP Business One
204 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Apéndice I: Capa de servicio versus DI API
Machine Translated by Google
Nota
La respuesta de Service Layer está en formato JSON. Si desea iterar el conjunto de resultados como lo hace DI API, debe utilizar las
bibliotecas de cliente de OData (por ejemplo, WCF).
10.5 API de UDO
10.5.1 Creación de UDO
Debe realizar cinco pasos para crear un UDO. El proceso de creación es muy similar entre DI API y Service Layer.
EN LLAMAS
Paso 1: Crear UDT "MyOrder" como tabla principal
//Crear UDT "MiPedido" como tabla principal
[Link] udtMyOrder =
(UserTablesMD)[Link]([Link]);
[Link] = "MiPedido";
[Link] = "MyOrderDesc";
[Link] = BoUTBTableType.bott_Document;
[Link]();
Paso 2: Agregar campos a la tabla "MiPedido"
//Agregue UDF CustomerName a la tabla "MyOrder"
[Link] udfCustomerName =
(UserFieldsMD)[Link]([Link]);
[Link] = "NombreCliente";
[Link] = BoFieldTypes.db_Alpha;
[Link]ño = 10;
[Link] = "Nombre del cliente";
[Link] = BoFldSubTypes.st_None;
[Link] = "@MYOrder";
[Link]();
//Agregar UDF DocTotal a la tabla "MyOrder"
Trabajar con la capa de servicio de SAP Business One PÚBLICO
[Link] udfDocTotal =
(UserFieldsMD)[Link]([Link]);
[Link] = "DocTotal";
[Link] = BoFieldTypes.db_Float;
[Link] = "Cantidad total";
[Link] = BoFldSubTypes.st_Sum;
[Link] = "@MIPedido";
[Link]();
Paso 3: Crear UDT "MyOrderLines" como tabla secundaria
//Crear UDT "MyOrderLines" como tabla secundaria
[Link] udtMyOrderLines =
(UserTablesMD)[Link]([Link]);
udtMisLí[Link] = "MisLíneasDePedido";
[Link] = "Mis líneas de pedido";
[Link] = BoUTBTableType.bott_DocumentLines;
udtMisLí[Link]();
Paso 4: agregue campos a la tabla "MyOrderLines"
//Añadir ItemName UDF a la tabla "MyOrderLines"
[Link] udfItemName =
(UserFieldsMD)[Link]([Link]);
[Link] = "NombreElemento";
[Link] = BoFieldTypes.db_Alpha;
[Link]ño = 10;
[Link] = "Nombre del elemento";
[Link] = BoFldSubTypes.st_None;
[Link] = "@MYOrderLINES";
[Link]();
//Agregar precio UDF a la tabla "MyOrderLines"
[Link] udfPrice =
(UserFieldsMD)[Link]([Link]);
[Link] = "Precio";
[Link] = BoFieldTypes.db_Float;
[Link] = "Precio unitario";
[Link] = BoFldSubTypes.st_Price;
[Link] = "@MYOrderLINES";
PÚBLICO Trabajar con la capa de servicio de SAP Business One
206 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Apéndice I: Capa de servicio versus DI API
Machine Translated by Google
[Link]();
//Añadir cantidad UDF a la tabla "MyOrderLines"
[Link] udfQuantity =
(UserFieldsMD)[Link]([Link]);
[Link] = "Cantidad";
[Link] = BoFieldTypes.db_Float;
[Link] = "Cantidad";
[Link] = BoFldSubTypes.st_Quantity;
[Link] = "@MYOrderLINES";
[Link]();
Paso 5: Registrar UDO "MiPedido"
[Link] udoMyOrder =
(UserObjectsMD)[Link]([Link]);
udoMiPedido.Código = "MisPedidos";
[Link] = "MiPedido";
[Link] = "MiPedido";
[Link]= BoUDObjType.boud_Document;
[Link] = "MyOrderLines";
[Link] = "MyOrderLines";
[Link]();
[Link]();
Capa de servicio
Paso 1: Crear UDT "MyOrder" como tabla principal
POST /UserTablesMD
"TableName": "MiPedido",
"TableDescription": "Mis Pedidos",
"TableType": "bott_Documento"
Paso 2: Agregar campos a la tabla "MiPedido"
POST /UserFieldsMD
Trabajar con la capa de servicio de SAP Business One PÚBLICO
"Nombre": "Nombre del cliente",
"Tipo": "db_Alpha",
"Tamaño 10,
"Descripción": "Nombre del cliente",
"Subtipo": "st_Ninguno",
"NombreTabla": "@MIORDEN"
POST /UserFieldsMD
"Nombre": "DocTotal",
"Tipo": "db_Float",
"Descripción": "Cantidad total",
"Subtipo": "st_Sum",
"NombreTabla": "@MIORDEN"
Paso 3: Crear UDT "MyOrderLines" como tabla secundaria
POST /UserTablesMD
"NombreTabla": "MisLíneasDePedido",
"TableDescription": "Mis líneas de pedido",
"TableType": "bott_DocumentLines"
Paso 4: agregue campos a la tabla "MyOrderLines"
POST /UserFieldsMD
"Nombre": "Nombre del elemento",
"Tipo": "db_Alpha",
"Tamaño 10,
"Descripción": "Nombre del artículo",
"Subtipo": "st_Ninguno",
"NombreTabla": "@MYORDERLINES"
PÚBLICO Trabajar con la capa de servicio de SAP Business One
208 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Apéndice I: Capa de servicio versus DI API
Machine Translated by Google
POST /UserFieldsMD
"Nombre": "Precio",
"Tipo": "db_Float",
"Descripción": "Precio unitario",
"Subtipo": "st_Precio",
"NombreTabla": "@MYORDERLINES"
POST /UserFieldsMD
"Nombre": "Cantidad",
"Tipo": "db_Float",
"Descripción": "Cantidad",
"Subtipo": "st_Quantity",
"NombreTabla": "@MYORDERLINES"
Paso 5: Registrar UDO "MiPedido"
POST /UserObjectsMD
"Código": "MisPedidos",
"Nombre": "MiPedido",
"TableName": "MiPedido",
"TipoObjeto": "documento_boud",
"UserObjectMD_ChildTables": [
"NombreTabla": "MisLíneasDePedido",
"NombreObjeto": "MisLíneasDePedido"
Trabajar con la capa de servicio de SAP Business One PÚBLICO
10.5.2 CRUD y operaciones de consulta
Una vez que se crea un UDO, puede tratarlo como una entidad ordinaria. La URL para UDO CRUD y la operación de consulta son las
mismas que las entidades internas de SAP Business One.
Creación de entidad UDO
POST /MisPedidos
"U_CustomerName": "c1",
"U_DocTotal": 620,
"MyOrderLinesCollection": [
"U_ItemName": "elemento1",
"Precio_U": 100,
"U_Cantidad": 3
},
"U_ItemName": "elemento2",
"Precio_U": 80,
"U_Cantidad": 4
}
Recuperando entidad UDO
OBTENER /MisPedidos(10)
Consultando sobre la entidad UDO
GET /MyOrders?$select=U_CustomerName, U_DocTotal&$filter=U_CustomerName eq 'c1' and U_DocTotal gt 1000
10.6 API de UDF
Esta sección demuestra cómo crear, recuperar, actualizar y eliminar las UDF de una entidad existente (por ejemplo, BusinessPartners) y
realizar operaciones relevantes en entidades con las UDF añadidas.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
210 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Apéndice I: Capa de servicio versus DI API
Machine Translated by Google
10.6.1 Operaciones CRUD
EN LLAMAS
Creación de UDF
[Link] udf =
(UserFieldsMD)[Link]([Link]);
udf .Nombre = "u1";
udf .Tipo = BoFieldTypes.db_Alpha;
udf .Tamaño = 10;
udf .Descripción = "udf 1";
udf .SubType = BoFldSubTypes.st_None;
udf .NombreTabla = "OCRD";
int retCode = udf .Add();
Nota
OCRD es la mesa principal de BusinessPartners.
Recuperar UDF
[Link] udf =
(UserFieldsMD)[Link]([Link]);
cadena tableName = "OCRD";
int fieldID = 0;//Asumir que el FieldID de la entidad a recuperar es 0
if ([Link](tableName, fieldID))
[Link]("Nombre = {0}, Descripción = {1}", [Link], [Link]ón);
Nota
Puede obtener el valor de fieldID a partir de la respuesta de crear una UDF.
La entidad UserFieldsMD debe recuperarse con una clave compuesta de varios campos.
Actualización de UDF
[Link] udf =
(UserFieldsMD)[Link]([Link]);
Trabajar con la capa de servicio de SAP Business One PÚBLICO
cadena tableName = "OCRD";
int fieldID = 0;//Asumir que el FieldID de la entidad a recuperar es 0
if ([Link](tableName, fieldID))
[Link] = "Nueva descripción";
[Link]();
Eliminación de UDF
[Link] udf =
(UserFieldsMD)[Link]([Link]);
cadena tableName = "OCRD";
int fieldID = 0;//Asumir que el FieldID de la entidad a recuperar es 0.
if ([Link](tableName, fieldID))
[Link]();
Capa de servicio
Creación de UDF
POST /UserFieldsMD
"Nombre": "u1",
"Tipo": "db_Alpha",
"Tamaño 10,
"Descripción": "udf 1",
"Subtipo": "st_Ninguno",
"NombreTabla": "OCRD"
La respuesta es:
HTTP/1.1 201 Creado
"Nombre": "u1",
"Tipo": "db_Alpha",
"Tamaño 10,
PÚBLICO Trabajar con la capa de servicio de SAP Business One
212 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Apéndice I: Capa de servicio versus DI API
Machine Translated by Google
"Descripción": "udf 1",
"Subtipo": "st_Ninguno",
"Tabla Vinculada": nulo,
"Valor predeterminado": nulo,
"NombreTabla": "OCRD",
"ID de campo": 0,
"Editar tamaño": 10,
"Obligatorio": "tNO",
"LinkedUDO": nulo,
"ValoresValidosMD": []
Recuperar UDF
OBTENER /UserFieldsMD (Nombre de tabla = 'OCRD', ID de campo = 0)
Nota
Puede obtener el valor de FieldID a partir de la respuesta de creación de UDF.
La entidad UserFieldsMD debe recuperarse con una clave compuesta de varios campos.
Actualización de UDF
PARCHE /UserFieldsMD(TableName='OCRD', FieldID=0)
"Descripción": "Nueva descripción",
Eliminación de UDF
ELIMINAR /UserFieldsMD(TableName='OCRD', FieldID=0)
10.6.2 Realización de operaciones en entidades con UDF
Esta sección muestra cómo realizar operaciones en entidades (BusinessPartners) con una UDF agregada (U_u1).
EN LLAMAS
Creando entidad con UDF
Trabajar con la capa de servicio de SAP Business One PÚBLICO
[Link] bp =
(BusinessPartners)[Link]([Link]);
bp.CódigoTarjeta = "bp_001";
[Link] = "bp_001_nombre";
[Link](0).Valor = "valor udf";
[Link]();
Nota
[Link](0) hace referencia a la UDF.
Recuperando entidad con UDF
[Link] bp =
(BusinessPartners)[Link]([Link]);
bool bRet = [Link]("bp_001");
si (bRet)
[Link]("Código de tarjeta = {0}, Nombre de tarjeta = {1}", bp.Código de tarjeta, [Link] de tarjeta);
cadena udfName = [Link](0).Name;
cadena udfValue = [Link](0).Value;
[Link]("udfName = {0}, udfValue = {1}", udfName, udfValue);
Actualizando entidad con UDF
[Link] bp =
(BusinessPartners)[Link]([Link]);
bool bRet = [Link]("bp_001");
si (bRet)
[Link](0).Value = "nuevo valor UDF";
[Link]();
Capa de servicio
Una vez que se crea una UDF, puede tratarla como una propiedad ordinaria de una entidad.
PÚBLICO Trabajar con la capa de servicio de SAP Business One
214 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Apéndice I: Capa de servicio versus DI API
Machine Translated by Google
Creando entidad con UDF
POST /Socios comerciales
"Código de tarjeta": "bp_001",
"Nombre de la tarjeta": "bp_001_name",
"U_u1": "valor udf"
}
Entidad de consulta con UDF
GET /BusinessPartners?$filter=empieza con(U_u1, 'udf')
Actualizando entidad con UDF
PARCHE /Socios comerciales('bp_001')
"Código de tarjeta": "bp_001",
"Nombre de la tarjeta": "bp_001_name",
"U_u1": "valor udf"
}
Trabajar con la capa de servicio de SAP Business One PÚBLICO
11 Apéndice II: Diferencia de nombres de
metadatos entre la capa de servicio y DI API
Service Layer se basa en DI Core y reutiliza sus metadatos. En realidad, para seguir el protocolo OData, Service Layer modifica ligeramente los
metadatos. Las diferencias se reflejan en los siguientes aspectos.
11.1 Diferencia de nomenclatura de objetos de colección
Para Service Layer, los metadatos del objeto de colección se pueden encontrar al verificar /b1s/v1/$metadata mientras que para DI API, se puede
invocar GetBusinessObjectXmlSchema para recuperar los metadatos.
De la siguiente tabla, se puede inferir que Service Layer toma nombres más sensatos.
Capa de servicio EN LLAMAS
CuentaSegmentacionesCategorías Categorías
BPAccountReceivablePaybleColección BPAccountReceivablePayble
BPFiscalTaxIDColección BPFiscalTaxID
BPRetenciónImpuestoRecaudación BPRetención de impuestos
BillOfExchangeTransBankPages BillOfExchangeTrans_BankPages
BillOfExchangeTransDeposits BillOfExchangeTrans_Deposits
BillOfExchangeTransactionLines BillOfExchangeTransaction_Lines
PresupuestoCostoContabilidadLíneas BudgetCostAccounting_Lines
LíneasPresupuestarias Líneas_de_presupuesto
BusinessPlaceIENúmeros IENúmeros
BusinessPlaceTributaryInfos TributaryInfos
Asignaciones de flujo de efectivo Elementos de formulario primario
CheckInListParams Entradas
DocFreightEBooksDetalles Doc_Freight_EBooks_Doc_Details
Colección DocsInWTGroups DocsInWTGroups
DocumentoGastos Adicionales DocumentosGastos Adicionales
Documento Cuotas Documento_cuotas
LíneaDeDocumentoGastosAdicionales Líneas_de_documentoGastosadicionales
LíneasDeDocumento Líneas_de_documento
PÚBLICO Trabajar con la capa de servicio de SAP Business One
216 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Apéndice II: Diferencia de nombres de metadatos entre la capa de servicio y DI API
Machine Translated by Google
Capa de servicio EN LLAMAS
DocumentoReferencias Referencia de documento
DocumentoLíneasEspeciales Document_SpecialLines
Libros electrónicosDetalles Línea_EBooks_Doc_Detalles
EmpleadoAbsenceInfoLines EmpleadoAbsenceInfo
EmpleadoEducaciónInfoLines EmpleadoEducaciónInfo
EmpleadoAnteriorEmpleoInfoLíneas EmpleadoPrevEmpoymentInfo
EmpleadoRevisionesInfoLines EmpleadoReseñasInfo
EmpleadoRolesInfoLines EmpleadoRolesInfo
EmpleadoAhorrosPagoInfoLíneas EmpleadoAhorrosPagoInfo
ID de campo Campos de búsqueda con formato
InventarioRecuentoDocumentoReferenciasColección InventarioRecuentoDocumentoReferencias
InventarioPublicaciónDocumentoReferenciasColección InventarioContabilizaciónDocumentoReferencias
ItemBarCodeCollection ItemBarCodes
ItemCycleCounts ItemCycleCount
ItemDepreciationParameters ItemDepreciationParam
Reglas de distribución de elementos Regla de distribución de elementos
ItemGroupsWarehouseInfos ItemGroups_WarehouseInfo
ItemLocalizationInfos LocalizationInfos
ItemPeriodControlsItemPeriodControls ItemPeriodControlItemPeriodControl
ArtículoPrecios Artículos_Precios
ItemUnitOfMeasurementCollection ElementoUnidadDeMedida
ItemUoMPackageCollection ArtículoUoMPaquete
ItemWarehouseInfoCollection ItemWarehouseInfo
JournalEntryLines JournalEntries_Lines
LineFreightEBooksDetalles Line_Freight_EBooks_Doc_Details
MaterialRevaluaciónDocumentoReferenciasColección MaterialRevaluaciónDocumentoReferencias
MaterialRevaluaciónLíneas MaterialRevaluación_líneas
Cuentas de pago Pagos_Cuentas
PagoCheques Pagos_Cheques
PagoCréditoTarjetas Pagos_Tarjetas de crédito
PagoDocumentoReferenciasColección Payments_DocumentReferences
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Capa de servicio EN LLAMAS
PagoFacturas Pagos_Facturas
PickListsLines PickLists_Lines
ProductoÁrbolLíneas ProductTrees_Lines
ProductoÁrbolEtapas ProductoÁrboles_Etapas
ProductionOrderLines ProductionOrders_Lines
ProducciónÓrdenesDocumentoReferencias ProductionOrders_DocumentReferences
ProducciónPedidosVentasOrderLines ProductionOrders_SalesOrderLines
ProducciónÓrdenesEtapas ProductionOrders_Stages
ProgressiveTax_Lines Retención de códigos de impuestos_ProgressiveTax_Lines
SNBLinesColección SNBLines
VentasPronósticoLíneas SalesForecast_Lines
SpecialPriceDataAreas PreciosEspecialesÁreasDeDatos
EspecialPrecioCantidadÁreas PreciosEspecialesCantidadÁreas
StockTransferLines StockTransfer_Lines
StockTransferTaxExtension StockTransfer_TaxExtension
Permiso de usuario Elemento de permiso de usuario
WTGroupsColección Grupos Aerogeneradores
RetenciónImpuestoCertificadosRecaudación Certificados de retención de impuestos
RetenciónImpuestoDatosRecaudación RetenciónImpuestoDatos
RetenciónImpuestoDatosWTXRecaudación RetenciónImpuestoDatosWTX
11.2 Diferencia de denominación de objetos comerciales
Para cumplir con la convención de nomenclatura de OData, la capa de servicio adopta el formato plural si el nombre de BO tiene un formato singular.
Capa de servicio EN LLAMAS
InventoryGenExits InventoryGenExit
Entradas de generación de inventario InventarioGenEntrada
PÚBLICO Trabajar con la capa de servicio de SAP Business One
218 © 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos. Apéndice II: Diferencia de nombres de metadatos entre la capa de servicio y DI API
Machine Translated by Google
11.3 Diferencia de nombres de propiedad
Para seguir el protocolo OData, la capa de servicio cambia el nombre de una propiedad agregando 'Propiedad' si es el mismo que su
objeto residente.
Capa de servicio EN LLAMAS
Número de [Link] del número de lote Número de lote.Número de lote
[Link] [Link]
[Link] [Link]
Trabajar con la capa de servicio de SAP Business One PÚBLICO
Derechos de autor, marcas registradas y
Descargos de responsabilidad
© 2022 SAP SE o una empresa filial de SAP. Reservados todos los derechos.
Ninguna parte de esta publicación puede reproducirse o transmitirse de ninguna forma o
para ningún propósito sin el permiso expreso de SAP SE o una empresa afiliada de SAP.
SAP y otros productos y servicios de SAP mencionados aquí, así como sus respectivos
logotipos, son marcas comerciales o marcas comerciales registradas de SAP SE (o una
empresa afiliada de SAP) en Alemania y otros países. Todos los demás nombres
de productos y servicios mencionados son marcas comerciales de sus respectivas
empresas. Consulte [Link]
[Link]#trademark para marca adicional
información y avisos.
Consulte [Link]
copyright/thirdparty[Link] para avisos de marcas comerciales de terceros.
Consulte [Link]
responsabilidad importantes.
EXENCIÓN DE
RESPONSABILIDAD DE JAVATM Algunos componentes de este producto están basados
en Java™. Cualquier cambio de código en estos componentes puede provocar un mal
funcionamiento imprevisible y grave, por lo que queda expresamente prohibido, al igual que cualquier
descompilación de estos componentes.
Cualquier código fuente de Java™ entregado con este producto debe ser
utilizado por los Servicios de Soporte de SAP y no puede ser modificado o alterado de
ninguna manera.
SAP BUSINESS ONE – DERECHOS DE AUTOR ADICIONALES Y
MARCAS
DotNetZip, .NET, SQL Server, Visual C++, Visual # y Windows Installer son marcas
comerciales o marcas comerciales registradas de Microsoft
Corporación.
DynaPDF es una marca comercial o marca comercial registrada de DynaForms
Software para Documentos Jens Boschulte.
EDTFTPJ/PRO es una marca comercial o marca comercial registrada de Enterprise
Distributed Technologies.
InstallAnywhere e InstallShield son marcas comerciales o registradas
marcas registradas de Flexera Software LLC.
SEE4C (Biblioteca de componentes de correo electrónico SMTP/POP3/IMAP para C/C++)
es propiedad intelectual de MarshallSoft Computing, Inc. MARSHALLSOFT es una marca
comercial o marca comercial registrada de MarshallSoft Computing, Inc.
Victor Image Processing Library y VIC32 son marcas comerciales o marcas
comerciales registradas de Catenary Systems. La biblioteca de procesamiento de
imágenes de Victor es material protegido por derechos de autor. Esto incluye el código
fuente, código objeto, dlls, ejemplos y documentación. Este material está protegido por las
leyes de derechos de autor de los Estados Unidos, así como por las disposiciones de los
tratados internacionales de derechos de autor.
To upload an attachment in SAP Business One's Service Layer, a multipart/form-data Content-Type header with a boundary specification is required. The attachment is uploaded using an HTTP POST method. For an attachment to be processed successfully, it must be less than 50M due to security considerations. The request body should include form-data for the file and must adhere to proper multipart formatting with specified boundaries .
In SAP Business One, user-defined fields (UDF), tables (UDT), and objects (UDO) are added to the metadata starting from patch level 05 and later versions. This inclusion allows third-party tools to generate code for UDF/UDT/UDO and perform standard CRUD operations on them. The metadata can vary based on the different databases of SAP Business One companies due to the presence of these user-defined elements .
SAP Business One manages normalization for SQL aliases by converting them to uppercase by default in SAP HANA to ensure consistency since alias normalization is vital for column names due to their representation in JSON. Functions like IsNull in SQL Server and IfNull in SAP HANA, which serve the same purpose but under different names, are handled by mapping equivalent functionalities. Such normalizations ensure coherent JSON content regardless of the database system .
To set up image retrieval for items in SAP Business One, follow these steps: 1. Create a shared image folder on the Windows platform for the SAP Business One client, ensuring it is accessible by the Service Layer running on Linux via CIFS . 2. Mount the Windows folder on the Linux system using a CIFS mount command, such as: `mount -t cifs -o username=xxxxx,password=******,file_mode=0777,dir_mode=0777 "//<database-server>/temp/SL/itemimages" /mnt/itemimages` . 3. Utilize the Service Layer of SAP Business One, which provides APIs for CRUD operations on item images. The entity metadata for handling item images includes properties such as `ItemCode` and `Picture` . 4. Send an HTTP request through the Service Layer to retrieve item images, leveraging OData protocols for uniform data access . This approach ensures scalability and high availability by allowing multiple instances with load balancing . 5. Configure API endpoints and ensure the Service Layer is installed on the same or distributed server as needed, following architecture guidelines for optimal performance .
The metadata in SAP Business One's service layer primarily defines types, entities (such as objects of SAP Business One), and actions (services of SAP Business One). These capabilities describe how entities and actions are exposed, allowing for operations like creation, recovery, updating, and deletion (CRUD) on various entities, such as BusinessPartners and Orders .
Parameterized SQL queries in SAP Business One's Service Layer use colon (:) to define named parameters, which are linked to specific columns. These queries can be executed by setting a payload with POST or using a GET query with parameters appended. The Service Layer is equipped to handle errors, such as SQL syntax errors or unsupported keywords, and provides structured responses indicating the nature and specifics of the error .
SAP Business One ensures compatibility across different database systems when consuming the service layer for SQL operations through the use of HTTP/OData protocols . These protocols provide a uniform way to expose business objects, allowing developers to operate using identical definitions for objects and properties regardless of the underlying database system, be it Microsoft SQL Server or SAP HANA . The Service Layer architecture facilitates high scalability and availability through a web-based server setup that handles multiple concurrent requests efficiently . Additionally, the DI Core interface used in SAP Business One provides consistent access to objects and services, smoothing the transition for developers familiar with DI API . This compatibility is further aided by the support for different OData versions, ensuring that data and services can be consumed effectively through the service layer .
The Service Layer in SAP Business One provides a scalable and web-accessible API that allows for the consumption of Business One services and objects, suited for new generation cloud-based applications. In contrast, the DI API is more traditional, offering direct com object access within local environments. The Service Layer provides enhanced scalability and flexibility, making it more suitable for remote service consumption and handling modern extensibility requirements with ease .
To host and manage UDOs in SAP Business One, creation steps include defining the UDO with specified fields and child tables, setting appropriate table types, and registering it with SAP Business One. This involves adding fields to a base table (e.g., MyOrder), defining subtables if necessary, and ensuring metadata is correctly set up for CRUD operations through the Service Layer .
The Service Layer in SAP Business One is designed as a new generation API extension that consumes B1 objects and services over a web service, ensuring high scalability and availability. It supports operations such as updating attachments via PATCH requests and handling multiple business operations simultaneously while maintaining system performance and dependability .