Foro de programación ABAP
SAP / ABAP => Programación ABAP => Mensaje iniciado por: guillo en 25 de Enero de 2008, 04:57:38 pm
-
Hola a todos,
Tengo que hacer un bloqueo sobre una tabla, ya tengo creado el objeto de bloqueo,
y ya estoy invocando las funciones ENQUEUE y DEQUEUE. El problema es que no esta
funcionando el bloqueo, es decir, no lo ejecuta, no se si de pronto sea algo con los parámetros.
Que me puede estar haciendo falta por definir?
Me gustaria tener un ejemplo completo de como se utilizan esas 2 funciones
Saludos,
-
Hola.
Te paso 2 ejemplos de perform de bloqueos.
*---------------------------------------------------------------------*
* FORM bloquear_objetos *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> P_LIT_ITEM *
* --> P_RC *
*---------------------------------------------------------------------*
FORM bloquear_objetos TABLES
p_lit_item STRUCTURE bapi2017_gm_item_create
CHANGING p_rc LIKE sy-subrc.
* bloquear material-centro + pedido + lote
p_rc = 4. " inicializar flag de retorno
* bloquear material-centro
DATA :
matnr TYPE marc-matnr, " material
werks TYPE marc-werks, " centro
ebeln TYPE ekko-ebeln, " pedido de compras
charg TYPE mcha-charg, " lote
aux_usr LIKE sy-uname " usuario
.
LOOP AT p_lit_item.
* bloquear material-centro
matnr = p_lit_item-material. " material
werks = p_lit_item-plant. " centro
CALL FUNCTION 'ENQUEUE_EMMARCE'
EXPORTING
* MODE_MARC = 'E'
* MANDT = SY-MANDT
matnr = matnr
werks = werks
* X_MATNR = ' '
* X_WERKS = ' '
* _SCOPE = '2'
* _WAIT = ' '
* _COLLECT = ' '
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
p_rc = sy-subrc.
IF p_rc <> 0.
* msg error -> material bloqueado para centro en tratamiento
CLEAR aux_usr.
IF sy-subrc = 1. " error foreign lock
aux_usr = sy-msgv1. " usuario que bloquea el objeto
ENDIF.
* Material &1 en centro &2 bloqueado por usuario &3.
MESSAGE s103(zsrf) WITH matnr werks aux_usr.
LEAVE TO TRANSACTION 'ZLM20'. " inicilizar t
ENDIF. " if p_rc <> 0.
CHECK p_rc = 0.
* bloquear lote por centro
charg = p_lit_item-batch. " lote
CHECK NOT charg IS INITIAL.
CALL FUNCTION 'ENQUEUE_EMMCHA'
EXPORTING
* MODE_MCHA = 'E'
* MANDT = SY-MANDT
matnr = matnr
werks = werks
charg = charg
* X_MATNR = ' '
* X_WERKS = ' '
* X_CHARG = ' '
* _SCOPE = '2'
* _WAIT = ' '
* _COLLECT = ' '
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
p_rc = sy-subrc.
IF p_rc <> 0.
* msg error -> objeto bloqueado para centro en tratamiento
CLEAR aux_usr.
IF sy-subrc = 1. " error foreign lock
aux_usr = sy-msgv1. " usuario que bloquea el objeto
ENDIF.
* Lote &1 en centro &2 bloqueado por usuario &3.
MESSAGE s108(zsrf) WITH charg werks aux_usr.
LEAVE TO TRANSACTION 'ZLM20'. " inicilizar t
ENDIF. " if p_rc <> 0.
CHECK p_rc = 0.
ENDLOOP.
IF sy-tcode = 'ZLM20'.
* bloqueo de material-centro ok
* bloqueo de lote-centro ok
* bloquear pedido
ebeln = zsrf0003-ebeln. " n. pedido
CALL FUNCTION 'ENQUEUE_EMEKKOE'
EXPORTING
* MODE_EKKO = 'E'
* MODE_EKPO = 'E'
* MANDT = SY-MANDT
ebeln = ebeln " pedido de compras
* EBELP =
* X_EBELN = ' '
* X_EBELP = ' '
* _SCOPE = '2'
* _WAIT = ' '
* _COLLECT = ' '
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
p_rc = sy-subrc.
IF p_rc <> 0.
* msg error -> objeto bloqueado para centro en tratamiento
CLEAR aux_usr.
IF sy-subrc = 1. " error foreign lock
aux_usr = sy-msgv1. " usuario que bloquea el objeto
ENDIF.
* Pedido &1 bloqueado por usuario &2.
MESSAGE s106(zsrf) WITH ebeln aux_usr.
LEAVE TO TRANSACTION 'ZLM20'. " inicilizar tx.
ENDIF.
ENDIF.
ENDFORM. "bloquear_objetos
*&---------------------------------------------------------------------*
*& Form bloquear_objetos_2
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_MATNR text
* -->P_WERKS text
* -->P_BATCH text
* -->P_EBELN text
* -->P_RC text
*----------------------------------------------------------------------*
FORM bloquear_objetos_2 USING
p_matnr LIKE mara-matnr " material
p_werks LIKE marc-werks " centro
p_batch LIKE mcha-charg " lote
p_ebeln LIKE ekko-ebeln " n. pedido compras
CHANGING p_rc LIKE sy-subrc.
* bloquear material-centro + pedido + lote
p_rc = 4. " inicializar flag de retorno
* bloquear material-centro
DATA :
matnr TYPE marc-matnr, " material
werks TYPE marc-werks, " centro
ebeln TYPE ekko-ebeln, " pedido de compras
charg TYPE mcha-charg, " lote
aux_usr LIKE sy-uname " usuario
.
* bloquear material-centro
matnr = p_matnr. " material
werks = p_werks. " centro
CALL FUNCTION 'ENQUEUE_EMMARCE'
EXPORTING
* MODE_MARC = 'E'
* MANDT = SY-MANDT
matnr = matnr
werks = werks
* X_MATNR = ' '
* X_WERKS = ' '
* _SCOPE = '2'
* _WAIT = ' '
* _COLLECT = ' '
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
p_rc = sy-subrc.
IF p_rc <> 0.
* msg error -> material bloqueado para centro en tratamiento
CLEAR aux_usr.
IF sy-subrc = 1. " error foreign lock
aux_usr = sy-msgv1. " usuario que bloquea el objeto
ENDIF.
* Material &1 en centro &2 bloqueado por usuario &3.
MESSAGE s103(zsrf) WITH matnr werks aux_usr.
LEAVE TO TRANSACTION 'ZLM20'. " inicilizar t
ENDIF. " if p_rc <> 0.
CHECK p_rc = 0.
* bloquear lote por centro
charg = p_batch. " lote
IF NOT charg IS INITIAL.
CALL FUNCTION 'ENQUEUE_EMMCHA'
EXPORTING
* MODE_MCHA = 'E'
* MANDT = SY-MANDT
matnr = matnr
werks = werks
charg = charg
* X_MATNR = ' '
* X_WERKS = ' '
* X_CHARG = ' '
* _SCOPE = '2'
* _WAIT = ' '
* _COLLECT = ' '
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
p_rc = sy-subrc.
IF p_rc <> 0.
* msg error -> objeto bloqueado para centro en tratamiento
CLEAR aux_usr.
IF sy-subrc = 1. " error foreign lock
aux_usr = sy-msgv1. " usuario que bloquea el objeto
ENDIF.
* Lote &1 en centro &2 bloqueado por usuario &3.
MESSAGE s108(zsrf) WITH charg werks aux_usr.
LEAVE TO TRANSACTION 'ZLM20'. " inicilizar t
ENDIF. " if p_rc <> 0.
ENDIF. " if NOT charg IS INITIAL.
CHECK p_rc = 0.
* bloqueo de material-centro ok
* bloqueo de lote-centro ok
* bloquear pedido
ebeln = p_ebeln. " n. pedido
CALL FUNCTION 'ENQUEUE_EMEKKOE'
EXPORTING
* MODE_EKKO = 'E'
* MODE_EKPO = 'E'
* MANDT = SY-MANDT
ebeln = ebeln " pedido de compras
* EBELP =
* X_EBELN = ' '
* X_EBELP = ' '
* _SCOPE = '2'
* _WAIT = ' '
* _COLLECT = ' '
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
p_rc = sy-subrc.
IF p_rc <> 0.
* msg error -> objeto bloqueado para centro en tratamiento
CLEAR aux_usr.
IF sy-subrc = 1. " error foreign lock
aux_usr = sy-msgv1. " usuario que bloquea el objeto
ENDIF.
* Pedido &1 bloqueado por usuario &2.
MESSAGE s106(zsrf) WITH ebeln aux_usr.
LEAVE TO TRANSACTION 'ZLM20'. " inicilizar tx.
ENDIF.
ENDFORM. "bloquear_objetos_2
Y un par de ejemplos para desbloquear.
CALL FUNCTION 'DEQUEUE_ALL'
EXPORTING
_synchron = 'X'.
CALL FUNCTION 'DEQUEUE_EMEKKOE'
EXPORTING
mandt = sy-mandt
ebeln = l_pedido
ebelp = l_posicion.
Un saludo.