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
- Vor dem Aufruf des generierten Adobe Forms-Funktionsbausteins wird der Funktionsbaustein FP_JOB_OPEN aufgerufen
- Das Coding der Formularausgabe befindet sich in einem beliebigen Funktionsbaustein bzw. wird von einem Funktionsbaustein in einer Klassenmethode, Form-Routine oder anderem Funktionsbaustein aufgerufen
- 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.