Aufruf von BAPI_PRODORD_CREATE_FROM_PLORD aus einer Klasse - Shortdump Thema ist als GELÖST markiert

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
11 Beiträge • Seite 1 von 1
11 Beiträge Seite 1 von 1

Aufruf von BAPI_PRODORD_CREATE_FROM_PLORD aus einer Klasse - Shortdump

Beitrag von Anne_A (ForumUser / 14 / 0 / 0 ) » 03.03.2020 15:56
Hallo zusammen,

ich habe ein relativ komplexes Programm mit einem Tree (CL_GUI_ALV_TREE) geschrieben. Zu diesem Tree gibt es u.a. einen Button, um Planaufträge in Fertigungsaufträge umzuwandeln, wofür ich den BAPI_PRODORD_CREATE_FROM_PLORD nutze.
Sobald dieser aber auf einen Fehler stößt (den er entsprechend in der Struktur "return" ausgibt), zerschießt er mir offensichtlich den Tree.
Wenn ich nämlich danach versuche, einen weiteren Planauftrag mit dem BAPI in einen Fertigungsauftrag umzuwandeln, bekomme ich einen Shortdump (bewusst ausgelöster Abbruch durch Message-Typ X):
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".
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.

Ich bin beim Googeln darauf gestoßen, dass schon andere Leute das Problem hatten, aber auch keine Lösung wussten, siehe z.B. hier:
https://answers.sap.com/questions/59355 ... of-ab.html

Es gibt auch eine SAP Note zu dem Thema (373437), die aber im Prinzip nur aussagt, man solle eine Vermischung von ABAP OO und Funktionsbausteinen vermeiden. Mein Z-Code ist aber komplett objektorientiert, nur brauche ich trotzdem den BAPI, um die Aufträge umzuwandeln.

Kann mir jemand helfen? Ich schaffe es noch nicht einmal, einen Workaround zu schreiben, denn sobald der BAPI einen Fehler ausgibt, fliege ich nach dem nächsten Methodenaufruf raus und kann keine Daten zwischenspeichern o.ä.

Viele Grüße, Anne


Re: Aufruf von BAPI_PRODORD_CREATE_FROM_PLORD aus einer Klasse - Shortdump

Beitrag von jocoder (Specialist / 214 / 3 / 63 ) » 04.03.2020 08:06
Den Code (mit der Stelle, an der der Fehler behandelt wird) posten wäre hilfreich. Zum Kurzdump ist auch immer der Aufrufstapel aufschlussreich.

Re: Aufruf von BAPI_PRODORD_CREATE_FROM_PLORD aus einer Klasse - Shortdump

Beitrag von Anne_A (ForumUser / 14 / 0 / 0 ) » 04.03.2020 09:37
Danke! :-) Ich poste mal die gesamte Methode - nach der Umwandlung eines oder mehrerer Plan- in Fertigungsaufträge werden die Ergebnisse in einem Popup-Fenster (mit CL_SALV_TABLE) angezeigt, das mittels Methode zcl_pp_feinplan_helper=>display_plaf_fauf_results aufgerufen wird. Schon hier gibt es einen Unterschied: ist der BAPI zuvor erfolgreich durchgelaufen, sehe ich ein Popup, wie gewünscht:
bapi_gruen.png
Wenn der BAPI dagegen einen Fehler ausgegeben hat (dann ist ls_return gefüllt), bekomme ich kein Popup-Fenster mit ALV-Grid, sondern ein Vollbild-Fenster, dessen Layout "älter" aussieht:
bapi_fehler.png
Ich war mir nicht sicher, wo ich den Aufrufstapel zum Kurzdump finde, vermute aber, es ist dieser Teil (einen Screenshot konnte ich nicht anhängen, weil angeblich zu groß):

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
Der Shortdump erfolgt in dem Befehl CALL METHOD go_tree->frontend_update.

Und jetzt der Code:
Der Codeteil ganz unten (mit lv_restart_cockpit) ist mein Versuch, absichtlich aus dem Cockpit rauszufliegen und dann die Daten neu zu laden, was ich aber auch nicht hinbekomme. Wenn ich statt dessen im Cockpit bleibe und versuche, einen anderen Auftrag mit dem BAPI umzuwandeln, bekomme ich den erwähnten Kurzdump.

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.

Re: Aufruf von BAPI_PRODORD_CREATE_FROM_PLORD aus einer Klasse - Shortdump

Beitrag von black_adept (Top Expert / 3434 / 67 / 671 ) » 04.03.2020 10:08
Fragen:
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?
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Aufruf von BAPI_PRODORD_CREATE_FROM_PLORD aus einer Klasse - Shortdump

Beitrag von Anne_A (ForumUser / 14 / 0 / 0 ) » 04.03.2020 10:24
black_adept hat geschrieben:
04.03.2020 10:08
Fragen:
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?
1. Genau, dann dumpt es nicht. Es liegt also nicht am mehrfachen Durchlauf des BAPIs an sich.
2. 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).
3. Gute Idee, habe ich gerade eingebaut, aber leider kommt der Dump immer noch.
4. Nein, dann kommt der Dump nicht mehr. Er hängt also eindeutig mit dem BAPI zusammen. Wenn der BAPI nicht durchlaufen wird, sieht auch das (gefakte) "Fehler"-Popup anders aus (ein ALV-Grid, so wie es eigentlich immer sein sollte), während das Layout nach einem BAPI-Durchlauf mit Fehler anders aussieht (s.o.).
bapi_fehler_fake.png

Re: Aufruf von BAPI_PRODORD_CREATE_FROM_PLORD aus einer Klasse - Shortdump

Beitrag von black_adept (Top Expert / 3434 / 67 / 671 ) » 04.03.2020 15:10
Anne_A hat geschrieben:
04.03.2020 10:24
2. 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).
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? ).

Also 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.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Aufruf von BAPI_PRODORD_CREATE_FROM_PLORD aus einer Klasse - Shortdump

Beitrag von Anne_A (ForumUser / 14 / 0 / 0 ) » 04.03.2020 19:14
black_adept hat geschrieben:
04.03.2020 15:10
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.
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).
Wenn dieser zweite Auftrag jedoch korrekt durchläuft, so dass die Methode update_data_plaf_to_fauf aufgerufen wird, bekomme ich einen Shortdump.
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? ).
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.

Mein Eindruck ist, dass der BAPI im Fehlerfall irgendetwas im System "verstellt", denn wie gesagt sieht bereits das Popup in Methode zcl_pp_feinplan_helper=>display_plaf_fauf_results nach einem BAPI-Fehler anders aus als es sollte. Und wenn ich dann z.B. auf den von mir angelegten Button "Tree aktualisieren" klicke, fliege ich aus dem Cockpit raus und lande auf dem Selektionsbildschirm (immerhin ohne Shortdump).

black_adept hat geschrieben:
04.03.2020 15:10
Also 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.
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:
fake2.png

Re: Aufruf von BAPI_PRODORD_CREATE_FROM_PLORD aus einer Klasse - Shortdump

Beitrag von jocoder (Specialist / 214 / 3 / 63 ) » 05.03.2020 08:21
Wie werden die Meldungen in der Methode zcl_pp_feinplan_helper=>display_plaf_fauf_results ausgegeben? Kannst du dies auch posten.

Re: Aufruf von BAPI_PRODORD_CREATE_FROM_PLORD aus einer Klasse - Shortdump

Beitrag von Anne_A (ForumUser / 14 / 0 / 0 ) » 05.03.2020 09:19

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.

Re: Aufruf von BAPI_PRODORD_CREATE_FROM_PLORD aus einer Klasse - Shortdump

Beitrag von Anne_A (ForumUser / 14 / 0 / 0 ) » 05.03.2020 11:30
Ich bin gerade noch auf den (nicht freigegebenen) BAPI COXT_BAPI_PLDORD_CONVERT gestoßen, aber selbst wenn ich order_post und commit auf SPACE setze, hat er genau den gleichen Effekt wie der BAPI_PRODORD_CREATE_FROM_PLORD. :-(

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.

Re: Aufruf von BAPI_PRODORD_CREATE_FROM_PLORD aus einer Klasse - Shortdump

Beitrag von Anne_A (ForumUser / 14 / 0 / 0 ) » 05.03.2020 12:46
Ich habe eine Lösung gefunden! 😁
Der BAPI ist ja remotefähig, deshalb rufe ich ihn einfach in einem neuen Modus (STARTING NEW TASK) auf, und so bleibt mein Tree tatsächlich weiterhin funktionsfähig!
Hier nochmal der komplette Loop über die umzuwandelnden Planaufträge:

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.
Da man bei Aufruf mit "starting new task" die Exporting-Parameter des BAPIs nicht abfragen kann, werte ich sie in der neu angelegten Methode get_plaftofauf_results aus:

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.
Unschön ist nur, dass ich jetzt mehrere Variablen/Strukturen global deklarieren musste (gv_bapi_results_received und vor allem gv_aufnr_new und gs_bapi_messages). Gibt es eine Möglichkeit, das zu vermeiden?

Ansonsten bin ich gerade sehr erleichtert, eine Lösung gefunden zu haben! Das Popup aus zcl_pp_feinplan_helper=>display_plaf_fauf_results sieht nun auch im Fehlerfall aus, wie es sollte, und es gibt keine seltsamen Effekte wie das Rausfliegen aus dem Cockpit oder Shortdumps.

Seite 1 von 1

Aktuelle Forenbeiträge

Last erzeugen im SAPGui?
vor 5 Stunden von tm987456 19 / 190
IDoc-Segmente löschen
Gestern von littleJohn 2 / 77

Vergleichbare Themen

Employee Create BAPI
von shilpak » 21.02.2005 14:25
BAPI for Vendor Create
von sonair » 01.03.2005 08:48
Performance-Problem bei Aufruf einer SAP-Klasse
von xforce » 12.07.2018 13:19
Problem mit BAPI-Aufruf !?!?!?!
von Gast » 29.09.2004 12:32
BAPI Aufruf mit TABLES
von dori79 » 27.05.2009 21:47