cancel
Showing results for 
Search instead for 
Did you mean: 

Bloqueo por Usuario de Cualquier Movimiento de Inventario para uno ó varios Almacenes

Former Member
0 Kudos

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.

Accepted Solutions (0)

Answers (1)

Answers (1)

bfierro
Active Participant
0 Kudos

Hola, efectivamente lo mejor es realizarlo mediante transaction, tienes algo modelado como para poder revisar y ayudarte. Slds

Former Member
0 Kudos

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.

bfierro
Active Participant
0 Kudos

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

bfierro
Active Participant
0 Kudos

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

Former Member
0 Kudos

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

bfierro
Active Participant
0 Kudos

Hola. puede ir en cualquier parte. lo que hace sap es recorrer el transaction y si encuentra una condición que se cumple, se detiene y envía el mensaje al usuario. por un tema de orden quizás debes dejarlo a continuación de los creados por el partners. Saludos.

Former Member
0 Kudos

Ok deja lo hago y te retroalimento en cuanto tenga algo.

gracias nuevamente

Former Member
0 Kudos

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

bfierro
Active Participant
0 Kudos

Objectype = '59' @transaction_type in ('A','U') -- ingreso y update respectivamente. slds

bfierro
Active Participant
0 Kudos

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

Former Member
0 Kudos

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

bfierro
Active Participant
0 Kudos

Hola, separalos por objeto. EL Objtype '59' es para entradas de mercancia tabla "OIGN". ejecuta lo siguente: select whscode, WhsName from owhs y subes la captura, otra cosa mas el valor a poner en el "usersing=" ocupa el campo internal_K o userid de la tabla ousr. Nos comentas.  slds

bfierro
Active Participant
0 Kudos

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.

Former Member
0 Kudos

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)  
                                                                                                                    
bfierro
Active Participant
0 Kudos

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

Former Member
0 Kudos

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

bfierro
Active Participant
0 Kudos

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

bfierro
Active Participant
0 Kudos

La verdad realizar un transaction no es complicado. Te sugiero subas la imagen del transaction ahora lo otro es que me contactes via skype y coordinamos forma de poder ayudarte via remota. Skype:bfierrob Saludos.,

Former Member
0 Kudos

aqui la imagen del transaction

e igual te marco por Skype