Evitando a concorrência num programa ABAP
2012-07-30

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.
10 de Outubro de 2012 às 8:59
Simples mas útil! Obrigado! =)
29 de Outubro de 2012 às 19:17
Muito bom, mas e se eu quiser saber qual o usuário que está rodando o programa?
30 de Outubro de 2012 às 11:17
Vinícius, aí acho que vais ter de procurar nas tabelas de bloqueio. Mas nunca fiz, não sei como é.
14 de Maio de 2013 às 13:00
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