cancel
Showing results for 
Search instead for 
Did you mean: 

Evitar ordenes de venta por debajo del inventario

marco_ramirez
Active Contributor
0 Kudos

Estimados todos:

De que manera puedo evitar que se creen ordenes de venta cuando el Stock = Comprometido esto para evitar que Disponible sea un número negativo?

Gracias por su ayuda

Saludos

Marco

Accepted Solutions (1)

Accepted Solutions (1)

Former Member

Hola,

Lo que yo haria es pasarlo por flujo de aprobación. asi el documento de venta no se crearia, sino que quedaria en borrador hasta que este sea aprobado.

tienes que pensar que las empresas lo que buscan es vender y SB1 hace que esto sea posible, por tanto no comprueba el stock disponible, sino el stock real.

Para el procedimiento de aprobación, debes generar una consulta que verifique la condición respecto del disponible.

slds.

marco_ramirez
Active Contributor
0 Kudos

Gracias Rulius

he creado esta consulta en el TN pero me genera el error 512 (Mensaje 131-183)

es seguro que tengo algo mal, sin embargo, no se que es, puede alguie apoyarme con esto? gracias a todos

IF (@object_type = '17') and (@transaction_type='A' or @transaction_type='U')

begin

declare @codeart as nvarchar (20)

declare @Existe as nvarchar (3)

declare @compromete nvarchar (3)

set @codeart = (select T0.ItemCode from OITM T0 where T0.ItemCode = @list_of_cols_val_tab_del)

set @Existe = (select T0.OnHand from OITM T0)

set @compromete = (Select T0.IsCommited from OITM T0)

IF

@Existe = @compromete

begin

SET @error = 1

SET @error_message = 'El comprometido supera las existencias'

end

end

former_member210784
Active Contributor
0 Kudos

Hola.

Intenta agregando la misma clausula Where que está en el SET @CODEART a los otros dos Set. para devolver sólo el dato de un registro. Así como lo tiene traería todos los registros de OITM para intentar almacenarlos en una variable que sólo puede almacenar el dato de un sólo registro.


set @codeart = (select T0.ItemCode from OITM T0 where T0.ItemCode = @list_of_cols_val_tab_del)
set @Existe = (select T0.OnHand from OITM T0 where T0.ItemCode = @list_of_cols_val_tab_del)
set @compromete = (Select T0.IsCommited from OITM T0 where T0.ItemCode = @list_of_cols_val_tab_del)

Nos cuenta cómo le va.

Saludos.

marco_ramirez
Active Contributor
0 Kudos

Hector

Gracias por el aporte, he hecho el ajuste al código pero ahora se graba la orden de venta sin hacer ninguna validación

ha quedado como si no existiera esa consulta en el TN.

Saludos

former_member210784
Active Contributor
0 Kudos

Hola.

Intentar ajustando la comparación que tiene (entre el stock actual contra lo comprometido: OnHand = IsCommited), tomando la cantidad que está en el documento. De esta manera se suma a lo comprometido la cantidad que figura en la orden de venta, si la suma de las dos cantidades supera el stock actual, dispararía la alarma.

Esto es, mientras no se haya creado/actualizado el documento tampoco se habrá actualizado la cantidad comprometida de los artículos.

Por otra parte las variables OnHand e IsCommited ¿no deberían ser numéricas y no caracter?.

Nos cuenta cómo le va.

Saludos.

marco_ramirez
Active Contributor
0 Kudos

Gracias Hector

De hecho la comparación que tu me dices de la cantidad que tiene el documento no es la que le asigno con los set @Existe y Set @compromete?

Esta es la última consulta que he probado pero no valida nada. que estárè haciendo mal?

IF (@object_type = '17') and (@transaction_type='A' or @transaction_type='U')

begin

declare @codeart as nvarchar (20)

declare @Existe as int

declare @compromete int

set @codeart = (select T0.ItemCode from OITM T0 where T0.ItemCode = @list_of_cols_val_tab_del)

set @Existe = (select T0.OnHand from OITM T0 where T0.OnHand = @list_of_cols_val_tab_del)

set @compromete = (Select T0.IsCommited from OITM T0 where T0.IsCommited = @list_of_cols_val_tab_del)

IF

@Existe = @compromete

begin

SET @error = 1

SET @error_message = 'El comprometido supera las existencias'

end

end

former_member210784
Active Contributor
0 Kudos

Hola.

Intenta con este código:


IF (@object_type = '17') and (@transaction_type='A' or @transaction_type='U')
begin
  declare @codeart as nvarchar (20)
  declare @Existe as int
  declare @compromete int
  set @codeart = (select T0.ItemCode from OITM T0 where T0.ItemCode = @list_of_cols_val_tab_del)
  set @Existe = (select T0.OnHand from OITM T0 where T0.OnHand = @list_of_cols_val_tab_del)
  set @compromete = (Select T0.IsCommited from OITM T0 where T0.IsCommited = @list_of_cols_val_tab_del)
  IF @Existe < @compromete
  begin
    SET @error = 1
    SET @error_message = 'El comprometido supera las existencias'
  end
end

Si además se desea tener en cuenta la cantidad en el documento, se debe sumar esa cantidad a lo comprmetido.

Saludos.

marco_ramirez
Active Contributor
0 Kudos

Gracias Hector

He intentado con todas las posibles combinaciones entre @Existe y @Compromete (= < >...) pero no ha sido posible que valide.

Ahora bien, la cantidad del documento no la quiero tomar en cuenta o sumar a este proceso ya que si la existencia y comprometido son iguales al momento de crear el documento debería activarse la validación.

De momento sigo haciendo pruebas pero si resolverlo.

Saludos

former_member210784
Active Contributor
0 Kudos

Hola.

Intenta algo diferente:


IF (@transaction_type IN (N'A',N'U') AND (@object_type = N'17'))
BEGIN
	IF EXISTS (
		SELECT T1.ItemCode, T2.OnHand, T2.IsCommited
		FROM RDR1 T1 
			INNER JOIN ORDR T0 ON T0.DocEntry = T1.DocEntry 
			INNER JOIN OITM T2 ON T1.ItemCode = T2.ItemCode
		WHERE T0.docentry = @list_of_cols_val_tab_del
			AND T2.OnHand < T2.IsCommited
	)
	BEGIN
		SELECT @error = 1, @error_message = 'La cantidad comprometida supera las existencias'
	END
END

(Faltaba un paréntesis, pero ya lo agregue en este código, jeje). He probado el código y funciona OK.

Tengo una inquietud: cuando los usuarios colocan en la Orden de Venta una cantidad superior al stock actual, ¿no aparece un mensaje de advertencia de esto?.

Nos cuenta cómo le va.

Saludos.

Edited by: Hector Daniel Hernandez on May 10, 2010 11:56 AM

marco_ramirez
Active Contributor
0 Kudos

Nada Hector

hice algunas modificaciones al código y sigue igual, sin validad

IF (@transaction_type IN ('A','U') AND @object_type = '17')

BEGIN

IF EXISTS (

SELECT T1.ItemCode, T2.OnHand, T2.IsCommited

FROM RDR1 T1

INNER JOIN ORDR T0 ON T0.DocEntry = T1.DocEntry

INNER JOIN OITM T2 ON T1.ItemCode = T2.ItemCode

WHERE T0.docentry = @list_of_cols_val_tab_del

AND T2.OnHand = T2.IsCommited

)

BEGIN

SELECT @error = 1, @error_message = 'La cantidad comprometida supera las existencias'

END

END

former_member210784
Active Contributor
0 Kudos

Hola.

Hice cambios a mi última respuesta que no viste. Probé el código y funciona OK en el TransactionNotification.

Copia y pega todo el código de mi última respuesta tal como está. Debe funcionar.

Este código se activará después que aparezca el aviso de confirmación al colocarse una cantidad superior al stock actual, si se intenta crear la Orden de Venta aparecerá el mensaje de error.

Saludos.

marco_ramirez
Active Contributor
0 Kudos

Hector

Lo del parentesis lo note y lo he agregado, sin embargo, la OV sigue sin ningún problema es decir pasa sin validar

Tengo el siguiente escenario, para ampliar algo más

del código XXX-YYY tengo en Stock = 2 Comprometido = 2 Disponible = 0

Hice una orden de venta por la cantidad de 1 y me aparece el aviso que no hay disponibles y que se está pidiendo 1 unidad.

(es el formulario que preguntas si sale, con lo que respondo a tu duda)

Le doy clic en crear y se crea sin problemas quedandome entonces los siguientes datos

código XXX-YYY tengo en Stock = 2 Comprometido = 3 Disponible = -1

hice un documento por 5 unidades y tambien se grabo sin validar, en este caso

código XXX-YYY tengo en Stock = 2 Comprometido = 7 Disponible = -5

Copie y pegue tal cual el código y nada

former_member210784
Active Contributor
0 Kudos

Hola.

Quisiera colocar las siguientes recomendaciones:

1. Asegúrate que estás colocando el código en el objeto "SBO_SP_TransactionNotification". debajo del la última línea de código de otra validación que pueda haber en el transaction, y arriba de la parte final del transaction donde está lo siguiente:


-- Select the return values
select @error, @error_message
end

Mira el siguiente ejemplo: .

2. La comparación en tu caso sería Onhand <= isCommited para que no deje crear la OV si la cantidad comprometida es igual o si supera al stock actual.

3. Cerrar todas las ventanas de Orden de Venta y abrir una nueva OV para probar la validación.

Asegúate de lo anteror para que funcione bien la validación.

Nos cuenta cóm le va.

Saludos.

marco_ramirez
Active Contributor
0 Kudos

Hector

Gracias por tu ayuda y paciencia, has sido de gran ayuda

el tema de las últimas líneas

-- Select the return values

select @error, @error_message

end

era el error que no me permitia que funcionara la validación, por causas extrañas encontre estas líneas perdidas entre otro código, al ponerlas al final del TN ha funcionado perfectamente.

De nuevo gracias

Answers (0)