Wenn ich eine andere Funktion auslöse (z.B. den von mir ergänzten Refresh-Button zum Tree), fliege ich aus dem Bildschirm raus und lande auf dem Vorgänger-(Selection-)Screen, was natürlich genauso wenig erwünscht ist.Laufzeitfehler: MESSAGE_TYPE_X
ABAP-Programm: SAPLCNTL
Anwendungskomponente: BC-FES-GUI
Fehleranalyse
Kurztext der Fehlermeldung:
Control Framework: Unzulässige Bearbeitung eines ABAP-Objects-Controls
Langtext der Fehlermeldung:
Diagnose
Ein Control, das mit ABAP-Objects-Mitteln (klassenbasiertes Control
Framework) erzeugt wurde, soll über einen Funktionsbaustein
(funktionsbausteinsbasiertes Control Framework) bearbeiten werden.
Diese Mischform ist nicht unterstützt.
Die Class-Id des Controls ist .
Systemaktivitäten
Die Transaktion wird abgebrochen.
Falls Sie selbst Zugang zum SAP-Hinweissystem haben, so suchen Sie
bitte zunächst mit folgenden Schlagworten:
"MESSAGE_TYPE_X"
"SAPLCNTL" bzw. LCNTLF01
"CHECK_OO"
Informationen zur Abbruchstelle
Der Abbruch trat im ABAP-Programm "SAPLCNTL" auf, und zwar in
"CHECK_OO".
Im Quelltext befindet sich die Abbruchstelle in Zeile 178
des (Include-)Programms "LCNTLF01".
Code: Alles auswählen.
Aktive Aufrufe/Ereignisse
Nr. Art Programm Include Zeile
Name
15 FORM SAPLCNTL LCNTLF01 178
CHECK_OO
14 FUNCTION SAPLCNTL LCNTLU13 16
CONTROL_DESTROY
13 METHOD CL_ITEM_TREE_CONTROL==========CP CL_ITEM_TREE_CONTROL==========CM006 88
CL_ITEM_TREE_CONTROL=>ASSIGN_TABLE_BY_METHOD
12 METHOD CL_ITEM_TREE_CONTROL==========CP CL_ITEM_TREE_CONTROL==========CM007 22
CL_ITEM_TREE_CONTROL=>UPDATE_NODES_AND_ITEMS
11 METHOD CL_ALV_TREE_BASE==============CP CL_ALV_TREE_BASE==============CM015 318
CL_ALV_TREE_BASE=>QUEUE_TO_CONTROL
10 METHOD CL_ALV_TREE_BASE==============CP CL_ALV_TREE_BASE==============CM00N 5
CL_ALV_TREE_BASE=>FRONTEND_UPDATE
9 METHOD ZCL_PP_FEINPLAN_TREE==========CP ZCL_PP_FEINPLAN_TREE==========CM01T 80
ZCL_PP_FEINPLAN_TREE=>UPDATE_NODE_DATA
8 METHOD ZCL_PP_FEINPLAN_TREE==========CP ZCL_PP_FEINPLAN_TREE==========CM038 27
ZCL_PP_FEINPLAN_TREE=>UPDATE_DATA_PLAF_TO_FAUF
7 METHOD ZCL_PP_FEINPLAN_TREE==========CP ZCL_PP_FEINPLAN_TREE==========CM01U 134
ZCL_PP_FEINPLAN_TREE=>CONVERT_PLAF_TO_FAUF
6 METHOD ZCL_PP_FEINPLAN_TREE==========CP ZCL_PP_FEINPLAN_TREE==========CM00W 36
ZCL_PP_FEINPLAN_TREE=>HANDLE_BUTTON_CLICK
5 METHOD CL_GUI_TOOLBAR================CP CL_GUI_TOOLBAR================CM007 18
CL_GUI_TOOLBAR=>DISPATCH
4 METHOD CL_GUI_CFW====================CP CL_GUI_CFW====================CM001 138
CL_GUI_CFW=>DISPATCH
3 MODULE (PAI) ZPP_FEINPLANUNGSCOCKPIT ZPP_FEINPLANUNGSCOCKPIT_I01 86
PAI_0100
2 FORM ZPP_FEINPLANUNGSCOCKPIT ZPP_FEINPLANUNGSCOCKPIT_F01 28
GET_STARTED
1 EVENT ZPP_FEINPLANUNGSCOCKPIT ZPP_FEINPLANUNGSCOCKPIT 18
START-OF-SELECTION
Code: Alles auswählen.
METHOD convert_plaf_to_fauf.
DATA: ls_tree_data TYPE zpp_feinplan,
lt_plaf_fauf TYPE zpp_plaf_fauf_tt,
ls_plaf_fauf TYPE zpp_plaf_fauf,
lv_aufnr_new TYPE aufnr,
lv_plnum TYPE plnum,
ls_return TYPE bapiret2,
lv_question TYPE string,
lv_answer TYPE char1,
lt_order_node_data TYPE zpp_feinplan_tree_tt,
lv_restart_cockpit TYPE as4flag.
REFRESH: lt_order_node_data, lt_plaf_fauf.
CLEAR lv_restart_cockpit.
* Userauswahl einlesen
TRY.
CALL METHOD get_all_selected_orders
EXPORTING
i_remove_changed = 'X'
IMPORTING
et_order_node_data = lt_order_node_data
e_removed = DATA(lv_changed_removed).
DELETE lt_order_node_data WHERE fauf_plaf EQ 'F'.
* Aufträge mit Änderungsmarkierung dürfen hier nicht umgewandelt werden; falls dennoch welche ausgewählt wurden,
* wurden sie in get_all_selected_orders aus der Liste der markierten Aufträge entfernt und lv_changed_removed auf 'X' gesetzt.
IF lv_changed_removed EQ 'X'.
IF lt_order_node_data[] IS INITIAL.
MESSAGE i047 DISPLAY LIKE 'W'. "Bitte nur Planaufträge ohne ungespeicherte Änderungen auswählen.
EXIT.
ELSE.
CLEAR lv_question.
lv_question = 'Ausgewählte Aufträge mit ungespeicherten Änderungen können nicht verarbeitet werden. Übrige Aufträge trotzdem verarbeiten?'(030).
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
titlebar = 'Teilauswahl'(029)
text_question = lv_question
text_button_1 = 'Ja'(011)
text_button_2 = 'Nein'(012)
default_button = '2'
display_cancel_button = ''
IMPORTING
answer = lv_answer
EXCEPTIONS
text_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE zcx_pp_feinplan
EXPORTING
textid = zcx_pp_feinplan=>error_in_popup.
ENDIF.
CHECK lv_answer EQ '1'.
ENDIF.
ENDIF.
IF lt_order_node_data[] IS INITIAL.
RAISE EXCEPTION TYPE zcx_pp_feinplan
EXPORTING
textid = zcx_pp_feinplan=>sel_at_least_one_plaf.
ENDIF.
IF lv_answer IS INITIAL. "falls das andere Popup schon kam, reicht das zur Userbestätigung aus
CLEAR lv_question.
lv_question = 'Möchten Sie die ausgewählten Planaufträge in Fertigungsaufträge umwandeln?'(018).
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
titlebar = 'Planaufträge umwandeln'(017)
text_question = lv_question
text_button_1 = 'Ja'(011)
text_button_2 = 'Nein'(012)
default_button = '2'
display_cancel_button = ''
IMPORTING
answer = lv_answer
EXCEPTIONS
text_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE zcx_pp_feinplan
EXPORTING
textid = zcx_pp_feinplan=>error_in_popup.
ENDIF.
CHECK lv_answer EQ '1'.
ENDIF.
* Loop über alle umzusetzenden Aufträge und Durchführung der Umsetzung
LOOP AT lt_order_node_data INTO DATA(ls_order_node_data).
MOVE-CORRESPONDING ls_order_node_data TO ls_tree_data.
CHECK ls_tree_data-fauf_plaf EQ 'P'.
CLEAR ls_return.
lv_plnum = ls_tree_data-aufnr.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
text = `Verarbeitung von Auftrag ` && lv_plnum && '...'.
* Achtung: BAPI_PRODORD_CREATE_FROM_PLORD zerschießt irgendetwas im Tree, falls der Planauftrag nicht
* in einen Fertigungsauftrag umgewandelt werden kann! In diesem Fall sieht schon die Anzeige aus
* zcl_pp_feinplan_helper=>display_plaf_fauf_results anders aus (Vollbild statt Popup sowie "älteres" Layout)
* und wenn man danach versucht, einen anderen Planauftrag in einen Fertigungsauftrag umzuwandeln, gibt es
* einen Shortdump. Versucht man dagegen, die Cockpitdaten neu zu laden (Refresh-Button), springt das
* System aus dem Cockpit zurück in den Auswahlbildschirm. !?
* Andere User hatten dieses Problem auch bereits: https://answers.sap.com/questions/5935557/dc-007--control-framework-invalid-processing-of-ab.html
CALL FUNCTION 'BAPI_PRODORD_CREATE_FROM_PLORD'
EXPORTING
planned_order = lv_plnum
order_type = 'PP01'
IMPORTING
production_order = lv_aufnr_new
return = ls_return.
IF ls_return IS INITIAL.
CLEAR ls_plaf_fauf.
ls_plaf_fauf-icon = c_icon_green.
ls_plaf_fauf-plnum = lv_plnum.
ls_plaf_fauf-aufnr = lv_aufnr_new.
APPEND ls_plaf_fauf TO lt_plaf_fauf.
CALL METHOD update_data_plaf_to_fauf
EXPORTING
i_aufnr_plaf = ls_tree_data-aufnr
i_aufnr_fauf = lv_aufnr_new.
ELSE.
CLEAR ls_plaf_fauf.
ls_plaf_fauf-icon = c_icon_red.
ls_plaf_fauf-plnum = lv_plnum.
ls_plaf_fauf-error_message = ls_return-message.
APPEND ls_plaf_fauf TO lt_plaf_fauf.
lv_restart_cockpit = 'X'.
ENDIF.
ENDLOOP.
* Anzeige der umgesetzten Aufträge und ggf. Fehlermeldungen
zcl_pp_feinplan_helper=>display_plaf_fauf_results( lt_plaf_fauf ).
CATCH zcx_pp_feinplan INTO DATA(lo_exceptions).
DATA(l_error) = lo_exceptions->if_message~get_text( ).
MESSAGE l_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
IF lv_restart_cockpit EQ 'X'.
SET PARAMETER ID 'RESTART_COCKPIT' FIELD lv_restart_cockpit.
refresh_tree( i_aufnr = CONV #( lv_plnum ) ).
* Hierdurch springt das System aus dem Cockpit zurück auf den Auswahlbildschirm; aus der
* aktuellen Methode fliegt man raus!
ENDIF.
ENDMETHOD.
1. Genau, dann dumpt es nicht. Es liegt also nicht am mehrfachen Durchlauf des BAPIs an sich.black_adept hat geschrieben: ↑04.03.2020 10:08Fragen:
1) Wenn du 2 Planaufträge erfolgreich umwandeln kannst - dann dumpt es nicht?
2) Erfolgt der Dump innerhalb des LOOPs oder außerhalb
3) Wenn du im LOOP nach dem BAPI-Aufruf stets entweder ein BAPI_TRANSACTION_COMMIT oder ein BAPI_TRANSACTION_ROLLBACK ausführst, kommt dann auch der Dump?
4) Wenn du statt des BAPI-Aufrufs mal gefakte Returninformationen verwendest ( BAPI auskommentieren und pro LOOPzähler so tun als ob es funktioniert hätte oder nicht ), kommt dann immer noch der DUMP?
Diese Information hört sich komisch an. Im Originalposting schreibst du, dass der Dump dann erzeugt wird wenn ein Fehler im BAPI auftritt. Die Methode update_data_plaf_to_fauf hingegen wird nur durchlaufen, wenn return initial ist was nach deinem Quelltext dann der Fall ist wenn der BAPI gerade keine Fehler gebracht hat da du hier die Auftragsnummer fortschreiben willst. ( Warum gibt es denn im Fehlerfall keinen Update des Baums mit der Fehlermeldung, die du ja auch extra in die Struktur schreibst? ).Anne_A hat geschrieben: ↑04.03.2020 10:242. Der Dump erfolgt innerhalb des Loops, und zwar in der Methode update_data_plaf_to_fauf, in der ich die Knotendaten im Tree aktualisiere und dann go_tree->frontend_update aufrufe (ich habe meinen vorigen Beitrag vorhin noch editiert und den Aufrufstapel eingefügt, da kann man es auch sehen).
Das hatte ich vielleicht nicht gut erklärt, tut mir leid. Also, es muss zunächst vom BAPI ein Fehler ausgegeben werden (woraufhin die Methode update_data_plaf_to_fauf natürlich nicht aufgerufen wird), damit das Problem auftritt: Wenn ich danach einen weiteren Planauftrag umwandeln will, kommt es auf das Ergebnis an. Läuft dieser auch auf einen Fehler, sieht alles genauso aus wie beim ersten Auftrag (ohne Shortdump).black_adept hat geschrieben: ↑04.03.2020 15:10Im Originalposting schreibst du, dass der Dump dann erzeugt wird wenn ein Fehler im BAPI auftritt. Die Methode update_data_plaf_to_fauf hingegen wird nur durchlaufen, wenn return initial ist was nach deinem Quelltext dann der Fall ist wenn der BAPI gerade keine Fehler gebracht hat da du hier die Auftragsnummer fortschreiben willst.
Im Fehlerfall ändert sich die Auftragsnummer nicht, da der Auftrag ja nicht umgewandelt werden konnte, so dass ich die Auftragsnummer im Tree auch nicht zu ändern brauche. Die Fehlermeldung erscheint statt dessen im erwähnten Popup in Listenform, so dass der User auch sieht, warum es zu dem Fehler gekommen ist.black_adept hat geschrieben: ↑04.03.2020 15:10( Warum gibt es denn im Fehlerfall keinen Update des Baums mit der Fehlermeldung, die du ja auch extra in die Struktur schreibst? ).
Nein, dann kommt der Dump nicht. Ich habe jetzt extra zwei Aufträge markiert und dann beim ersten einen Fehler gefakt, beim zweiten nicht (und die Fake-Auftragsnummer 11111111 in lv_aufnr_new geschrieben). Es gibt keinen Shortdump, das Cockpit läuft normal und das Popup sieht folgendermaßen aus:black_adept hat geschrieben: ↑04.03.2020 15:10Also bitte jetzt noch mal die Frage 4): Kommt der Dump auch, wenn du die o.a. Methode (nach dem auskommentierten BAPI ) mit gefaktem Feld lv_aufnr_new aufrufst.
Code: Alles auswählen.
METHOD display_plaf_fauf_results.
DATA: lt_plaf_fauf TYPE zpp_plaf_fauf_tt.
CHECK it_plaf_fauf[] IS NOT INITIAL.
REFRESH lt_plaf_fauf.
APPEND LINES OF it_plaf_fauf TO lt_plaf_fauf.
DATA: lo_alv TYPE REF TO cl_salv_table.
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = lo_alv
CHANGING
t_table = lt_plaf_fauf[] ).
CATCH cx_salv_msg.
ENDTRY.
IF lo_alv IS BOUND.
DATA(lo_display) = lo_alv->get_display_settings( ).
lo_display->set_list_header( 'Ergebnisse der Umsetzung'(002) ).
lo_alv->set_screen_popup(
start_column = 40
end_column = 100
start_line = 15
end_line = 25 ).
lo_alv->display( ).
ENDIF.
FREE lo_alv.
ENDMETHOD.
Code: Alles auswählen.
CALL FUNCTION 'COXT_BAPI_PLDORD_CONVERT'
EXPORTING
i_plnum = lv_plnum
i_order_category = '10'
i_order_type = 'PP01'
* i_aufnr = " Auftragsnummer
iv_reset = '' " Zu Beginn Belegtabellen initialisieren
iv_order_post = '' " Verbuchungsroutinen ausführen
iv_commit = '' " COMMIT WORK ausführen
IMPORTING
e_order_number = lv_aufnr_new
* e_order_category = " Auftragstyp
* e_order_type = " Auftragsart
es_return = ls_return.
Code: Alles auswählen.
* Loop über alle umzusetzenden Aufträge und Durchführung der Umsetzung
LOOP AT lt_order_node_data INTO DATA(ls_order_node_data).
MOVE-CORRESPONDING ls_order_node_data TO ls_tree_data.
CHECK ls_tree_data-fauf_plaf EQ 'P'.
CLEAR gs_bapi_messages.
lv_plnum = ls_tree_data-aufnr.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
text = `Verarbeitung von Auftrag ` && lv_plnum && '...'.
*** Gibt es noch freie Sessions?
CALL FUNCTION 'RM_FREE_SESSION_CHECK'
EXCEPTIONS
no_free_session = 1
OTHERS = 2.
IF sy-subrc NE 0.
RAISE EXCEPTION TYPE zcx_pp_feinplan
EXPORTING
textid = zcx_pp_feinplan=>no_free_sessions.
ENDIF.
* Aufruf des BAPI_PRODORD_CREATE_FROM_PLORD in neuem Modus
CLEAR: lv_taskname, gv_bapi_results_received, gv_aufnr_new, gs_bapi_messages.
CONCATENATE 'PLAF_FAUF_' sy-datum sy-uzeit INTO lv_taskname.
CALL FUNCTION 'BAPI_PRODORD_CREATE_FROM_PLORD'
STARTING NEW TASK lv_taskname
DESTINATION 'NONE'
CALLING get_plaftofauf_results ON END OF TASK
EXPORTING
planned_order = lv_plnum
order_type = 'PP01'.
WAIT FOR ASYNCHRONOUS TASKS UNTIL gv_bapi_results_received EQ 'X'.
* Verarbeitung der BAPI-Ergebnisse
IF gs_bapi_messages IS INITIAL.
CLEAR ls_plaf_fauf.
ls_plaf_fauf-icon = c_icon_green.
ls_plaf_fauf-plnum = lv_plnum.
ls_plaf_fauf-aufnr = gv_aufnr_new.
APPEND ls_plaf_fauf TO lt_plaf_fauf.
CALL METHOD update_data_plaf_to_fauf
EXPORTING
i_aufnr_plaf = ls_tree_data-aufnr
i_aufnr_fauf = gv_aufnr_new.
ELSE.
CLEAR ls_plaf_fauf.
ls_plaf_fauf-icon = c_icon_red.
ls_plaf_fauf-plnum = lv_plnum.
ls_plaf_fauf-error_message = gs_bapi_messages-message.
APPEND ls_plaf_fauf TO lt_plaf_fauf.
ENDIF.
ENDLOOP.
Code: Alles auswählen.
METHOD get_plaftofauf_results.
CLEAR: gv_aufnr_new, gs_bapi_messages.
RECEIVE RESULTS FROM FUNCTION 'BAPI_PRODORD_CREATE_FROM_PLORD'
IMPORTING
production_order = gv_aufnr_new
return = gs_bapi_messages.
gv_bapi_results_received = 'X'.
ENDMETHOD.