Programm RSNAST00 Nachrichtenversand

Aus SAP-Wiki
Wechseln zu: Navigation, Suche

Das Programm RSNAST00 stösst Nachrichten zur Nachrichtenverarbeitung an. Die relevanten Programm und Formulare werden aus dem Customizing der Nachrichtensteuerung der Tabelle TNAPR entnommen.

Die selektierten Nachrichten haben gewöhnlich den unverarbeiteten Status (NAST-VSTAT = 0).

Aufruf Programm

  • Meist wird das Programm RSNAST00 über die Nachrichtensteuerung aus dem Belegtransaktion aufgerufen.
  • Zur Massenverarbeitung von Nachrichtenbelegen kann ein Job mit dem Programm RSNAST00 aufgesetzt werden, z. B. ein Rechnungslauf, der am Abend eingeplant wird.
  • Das Programm RSNAST00 kann auch über die Transaktion /ISDFPS/CALLRSNAST00 aufgerufen werden.


In diesem Beispiel wird eine Nachricht aus der Transaktion VT03N (Transport anzeigen) ausgegeben.

Der Breakpoint wurde in die Form-Routine vom Druckprogramm Z_SHIPMENT_OUTPUT gesetzt, die aus dem Programm RSNAST00 aufgerufen wird.

Hier wurde die Nachrichtenausgabe im Preview/Bildschirmansicht aufgerufen.

RSNAST00 14.JPG


Nun wird die Nachrichtenausgabe im Beleg im Druck aufgerufen. Die Steps 8 und 9 unterscheiden sich. Letztlich wirkt sich dies auf die Fortschreibung des NAST-Datensatzes und des Application Logs aus. Hier beim Druck (Parameter US_SCREEN = space) erfolgt die Fortschreibung, während dies beim Preview (US_SCREEN = ‚X’) nicht der Fall ist.

RSNAST00 18.JPG

Selektionsbildschirm vom Programm RSNAST00

Die Nachrichtenausgabe kann auch direkt aus dem Report RSNAST00 aufgerufen werden.

RSNAST00 2.JPG

Bei nicht gesetztem "Send again" ist der selektierte Versandstatus NAST-VSTAT = 0. Ist "Send again" markiert, ist NAST-VSTAT = 1. Fehlerhafte Einträge (NAST-VSTAT = 2) können hier nicht selektiert werden. Diese können über das Programm RSNAST0F angezeigt und prozessiert werden.

Der Versandzeitpunkt (NAST-VSZTP) muss 1 oder 2 sein. Die Nachrichten müssen also zur Job-Verarbeitung vorgesehen sein.

  • 1 = Versenden durch periodisch eingeplanten Job
  • 2 = Versenden durch Job, mit zusätzlicher Zeitangabe
  • 3 = Versenden durch anwendungseigene Transaktion
  • 4 = sofort versenden (beim Sichern der Anwendung)

RSNAST00 15.JPG


Werden mehrere Belege/Objektkeys angegeben, läuft das Programm über die Select-Endselect-Schleife und schreibt alle gefunden NAST-Einträge in den Extract "STATUS" und loop anschließend über diesen Extract/Datensätze mit

loop.
 at status.
   ... "Lesen TNAPR
   ... "Druckprogramm aufrufen, in Form "PROGRAMM_AUFRUFEN"
endloop.

Die Steps 4 und 5 entsprechen hier den Steps 10 und 11 bei der Nachrichtenausgabe aus dem Einzelbeleg (Transaktion VT03N) (siehe oben).

RSNAST00 16.JPG

Verarbeitungsprotokoll

Nach dem Ausführen des Reports erfolgt im Optimalfall eine Meldung über die erfolgreiche Verarbeitung des einen Belegs.

RSNAST00 3.JPG


Ob die Nachricht noch nicht verarbeitet (NAST-VSTAT = 0), erfolgreich verarbeitet (NAST-VSTAT = 1) oder nicht erfolgreich verarbeitet (NAST-VSTAT = 2) ist, sieht man im Nachrichten-/Outputfenster der Belegtransaktion (in diesem Fall Transaktion VT03N).

Hier gibt es 2 fehlerhaft verarbeitete Nachrichten, 1 erfolgreich verarbeitete Nachricht und 1 noch nicht verarbeitete Nachricht der Nachrichtenart ZLFZ.

RSNAST00 19.JPG


Entscheidend für den Ampelstatus (NAST-VSTAT) ist im Druckprogramm die Änderung des Parameters RETURNCODE.

RSNAST00 20.JPG

Erfolgt eine reine Anzeige auf dem Bildschirm (US_SCREEN = 'X') dann gibt es keine Fortschreibung vom NAST-Datensatz und kein Application Log. Aber wenn US_SCREEN initial/space ist und wird dann der RETURNCODE im Druckprogramm auf 0 gesetzt, wird die Nachricht erfolgreich verarbeitet (grüne Ampel, NAST-VSTAT = 1). Wird der Returncode auf eine Zahl größer 0 gesetzt im Druckprogramm, wird die Nachricht als nicht erfolgreich verarbeitet gespeichert (rote Ampel, NAST-VSTAT = 2).


Welche Zeilen (Application Log) im "Processing Log" eines NAST-Nachrichtensatzes existieren, entscheiden die Aufrufe vom Funktionsbaustein NAST_PROTOCOL_UPDATE im Druckprogramm und im Programm RSNAST00.

Drückt man auf die Schaltfläche RSNAST00 22.JPG erscheint das Protokoll/Application Log zu einem NAST-Nachrichtensatz. Das ist besonders dann hilfreich, wenn der Nachrichtensatz auf einen Fehler gelaufen ist.

RSNAST00 21.JPG

Hier wurde im Druckprogramm z. B. der Protokolleintrag hinzugefügt mit dem Text FP_FUNCTION_MODULE_NAME: Form Z_SD_SHIPMENT_LAUFZETTEL doesn't exist., durch einen entsprechenden Aufruf vom Funktionsbaustein NAST_PROTOCOL_UPDATE.

 call function 'NAST_PROTOCOL_UPDATE'
   exporting
     msg_arbgb = ...  "E = Error (rote Ampel), W = Warnung (Gelb), S = Success (grüne Ampel)
     msg_nr    = ...
     msg_ty    = ...
     msg_v1    = ...
     msg_v2    = ...
   exceptions
     others    = 0.

Kapselung Programmaufruf RSNAST00 in einer globalen Methode

Es bietet sich an den Aufruf des Reports RSNAST00 in einer globalen Methode einer zentralen Formularklasse zu kapseln.

Hier wurde die Methode SUBMIT_RSNAST00 in einer globalen Klasse Z_CL_FORMULARE angelegt.

Nur der Objektschlüssel ist hier als Importrange anlegt. Alle anderen Importparameter können lediglich einen einzelnen Wert haben.

RSNAST00 24.JPG


RSNAST00 25.JPG

Fehlerverarbeitung mit dem Druckprogramm

  • Eine NAST-Nachricht/Formularausgabe wird häufig erfolgreich verarbeitet, aber manchmal auch nicht. Speziell der Fehlerfall-/Status muss korrekt festgestellt werden.
  • Wenn das Formular nur im Anzeigemodus aufgerufen wird, wird das Verarbeitungsprotokoll der Nachricht nicht aktualisiert. Dann sollten Messageboxen im Druckprogramm auftretende Fehler zeigen. Im Anzeigemodus wird dem Druckprogramm von der RSNAST ein Importparameter US_SCREEN mitgegeben, der beim Anzeigemodus mit "X" gefüllt ist.
  • Wird das Druckprogramm nicht lediglich in der Druckvorschau aufgerufen, kann das Application Log mit möglichst präzisen (Fehler-)Meldungen gefüllt werden.
  • Die Ursache von einer Fehlersituation, die eine Formularausgabe verhindert, kann im Druckprogramm oder im Formular liegen.
  • Im Fehlerfall (Nichtausgabe des Formulars) sollte die Nachricht als nicht erfolgreich verarbeitet angezeigt werden (rote Ampel). Mindestens der Verarbeitungsstatus (Feld NAST-VSTAT) muss korrekt fortgeschrieben werden: Erfolgreiche Verarbeitung (NAST-VSTAT = 1, grüne Ampel) oder nicht erfolgreiche Verarbeitung (NAST-VSTAT = 2; rote Ampel).

Form-Routinen RSNAST00

  • Der Verarbeitungsstatus der Nachricht (Feld NAST-VSTAT) wird im Programm RSNAST00 gesetzt. In der aufgerufenen Form-Routine im Druckprogramm wird ein Parameter ENT_RETCO gesetzt. Ist dieser Parameter 0, dann wird die Nachricht im Programm RSNAST00 mit dem Status "erfolgreich verarbeitet" (grüne Ampel) gespeichert. Ist dieser Parameter ungleich 0, dann wird die Nachricht im Programm RSNAST00 mit dem Status "nicht erfolgreich verarbeitet" (rote Ampel) gespeichert.
  • Sehr unschön ist, dass dieser Verarbeitungsparameter mit USING vom Programm RSNAST00 aufgerufen wird, obwohl der Parameter verändert werden kann. Daher hätte er eigentlich als CHANGING-Parameter übergeben werden sollen. Aber auch Parameter in USING können verändert werden.
  • Ist der Parameter <> 0, dann wird die Nachricht auf nicht erfolgreich verarbeitet (rote Ampel) gesetzt.
  • Ist der Parameter = 0, dann wird die Nachricht auf erfolgreich verarbeitet (grüne Ampel) gesetzt.
  • Das Druckprogramm wird zunächst mit dem Wert 999 für den Returnparameter aufgerufen. Bleibt der Parameter beim Wert 999, geht das Programm davon aus, dass die Verarbeitungsroutine im Druckprogramm nicht gefunden wurde und setzt ebenfalls die rote Ampel.
  • Im Druckprogramm wird der Returnparameter auf 0 gesetzt, wenn das Formular ohne Probleme ausgegeben werden konnte und eine Zahl größer 0, wenn eine Fehlersituation auftrat.

Form PROGRAMM_AUFRUFEN

Siehe auch Customizing der Nachrichtensteuerung der Tabelle TNAPR.

form programm_aufrufen using us_screen type c.
  ...
„Aufruf Formroutine <formname> in Programm <programmname>
„Es wird der Returncode RETURNCODE übergeben (und erwartet, dass der Returncode im Druckprogramm 0 oder <> 0 gesetzt wird
 perform (tnapr-ronam) in program (tnapr-pgnam)   "Aufruf Form-Routine in Druckprogramm
    using returncode  „Änderung Retcode im Druckprogramm auf 0 (Grüne Ampel) oder <> 0 (Rote A.)
          us_screen  „bei Preview = "X"
          if found.

   if returncode = 999. „Wenn Retcode 999 unverändert, dann auch (NAST-VSTAT = '2'; rote Ampel)
    "Die Verarbeitungsroutine & im Programm & existiert nicht
     syst-msgid = 'VN'.
     syst-msgno = 068. 
     syst-msgty = 'E'.
     syst-msgv1 = tnapr-ronam.
     syst-msgv2 = tnapr-pgnam.

     call function 'NAST_PROTOCOL_UPDATE'
       exporting
         msg_arbgb = syst-msgid
         msg_nr    = syst-msgno
         msg_ty    = syst-msgty
         msg_v1    = syst-msgv1
         msg_v2    = syst-msgv2
       exceptions
         others    = 0.

   endif.
   if returncode ne 0.
     exit.
   endif.

endform.

Form EINZELNACHRICHT_SCREEN

  • Der Returncode von der Form PROGRAMM_AUFRUFEN wird übergeben.
form einzelnachricht_screen using us_subrc like sy-subrc.

 perform tnapr_lesen  using nast-kschl
                            nast-nacha
                            nast-kappl.
 xscreen = 'X'.
 perform programm_aufrufen using xscreen.
 us_subrc = returncode.

endform.                    "EINZELNACHRICHT_SCREEN

RSNAST00 8.JPG


RSNAST00 9.JPG

Form EINZELNACHRICHT_DIALOG

RSNAST00 10.JPG

Form PROTOCOL_STORE

In der Form-Routine NAST_PROTOCOL_STORE sichert der Funktionsbaustein NAST_PROTOCOL_STORE das Verarbeitungsprotokoll und gibt eine Verarbeitungsnummer zurück (in diesem Fall 2822).

RSNAST00 11.JPG


Der Funktionsbaustein RV_MESSAGE_UPDATE_SINGLE sichert schließlich den NAST-Datensatz, der im Fehlerfall mit dem Verarbeitungsstatus NAST-VSTAT = 2 aktualisiert wird.

RSNAST00 12.JPG

Verarbeitungsroutine im Druckprogramm

  • cv_returncode = 0 -> Ampel wird auf erfolgreich verarbeitet gesetzt (grüne Ampel) (NAST-VSTAT = 1)
  • cv_returncode <> 0 -> Ampel wird auf nicht erfolgreich verarbeitet gesetzt (rote Ampel) (NAST-VSTAT = 2)
  • iv_screen -> wenn ‚X‘, dann Druckvorschau und keine Fortschreibung NAST und kein Application Log
FORM entry_neu USING cv_returncode type sysubrc
                     iv_screen     type c.

 PERFORM adobe_print_output USING    xdruvo
                                     iv_screen."xdruvo
                         CHANGING    cv_returncode

ENDFORM.                    " entry_neu

Protokolleintrag schreiben mit NAST_PROTOCOL_UPDATE

  • Wie oben beschrieben hilft eine Fehlerbeschreibung im Protokoll den Fehler zu finden und zu beheben.
  • Die Einträge in das Fehlerprotokoll werden durch den Funktionsbaustein NAST_PROTOCOL_UPDATE vorgenommen. Hier werden Meldungstexte gefüllt.
  • Wird das Formular nur im Anzeigemodus ausgegeben, wird kein Application Log fortgeschrieben. Dann werden auch die NAST-Protokollupdates über den Funktionsbaustein "NAST_PROTOCOL_UPDATE" verworfen. Es ist daher ok, wenn unabhängig vom Anzeige-/Verarbeitungsmodus im Druckprogramm bei entsprechenden Fehlern immer der Funktionsbaustein NAST_PROTOCOL_UPDATE ausgeführt wird. Aus Performancegründen ist es jedoch besser nur bei IV_SCREEN = space den Funktionsbaustein NAST_PROTOCOL_UPDATE aufzurufen.
  • Bei der Druckvorschau können Messageboxen mögliche Fehler ausgeben. Bei Druckvorschau = space (IV_SCREEN = space) und hier besonders bei einem Job zur Massennachrichtenverarbeitung, sollte darauf verzichtet werden Dialogmessages auszugeben, um das Jobprotokoll nicht zu überfrachten.
if iv_screen = ‚X‘.
  message i531(0u) with ‚Fehler bei ...‘.

else. 
 CALL FUNCTION 'NAST_PROTOCOL_UPDATE'
   EXPORTING
     msg_arbgb =  ...   "Nachrichtenklasse
     msg_nr    = ...    "Nachrichtennummer
     msg_ty    = ...    "Fehlertyp
     msg_v1    = ...    "1. Variabler Text
     msg_v2    = ...    "2. Variabler Text
     msg_v3    = ...    "3. Variabler Text
     msg_v4    = ...    "4. Variabler Text
   EXCEPTIONS
     OTHERS    = 0.
endif.

Fehlerarten, die NAST-VSTAT = 2 setzen

  • Drucker LOCL beim PDF-Druck
  • Ein Textbaustein existiert nicht (in der Ausgabesprache) und Flag "Kein Fehler, wenn Text nicht vorhanden" ist nicht gesetzt
  • Formularname existiert nicht

Sperrverarbeitung im Programm RSNAST00

Die Sperren erfolgen bei einem Nachrichtensatz in Abhängigkeit von dessen Applikation.

 case nast-kappl.
   when 'V1'.                         "Auftrag
     belnr = nast-objky.
     call function 'ENQUEUE_EVVBAKE'
       exporting
         vbeln          = belnr
       exceptions
         foreign_lock   = 2
         system_failure = 3.
   when 'V2' or 'E1'.                 "Lieferung
     belnr = nast-objky.
     call function 'ENQUEUE_EVVBLKE'
       exporting
         vbeln          = belnr
       exceptions
         foreign_lock   = 2
         system_failure = 3.
   ...

Vor jeder Verarbeitung eines Nachrichtensatzes wird der passende Beleg gesperrt und nach erfolgreicher/nicht erfolgreicher Verarbeitung wieder entsperrt.

Ein "commit work and wait" erfolgt nur bei der Applikation WT (Trading contract). Bei allen anderen Applikation wird lediglich "commit work" aufgerufen.

Werden mehrere Nachrichten pro Beleg in einem Job oder z. B. der Sammeltransaktion ME9F (Nachrichtenausgabe Einkaufsbelege) ausgegeben, kann es passieren, dass eine Nachricht die nächste sperrt. In so einem Fall kann man ein "wait up to <n> seconds" in das Druckprogramm einbauen, um dem Verbucher mehr Zeit zur Verbuchung zu lassen. In einem Projekt half es hier das Programm 3 Sekunden warten zu lassen, ehe die Verarbeitung im Programm RSNAST00 fortgesetzt wurde.

Funktionsgruppe WMCP

  • Viele relevante Funktionsbausteine für die Protokollierung der NAST-Einträge finden sich in der Funktionsgruppe WMCP.

WMCP1.JPG

Programm RSNAST0F

  • Mit dem Programm RSNAST0F lassen sich fehlerhaft verarbeitete Nachrichten (NAST-VSTAT = 2) in einer Übersicht anzeigen und die Markierten verarbeiten. Das macht Sinn, wenn die Ursache einer fehlerhaft prozessierten Nachricht behoben wurde und die Nachricht dann erneut prozessiert werden soll.

RSNAST0F1.JPG


RSNAST0F2.JPG

Programm RSNASTED

  • Mit dem Programm RSNASTED wird der NAST-Satz beim Druckmedium 6 (EDI) versendet.

Web-Links