La presente, tal como lo indica el titulo, necesito limitar el acceso a un desarrollo que realizamos en casa para que no pueda editar (en este caso unas notas de entrega) mas de un usuario a la vez. El tema es que desarrollamos un sistema para embalaje de mercancía, pero no queremos que mas de un usuario trate el mismo embalaje. Tal como es SAP, asumimos que debe haber una babi o algún método estándar que pueda consumir para evitar dicha concurrencia.
Esto lo puedes lograr con objetos de bloqueo… Te creas tus objetos de bloqueo por la SE11, y lo aplicas en tu programa de la manera que necesites aplicar el bloqueo, y con esto garantizas que solo un usuario a la vez puede realizar dicho proceso.
Definicion de objeto de bloqueo
Nombre de un objeto de bloqueoUn objeto de bloqueo es una unión virtual de varias tablas SAP que sincroniza el acceso simultáneo de dos usuarios al mismo set de datos ( Concepto de bloqueo SAP).La solicitud y/o la liberación de los bloqueos se realiza en la programación de las transacciones de diálogo mediante la llamada de determinados módulos de funciones que se generan automáticamente de la definición de los objetos de bloqueo. Estos objetos deben crearse explícitamente en el Dictionary ABAP.Para fijar bloqueos debe seguir los siguientes pasos:1. Debe definir un objeto de bloqueo en el Dictionary ABAP cuyo nombre debería empezar con E.2. Debe incluir los módulos de funciones para la solicitud y/o liberación de bloqueos en la programación de las transacciones de diálogo correspondientes. Los módulos se crearán automáticamente al activar el objeto de bloqueo.
No @canuto me confundiste, la consulta esta un poco confusa sobre que es lo que persigue, pero segun entendi quiere evitar que varios usarios al mismo tiempo realicen dicha funcion. Lo de editar el reporte no me parece factible ya que los usuarios no tienen acceso al modo abap.
correcto. Lo que quiero es, tal como lo hace estandar SAP cuando entras a la VL02N o MM02 e intentas editar un registro “tomado” por otra persona. Ejemplo:
Si @canuto esta en la VL02N editando la Nota de Entrega 50000214 yo por la VL02N no puedo editar esa Nota. Puedo hacerlo con otra nota de entrega pero eso no, hasta que tu la “sueltes”
ummmm, entonces entendi mal yo jejejejeje !!! a listo, entonces prueba como dice @smota, a ver…yo he trabajado con objetos de autorizacion pero siempre me los pasa el basis o la otra es tratar de debugear esas tx a ver si no es tan complicado y haces algo parecido al estandar…pero debugear un estandar, es lo mas fastidioso del mundo !!! Disculpen si los confundi
We can lock the table before updating the entries. Two types of locks are there.
To lock the entire table. Here when the table is locked by one program, another program will not be able to modify it.
To lock the particular record only. Here when the record is locked by one program, the other program can modify records other than the one locked.
For option 1
Use the FM ENQUEUE_E_TABLEE to lock the table and FM DEQUEUE_E_TABLEE to unlock table.
For option 2
Go to SE11. There enter the name of your lock object and create it. Next screen you have to mention which field you want to lock.
For more info. on LOCK OBJECTS go to h_tp://help.sap.com/saphelp_nw2004s/helpdata/en/cf/21eea5446011d189700000e8322d00/content.htm
a bueno en HR hay un objeto estandar que bloquea a los trabajadores para que varios usuario no trabajen con el mismo empleado a la vez…habria que saber si aplica algo parecido !!!
Con la funcion ENQUEUE_E_TABLEE y DEQUEUE_E_TABLEE se logra este comportamiento. Solo debe crear el objeto por la se11 y usarlo con estas dos funciones, hay otras funciones con comportamiento parecidos.
Correctamente, lo que estamos buscando fue lo que comentó @smota. Ya la bloquea perfectamente, pero ahora el tema es desbloquearla. Solo lo hace cuando se sale completamente del programa Z al menú de SAP. No cuando salgo del tratamiento. El codigo que estamos usando es el siguiente
El bloqueo se hace con enqeue y el desbloqueo con deqeue, se supone que funciona asi, yo he usado este sistema pero a sinceridad no recuerdo si debia hacer algo mas, como un commit o algo por el estilo.
Puedes consultar la t-code de objetos bloqueados sm12 cuando lo bloquees ve a esta t-code, y luego cuando pases el desbloqueo, verifica si el objeto sale de aqui.
Listo. Trabajo realizado. Gracias a todos… @SidV y @smota ,era precisamente lo que estaba buscando.
Para el bloqueo se uso:
CALL FUNCTION 'ENQUEUE_EVVBLKE'
EXPORTING
mode_likp = 'E' " Bloqueo de escritura, es el que tiene
mandt = sy-mandt
vbeln = W_NE
_SCOPE = '1' " Te lo pone por defecto.
EXCEPTIONS " Controlaría las posibles excepciones
FOREIGN_LOCK = 1
SYSTEM_FAILURE = 2
OTHERS = 3. `
para quitarlo:
CALL FUNCTION 'DEQUEUE_ALL' "Release Locks of an LUW
COMMIT WORK `.
Problema resuelto.! Si ven algo que pueda mejorar, bienvenido…