Projektsystem: Hierarchie PSP-Element ändern

Eine Projektstruktur ist zwangsläufig eine Hierarchie. Einzelne PSP-Elemente können ebenfalls hierarchisch angeordnet sein. Eine einfache Struktur sieht beispielsweise so aus:

2016-05-26_17-26-05

Die Projektstruktur wird im SAP-Standard mit der Transaktion CJ20n bearbeitet.
Mit dem kleinen Hierarchieänderungsprogramm soll die Struktur nun dahingehend geändert werden, dass das PSP-Element 43 unter das PSP-Element Nummer 42 gehängt wird. Der Aufruf sieht folgendermaßen aus:

2016-05-26_18-30-54

Die Übergabetabelle LT_HIERARCHY:

2016-05-26_18-32-09

Das Ergebnis ist glücklicherweise wie erwartet:

2016-05-26_17-27-35

Hinweis

Wenn die Hierarchie geändert werden soll, dann kann dies leider nicht beliebig passieren. In jedem Fall muss immer die Hierarchie aller beteiligten PSP-Elemente definiert werden. Soll das PSP-Element Nummer 43 wieder „heraufgestuft“ werden, dann müssen Nr. 42 und Nr. 43 jeweils mit „UP = P-0000004“  und „DOWN = space“ an den Baustein übergeben werden. Nr. 4 muss ebenfalls übergeben werden. Hier der Aufruf für Nr. 43. Eigentlich müsste auch hier Nr. 42 berücksichtigt werden, da es ebenfalls beteiligt ist, denn es „verliert“ ja sein Kind:

2016-05-26_18-36-46

Dies ist das Ergebnis:

2016-05-26_17-41-13

Wie du siehst, ist die Reihenfolge vertauscht: Erst kommt Element 43, danach 42. Eine Sortierung gibt es nicht. Die „Geschwister“ müssen genau definiert werden (LEFT und RIGHT). Soll die Reihenfolge anders herum sein, also erst 42, dann 43, dann muss die Übergabetabelle folgendermaßen aussehen:

2016-05-26_17-53-09

Die Geschwister müssen nicht immer definiert werden. Manchmal funktioniert eine Operation jedoch nur dann, wenn auch die Geschwister korrekt angegeben werden.

Am besten ist es, die Hierarchie 100%ig genau zu definieren. Wann sich der Baustein unvollständigen Definitionen tolerant verhält und wann nicht, ist für mich nicht nachvollziehbar.

Fehler „Wurzelelement der Hierarchie darf nicht verschoben werden“

Fehler 469(CJ)

Bei der Änderung der Hierarchie müssen alle beteiligten Elemente definiert werden! Wenn aus der Ausgangsposition „43 ist 42 untergeordnet“ die Änderung „42 ist 43 untergeordnet“ erfolgen soll, dann muss das ROOT-Element P-0000004 erwähnt werden. Das passiert in dem Demoprogramm, allerdings zeige ich den Fehler hier auf, weil er nicht auf die Fehlerursache schließen lässt.

2016-05-26_18-21-16

Code

 PARAMETERS p_projn  TYPE ps_pspid DEFAULT 'K-0000001'.
 PARAMETERS p_root   TYPE ps_posid DEFAULT 'P-0000004'.
 PARAMETERS p_parent TYPE ps_posid DEFAULT 'P-00000042'.
 PARAMETERS p_child  TYPE ps_posid DEFAULT 'P-00000043'.
 
 START-OF-SELECTION.
 
   PERFORM go.
 
 *&---------------------------------------------------------------------*
 *&      Form  go
 *&---------------------------------------------------------------------*
 FORM go.
 
   DATA ls_project_def      TYPE bapi_project_definition.
   DATA ls_project_def_upd  TYPE bapi_project_definition_up.
   DATA lt_messages         TYPE STANDARD TABLE OF bapi_meth_message.
   DATA ls_message          TYPE bapi_meth_message.
   DATA ls_return           TYPE bapireturn1.
   DATA lt_methods          TYPE STANDARD TABLE OF bapi_method_project.
   DATA ls_method           TYPE bapi_method_project.
   DATA lt_hierarchy        TYPE STANDARD TABLE OF bapi_wbs_hierarchie.
   DATA ls_hierarchy        TYPE bapi_wbs_hierarchie.
 
   ls_project_def-project_definition = p_projn.
 
 
   ls_method-method     = 'Create'.
   ls_method-objecttype = 'WBS-Hierarchy'.
   APPEND ls_method TO lt_methods.
 
 
   CLEAR ls_method.
   ls_method-method     = 'SaveAndWait'.
   APPEND ls_method TO lt_methods.
 
   CLEAR ls_hierarchy.
   ls_hierarchy-project_definition = p_projn.
   ls_hierarchy-wbs_element        = p_root.
   ls_hierarchy-down               = p_parent.
   APPEND ls_hierarchy TO lt_hierarchy.
 
 
   CLEAR ls_hierarchy.
   ls_hierarchy-project_definition = p_projn.
   ls_hierarchy-wbs_element        = p_parent.
   ls_hierarchy-down               = p_child.
   ls_hierarchy-up                 = p_root.
   APPEND ls_hierarchy TO lt_hierarchy.
 
   IF p_child IS NOT INITIAL.
     CLEAR ls_hierarchy.
     ls_hierarchy-project_definition = p_projn.
     ls_hierarchy-wbs_element        = p_child.
     ls_hierarchy-up                 = p_parent.
     APPEND ls_hierarchy TO lt_hierarchy.
   ENDIF.
 
 
   CALL FUNCTION 'BAPI_PROJECT_MAINTAIN'
     EXPORTING
       i_project_definition     = ls_project_def
       i_project_definition_upd = ls_project_def_upd
     IMPORTING
       return                   = ls_return
     TABLES
       e_message_table          = lt_messages
       i_method_project         = lt_methods
       i_wbs_hierarchie_table   = lt_hierarchy.
 
   WRITE: / ls_return-message.
   LOOP AT lt_messages INTO ls_message.
     WRITE: / ls_message-message_text.
   ENDLOOP.
 
   CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
     EXPORTING
       wait = abap_true.
 
 ENDFORM.                    "go
image_pdfimage_print