Aufruf Adobe Forms über direktes Ausführen eines Funktionsbausteins nicht möglich

Aus SAP-Wiki
Zur Navigation springenZur Suche springen

Ein sehr interessanter Bug kann unter der Ausgabe der Fehlermeldung "Job bereits gestartet." (Nachrichtenklasse = FPRUNX, Meldung = 101) verhindern, dass ein Adobe Forms ausgegeben wird.

Dieser Bug wird gewöhnlich nur im Entwicklungssystem oder Testsystem zu bemerken sein.

Fehlerkonstellation des Bugs

  • Dieser Bug tritt unter der Kombination mehrerer Bedingungen auf
  1. Vor dem Aufruf des generierten Adobe Forms-Funktionsbausteins wird der Funktionsbaustein FP_JOB_OPEN aufgerufen
  2. Das Coding der Formularausgabe befindet sich in einem beliebigen Funktionsbaustein bzw. wird von einem Funktionsbaustein in einer Klassenmethode, Form-Routine oder anderem Funktionsbaustein aufgerufen
  3. Dieser Funktionsbaustein XY wird über die Transaktion SE37 (Function Builder) angezeigt und über F8/Ausführen direkt ausgeführt

Erklärung des Bugs

  • Bei der direkten Ausführung eines Funktionsbausteins wird die Systemvariable SY-CPROG = ‘RS_TESTFRAME_CALL’ gefüllt.
  • Der generierte Adobe Forms-Funktionsbaustein geht jedoch bei der Systemvariable SY-CPROG = ‘RS_TESTFRAME_CALL’ von der Annahme aus, dass der generierte Adobe Forms-Funktionsbaustein direkt ausgeführt wird. In diesem Fall kann es keinen Funktionsbausteinaufruf FP_JOB_OPEN geben, und daher wird im generierten Funktionsbaustein der Funktionsbaustein 'FPCOMP_JOB_OPEN' direkt ausgeführt, der auch im Funktionsbaustein 'FP_JOB_OPEN' ausgeführt wird.
  • Zur Sicherheit, dass der Job nicht doppelt ausgeführt wird, erfolgt unmittelbar vor FPCOMP_JOB_OPEN der Aufruf einer Form-Routine CHECK_JOB_OPEN.
form check_job_open.

  if fpstat-is_opened = abap_true.
    perform reset_status.
    message id 'FPRUNX' type 'E' number '101' raising usage_error.
  endif.

  fpstat-is_opened  = abap_true.
  fpstat-is_started = abap_false.

endform.                    "check_job_open

Die Variable FPSTAT-IS_OPENED wurde jedoch bereits im Funktionsbaustein "FP_JOB_OPEN" auf ABAP_TRUE = 'X' gesetzt. Daher bricht der generierte Funktionsbaustein an dieser Stelle ab.

Workaround zur Fehlerbehebung

SY-CPROG <> ‘RS_TESTFRAME_CALL’

  • Wenn man eine Formularausgabe testet, wird man in aller Regel die Formularausgabe testen und nicht die Erstellung des Spoolauftrags.
  • Daher können beim entsprechenden Aufruf des generierten Adobe Forms-Funktionsbausteins die Aufrufe der Funktionsbausteine FP_JOB_OPEN und FP_JOB_CLOSE durch eine IF-Bedingung ausgeschlossen werden.
If sy-cprog  <> ‘RS_TESTFRAME_CALL’.
  Call function 'FP_JOB_OPEN'
   ..
Endif.

und

If sy-cprog  <> ‘RS_TESTFRAME_CALL’.
  Call function 'FP_JOB_CLOSE'
   ..
Endif.

Kapselung Funktionsbausteinaufruf in einem Testreport

  • Schreibt man einen Testreport und ruft hier den Funktionsbaustein auf, so wird SY-CPROG gleich dem Reportnamen sein und das Problem ist ebenfalls gelöst.