Búsquedas formateadas en SAP Business One (FMS): sintaxis $[$38.1.0], 7 ejemplos prácticos y actualización automática

Por Zain Abbas, Kodenova · Actualizado el

Respuesta cortaUna búsqueda formateada (FMS) es una consulta guardada que se vincula a un campo en SAP Business One y que rellena el campo o muestra una lista de selección. Dentro de la consulta se leen valores del formulario abierto con $[$Item.Column.Type] (ítem, columna, tipo), por ejemplo $[$38.1.0] para el código de artículo en una línea del documento. Se asigna con Alt+Shift+F2 y usted elige si se ejecuta a petición, cuando cambia otro campo o siempre.

Qué es una búsqueda formateada

Una búsqueda formateada, normalmente llamada FMS, es una consulta guardada vinculada a un campo de un formulario. Cuando se ejecuta, SAP Business One escribe el resultado en el campo o muestra una lista para que el usuario elija.

A los usuarios les encantan porque eliminan tecleo. A los desarrolladores les gustan porque no hace falta ningún add-on. Puede rellenar un UDF de línea con el nombre extranjero del artículo, mostrar el stock en el almacén de la línea u ofrecer una lista desplegable a partir de una tabla definida por el usuario.

Si prefiere saltarse el trabajo de sintaxis, nuestro generador de búsquedas formateadas escribe la consulta por usted.

La sintaxis

Hay dos formas de leer valores del formulario abierto.

FormaEjemploCuándo usarla
$[$Item.Column.Type]$[$38.1.0]Lee el campo por su posición en el formulario. Funciona en documentos similares.
$[TABLE.Field]$[OINV.CardCode]Lee por nombre de tabla y de campo. Solo funciona en formularios basados en esa tabla.

En la primera forma:

  • Item es el índice del ítem del formulario. En los documentos de ventas y compras, 38 es la matriz de líneas y 4 es el código de cliente o proveedor.
  • Column es la columna de la matriz. Use 0 para los campos de cabecera.
  • Type controla cómo se devuelve el valor:
    • 0 devuelve el valor tal cual. Úselo para códigos, texto y números de documento.
    • NUMBER devuelve un número sin la moneda ni la unidad. Úselo para cálculos.
    • CURRENCY devuelve solo el símbolo de moneda o la unidad de medida.
    • DATE devuelve una fecha a la que puede sumar días.

La propia guía de SAP recomienda la forma por índice, porque $[$4.0.0] funciona en cualquier documento de marketing, mientras que $[OINV.CardCode] solo funciona en facturas de clientes.

Los campos definidos por el usuario usan su nombre como columna: $[$38.U_Discount.NUMBER].

¿No quiere buscar a mano los IDs de ítem y columna? El generador de búsquedas formateadas escribe la variable del campo que usted elija.

Referencia rápida

VariableQué devuelve
$[$38.1.0]Código de artículo de la fila actual: el ítem 38 es la matriz de líneas, la columna 1 el número de artículo, y 0 significa que el campo contiene un único valor.
$[$38.17.NUMBER]El número de un campo de precio o total sin el símbolo de moneda, listo para cálculos.
$[$38.17.CURRENCY]Solo el símbolo de moneda (o la unidad de medida) de ese campo.
$[$10.0.DATE]Una fecha de cabecera con la que puede calcular, por ejemplo $[$10.0.DATE] + 20. Los campos de cabecera usan la columna 0.
$[$4.0.0]El código de cliente o proveedor en cualquier documento de ventas o compras.
$[ORDR.CardCode], $[RDR1.ItemCode]Nombre de tabla y de campo. Solo funciona en la ventana basada en esa tabla (aquí, el pedido de cliente).
$[$38.U_Discount.NUMBER]Un campo definido por el usuario de línea: escriba siempre el prefijo U_, o SAP B1 devuelve el error -1003.

Los números de ítem y de columna pueden variar entre versiones y formularios. Compruébelos con Visualizar → Información del sistema (View → System Information) antes de confiar en un número.

Cómo encontrar los IDs de ítem y columna

  1. En SAP Business One, abra Visualizar > Información del sistema (View > System Information).
  2. Abra el formulario y pase el cursor sobre el campo.
  3. Lea la barra de estado en la parte inferior. Muestra el ítem, la columna y, para los campos de base de datos, el nombre de la tabla y del campo.

Compruebe cada ID en su propia versión y formulario. Los números de columna pueden variar entre tipos de documento y localizaciones. Nuestra referencia de tablas de SAP B1 le ayuda con los nombres de tablas y campos.

Cómo asignar una búsqueda formateada

  1. Guarde su consulta en el gestor de consultas, idealmente en una categoría llamada “FMS”.
  2. Abra el formulario de destino y haga clic en el campo.
  3. Pulse Alt+Shift+F2. Se abre la ventana de búsqueda formateada.
  4. Elija Buscar en valores definidos por el usuario existentes según consulta grabada (Search in Existing User-Defined Values according to Saved Query) y seleccione su consulta.
  5. Decida cuándo se ejecuta:
    • Sin actualización automática: el usuario pulsa Shift+F2 o hace clic en la lupa.
    • Actualización automática al modificar el campo (Auto Refresh When Field Changes): elija el campo disparador, por ejemplo el código de artículo. La consulta se ejecuta cuando el usuario sale de ese campo.
    • Visualizar valores grabados (Display Saved Values): conserva el valor guardado en el documento en lugar de volver a ejecutar la consulta cada vez que se abre el documento.
  6. Haga clic en Actualizar y pruebe en un documento nuevo.

La guía de SAP también menciona la opción “Actualizar regularmente” (Refresh Regularly). Advierte que se use con moderación, porque puede ralentizar los formularios y modificar documentos guardados cuando se consultan.

7 ejemplos prácticos

Todos los ejemplos usan sintaxis de SQL Server. Las notas para HANA vienen después.

1. Campo de artículo en una línea. Nombre extranjero del artículo de la línea en un UDF de línea (tabla OITM).

SELECT T0.FrgnName
FROM OITM T0
WHERE T0.ItemCode = $[$38.1.0]

2. Campo de socio de negocios en la cabecera. Crédito disponible del cliente seleccionado (tabla OCRD).

SELECT T0.CreditLine - T0.Balance
FROM OCRD T0
WHERE T0.CardCode = $[$4.0.0]

3. Stock en el almacén de la línea. La columna 24 es el almacén en muchos formularios de documento. Confírmelo con Información del sistema. El stock por almacén está en OITW.

SELECT T0.OnHand
FROM OITW T0
WHERE T0.ItemCode = $[$38.1.0]
  AND T0.WhsCode = $[$38.24.0]

4. Último precio vendido a este cliente. Útil como control junto a la columna de precio (facturas de clientes en OINV).

SELECT TOP 1 T1.Price
FROM OINV T0
INNER JOIN INV1 T1 ON T0.DocEntry = T1.DocEntry
WHERE T0.CardCode = $[$4.0.0]
  AND T1.ItemCode = $[$38.1.0]
  AND T0.CANCELED = 'N'
ORDER BY T0.DocDate DESC, T0.DocEntry DESC

5. Peso de la línea. Peso de venta por unidad multiplicado por la cantidad de la línea (columna 11).

SELECT T0.SWeight1 * $[$38.11.NUMBER]
FROM OITM T0
WHERE T0.ItemCode = $[$38.1.0]

6. Lista desplegable a partir de una tabla definida por el usuario. Si devuelve dos columnas, el usuario obtiene una lista para elegir.

SELECT T0.Code, T0.Name
FROM [@REGIONS] T0
ORDER BY T0.Name

7. Fecha de hoy. Rellena un UDF de fecha cuando se crea el documento.

SELECT GETDATE()

Diferencias en HANA

En SAP Business One para HANA, la lógica es la misma, pero el SQL cambia:

  • Ponga los nombres de tablas y columnas entre comillas dobles: T0."ItemCode", "@REGIONS".
  • Los nombres de UDF dentro de la variable también necesitan comillas: $[$38."U_Discount".NUMBER].
  • Un SELECT sin tabla necesita FROM DUMMY.
  • Reemplace las funciones de SQL Server: GETDATE() pasa a ser CURRENT_DATE, ISNULL pasa a ser IFNULL.

El ejemplo 7 en HANA:

SELECT CURRENT_DATE FROM DUMMY

El ejemplo 1 en HANA:

SELECT T0."FrgnName"
FROM OITM T0
WHERE T0."ItemCode" = $[$38.1.0]

Si va a migrar muchas consultas, péguelas en nuestro conversor de SQL a HANA y después pruebe cada una.

Errores comunes en búsquedas formateadas y cómo corregirlos

SíntomaCausa habitualSolución
Internal error (-1003) occurred (error interno) cuando se ejecuta la búsquedaEl SQL falló cuando SAP Business One lo ejecutó: un error de sintaxis, un corchete que falta o una referencia de campo que no se resuelveEjecute la consulta en el gestor de consultas, o ejecute el SQL traducido en SQL Server Management Studio, y corrija el error que informe. Después revise cada referencia $[...] con Visualizar > Información del sistema.
La consulta funciona en SQL Server pero falla en HANANombres de columna con mayúsculas y minúsculas sin comillas, o un SELECT sin tablaPonga los nombres de tablas y columnas entre comillas dobles y agregue FROM DUMMY. Vea Diferencias en HANA.
No se encuentra un campo definido por el usuarioEl campo se escribió sin su prefijo U_Escriba siempre el nombre completo, por ejemplo $[$38.U_Discount.NUMBER].
El valor no cambia cuando cambia el campo disparadorActualización automática al modificar el campo está desactivada o apunta al campo equivocadoMarque la actualización automática y elija el campo que debe disparar la consulta. Sin ella, la consulta solo se ejecuta con Shift+F2.
El valor se recalcula al reabrir un documento antiguo, o nunca se actualizaSe eligió la opción de actualización equivocadaVisualizar valores grabados muestra lo que se guardó con el documento. Actualizar regularmente vuelve a ejecutar la consulta cada vez que navega al documento, y SAP advierte que puede ralentizar los documentos y cambiar valores que usted no quería cambiar.

La actualización automática tampoco hace nada en campos que ya no se pueden modificar, como el número de artículo en una entrega existente.

Consejos de rendimiento

  • Las búsquedas a nivel de línea se multiplican. Una búsqueda que se actualiza automáticamente con el código de artículo se ejecuta una vez por línea. En un pedido de 200 líneas, son 200 consultas. Agregue tres búsquedas así y los usuarios lo notarán.
  • Filtre por claves. Consulte por ItemCode, CardCode, DocEntry. Evite LIKE '%x%' y funciones sobre columnas en la cláusula WHERE.
  • Evite joins pesados sobre tablas de documentos. El ejemplo 4 recorre el historial de facturas. Va bien con unos cientos de miles de líneas y lento con millones. Considere un índice o una tabla resumen.
  • Prefiera la ejecución a petición para necesidades poco frecuentes. Si los usuarios solo necesitan un valor de vez en cuando, deje desactivada la actualización automática y que pulsen Shift+F2.
  • Use Visualizar valores grabados para todo lo que no deba cambiar después de guardar el documento.

Cuándo usar otra cosa

Una búsqueda formateada rellena campos. No obliga a cumplir reglas. Un usuario puede sobrescribir el valor, y las importaciones mediante DI API o Service Layer no la ejecutan.

  • Use el procedimiento almacenado de notificación de transacciones (SBO_SP_TransactionNotification) cuando una regla deba cumplirse siempre, por ejemplo “ninguna factura sin centro de costo” o “el precio no puede ser inferior al costo”. Bloquea el guardado, venga de donde venga.
  • Use un add-on cuando necesite pantallas nuevas, botones, llamadas a APIs externas o lógica que dependa de muchos campos a la vez.
  • Mantenga las FMS para valores predeterminados, búsquedas y listas de selección que ayudan al usuario a teclear menos.

Las búsquedas formateadas rellenan campos mientras la gente escribe; para hacer reportes sobre esos mismos datos, vea cómo crear un dashboard de SAP Business One sin Power BI.

¿Listo para crear una? Abra el generador de búsquedas formateadas, elija su formulario y campo, y copie la consulta. Si sus documentos van lentos o necesita reglas que las FMS no pueden hacer cumplir, contáctenos y revisaremos su configuración.

Fuentes

Servicios relacionados

Preguntas frecuentes

Preguntas frecuentes

¿Qué significa $[$38.1.0] en SAP Business One?

Lee un valor del formulario abierto. 38 es el índice del ítem de la matriz de líneas del documento, 1 es la columna (Número de artículo) y 0 es el tipo, que devuelve el valor tal cual. Así, $[$38.1.0] es el código de artículo de la línea actual.

¿Cuál es la diferencia entre 0, NUMBER y DATE en una búsqueda formateada?

0 devuelve el valor del campo tal como está, lo que sirve para códigos y texto. NUMBER devuelve un valor numérico sin la moneda ni la unidad, para que pueda hacer cálculos con él. DATE devuelve una fecha que puede usar en aritmética de fechas.

¿Cómo encuentro el número de ítem y de columna de un campo?

Active Visualizar > Información del sistema (View > System Information) y pase el cursor sobre el campo. La barra de estado muestra el número de ítem, la columna y, para campos de base de datos, el nombre de la tabla y del campo.

¿Funcionan las búsquedas formateadas en SAP Business One para HANA?

Sí, pero el SQL debe seguir las reglas de HANA. Ponga los nombres de tablas y columnas entre comillas dobles, use FROM DUMMY cuando seleccione un valor sin tabla y reemplace funciones de SQL Server como GETDATE() por las de HANA, como CURRENT_DATE.

¿Por qué mi búsqueda formateada da Internal error (-1003)?

En la práctica significa que el SQL falló cuando SAP Business One lo ejecutó: un error de sintaxis, una referencia de campo incorrecta o un campo definido por el usuario escrito sin U_. Ejecute la misma consulta en el gestor de consultas, o ejecute el SQL traducido en SQL Server Management Studio, lea el error real y corríjalo allí. Después revise cada referencia $[...] con Visualizar > Información del sistema.

¿Por qué mis documentos van lentos después de agregar búsquedas formateadas?

Cada búsqueda formateada ejecuta una consulta. Una que se actualiza automáticamente en cada línea, o que está configurada para actualizarse regularmente, se ejecuta muchas veces por documento. Mantenga pocas búsquedas a nivel de línea, que aprovechen los índices y que sean a petición siempre que sea posible.

¿Listo para empezar?

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