Autor Tema: Bloqueo sobre tablas  (Leído 21061 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado guillo

  • Novato
  • *
  • Mensajes: 1
    • Ver Perfil
Bloqueo sobre tablas
« 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,

Desconectado Carlos

  • Usuario Sr.
  • ****
  • Mensajes: 177
    • Ver Perfil
Re: Bloqueo sobre tablas
« Respuesta #1 en: 28 de Enero de 2008, 10:01:17 am »
Hola.

Te paso 2 ejemplos de perform de bloqueos.

Código: [Seleccionar]
*---------------------------------------------------------------------*
*       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.
Código: [Seleccionar]
CALL FUNCTION 'DEQUEUE_ALL'
  EXPORTING
    _synchron = 'X'.



CALL FUNCTION 'DEQUEUE_EMEKKOE'
  EXPORTING
    mandt = sy-mandt
    ebeln = l_pedido
    ebelp = l_posicion.

Un saludo.