Buenos dias compañeros, no acostumbro a poner muchos POST aqui porque bueno no tengo casos puntuales, por eso es que pido ayuda aqui a expertos en la materia que me ayuden en algo. tengo un SP de esta forma:
-- IF @object_type in ('202') AND @transaction_type in ('A','U') BEGIN
-- IF (SELECT COUNT(*)
-- FROM OIGE T0 INNER JOIN IGE1 T1 ON T0.DocEntry = T1.DocEntry
-- WHERE (T1.[WhsCode] not in (select T2.[U_BODEGA]
-- from [dbo].[@KGP_USU_BOD] T2
-- where T0.[UserSign]=T2.[U_ID]))
-- AND T0.DocEntry=@list_of_cols_val_tab_del AND T0.[DocType]='I')>0 BEGIN
-- Set @error=10
-- Set @error_message= 'EL USUARIO NO TIENE AUTORIZACION PARA HACER MOVIMIENTOS EN ESTA BODEGA-1'
-- END
-- END
El caso puntual es que ahora mismo lo tengo comentado porque si le quito el comentario nadie puede hacer moviemientos en las bodegas, incluso a esos usuarios les ingreso en esa tabla la bodega en donde deben trabajar, me gustaria que algun experto me pueda decir que esta pasando porque si desbloqueo no deja trabajar asi sea que esten en la tabla los usuarios con las bodegas en donde deben trabajar. Se me paso TENGO SAP SQL OK
Estare agradecido a su gran ayuda.
Esta es la tabla que tengo
yo probaría la sentencia SQL con ejemplos para comprobar que devuelve los datos esperados. Yo buscaría varios documentos y sustituiría las variables por los valores del documento, y una vez hecho comprobaría si los resultados son correctos.
Te podría funcionar de esta forma, EL código está en Hana, es como creo que se podría realizar para que validara el usuario y almacén de tu tabla, espero te sea de ayuda.
IF @object_type in ('202') AND @transaction_type in ('A','U')
THEN
SELECT (
SELECT TOP 1 T1."ItemCode"
FROM OIGE T0
INNER JOIN IGE1 T1 ON T0.DocEntry = T1.DocEntry
INNER JOIN [dbo].[@KGP_USU_BOD] T2 ON T0."UserSign"=T2."U_ID"
WHERE
T2."[U_BODEGA]"=T1."WhsCode" AND T0."DocEntryW=@list_of_cols_val_tab_del AND T0.[DocType]='I'
)
INTO Usuario FROM dummy ;
IF :Usuario IS NOT NULL THEN
error := 440 ;
error_message :='Error (SP): EL USUARIO NO TIENE AUTORIZACION PARA HACER MOVIMIENTOS EN ESTA BODEGA-1';
end IF;
end IF;
No se si ya lo resolviste pero creo que asi funciona
Cualquier actualizacion que hagas no utiliza solo un objeto,
aunque paresca asi por que tienes un objeto pricnipal (la ventana
donde inicias el proceso que estes registrando).
Teniendo eso en cuenta y por la tabla que utilizas en el query, tu
necesitas validar en la emision de matreriales, eso es un objeto 60,
el objeto 202 es la orden de fabricacion
IF @object_type in ('60') AND @transaction_type in ('A')
BEGIN
DECLARE @UserId INTEGER = (SELECT UserSign FROM OIGE WHERE DocEntry = @list_of_cols_val_tab_del)/*Obtenemos el usuario que esta registrando la OF*/
IF (SELECT COALESCE((SELECT COUNT(*) FROM IGE1 T0 WHERE T0.DocEntry = @list_of_cols_val_tab_del),0))/*Obtenemos cuantas lineas tiene esa emision*/
<> (SELECT COALESCE((SELECT COUNT(*) /*y aqui esta el detalle, volvemos a revisar nuevamente cuantas lineas tiene la emision pero solo donde el usuario que lo crea si tiene permiso*/
FROM IGE1 T0 INNER JOIN [@KGP_USU_BOD] T1 ON T0.WhsCode = T1.U_Bodega
WHERE T0.DocEntry = @list_of_cols_val_tab_del AND T1.U_ID = @UserId
),0))
/*Si los numeros no coinciden salta el error por que quiere decir que al menos una linea no tiene permiso.
La funcion COALESCE en este caso me esta devolviendo 0 (cero) si alguno de los QUERY retorna NULL*/
BEGIN
Set @error=10
Set @error_message= 'EL USUARIO NO TIENE AUTORIZACION PARA HACER MOVIMIENTOS EN ESTA BODEGA-1'
END
END