Control de almacenes por usuario

Buenos tardes estimados.

Estoy realizando un desarrollo para poder bloquear los movimientos en los almacenes para cada usuario.

El primer paso fue crear dos tablas de usuario que luego relacione, una cabecera y un detalle.
En la cabecera cargo el usuario y en el detalle coloco los almacenes y un S/N para saber si tiene bloqueado el almacén o no.

image

El segundo paso fue crear una vista que me devuelva dos columnas, una con el usuario y otra con el codigo del almacen que tiene bloqueado, de esta manera puedo consultar alli los almacenes bloqueados para cada usuario.

CREATE VIEW "VBIT_BloqueoDeAlmacenes" AS
	SELECT "@BLOQ_ALM_CABECERA"."U_UsuarioSAP" as "Usuario", "@BLOQ_ALM_DETALLE"."U_AlmacenSAP" as "Almacen"
	FROM "@BLOQ_ALM_CABECERA" 
	INNER JOIN "@BLOQ_ALM_DETALLE" ON "@BLOQ_ALM_DETALLE"."Code"="@BLOQ_ALM_CABECERA"."Code"
	WHERE "@BLOQ_ALM_DETALLE"."U_TransferenciaStock"='N'
		OR "@BLOQ_ALM_DETALLE"."U_Entrada_Compra"='N'
		OR "@BLOQ_ALM_DETALLE"."U_Devolucion_Compra"='N'
		OR "@BLOQ_ALM_DETALLE"."U_FCNDNC_Compra"='N'
		OR "@BLOQ_ALM_DETALLE"."U_Entrega_Venta"='N'
		OR "@BLOQ_ALM_DETALLE"."U_Devolucion_Ventas"='N'
		OR "@BLOQ_ALM_DETALLE"."U_FCNDNC_Venta"='N'
		OR "@BLOQ_ALM_DETALLE"."U_EntradaMercancias"='N'
		OR "@BLOQ_ALM_DETALLE"."U_SalidaMercancias"='N'
		OR "@BLOQ_ALM_DETALLE"."U_EmisionProduccion"='N'
		OR "@BLOQ_ALM_DETALLE"."U_ReciboProduccion"='N'

Finalmente realice un control dentro del SBO_TransactionNotification que al momento de querer realizar una transacción con movimiento de stock controla que el almacén para ese usuario no este bloqueado.

---------------------------------------------------------------------------------------
-- Control de bloqueo de almacenes por usuario-- INICIO
---------------------------------------------------------------------------------------
---- Transferencia de stock
---------------------------------------------------------------------------------------
IF :object_type = '67' AND (:transaction_type = ('A') OR :transaction_type = ('U')) THEN
	SELECT (SELECT "UserSign" FROM OWTR WHERE "DocEntry"= :list_of_cols_val_tab_del) INTO Usuario FROM DUMMY;
	--SELECT (SELECT "FromWhsCod" FROM WTR1 WHERE "DocEntry"= :list_of_cols_val_tab_del) INTO AlmacenSalida FROM DUMMY;
	--SELECT (SELECT "WhsCode" FROM WTR1 WHERE "DocEntry"= :list_of_cols_val_tab_del) INTO AlmacenEntrada FROM DUMMY;
	Encontrado := 0;
	numLineas1 := 0;
	contador1 := 0;
	SELECT (SELECT (MAX(T0."LineNum")-1) FROM WTR1 T0 WHERE T0."DocEntry" = :list_of_cols_val_tab_del) INTO numLineas1 FROM DUMMY;
	WHILE contador1 < numLineas1 DO
		SELECT (SELECT "FromWhsCod" FROM WTR1 WHERE "LineNum"= :contador1 AND "DocEntry"= :list_of_cols_val_tab_del) INTO AlmacenSalida FROM DUMMY;
		--SELECT (SELECT "WhsCode" FROM WTR1 WHERE "LineNum"= :contador1 AND  "DocEntry"= :list_of_cols_val_tab_del) INTO AlmacenEntrada FROM DUMMY;
		SELECT (SELECT 1 FROM "VBIT_BloqueoDeAlmacenes" WHERE "Usuario" = :Usuario AND "Almacen" = :AlmacenSalida) INTO Encontrado FROM DUMMY;
		contador1 := contador1 + 1;
	END WHILE;
	-- comparo si el almacen de salida es igual a alguno de los almacenes que me trae la subconsulta 
	IF (:Encontrado = 1) THEN
		error := 117;
		error_message := N'Almacen bloqueado para el usuario que esta realizando la transaccion';
		select :error, :error_message FROM dummy;
		Return;
	END IF;
END IF;
---------------------------------------------------------------------------------------
-- Control de bloqueo de almacenes por usuario-- FIN
---------------------------------------------------------------------------------------

Actualmente me deja realizar la transferencia, cuando utilizo un almacén de los que están bloqueados.

Me podrían ayudar descifrar el error en el control, seguramente el inconveniente esta allí.

Por el momento solo desarrolle el control para las transferencias de stock y solo controle al almacén de salida… Seguramente una vez que logre hacer funcionar esto los demás sera cuestión de seguir la lógica.

Muchas gracias.

1 me gusta

Hola, ahora mismo no tengo acceso a una BBDD para probar, pero puedes intentar con algo como esto para activar el SP:

SELECT COUNT(*) INTO FOUND FROM VBIT_BloqueoDeAlmacenes T0, OWTR T1 INNER JOIN WTR1 T2 ON T1."DocEntry" = T2."DocEntry"
WHERE T0."U_UsuarioSAP" = T1."UserSign" AND T0."U_AlmacenSAP" = T2."WhsCode" AND T1."DocEntry" = :list_of_cols_val_tab_del;
IF FOUND > 0 THEN
  --error := 117;
  --error_message := ' ';
END IF;

Saludos.

1 me gusta

Creo que el problema ocurre con tu While, ya que estas recorriendo todas las lineas una por una, lo aconsejable sera colocar una sola consulta, que tome en cuenta todas las lineas que tengan un almacén bloqueado de ese usuario.

SELECT count(*) FROM WTR1 T0 
INNER JOIN OWTR T1 ON T1."DocEntry" = T0."DocEntry"
WHERE T0."DocEntry" = :list_of_cols_val_tab_del
and T0."FromWhsCod" in (SELECT 1 FROM "VBIT_BloqueoDeAlmacenes" WHERE "Usuario" = T1. "UserSign" AND "Almacen" = T0."FromWhsCod")

Algo asi.

Saludos,

1 me gusta

Muchas gracias por su ayuda, no me di cuenta que era mas fácil utilizar la función COUNT(*). Ya lo pude solucionar, solo me queda replicar la lógica para todas las transacciones que muevan stock y que tengo en la tabla de control.

Finalmente el código quedo así:

IF :object_type = '67' AND (:transaction_type = ('A') OR :transaction_type = ('U')) THEN
	SELECT (SELECT COUNT(*) FROM "VBIT_BloqueoDeAlmacenes" T0
		INNER JOIN OUSR T3 ON T3."USER_CODE" = T0."Usuario"
		INNER JOIN OWTR T1 ON T1."UserSign" = T3."USERID"
		INNER JOIN WTR1 T2 ON T1."DocEntry" = T2."DocEntry"
	WHERE T0."Almacen" = T2."FromWhsCod" 
		AND T1."DocEntry" = :list_of_cols_val_tab_del) INTO Encontrado FROM DUMMY;
	IF :Encontrado > 0 THEN
		error := 171717;
		error_message := N'Almacen bloqueado para el usuario que esta realizando la transaccion';
		select :error, :error_message FROM dummy;
		Return;
	END IF;
END IF;

Esto fue lo primero que pensé, pero HANA me dio error al querer utilizar una subconsulta en un procedimiento almacenado.

Mensaje de error:
Could not execute ‘ALTER PROCEDURE SBO_SP_TransactionNotification ( in object_type nvarchar(30), – SBO Object Type in …’

SAP DBTech JDBC: [7]: feature not supported: Sub-query is not supported in a nested procedure call: line 3229 col 5 (at pos 196924)

Traducción: “función no admitida: la subconsulta no se admite en una llamada a procedimiento anidado”