"
Apoiado por

Evitando a concorrência num programa ABAP

Dizem que a concorrência no comércio é boa. Boa para os consumidores, isto é. Faz descer os preços e assim. Mas dentro dos computadores prejudica quem os consome.

Normalmente em ABAP combate-se a concorrência ao nível dos dados, bloqueando (euqueue) determinadas tabelas com base na sua chave. Mas por vezes pode ser necessário algo mais violento como garantir que um programa não pode correr mais do que uma vez ao mesmo tempo. Para fazer isso pode usar-se o objecto de bloqueio ESINDX.

Assim:


  DATA srtfd LIKE indx-srtfd.
  srtfd = sy-repid.
  DO.
    CALL FUNCTION 'ENQUEUE_ESINDX'
      EXPORTING
        mandt          = sy-mandt
        relid          = 'GN'
        srtfd          = srtfd
        srtf2          = 0
      EXCEPTIONS
        foreign_lock   = 1
        system_failure = 2
        OTHERS         = 3.
    IF sy-subrc = 0.
      EXIT.
    ELSE.
      WAIT UP TO 1 SECONDS.
    ENDIF.
  ENDDO.

Obrigado a pylbug pela foto.

O Abapinho saúda-vos.

4 comentários a “Evitando a concorrência num programa ABAP”

  1. Bruno Filipa Diz:

    Simples mas útil! Obrigado! =)

  2. Vinícius Mussato Diz:

    Muito bom, mas e se eu quiser saber qual o usuário que está rodando o programa?

  3. Nuno Godinho Diz:

    Vinícius, aí acho que vais ter de procurar nas tabelas de bloqueio. Mas nunca fiz, não sei como é.

  4. Pedro Melo Diz:

    Olá,

    Eu estou a usar essa função e acho perfeita.
    O utilizador que se encontra a correr o programa é devolvido na variável sy-msgv1.

    Podes completar com:

    if sy-subrc 0.
    clear msg.
    concatenate ‘A transação está em utilizadção pelo user’ sy-msgv1 ‘!’
    into msg separated by space.
    message msg type ‘S’ display like ‘E’.
    stop.
    endif.

    Pedro Melo

Deixe um comentário


Acerca do Abapinho
O Abapinho é suportado pelo WordPress
Artigos (RSS) e Comentários (RSS).