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

Aus SAP-Wiki
Wechseln zu: Navigation, Suche

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 XY bzw. wird von einem Funktionsbaustein XY in einer Klassenmethode, Form-Routine oder anderem Funktionsbaustein aufgerufen
  3. Dieser Funktionsbaustein XY wird über den Forms Builder SE37 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 <reportname> und ruft hier den Funktionsbaustein XY auf, so wird SY-CPROG = <reportname> sein und das Problem ist ebenfalls gelöst.