Buen día, estoy realizando una validación para que una orden de compra no se realice por un monto mayor al de la solicitud de compra, pero está bloqueando documentos que deben pasar,
Les agradezco si me pueden guiar, el código que tengo es:
IF @transaction_type IN ('A', 'U') AND
(@Object_type = '22')
begin
if exists
(SELECT T0.BaseEntry, SUM(T0.Linetotal + isnull(T0.LineVat,0))
FROM POR1 T0
INNER JOIN PRQ1 T1 ON T1.DOCENTRY = T0.BASEENTRY
WHERE
T0.BaseType = '1470000113' AND
T0.BaseLine = T1.LineNum and
T0.DOCENTRY = @list_of_cols_val_tab_del
GROUP BY T0.BaseEntry
HAVING (SUM(T0.Linetotal + isnull(T0.LineVat,0)) > SUM(T1.OpenSum)))
begin
select @Error = 10, @error_message = 'Monto mayor a SC'
end
end
Ojo, en esta sentencia estas asumiendo que todos los rows de la solicitud de compra se transforman en rows de la orden de compra para q se realice correctamente la validación
Si, por ejemplo, tienes 10 rows en solicitud de compra (c/u con valor de 10, con el total de 100), pero solo 9 pasaron a la orden de compra, entonces estarías comparando la solicitud de compra fue por 100, pero la orden de compra tiene un valor de 90. Pero los valores de los rows q comparas ahi son iguale (90)
HAVING (SUM(T0.Linetotal + isnull(T0.LineVat,0)) > SUM(T1.OpenSum)))
hola @tenguman gracias por tu comentario pero siguiendo con los números que indicas si la OC es por 90 y la SC por 100 sí permitiría la creación del documento ya que es menor al monto de SC o estoy mal?
“POR1 T0” es la tabla de rows de la OC, “PRQ1 T1” es la tabla de los rows de la solicitud de compra.
Cuando validas, para el caso compara: T0 > T1, osea 90 > 90.
Pero a ti que te interesa? Saber si el monto de la OC es mayor que el de la SC? xq con el INNER JOIN solo estas jalando los mismos rows de ambos.
Personalmente yo haría dos consultas: primero obtener la suma de las rows del la OC, luego la suma de las rows de la SC y luego recién haría la comparación.