0% encontró este documento útil (0 votos)
4K vistas220 páginas

Guía de la Capa de Servicio SAP B1

Este documento proporciona una guía de usuario para trabajar con la capa de servicio de SAP Business One. Explica las convenciones tipográficas utilizadas, la historia de versiones del documento y cómo ha evolucionado la capa de servicio a lo largo de las versiones de SAP Business One para admitir nuevas funciones como consultas SQL, agregación de datos, archivos adjuntos y más.

Cargado por

Sixto Sánchez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
4K vistas220 páginas

Guía de la Capa de Servicio SAP B1

Este documento proporciona una guía de usuario para trabajar con la capa de servicio de SAP Business One. Explica las convenciones tipográficas utilizadas, la historia de versiones del documento y cómo ha evolucionado la capa de servicio a lo largo de las versiones de SAP Business One para admitir nuevas funciones como consultas SQL, agregación de datos, archivos adjuntos y más.

Cargado por

Sixto Sánchez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Machine Translated by Google

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  –  2022­02­22

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

Versión Fecha Cambiar

1.0 2014­06­27 La  primera  versión  de  SAP  Business  One  Service  Layer

1.1 2014­11­11 •  Usuario  del  servicio  SAP  Business  One

•  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)

1.2 2014­12­30 •  Soporte  OData  versión  4

•  Metadatos  para  UDF/UDT/UDO

•  Actualizaciones  para  objetos  definidos  por  el  usuario,  campos  definidos  por  el  usuario  y
mesas

1.3 2015­03­19 •  Usar  el  servidor  SLD  durante  el  inicio  de  sesión

•  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

1.4 2015­07­20 •  Agregar  sesión  en  Iniciar/Cerrar  sesión  •  

Agregar  un  ejemplo  de  "Vista  previa  de  un  pedido"  en  Acciones  •  

Agregar  Intercambio  de  recursos  de  origen  cruzado  (CORS)

1.5 2015­12­15 Agregar  inicio  de  sesión  único

1.6 2016­03­04 Actualización  menor  para  OBServer.

1.7 2016­05­04 •  Agregar  crear  entidad  sin  contenido

•  Agregar  agregación

•  Agregar  archivos  adjuntos

•  Agregar  imagen  de  

elemento  •  Agregar  uso  compartido  de  recursos  de  origen  cruzado

1.8 2016­07­28 •  Compatibilidad  con  la  extensión  de  JavaScript

•  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

Versión Fecha Cambiar

1.9 2017­08­14 Soporte  SAP  Business  One  9.3,  versión  para  SAP  HANA

1.10 2018­01­15 •  Servicio  de  soporte  de  capa  semántica


•  Correcciones  menores

1.11 2018­02­09 •  Admite  cancelar/cerrar  entidad  para  UDO  •  Admite  

filtro  de  nivel  de  fila

1.12 2018­12­04 Actualización  del  Apéndice  II:  diferencia  de  nombres  de  objetos  de  colección

1.13 2019­03­13 Vuelva  a  agregar  el  ejemplo  "Vista  previa  de  un  pedido"  en  Acciones

1.14 2019­05­20 Agrega  la  API  de  Ping  Pong

1.15 2019­10­20 Soporte  SAP  Business  One  10.0,  versión  para  SAP  HANA.

Agregar  controlador  de  configuración  para  la  capa  de  servicio.

1.16 2019­12­02 Agregar  imagen  de  empleado

1.17 2020­01­02 Compatibilidad  con  SAP  Business  One  10.0  PL01  (en  Microsoft  SQL  Server)

1.18 2020­04­08 Admite  vista  SQL.

El  controlador  de  configuración  está  disponible  en  la  versión  de  SQL.

1.19 2020­08­20 Actualización  del  Apéndice  II:  diferencia  de  nombres  de  objetos  de  colección

1.20 2020­10­28 Admite  consultas  SQL.

Actualice  la  herramienta  JavaScript  SDK  Generator  para  el  entorno  de  Microsoft  
Windows.

1.21 2021­03­22 SQLQueries  admite  objetos  definidos  por  el  usuario  y  tablas  definidas  por  el  usuario.

Admite  mecanismo  ETag.

1.22 2021­06­10 Para  oData  Query,  se  admiten  opciones  de  selección  adicionales:

•  Entidad  única  $expandir  con  $lista  de  selección  •  

Entidad  de  colección  $expandir  con  $lista  de  selección

1.23 2022­02­22 Mejorar  el  mecanismo  de  carga  de  la  capa  de  servicio.

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  HTTP­POST ........................................... .................................................... ...............  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:

Elementos  clave  y Descripción/Actividad URL/código  de  muestra


Términos

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]

Ruta  de  recursos Identifica  el  recurso  a  ser [Link]


interactuado  con.  puede  ser  una  coleccion

de  entidades  o  de  una  sola  entidad. Ejemplo:  
[Link]
ccsme

Opciones  de  consulta Especifica  múltiples  opciones  de  consulta  y   [Link]


parámetros  de  operación. <opciones_consulta>

Ejemplo:  
[Link]
$top=2&$orderby=itemcode

Verbo  HTTP Indica  la  acción  a  realizar En  el  siguiente  ejemplo,  las  2  solicitudes  son  equivalentes:


contra  el  recurso,  de  acuerdo
con  la  arquitectura  RESTful •  POST
principios [Link]

•  POST /Iniciar  sesión

Recurso  JSON Representa  e  interactúa  con  contenido   {"clave1":  "valor1",  "arr1":  [100,  200],  "clave2":  "valor2"}


Representación estructurado,  incrustado  en

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

Establecer­Cookie:  B1SESSION=PTRzIjYK­weN6­1Lx1­ZG0J­3ARxfjcU0Shy;HttpOnly;

Establecer­Cookie:  ROUTEID=.node1;  camino=/b1s

"una  [Link]":

"[Link]

"SessionId":  "PTRzIjYK­weN6­1Lx1­ZG0J­3ARxfjcU0Shy",

"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  'PTRzIjYK­weN6­1Lx1­ZG0J­3ARxfjcU0Shy'  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=PTRzIjYK­weN6­1Lx1­ZG0J­3ARxfjcU0Shy;  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=PTRzIjYK­weN6­1Lx1­ZG0J­3ARxfjcU0Shy;  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":  "en­us",

"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:
•  HTTP­POST:  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:2003­08';'urna:oasis:nombres:tc:SAML:2.0:perfiles:SSO:ecp'

2.  Desde  el  encabezado  de  respuesta,  obtenga  el  JSESSIONID  del  encabezado  Set­Cookie  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

Establecer­Cookie:  B1SESSION=PTRzIjYK­weN6­1Lx1­ZG0J­3ARxfjcU0Shy;HttpOnly;

Establecer­Cookie:  ROUTEID=.node1;  camino=/b1s

{ "SessionId":  "PTRzIjYK­weN6­1Lx1­ZG0J­3ARxfjcU0Shy",  "Versión":  "920110",
"Tiempo  de  espera  de  la  sesión":  30}

"una  [Link]":

"[Link]

"SessionId":  "PTRzIjYK­weN6­1Lx1­ZG0J­3ARxfjcU0Shy",

"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  HTTP­POST

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  HTTP­POST.

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":  "es­es",

"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":  "2014­04­01",

"DocDueDate":  "2014­04­01",

"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":  "es­es",

"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":  "2014­04­01",

"DocDueDate":  "2014­04­01",

"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":  "2014­04­01",

"DocDueDate":  "2014­04­01",

"CódigoTarjeta":  "c1",

"Nombre  de  la  tarjeta":  "cliente  1",

"DocTotal":  1000,

"DocCurrency":  "$",

"JournalMemo":  "Órdenes  de  Venta  ­  0af75168­60cd­4",

"FechaImpuesta":  "2014­04­01",

"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":  "2014­04­01",

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

Opción Descripción Ejemplo

$filtro Consulta  colecciones  de  entidades. /Pedidos?$filter=DocTotal  gt  3000

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.

$seleccionar Devuelve  las  propiedades  que  se   /Pedidos?$select=DocEntry,  DocTotal


solicitan  explícitamente.

$ordenarpor Especifica  el  orden  en  que  se  devuelven  las   /Pedidos?$orderby=DocTotal  asc,  DocEntry  


entidades. desc

$superior Devuelve  los  primeros  n  (enteros  no   /Pedidos?$top=3


negativos)  registros.

$saltar Especifica  el  resultado  excluyendo  el  primer  n /Pedidos?$top=3&$skip=2


entidades.
Cuando  $top  y  $skip  se  usan  juntos,  $skip  se  aplica  
antes  que  $top,  independientemente  del  orden  de  aparición  
en  la  solicitud.

$contar Devuelve  el  recuento  de  una  colección   /pedidos/$recuento


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. 33
Machine Translated by Google

Opción Descripción Ejemplo

/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  '2014­04­23'

OBTENER /Pedidos?$filter=DocDate  eq  '20140423'

OBTENER /Pedidos?$filter=DocDate  eq  datetime'2014­04­23'

OBTENER /Pedidos?$filter=DocDate  eq  datetime'20140423'

OBTENER /Pedidos?$filter=DocDate  eq  '2014­04­23T[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  '2014­06­18T[Link]Z'

OBTENER /Pedidos?$filter=DocTime  eq  '2014­06­18T18: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  Preference­Applied  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

Cross­Joins  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  '2017­09­20'  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":  2017­09­2

},

"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":  2017­09­2

},

"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":  "es­es",

"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  OData­MaxVersion:  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="UTF­8"?>
<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  OData­CSDL  (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":  "es­es",

"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":  "2017­05­16",

"FechaDocumento":  "2017­05­16",

"AñoDocumento":  "2017",

...

"CuartoDocumento":  "T2",

"DocumentoMes":  "05",

"Administrador":  "­NULL­",

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. sesenta  y  cinco


Machine Translated by Google

"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":  "d3fb9f1c­72a0­4"

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":  "es­es",

"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

PublicaciónAño PublicaciónMes ItemCode_COUNT PrecioUnitario  PromedioLC_SUM

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":  "2020­02­14"

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="UTF­8"?>

<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  OData­CSDL  (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

SELECCIONE  T0.[Código  de  artículo] , T0.[Lista  de  precios] ,  T0.[EntradaUom] , T0.[Precio] , T0.

[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  =  utf­8;
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":  "en­us",

"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  Content­Type.

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>

<subsolicitud­1>

­­<Límite  del  lote>

<subsolicitud­2>

­­<Límite  del  lote>

Tipo  de  contenido:  multipart/mixed;boundary=<Límite  del  conjunto  de  cambios>

­­<Límite  del  conjunto  de  cambios>

<subchangeset­request­1>

­­<Límite  del  conjunto  de  cambios>

<subchangeset­request­2>

­­<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  Content­ID  
con  el  prefijo  $.  Cuando  se  usa  de  esta  manera,  $<Content­ID>  actúa  como  un  alias  para  el  URI  que  identifica  la  nueva  entidad.

Ejemplo
Cómo  usar  el  conjunto  de  cambios  con  Content­ID
1.  Crea  un  pedido.

2.  Utilice  $<Content­ID>  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  Content­ID  solo  existe  en  las  subsolicitudes  del  conjunto  de  cambios:

o  Para  la  versión  3  de  OData,  no  es  necesario  usar  Content­ID  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  Content­ID  =  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  Content­ID  =  2)

Códigos  de  muestra

POST  [Link]
Versión  de  OData:  4.0

Tipo  de  contenido:  multiparte/mixto;límite=batch_36522ad7­fc75­4b56­8c71­56071383e77b

­­batch_36522ad7­fc75­4b56­8c71­56071383e77b
Tipo  de  contenido:  aplicación/http

Codificación  de  transferencia  de  contenido:  binario

OBTENER /b1s/v1/Artículos('i001')

­­batch_36522ad7­fc75­4b56­8c71­56071383e77b

Tipo  de  contenido:  multiparte/mixto;límite=cambio_77162fcd­b8da­41ac­a9f8­9357efbbd

­­changeset_77162fcd­b8da­41ac­a9f8­9357efbbd
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_77162fcd­b8da­41ac­a9f8­9357efbbd
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_77162fcd­b8da­41ac­a9f8­9357efbbd­­

­­batch_36522ad7­fc75­4b56­8c71­56071383e77b­­

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":  "en­us",

"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_d878cedc­a0ad­4025­823e­5ee1aaffa288

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  =  utf­8

Longitud  del  contenido:  14729

<Cuerpo  de  elemento  de  formato  Json  (i001)>

­­batchresponse_d878cedc­a0ad­4025­823e­5ee1aaffa288

Tipo  de  contenido:multiparte/mixto;límite=cambiosetresponse_8bfb3c36­dbf7­46a0­bdfe
670bbac86eb2

­­changesetresponse_8bfb3c36­dbf7­46a0­bdfe­670bbac86eb2

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  =  utf­8

Longitud  del  contenido:  14641

Ubicación:[Link]

<Cuerpo  de  elemento  de  formato  Json  (i002)>

­­changesetresponse_8bfb3c36­dbf7­46a0­bdfe­670bbac86eb2

Tipo  de  contenido:  aplicación /  http

Codificación  de  transferencia  de  contenido:  binario
ID  de  contenido:  2

HTTP/1.1  204  Sin  contenido

­­changesetresponse_8bfb3c36­dbf7­46a0­bdfe­670bbac86eb2­­

­­batchresponse_d878cedc­a0ad­4025­823e­5ee1aaffa288­­  •  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_3aa0885d­245c­4164­b9a4­9c27f7a2c4d1

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  =  utf­8

Longitud  del  contenido:  14729

<Cuerpo  de  elemento  de  formato  Json  (i001)>

­­batchresponse_3aa0885d­245c­4164­b9a4­9c27f7a2c4d1

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  =  utf­8

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":  "en­us",

"value" :  "El  código  de  artículo  'i002'  ya  existe"

­­batchresponse_3aa0885d­245c­4164­b9a4­9c27f7a2c4d1­­

Ejemplo
Cree  un  pedido  y  cancélelo  en  una  sola  transacción

POST  [Link]

tipo  de  contenido:  multiparte/mixto;límite=batch_36522ad7­fc75­4b56­8c71­
56071383e77b

­­batch_36522ad7­fc75­4b56­8c71­56071383e77b

tipo  de  contenido:  multiparte/mixto;límite=cambio_77162fcd­b8da­41ac­a9f8­
9357efbbd

­­changeset_77162fcd­b8da­41ac­a9f8­9357efbbd

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":  "2017­07­20",

"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_77162fcd­b8da­41ac­a9f8­9357efbbd

tipo  de  contenido:  aplicación/http

codificación  de  transferencia  de  contenido:  binario

publicar  $1/cancelar

anfitrión:  anfitrión

­­changeset_77162fcd­b8da­41ac­a9f8­9357efbbd­­

­­batch_36522ad7­fc75­4b56­8c71­56071383e77b­­

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":  "es­es",

"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":  "2014­04­01",

"Precio":  100,

...

},

"Número  de  Línea":  1,

"Código  del  artículo":  "i2",

"ItemDescription":  "elemento  2",

"Cantidad":  8,

"Fecha  de  envío":  "2014­04­01",

"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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 101


Machine Translated by Google

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:

Tabla  principal /  Tabla  secundaria  UDT FDU Tipo

Mesa  principal Mi  pedido Documento

CustomerName  Alfanumérico

DocTotal Unidades  y  Totales /  Importe

Mesa  Infantil MisLíneasDePedido Filas  de  documentos

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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 103


Machine Translated by Google

"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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 105


Machine Translated by Google

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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 107


Machine Translated by Google

"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  add­entity.

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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 109


Machine Translated by Google

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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 111


Machine Translated by Google

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]/en­us/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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 113


Machine Translated by Google

"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":  "2016­03­25",

"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/form­data;boundary=<Límite>

El  cuerpo  está  separado  por  el  límite  definido  en  el  encabezado  Content­Type,  como:

­­<Límite>

Contenido­Disposición:  formulario­datos;  nombre="archivos";  nombre  de  archivo="<archivo1>"

Tipo  de  contenido:  <tipo  de  contenido  del  archivo1>

<contenido  del  archivo1>

­­<Límite>

Contenido­Disposición:  formulario­datos;  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/form­data;  límite=WebKitFormBoundaryUmZoXOtOBNCTLyxT

­­WebKitFormBoundaryUmZoXOtOBNCTLyxT

Contenido­Disposición:  formulario­datos;  nombre="archivos";  nombre  de  archivo  =  "lí[Link]"

Tipo  de  contenido:  texto/simple

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. 115


Machine Translated by Google

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

Contenido­Disposición:  formulario­datos;  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":  "2016­04­06",

"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":  "2016­04­06",

"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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 117


Machine Translated by Google

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/form­data;  límite=WebKitFormBoundaryUmZoXOtOBNCTLyxT

­­WebKitFormBoundaryUmZoXOtOBNCTLyxT

Contenido­Disposición:  formulario­datos;  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/form­data;  límite=WebKitFormBoundaryUmZoXOtOBNCTLyxT

­­WebKitFormBoundaryUmZoXOtOBNCTLyxT

Contenido­Disposición:  formulario­datos;  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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 119


Machine Translated by Google

<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

OData­Max  Versión:  4.0

Aceptar:  aplicación/json;[Link]=minimal;

Aceptar  juego  de  caracteres:  UTF­8

Agente  de  usuario:  [Link]/7.9.0

Cookie:  B1SESSION=3a8f8e84­e1f4­11eb­8000­0a0027000008;  HttpOnly;

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. 121


Machine Translated by Google

Conexión:  Keep­Alive

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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 123


Machine Translated by Google

</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/form­data;boundary=<Límite>

El  cuerpo  está  separado  por  el  límite  definido  en  el  encabezado  Content­Type,  como:

­­<Límite>

Contenido­Disposición:  formulario­datos;  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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 125


Machine Translated by Google

­­<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/form­data;  límite=­­­­WebKitFormBoundaryUmZoXOtOBNCTLyxT

­­­­­­WebKitFormBoundaryUmZoXOtOBNCTLyxT

Contenido­Disposición:  formulario­datos;  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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 127


Machine Translated by Google

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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 129


Machine Translated by Google

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  UTF­8.

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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 131


Machine Translated by Google

"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=UTF­8",

"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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 133


Machine Translated by Google

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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 135


Machine Translated by Google

"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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 137


Machine Translated by Google

GET /b1s/v1/BusinessPartners?$filter=contains(CódigoTarjeta,

'c2')&$select=CódigoTarjeta

B1S­Insensible  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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 139


Machine Translated by Google

[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":  "en­us",

"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":  "es­es",

"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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 141


Machine Translated by Google

"código":  512,

"mensaje":  {

"lang":  "es­es",

"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":  "es­es",

"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  back­end,  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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 143


Machine Translated by Google

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="utf­8"?>

<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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 145


Machine Translated by Google

/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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 147


Machine Translated by Google

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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 149


Machine Translated by Google

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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 151


Machine Translated by Google

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/#toc­withcredentials

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,  B1S­CaseInsensible.  Para  satisfacer  este  requisito,  agregue  la  opción  de  
configuración  CorsAllowedHeaders  en  [Link].  Por  ejemplo:

"CorsAllowedHeaders":"tipo  de  contenido,  aceptar,  B1S­Insensible  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

{ "mensaje":  "pong", "remitente":  "equilibrador  de  carga", "marca  de  tiempo":


"1555998764.740"}

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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 153


Machine Translated by Google

Respuesta:

HTTP/1.1  200  Aceptar

{ "mensaje":  "pong", "remitente":  "equilibrador  de  carga", "marca  de  tiempo":


"1555998785.080"}

o  Escenario  3:  el  nodo  especificado  responderá

Pedido:

[Link]

Respuesta:

HTTP/1.1  200  Aceptar

{ "mensaje":  "pong", "remitente":  "nodo1", "marca  de  tiempo":


"1554363811.386"}

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

{ "mensaje":  "pong", "remitente":  "nodo1", "marca  de  tiempo":


"1555998837.832"}

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

Consumir  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 155


Machine Translated by Google

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  HANA­box.

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":  "2020­10­08",

"Actualización":  "2020­10­08"

4.2.2  Recuperar  por  clave

Pedido

Trabajar  con  la  capa  de  servicio  de  SAP  Business  One PÚBLICO

Consulta  SQL ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 157


Machine Translated by Google

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":  "2020­10­08",

"Actualización":  "2020­10­08"

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  =  UTF­8

Respuesta

HTTP/1.1  200  Aceptar

Preferencia  aplicada:  [Link]=5

Tipo  de  contenido:  aplicación/json;odata=minimalmetadata;charset=utf­8

"[Link]":  "[Link]

"valor":  [

"Código  Sql":  "sql01",

"SqlName":  "consultaEnPedido",

"SqlText":  "seleccione  [DocEntry],  [DocTotal],  [DocDate],  [Comentarios]  de
[ORDR]  donde  [DocTotal]  > :docTotal",

"ParamList":  "docTotal",

"CrearFecha":  "2020­10­08",

"Actualización":  "2020­10­08"

},

"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":  "2020­10­08",

"Actualización":  "2020­10­08"

},

"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

Consulta  SQL ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 159


Machine Translated by Google

"CrearFecha":  "2020­10­08",

"Actualización":  "2020­10­08"

},

"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":  "2020­10­08",

"Actualización":  "2020­10­08"

},

"Código  Sql":  "sql06",

"SqlName":  "queryOnItem",

"SqlText":  "seleccione  [DocEntry]  de  [ORDR]  donde  [CreateDate] !=  '2020­10­
03'",

"ParamList":  nulo,

"CrearFecha":  "2020­10­08",

"Actualización":  "2020­10­08"

],

"[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  =  UTF­8

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

Consulta  SQL ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 161


Machine Translated by Google

HTTP/1.1  200  Aceptar

Preferencia  aplicada:  [Link]=5

Tipo  de  contenido:  aplicación/json;odata=minimalmetadata;charset=utf­8

"[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+  QUT1­14,  ORDR  +RDR1­14,  ODLN+DLN1­14,  ORRR+RRR1­14,  ORDN+RDN1­
14,  ODPI+DPI1­14,  OINV+INV1­14,  ORIN+RIN1­14)

•  Documentos  de  Compra  (OPRQ+PRQ1­14,  OPQT+PQT1­14,  OPOR+POR1­14,  OPDN+PDN1­14,
OPRR+PRR1­14,  ORPD+RPD1­14,  ODPO+DPO1­14,  OPCH+PCH1­14,  ORPC+RPC1­14)

•  Giros  (ODRF+DRF1­14)  •  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

Consulta  SQL ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 163


Machine Translated by Google

•  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":  "en­us",

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

Alias seleccione  [Link]  como  Col1  donde   , [Link]  como  Col2  de  ORDR  t1

[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

Consulta  SQL ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 165


Machine Translated by Google

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

Consulta  SQL ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 167


Machine Translated by Google

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":  "2020­10­08",

"Actualización":  "2020­10­08"

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

Consulta  SQL ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 169


Machine Translated by Google

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":  "en­us",

"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

Consulta  SQL ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 171


Machine Translated by Google

"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":  "es­es",

"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":  "es­es",

"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":  "en­us",

"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

Consulta  SQL ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 173


Machine Translated by Google

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":  "es­es",

"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":  "es­es",

"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":  "es­es",

"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

Consulta  SQL ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 175


Machine Translated by Google

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":  "es­es",

"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

Consulta  SQL ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 177


Machine Translated by Google

•  No  se  admite  SBOCOMMON  o  SBO­COMMON  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  If­Match.  Cualquier  solicitud  PATCH  con  una  ETag  desactualizada  en  el  encabezado  If­Match  
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  =  UTF­8

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

ETag  de  capa  de  servicio ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 179


Machine Translated by Google

"@[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  If­Match  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=utf­8

"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  If­Match  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=utf­8

"@[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

ETag  de  capa  de  servicio ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 181


Machine Translated by Google

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=utf­8

"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  If­Match  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=utf­8

"@[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=utf­8

"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

ETag  de  capa  de  servicio ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 183


Machine Translated by Google

•  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

ETag  de  capa  de  servicio ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 185


Machine Translated by Google

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  Get­ExecutionPolicy  para  verificar  la  política  de  ejecución  actual.  Si  no  es  
"Sin  restricciones",  use  el  comando  Set­ExecutionPolicy  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  PL00­PL03,  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

Configuración  de  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 187


Machine Translated by Google

Opciones  de  conexión  del  servidor

Opción Tipo Descripción  y  valores  predeterminados

Servidor Cadena El  servidor  de  base  de  datos.

Servidor  de  licencias Cadena Esta  opción  entra  en  vigor  a  partir  del  parche  9.1  nivel  05  para  trabajar  con  el  servidor  de  


licencias  y  el  servidor  SLD.  El  servidor  de  licencias  y  el

El  servidor  SLD  comparte  la  misma  dirección.

Hora  de  término  de  la  sesión Entero Medido  por  minutos.  Define  el  período  de  tiempo  de  espera  para  cada  sesión.

El  valor  predeterminado  es  30  (minutos).

Otras  opciones

Opción Tipo Descripción  y  valores  predeterminados

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.

Tamaño  de  página Entero Define  el  tamaño  de  la  página  cuando  se  aplica  paginación  para  una  consulta.

El  valor  predeterminado  es  20.

Esquema Cadena Disponible  a  partir  de  la  versión  9.1,  nivel  de  parche  03.

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.

CorsAllowedOrig Cadena Disponible  a  partir  de  la  versión  9.1,  nivel  de  parche  08.


En  s
El  valor  predeterminado  está  vacío  ("").

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

Opción Tipo Descripción  y  valores  predeterminados

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.

CorsPermitidoCabeza Cadena Disponible  a  partir  de  la  versión  9.2,  nivel  de  parche  07.

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,  B1S­PageSize"

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­<nombre­elemento­configuración>:  <valor>

Por  ejemplo:

•  Compatible  con  B1S­WCF:  Verdadero

•  B1S­Tamañ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

Configuración  de  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 189


Machine Translated by Google

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

Configuración  de  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 191


Machine Translated by Google

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

Configuración  de  la  capa  de  servicio  de  SAP  Business  One ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 193


Machine Translated by Google

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

Alta  disponibilidad  y  equilibrio  de  carga ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 195


Machine Translated by Google

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  X­HTTP­Method­Override  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  X­HTTP:  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":  "2014­04­01",

"DocDueDate":  "2014­04­01",

"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

Apéndice  I:  Capa  de  servicio  versus  DI  API ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 199


Machine Translated by Google

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

Apéndice  I:  Capa  de  servicio  versus  DI  API ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 201


Machine Translated by Google

"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_36522ad7­fc75­4b56­8c71­56071383e77b

­­batch_36522ad7­fc75­4b56­8c71­56071383e77b

Tipo  de  contenido:  multiparte/mixto;límite=cambio_77162fcd­b8da­41ac­a9f8­9357efbbd

­­changeset_77162fcd­b8da­41ac­a9f8­9357efbbd

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_77162fcd­b8da­41ac­a9f8­9357efbbd

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_77162fcd­b8da­41ac­a9f8­9357efbbd­­

­­batch_36522ad7­fc75­4b56­8c71­56071383e77b­­

Nota
Las  dos  primeras  líneas  indican  que  esta  solicitud  es  una  solicitud  por  lotes  y  el  encabezado  de  la  solicitud  debe  establecerse  
en  'Content­Type:  multipart/mixed;boundary=batch_36522ad7­fc75­4b56­8c71­56071383e77b'.

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]
version­3­0/batch­processing/.

Trabajar  con  la  capa  de  servicio  de  SAP  Business  One PÚBLICO

Apéndice  I:  Capa  de  servicio  versus  DI  API ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 203


Machine Translated by Google

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":  "ce7a456e­ead4­4",

"Nombre  de  la  tarjeta":  "bb72965f­b076­4a81­859f­a2bde7b5b356"

},

...

"Código  de  tarjeta":  "ce8da8a1­d674­4",

"Nombre  de  la  tarjeta":  "cbdb91d7­1a29­4e64­9ce8­0bd0a72704b8"

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

Apéndice  I:  Capa  de  servicio  versus  DI  API ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 205


Machine Translated by Google

[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

Apéndice  I:  Capa  de  servicio  versus  DI  API ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 207


Machine Translated by Google

"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

Apéndice  I:  Capa  de  servicio  versus  DI  API ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 209


Machine Translated by Google

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

Apéndice  I:  Capa  de  servicio  versus  DI  API ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 211


Machine Translated by Google

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

Apéndice  I:  Capa  de  servicio  versus  DI  API ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 213


Machine Translated by Google

[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

Apéndice  I:  Capa  de  servicio  versus  DI  API ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 215


Machine Translated by Google

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

Apéndice  II:  Diferencia  de  nombres  de  metadatos  entre  la  capa  de  servicio  y  DI  API ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 217


Machine Translated by Google

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

Apéndice  II:  Diferencia  de  nombres  de  metadatos  entre  la  capa  de  servicio  y  DI  API ©  2022  SAP  SE  o  una  empresa  filial  de  SAP.  Reservados  todos  los  derechos. 219


Machine Translated by Google

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.

Common questions

Con tecnología de IA

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 .

También podría gustarte