Importante
La siguiente respuesta es generada por nuestro Robot AI de Consultoria-SAP denominado “CSAPBOT” usando tecnología de IA -inteligencia artificial. Por lo tanto, puede haber datos incorrectos. No podemos garantizar que la información sea 100% correcta, solo consultores SAP profesionales y usuarios del sistema podrían verificar la información. ¿Te animas a hacerlo? ¿Aceptas el reto? Puedes responder este debate si sigue abierto!
Si quieres aprender más sobre nuestros sistemas con AI, te esperamos en este artículo.
Hola, gracias por tu excelente descripción del caso. Es un escenario muy bien planteado sobre control de caja por usuario en SAP Business One, y es totalmente posible filtrar en un reporte de Crystal Reports los datos de usuario de sesión actual, siempre que se configure correctamente desde SAP.
Objetivo
Filtrar los registros de pagos (ORCT) por usuario de sesión (cajero), cuando se ejecuta un reporte en Crystal Reports directamente desde SAP Business One.
¿Es posible obtener el usuario de sesión dentro del reporte?
Sí, pero NO directamente usando $[USER] dentro del Command del Crystal Report. Esa sintaxis ($[USER]) funciona solo dentro de campos de definición de valores en SAP B1, no dentro de la definición de un Command en Crystal.
¿Cómo lograrlo correctamente?
Tienes dos opciones confiables:
Opción 1: Pasar el usuario como parámetro en SAP B1 al Crystal Report
-
Crea un parámetro llamado UserID en tu Crystal Report.
-
En SAP B1, cuando adjuntes el reporte (en Reportes → Gestión de reportes o en el menú de impresión), configura el parámetro como:
SELECT $[USER] FROM DUMMY
Esto enviará automáticamente el nombre del usuario actual que ejecuta el reporte como valor del parámetro UserID.
-
Luego, en tu Command de Crystal:
SELECT
T0.DocEntry,
T0.DocDate,
T0.CardCode,
T0.CardName,
T0.CashSum,
T0.UserSign
FROM ORCT T0
WHERE T0.UserSign = (SELECT USERID FROM OUSR WHERE USER_CODE = '{?UserID}')
Opción 2: Usar USER_CODE directamente si ya estás guardando el usuario
Si en tu lógica de apertura de caja ya estás almacenando el USER_CODE, y no necesitas hacer la traducción del ID numérico (UserSign), podrías incluso comparar directamente con el string:
WHERE OUSR.USER_CODE = '{?UserID}'
Siempre que ORCT.UserSign esté correctamente relacionado.
Importante considerar:
-
La tabla OUSR es la que almacena los datos de usuario, donde:
-
En la tabla ORCT, el campo UserSign indica quién creó el documento de pago.
Consejo extra
Ya que en tu ventana de apertura de caja se genera un número de caja relacionado al usuario, puedes complementar el filtro para que también valide:
...AND T0.U_NumCaja = (SELECT MAX(U_NumCaja) FROM [tu_tabla_caja] WHERE UserCode = '{?UserID}')
De esta forma, aseguras que vean solo lo que corresponde a su caja abierta y no todo su historial.
Resumen Consultoria-SAP
-
Puedes filtrar por usuario de sesión en Crystal Reports desde SAP B1 si configuras correctamente un parámetro que reciba $[USER].
-
Luego, en el SQL del Command, traduces ese parámetro a UserSign con la tabla OUSR.
-
Esta solución es común en escenarios de arqueo de caja, en módulos de Finanzas (FI) y Ventas (SD).
-
Recuerda siempre validar la sesión del usuario activo si usas múltiples cajas abiertas.
¡Estamos aquí para ayudarte en los Foros SAP de Consultoria-SAP!