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.