Sperreintrag prüfen

Getting started ... Alles für einen gelungenen Start.
4 Beiträge • Seite 1 von 1
4 Beiträge Seite 1 von 1

Sperreintrag prüfen

Beitrag von Frank Schmitt (ForumUser / 10 / 12 / 0 ) »
Guten Tag werte Community,
als blutiger ABAP-Anfänger stehe ich derzeit vor eine Anforderung, die mich relativ ratlos zurücklässt. Ich soll einen Funktionsbaustein entwickeln (ZAL_ARCHIVER), mit dem extern angelieferte Dokumente archiviert werden.
Damit dieser FuBau nicht doppelt aufgerufen werden kann soll ich folgenden Fall abfangen:

In einer Tabelle ZAL_LOCK soll überprüft werden, ob im Feld CALL_PROGRAM (aufrufendes Programm) ein Eintrag ZAL_ARCHIVER vorhanden ist.
Wenn ja, soll ich überprüfen, ob das Feld MAILSENT (CHAR 1) den Wert 'X' hat.
->Wenn ja, soll der FuBau beendet werden.
->Wenn nein, soll der Wert 'X' gesetzt werden
Wenn nein, soll die Sperre gesetzt werden durch folgende Einträge in der Tabelle ZAL_LOCK (Felder: MANDANT, CALL_PROGRAM, SAP_USER, LOCKDATE, LOCKTIME, MAILSENT)

CALL_PROGRAM = ZAL_ARCHIVER
SAP_USER = sy-UNAME
LOCKDATE = sy-DATLO
LOCKTIME = sy-TIMLO
MAILSENT = leer

Derzeit stehe ich wie gesagt ratlos da. Deshalb wäre ich für jede Hilfe oder jedes Stückchen Code sehr, sehr dankbar.
Sollte ich das falsch formuliert haben, oder elementare Infos vergessen haben, verzeiht bitte, ich liefere gerne alle Infos!

Vielen herzlichen Dank vorab,
Frank

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Sperreintrag prüfen

Beitrag von A6272 (Specialist / 238 / 8 / 36 ) »
Hallo,

ich frage mich ob die Anforderung so sinnvoll ist.
Funktionsbaustein (ZAL_ARCHIVER) soll abbrechen wenn schon ein anderer Task läuft, der den selben Funktionsbaustein nutzt?

Variante 1: So wie gefordert, würde ich aber so nicht umsetzen lassen.
Select auf ZAL_LOCK für CALL_PROGRAM = ZAL_ARCHIVER into ls_ZAL_LOCK
Dann hast Du den Eintrag aus ZAL_LOCK .
Wenn ls_ZAL_LOCK-Mail = "X" dann beende Funktionsbaustein (Ausnahme, Fehlermeldung,...)
ansonsten Bau den Eintrag zusammen und modifiziere die Tabelle ZAL_LOCK (vorher Sperreintrag setzen und nachher wieder entsperren)
Commit Work nicht vergessen, damit der andere Aufruf den Eintrag sieht.

am Ende des Funktionsbausteins nochmal die Tabelle ZAL_LOCK für Mail = "" updaten.

Der Haken daran: Wenn Funktionsbaustein (ZAL_ARCHIVER) abbricht, dann bleibt ZAL_LOCK-Mail = "X" stehen und kein nachfolgender Prozess tut noch irgendwas, bis jemand das X von der Datenbank kratzt.

Variante 2: Entsprechenden Sperreintrag auf Tabelle ZAL_LOCK setzen und da den RC abfragen. Wenn schon gesperrt, dann Funktionsbaustein abbrechen ansonsten erst am Ende des Funktionsbausteins die Sperre wieder aufheben. Wenn Funktionsbaustein (ZAL_ARCHIVER) abbricht, dann wird auch die Sperre entfernt.



Als Berater liefere ich keinen Code.

Folgende Benutzer bedankten sich beim Autor A6272 für den Beitrag (Insgesamt 2):
ewxFrank Schmitt


Re: Sperreintrag prüfen

Beitrag von ewx (Top Expert / 4854 / 313 / 644 ) »
A6272 hat geschrieben:
11.10.2022 14:32
Variante 2: Entsprechenden Sperreintrag auf Tabelle ZAL_LOCK setzen und da den RC abfragen. Wenn schon gesperrt, dann Funktionsbaustein abbrechen ansonsten erst am Ende des Funktionsbausteins die Sperre wieder aufheben. Wenn Funktionsbaustein (ZAL_ARCHIVER) abbricht, dann wird auch die Sperre entfernt.
Auf jeden Fall, Variante 2!! Sperreinträge über eine Datenbanktabelle macht man gar nicht!
also entweder ein eigenes Sperrobjekt definieren oder einen generellen Sperrbaustein nutzen, wie z.B: ENQUEUE_E_TABLE. Als Tabelle kannst du einen beliebigen Namen verwenden, zum Beispiel den des Funktionsbausteins.

Ein weiterer Haken ist der Abbruch des Bausteins. In dem Fall hättest du manchmal nicht archivierte Objekte. Du solltest dich also darum kümmern, dass der Baustein entweder erneut startet oder einfach wartet. so in etwa:

Code: Alles auswählen.

data sperre type c length 1 value 'X'.

while sperre = 'X'.
  CALL FUNCTION 'ENQUEUE_E_TABLE'
    EXPORTING
      tabname = 'EINDEUTIGER_NAME'
      ...
    IF sy-subrc > 0.
    wait up to 1 seconds.
    else.
    sperre = space.
    endif.
endwhile.

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
Frank Schmitt


Re: Sperreintrag prüfen

Beitrag von a-dead-trousers (Top Expert / 4414 / 224 / 1186 ) »
@ewx
Dafür gibts eigentlich den Parameter _WAIT bei jedem ENQUEUE-Baustein.
Wem die im Systemprofil voreingestellte Wartezeit "zuwenig" ist, kann natürlich noch zusätzlich mit WAIT spielen. Nur würde ich hier aber auch nicht empfehlen bis zum St. Nimmerleinstag (Endlosschleife!) auf die Sperre zu warten. Irgendwann ist einfach mal gut und man muss abbrechen. Da hat sich die SAP mit dem Profilparameter schon was dabei gedacht.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag (Insgesamt 3):
ewxTronFrank Schmitt

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Seite 1 von 1

Vergleichbare Themen

2
Antw.
3617
Views
Sperreintrag _synchron löschen
von ewx » 08.04.2009 11:29 • Verfasst in ABAP® Core
6
Antw.
3361
Views
Auf Mehrfachselektion prüfen
von Fistandantilus » 23.07.2013 12:29 • Verfasst in ABAP® für Anfänger
0
Antw.
916
Views
VSNR prüfen
von uli_sc » 25.03.2010 14:46 • Verfasst in ABAP® Core
3
Antw.
3139
Views
Prüfen, ob in SAP GUI ausgeführt
von msfox » 28.08.2019 17:03 • Verfasst in Dialogprogrammierung
0
Antw.
1040
Views
Internetadresse prüfen
von Mr. ABAP » 30.05.2006 08:04 • Verfasst in ABAP® Core

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

SD_PRINT_TERMS_OF_PAYMENT
vor einer Woche von Manfred K. 1 / 2508
BUSOBJEKT zu CMIS PHIO ermitteln
vor 4 Wochen von snooga87 1 / 4328