Zum Inhalt springen

Ein Versuch Meshes unter ABAP zu erklären…

Bei Meshes handelt es sich um eine etwas undurchsichtige Technik, die allerdings schon mit ABAP 7.40 SP05 eingeführt wurde. Wirklich sinnvoll verwendet habe ich diese bis jetzt allerdings nie was allerdings auch an mangelnden Anwendungsfällen liegen kann. Sicherlich ist auch ein Grund dafür, dass Meshes und Mesh-Typen nicht unbedingt immer einfach zu verstehen bzw. einfach in sinnvollem Kontext anzuwenden sind. Grundsätzlich ermöglicht es diese Technik interne Tabellen über unterschiedliche Kriterien gegeneinander aufzulösen. Damit das funktioniert müssen die Mesh-Typen entsprechend definiert werden und darin enthaltene interne Tabellen verknüpft werden. Hier kommen die bekannten Assoziationen ins Spiel.

Am einfachsten lassen sich Meshes vielleicht als Art Inner-Joins für interne Tabellen verstehen.

Dazu folgend der Quellcode mit entsprechenden Erklärungen. Die Knackpunkte sind sicherlich die Mesh-Pfade, welche in der SAP Help im Detail erklärt sind. Diese habe ich auch in der Demo versucht einfach einzubinden. Die Beispiele habe ich mir aus Demoprogrammen und der SAP-Help “zusammengeschustert”

TYPES:
      t_scarr    TYPE HASHED TABLE OF scarr
                 WITH UNIQUE KEY carrid,
      t_spfli    TYPE HASHED TABLE OF spfli
                 WITH UNIQUE KEY carrid connid ,
      t_sflight  TYPE HASHED TABLE OF sflight
                 WITH UNIQUE KEY carrid connid fldate,
      t_sairport TYPE HASHED TABLE OF sairport
                 WITH UNIQUE KEY id,
      BEGIN OF MESH t_flights,
        scarr    TYPE t_scarr
          ASSOCIATION _spfli TO spfli
                   ON carrid = carrid,
        spfli    TYPE t_spfli
          ASSOCIATION _sflight TO sflight
                   ON carrid = carrid AND
                      connid = connid
          ASSOCIATION _sairport TO sairport
                   ON id = airpfrom,
        sflight  TYPE t_sflight,
        sairport TYPE t_sairport,
      END OF MESH t_flights.

    DATA:
      flights    TYPE t_flights,
      name       TYPE scarr-carrname VALUE 'Lufthansa',
      id         TYPE spfli-carrid   VALUE 'LH',
      connection TYPE spfli-connid   VALUE '0400',
      date       TYPE sflight-fldate.

    SELECT *
         FROM scarr
         INTO TABLE @flights-scarr.
    SELECT *
           FROM spfli
           INTO TABLE @flights-spfli.
    SELECT *
           FROM sflight
           INTO TABLE @flights-sflight.
    SELECT *
           FROM sairport
           INTO TABLE @flights-sairport.

    date = flights-sflight[ carrid = id
                         connid = connection ]-fldate.

    BREAK-POINT.

    "Inner Join von scarr und spfli mit den entsprechenden Bedingungen im Tabellenausdruck
    "scarr und spfli sind über eine Assoziation miteinander verbunden
    DATA(spfli_wa) =
          flights-scarr\_spfli[ flights-scarr[ carrname = name ]
                                  connid = connection ].

    "Die Assoziation wird jetzt quasi rückwärts gegangen, da scarr auf spfli zeigt
    DATA(scarr_wa) =
          flights-spfli\^_spfli~scarr[
            flights-spfli[ carrid = id connid = connection ] ].

    "Erstes Beispiel + eine Verlängerung auf das Ergebnis des Tabellenausrucks mit der Assoziation sflight
    DATA(sflight_wa) =
      flights-scarr\_spfli[ flights-scarr[ carrname = name ]
                              connid = connection
                            ]\_sflight[ fldate = date ].
    "Das obige Beispiel erweitert um einen Feldzugriff aus der Workarea
    DATA(price) =
      flights-scarr\_spfli[ flights-scarr[ carrname = name ]
                              connid = connection
                            ]\_sflight[ fldate = date ]-price.

    "Feldsymbol Zuweisung
    ASSIGN
      flights-scarr\_spfli[ flights-scarr[ carrname = name ]
                              connid = connection
                            ]\_sflight[ fldate = date ]
      TO FIELD-SYMBOL(<sflight_wa>).

    "Zuweisung eines Wertes über Assoziation bzw. MESH-Pfade
    flights-scarr\_spfli[ flights-scarr[ carrname = name ]
                            connid = connection
                          ]\_sflight[ fldate = date
                          ]-price = price - 10.

    "Prüfung ob eine Zeile innerhalb des MESHES existiert
    IF line_exists(
      flights-scarr\_spfli[ flights-scarr[ carrname = name ]
                              connid = connection
                            ]\_sflight[ fldate = date
                                          price = price - 10 ] ).
    ENDIF.
Facebooktwitterpinterestlinkedinmail
Published inABAPSAP Entwicklung

Sei der Erste der einen Kommentar abgibt

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert