Programm RSNAST00 Nachrichtenversand

Aus SAP-Wiki
Zur Navigation springenZur Suche springen

Siehe Fehlerbehandlung.

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

Zu verarbeitende Nachrichten haben gewöhnlich den unverarbeiteten Status (NAST-VSTAT = 0). Nachrichten, die auf einen Fehler gelaufen sind (NAST-VSTAT = 2) werden gewöhnlich nicht erneut prozessiert, sondern die Nachricht zum Beleg neu erstellt und dann (hoffentlich nach Behebung der Fehlersituation) initial prozessiert. Die alten fehlerhaften Nachrichten verbleiben im System und werden ggf. nach Monaten vom Systemadministrator oder von Aufräumprogrammen gelöscht. Aber es kann sehr sinnvoll sein für die Nachvollziehbarkeit von Fehlersituationen diese fehlerhaften Belege mindestens für einige Monate nicht zu löschen.

Aufruf Programm

  • Meist wird das Programm RSNAST00 über die Nachrichtensteuerung aus der 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 Logs aus. Hier bei der Prozessierung (meist Medium 1 = Druck) mit 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. Bei markiertem "Send again" ist NAST-VSTAT = 1. Fehlerhafte Einträge (NAST-VSTAT = 2) 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 und Verarbeitungsstatus

Grundlagen

Nach dem Ausführen des Reports erfolgt im Optimalfall eine Meldung über die erfolgreiche Verarbeitung des Belegs, bzw. der Belege.

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 Nachrichtenprotokoll. Aber wenn US_SCREEN initial/space ist, kommt es zu einer der folgenden Alternativen

  • A) Der RETURNCODE wird im Druckprogramm auf 0 gesetzt und somit wird die Nachricht erfolgreich verarbeitet (grüne Ampel, NAST-VSTAT = 1).
  • B) Der Returncode wird im Druckprogramm auf eine Zahl größer 0 gesetzt und somit wird die Nachricht als nicht erfolgreich verarbeitet gespeichert (rote Ampel, NAST-VSTAT = 2).
  • C) Der Returncode wird im Druckprogramm nicht geändert. Beim Aufruf des Druckprogramms wird der Returncode mit dem Wert 999 übergeben. Es wird die Nachricht als nicht erfolgreich gespeichert (rote Ampel, NAST-VSTAT = 2) und im Log steht ein Hinweis auf eine fehlende Form-Routine. Das ist irreführend.

Daher sollte die Variable RETURNCODE (bzw der entsprechende Variablenname in der aufgerufenen Form-Routine des Druckprogramms) als erstes gecleart werden auf 0. Nur wenn im Druckprogramm ein Fehler auftritt, der die erfolgreiche Verarbeitung der Nachricht verhindert, wird im Druckprogramm die Variable RETURNCODE auf einen Wert größer 0 gesetzt, z. B. 1 oder 4. Entsprechend bewirkt die weitere Verarbeitung im Programm RSNAST00 nach der Rückkehr aus dem Druckprogramm die Speicherung der NAST-Nachricht mit der roten Ampel.

Welche Zeilen im "Processing Log" eines NAST-Nachrichtensatzes existieren, entscheiden die Aufrufe vom Funktionsbaustein NAST_PROTOCOL_UPDATE im Druckprogramm und im Programm RSNAST00, wenn der Nachrichtensatz verarbeitet wurde und auf Status1 oder 2 gewechselt ist.

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

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 = ...  
     msg_nr    = ...
     msg_ty    = ...  "E = Error (rotes Ampelsymbol), W = Warnung (Gelb), S = Success (grüne)
     msg_v1    = ...
     msg_v2    = ...
   exceptions
     others    = 0.
  • Eine NAST-Nachricht/Formularausgabe wird häufig erfolgreich verarbeitet, aber manchmal auch nicht. Speziell der Fehlerfall-/Status muss korrekt festgestellt werden, damit die Anwender/Berater den Fehler (z. B. fehlende Stammdaten) schnell identifizieren und beheben können.
  • Wenn das Formular nur im Anzeigemodus aufgerufen wird, wird das Verarbeitungsprotokoll der Nachricht nicht aktualisiert. Dann sollten Messageboxen im Druckprogramm auftretende Fehler anzeigen. 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, sollte das Protokoll mit möglichst präzisen (Fehler)Meldungen gefüllt werden. Die Ursache von einer Fehlersituation, die eine Formularausgabe verhindert, kann vielfältig sein und im Coding des Druckprogramms, im Formular, im Customizing oder u. a. in fehlenden Stammdaten begründet sein.

Access Tabellenbeziehung Fehlerprotokoll

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-Routine PROGRAMM_AUFRUFEN im Programm RSNAST00

Siehe Customizing der Nachrichtensteuerung der Tabelle TNAPR.

form programm_aufrufen using us_screen type c.
  ...
 returncode = 999.

„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  „Retcode im Druckprogramm auf 0 (Grüne Ampel) oder <> 0 (Rote A.)
          us_screen  „bei Preview = "X"
          if found.

   if returncode = 999. „Retcode 999 unverändert im Druckprogramm (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 im Programm RSNAST00

  • 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 im Programm RSNAST00

RSNAST00 10.JPG

Form PROTOCOL_STORE im Programm RSNAST00

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.

 clear cv_returncode.

 PERFORM adobe_print_output USING    xdruvo
                                     iv_screen."xdruvo
                         CHANGING    cv_returncode

ENDFORM.                    " entry_neu

Protokolleinträge 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.

Fehlerauswertung Funktionsbaustein WFMC_PROTOCOL_GET

  • Der Funktionsbaustein WFMC_PROTOCOL_GET gibt das Fehlerprotokoll zu einer Nachrichtenverarbeitung (NAST-Datensatz) zurück.
  • Die zurückgegebenen Messages werden mit der Nachrichtenverarbeitungsnummer NAST-CMFPR auch in die Tabelle CMFPR geschrieben.
 DATA: lt_nast_msg TYPE TABLE OF nast_msg WITH DEFAULT KEY.

*    Lese die Meldungen zur Nachrichtenverarbeitung des NAST-Satzes
     CALL FUNCTION 'WFMC_PROTOCOL_GET'
       EXPORTING
         cps_nast  = nast
       TABLES
         messages  = lt_nast_msg
       EXCEPTIONS
         not_found = 1
         OTHERS    = 2.
     LOOP AT lt_nast_msg REFERENCE INTO DATA(ls_nast_msg).
       MESSAGE ID ls_nast_msg->arbgb TYPE ls_nast_msg->msgty NUMBER ls_nast_msg->msgnr
             WITH ls_nast_msg->msgv1
                  ls_nast_msg->msgv2
                  ls_nast_msg->msgv3
                  ls_nast_msg->msgv4 INTO DATA(lv_dummy).
     ENDLOOP.

Typische Fehlerursachen, 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
  • Das Formular existiert nicht, was im Customizing unter der Nachrichtenart eingetragen ist.
  • Das Druckprogramm bzw die Form-Routine im Druckprogramm existiert nicht, die im Customizing unter der Nachrichtenart eingetragen sind.

Dynamischer Perform

  • Der Aufruf der Form-Routine in der Nachrichtensteuerung ist ein Klassiker, wo ein dynamischer Perform genutzt wird. Druckprogramm und Einstiegs-Formroutine werden aus dem Customizihg ermittelt und daher im Programm RSNAST00 dynamisch aufgerufen.
  • Dynamischer Perform

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

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.

Funktionsbaustein RV_MESSAGE_PREVIEW

  • Der Funktionsbaustein RV_MESSAGE_PREVIEW wird aufgerufen, wenn bei einer Nachrichtenausgabe ein Druckdialog angezeigt wird, um verschiedene Parameter abzufragen, wie z. B. das Ausgaberät/Drucker.

Druckdialog1.JPG


Druckdialog2.JPG

Der Funktionsbaustein ruft dann aus der RSNAST00 die Form-Routine "EINZELNACHRICHT_SCREEN" auf.

PERFORM einzelnachricht_screen(rsnast00) USING rcode.

Druckdialog3.JPG

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