on 09-30-2016 4:16 PM
Buen dia.
Requiero bloquear la utilizacion de cualquier movimiento de Inventario para 1 ó varios almacenes para tambien 1 ó varios usuarios.
Es decir para el Usuario USR1 NO LE PERMITA REALIZAR NINGUN MOVIMIENTO PARA EL ALMACEN WH1 pero si para cualquier otro almacen de los que se tienen en la sociedad.
se que es directo en el transaction porque por configuracion y/o parametrizacion no es posible, a menos que me equivoque.
Alguien que pudiera auxiliarme?
les agradezco.
Hola, efectivamente lo mejor es realizarlo mediante transaction, tienes algo modelado como para poder revisar y ayudarte. Slds
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hola gracias.
No aun no, vi algún codigo pero creo que lo mejor seria cambiar la estrategia para SOLO PERMITIR A "X" Usuarios movimientos en ese almacen y asi creo seria mucho mejor.
El concepto seria:
SI usuario NOT IN ( Usr1, Usr2, Usr3, ...)
and wharehouse = '71'
then " No tienes autorizacion para este Almacen"
solo que no se cuales son las tablas respectivas para hacer el codigo en el sql.
Hola. primero que movimientos quieres bloquear. Entradas - salidas de mercancía desde el módulo inventario - desde producción?, en sap estos documentos se referencian con objetos, te dejo un ejemplo simple de un transaction para ordenes de venta para que puedas modificarlo. Usa el campo Usersing que almacena el codigo interno del usuario que esta creando x documento, ese es el campo que debes validar en tu transaction + el almacén a restringir. if @object_type='17' --Orden de Venta begin if @transaction_type ='A' Begin if exists (SELECT * FROM ORDR T0 INNER JOIN RDR1 T1 ON T0.DocEntry=T1.DocEntry where T1.WhsCode = 'XXX' --Almacen a restringir AND T0.UserSign in (19) -- dato sacado de la tabla ousr and T0.DocEntry = @list_of_cols_val_tab_del) begin select @error = 601 select @error_message = 'Usuario no autorizado a realizar movimientos desde almacen "XXX"' goto FinTN end end end Nota: para saber las tables que debes usar en el menu visulizar de sap le dack click en en información del sistema, luego te vas al documento ejemplo salida de mercancia te posiciones encima de un campo y en el angulo inferior izquierdo de da el nombre de la tabla. Saludos
Quedo un poco desordenado. Sorry.
if @object_type='17' --Orden de Venta
begin
if @transaction_type ='A'
Begin
if exists (SELECT * FROM ORDR T0 INNER JOIN RDR1 T1 ON T0.DocEntry=T1.DocEntry
where T1.WhsCode = 'XXX' --Almacen a restringir
AND T0.UserSign in (19) -- dato sacado de la tabla ousr
and T0.DocEntry = @list_of_cols_val_tab_del)
begin
select @error = 601
select @error_message = 'Usuario no autorizado a realizar movimientos desde almacen "XXX"'
goto FinTN
end
end
end
Gracias.
Serian todos los movimientos para ese almacen, lo cual seria mas simple, porque la idea es no permitir nada si no esta dentro de la lista de los usuarios permitidos.
Lo de la tablas por documento y usuarios si lo se, solo que pensé eran otras dentro del sistema ( es mi primera vez que cambiaria algo en el transaction )
ya habiendo hecho las pruebas respectivas, este codigo tiene que ir en alguna posicion especifica para que lo tome ó no importa? ( colocandolo a partir del area donde se indica que se puede colocar) porque tengo código que mi parthner colocó para hacer otras validaciones
el documento para los traspasos ( archivo OWTR ) que # es? y el tipo de transaccion sigue siendo "A" ?
porque si quiero dejarlo para cualquier documento deberia de desaparecer la linea del tipo de objeto pero en el select tambien no deberia hacerse referencia a ese archivo
si opto solo por bloquear la transferencia de stock solo cambio el # del tipo de transaccion
Revisa un poco el siguiente link, te ayudara a aclarar un par de dudas. http://scgintblog.blogspot.cl/2013/04/aprende-usar-el-transaction-notification_9.html Saludos
Asi quedo el código, sin embargo las pruebas hechas al momento no me esta mostrando la validacion, ya que el primer documento que me marco fue con tipo 67 , el cual se lo anexe al código y guarde el transaction.
mi usuario es el #60, el cual no esta dentro de la lista pero aun asi me ha permitido crear 2 documentos de traspaso, pense que era la validacion estuviera mal planteada pero no lo creo
ya revise el transaction y estuvo modificado antes de hacer una 2a. prueba.
Tambien realice ya sobre los registros creados actualizacion y tambien me lo permite
Una prueba mas fue ingresando con un usuario que en teoria si lo permita para ver si aparecia el error ( pensando que fuera inverso el problema) pero tambien lo acepto, lo cual es correcto.
revisando los 3 registros teoricamente el Transaction debio de aplicar en los 2 primeros casos ( objeto 67 y #usuario diferente a la lista de los permitidos
ojala puedas ayudarme que pudiera estar mal
aqui el codigo agregado al transaction
Gracias
if @object_type in ('59','67') --Traspaso Stock |
begin
if @transaction_type in ('A','U') |
Begin |
if exists (SELECT * FROM OWTR T0 INNER JOIN WTR1 T1 ON T0.DocEntry=T1.DocEntry | ||
where T1.WhsCode = '71' --Almacen a restringir | ||
AND T0.UserSign in (49,50,51,52,53,54,67,68,83,84,97) -- Usuarios Depto Calidad | ||
and T0.DocEntry = @list_of_cols_val_tab_del) | ||
begin | ||
select @error = 601 | ||
select @error_message = 'Usuario no autorizado a realizar movimientos Hacia/Desde almacen "71"' | ||
end |
end |
end
Roberto.
una forma que puedes usar para validar la query es ejecutar el select en una bd de prueba reemplanzando el @list_of_cols_val_tab_del por un docentry de un documento creado o que crees para prueba.
ejemplo: creas una transferencia en una bd de prueba para el alamacen y usuario que quieres restringir si tu query te trae el dato es por que esta correcto ya luego solo chequeas que el objtype este correcto--- ejemplo:
SELECT *
FROM OWTR T0 INNER JOIN WTR1 T1 ON T0.DocEntry=T1.DocEntry
where T1.WhsCode = '71' --Almacen a restringir
AND T0.UserSign in (49) -- Usuarios que creo el documento.
AND T0.DocEntry = 'DocEntry'
Saludos.
Boris.
Tenia un error en el comando ( lo tenia a la inversa), lo cambie lo checo via sql y si me lo reporta pero ya habia actualizado el Transaction y aun asi no me hace la validacion al hacer una nueva prueba.
como inicialmente lo hice con usuario que si permitia y lo hizo pense que estaba ok.
luego lo hice con usuario que no permitia ( ya el transaction estaba actualizado) y aun asi no me manda el mensaje de error de no permitir.
if exists (SELECT * FROM OWTR T0 INNER JOIN WTR1 T1 ON T0.DocEntry=T1.DocEntry | |
where ( T1.WhsCode = '71' or T1.fromWhsCod = '71') --Almacen a restringir | |
AND T0.UserSign NOT in (49,50,51,52,53,54,67,68,83,84,97) -- Usuarios Depto Calidad | |
and T0.DocEntry = @list_of_cols_val_tab_del) | |
Ejecuta en el transaction lo siguiente: y lo pruebas para transferencia de stock.
if @object_type = '67' --Traspaso Stock |
begin
if @transaction_type in ('A','U') |
Begin |
if exists (SELECT T0.DocEntry FROM OWTR T0 | ||||||||
INNER JOIN WTR1 T1 ON T0.DocEntry=T1.DocEntry | ||||||||
WHERE T1.WhsCode = '71' --Almacen a restringir | ||||||||
AND T0.UserSign in (49,50,51,52,53,54,67,68,83,84,97) -- Usuarios Depto Calidad | ||||||||
AND T0.DocEntry = @list_of_cols_val_tab_del | ||||||||
GROUP BY T0.DocEntry | ||||||||
HAVING COUNT(T0.DocEntry) > 0 | ||||||||
) | ||||||||
begin | ||||||||
select @error = 601 | ||||||||
select @error_message = 'Usuario no autorizado a realizar movimientos Hacia/Desde almacen "71"' | ||||||||
end | ||||||||
end |
end
Saludos
Buen dia.
Creo que no lo esta tomando el Transaction ( aunque ya lo he guardado con la ejecucion, cierro y lo vuelvo a abrir para verificar seaq el ultimo actualizado y si es)
Acabo de hacer 2 pruebas mas con un usuario que no esta en la lista y ademas de cambiar la sentencia del usuario y aun asi en ambas me lo permite ( no deberia de permitirlo en ninguna porque el usuario no esta en dicha lista)
Corri via SQL la sentencia solo colocando el 3 de registro y en donde deberia de mandar el mensaje de error ( transaction) en el SQL si me lo detecta.
Inclusive cambie en el SQL la instruccion y tambien donde no deberia de darme registro me indica que no lo encuentra ( cosa que esta bien )
Te anexo pantalla del Transaction, del registro y del SQL
Hola creo que nos estamos confundiendo.
Una cosa es Query manager y la otra es un transaction vía sql server, o te falto una imagen por subir.... un transaction para que valide el ingreso de los datos se realiza en sql server directamente en un procedimiento almacenado llamado SBO_SP_TransactionNotification.
Favor me aclaras si te falto una imagen por subir.
Te recomiendo que veas el siguiente enlace.
Hacer un campo de SAP Business One obligatorio por medio del SP Transaction Notification - YouTube
Nos comentas. saludos
User | Count |
---|---|
99 | |
11 | |
11 | |
6 | |
6 | |
4 | |
4 | |
3 | |
3 | |
3 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.