Buenos día a todos, reciban un cordial saludo. Mi nombre es Juan Carlos Barrios Medina, y actualmente trabajo en la empresa con el SAP B1 9.2 PL9, con Sql Server 2014.
Les comento que quiero implementar un modelo de autorización sobre pedidos de venta, que cuando un precio de una de las partidas sea más bajo que el que tiene en la lista de precios del cliente, lo envíe a una autorización.
Pero no me funciona. Les pongo aquí el query que utilizó para determinar si va o no a autorización (obtengo un conteo de las partidas que están en esa situación - precio más bajo que la lista de precios- ) y si el número de partidas es igual o mayor a 1, se supone que debe ejecutar el modelo de autorización, pero no funciona. Pongo aquí el query elaborado:
IF ((select count(t1.itemcode) from ordr t0
left outer join rdr1 t1 on t1.docentry=t0.DocEntry
left outer join OCRD t2 on t2.CardCode = t0.CardCode
left outer join itm1 t3 on t3.ItemCode = t1.itemcode and t3.PriceList =t2.ListNum
where t0.docentry = $[ordr.docentry] and (t1.Price<t3.Price) ) >= 1 )
Select distinct ‘TRUE’
Si ejecuto el query sobre los pedidos ya generados, si genera el resultado correcto, pero no funciona en el modelo de autorización.
Es por eso que acudo a su valiosa ayuda, para preguntarles si les habrá pasado algo similar y como lo resolvieron.
Muchas gracias de antemano por su apoyo.
Saludos y buen día!!!
hola estimado @jcbarriostkl lo que te sugiero es que tu consulta (query) actual, la cambies de como la tienes a la modalidad siguiente: SELECT CASE WHEN (count(t1.itemcode))>=1 THEN 'TRUE' ELSE 'FALSE'FROM ORDR T0….etc, etc. Lo mas recomendable es que pruebes inicialmente tu proceso de autorizacion con una consulta sencilla (en la modalidad que te indico anteriormente) y si te funciona tu proceso de autorizacion, vayas poco a poco haciendo mas compleja tu QUERY….si esto te ayudo en algo, dale LIKE, si resolvio tu problema marcalo como Resuelto, para tener un foro mas limpio y ordenado. Espero haberte ayudado en algo. saludos.
Lo que planteas es correcto en cuanto a la lógica, pero el motivo por el que funciona en un query directo y no dentro del modelo de autorización de SAP Business One es que el motor de autorizaciones tiene ciertas restricciones:
-
No acepta sub‑queries complejas (como tu SELECT COUNT(...)) dentro de la condición.
-
El modelo de autorización espera una condición booleana simple que pueda evaluarse directamente sobre las tablas relacionadas al documento en proceso.
-
Cuando usas $[ordr.docentry], el motor de autorización no siempre interpreta bien las correlaciones con múltiples joins y agregaciones.
Intenta realizar esto:
IF EXISTS (
SELECT 1
FROM RDR1 T1
INNER JOIN ORDR T0 ON T1.DocEntry = T0.DocEntry
INNER JOIN OCRD T2 ON T2.CardCode = T0.CardCode
INNER JOIN ITM1 T3 ON T3.ItemCode = T1.ItemCode AND T3.PriceList = T2.ListNum
WHERE T0.DocEntry = $[ORDR.DocEntry]
AND T1.Price < T3.Price
)
SELECT 'TRUE'
-
Usar EXISTS en lugar de COUNT
En lugar de contar las partidas, basta con verificar si existe al menos una línea con precio menor al de la lista
-
Verificar el campo correcto
En algunos escenarios SAP B1 usa PriceAfVAT o LineTotal según la configuración de impuestos. Asegúrate de que T1.Price sea el campo que refleja el precio unitario neto que quieres comparar.
-
Prueba en el modelo de autorización
Copia el query simplificado y ejecútalo en la condición de autorización. Si devuelve 'TRUE', el documento se enviará a autorización.
CONSEJO
En SAP B1 muchas veces se recomienda crear una vista en SQL que encapsule la lógica (joins y validaciones) y luego en el modelo de autorización simplemente hacer:
IF EXISTS (SELECT 1 FROM VW_AutorizacionPrecio WHERE DocEntry = $[ORDR.DocEntry])SELECT ‘TRUE’
De esa manera el motor de autorización evalúa algo mucho más sencillo y evitas problemas de compatibilidad.
3 Me gusta
Buen día estimado JulianCab. Te agradezco tus comentarios para intentar solucionar el problemita que tengo. Por un tiempo deje de lado este proceso, pero ya me lo están pidiendo y entonces aplicaré lo que me sugieres.
En cuanto tenga algún resultado, lo comento.
Muchas gracias.
Saludos.