[ABAP] MM: Materialpreis aus Konditionssatz ermitteln

DATA: it_t685 TYPE STANDARD TABLE OF t685 WITH DEFAULT KEY.
DATA: it_t682i TYPE STANDARD TABLE OF t682i WITH DEFAULT KEY.
DATA: it_a004 TYPE STANDARD TABLE OF a004 WITH DEFAULT KEY.
DATA: it_konp TYPE STANDARD TABLE OF konp WITH DEFAULT KEY.
DATA: it_konh TYPE STANDARD TABLE OF konh WITH DEFAULT KEY.

PARAMETERS: pkvewe TYPE t685-kvewe DEFAULT 'A'.
PARAMETERS: pkappl TYPE t685-kappl DEFAULT 'V'.
PARAMETERS: pkschl TYPE t685-kschl DEFAULT 'PR00'.
PARAMETERS: pkolnr TYPE t682i-kolnr DEFAULT '40'.
PARAMETERS: pvkorg TYPE a004-vkorg DEFAULT '0030'.
PARAMETERS: pvtweg TYPE a004-vtweg DEFAULT '01'.
PARAMETERS: pmatnr TYPE mara-matnr DEFAULT '000000001234567890'.
PARAMETERS: pdatab TYPE a004-datab DEFAULT '20170101'.
PARAMETERS: pdatbi TYPE a004-datbi DEFAULT '99991231'.

START-OF-SELECTION.

*T685 (Konditionen: Arten)
*-> KVEWE A (Verwendung der Konditionstabelle -> Preisfindung)
*-> KAPPL V (Applikation -> Vertrieb)
*-> KSCHL PR00 (Konditionsart)
*
*<- KOZGF (Zugriffsfolge -> Preis)
*<- VTEXT (Listenpreis)
  SELECT * FROM t685
    INTO TABLE @it_t685
    WHERE kvewe = @pkvewe
      AND kappl = @pkappl
      AND kschl = @pkschl.

  IF sy-subrc = 0.

    LOOP AT it_t685 ASSIGNING FIELD-SYMBOL(<a>).
      WRITE: / |        KOZGF (Zugriffsfolge): { <a>-kozgf }|.
    ENDLOOP.

*T682I (Konditionen: Zugriffsfolgen (generierte Form))
*-> KVEWE A (Verwendung der Konditionstabelle -> Preisfindung)
*-> KAPPL V (Applikation -> Vertrieb)
*-> KOZGF PR00 (Zugriffsfolge -> Preis)
*-> KOLNR 40 (Zugriffsfolge -> Zugriff)
*
*<- KOTABNR 4 (Konditionstabelle -> Material (004))

    DATA(lv_kozgf) = it_t685[ 1 ]-kozgf.

    SELECT * FROM t682i
      INTO TABLE @it_t682i
      WHERE kvewe = @pkvewe
        AND kappl = @pkappl
        AND kozgf = @lv_kozgf
        AND kolnr = @pkolnr.

    IF sy-subrc = 0.

      LOOP AT it_t682i ASSIGNING FIELD-SYMBOL(<z>).
        WRITE: / |  KOTABNR (Konditionstabelle): { <z>-kotabnr } (A{ <z>-kotabnr })|.
      ENDLOOP.

*A004 (Material)
*-> KAPPL V (Applikation -> Vertrieb)
*-> KSCHL PR00 (Konditionsart)
*-> VKORG 0030 (Verkaufsorganisation)
*-> VTWEG 01 (Vertriebsweg - Stammdaten)
*-> MATNR 000000001234567890 (Materialnummer)
*-> DATAB (Gültigkeitsbeginn des Konditionssatzes)
*-> DATBI (Gültigkeitsende des Konditionssatzes)
*
*<- KNUMH (Nummer Konditionssatz)

* Tabellenname zusammenbauen -> A004 (Material)
      DATA(lv_tabname) = |A{ it_t682i[ 1 ]-kotabnr }|.

      SELECT * FROM (lv_tabname)
        INTO TABLE @it_a004
        WHERE kappl = @pkappl
          AND kschl = @pkschl
          AND vkorg = @pvkorg
          AND vtweg = @pvtweg
          AND matnr = @pmatnr
          AND datab <= @pdatab
          AND datbi >= @pdatbi.

      IF sy-subrc = 0.

        LOOP AT it_a004 ASSIGNING FIELD-SYMBOL(<m>).
          WRITE: / |KNUMH (Nummer Konditionssatz): { <m>-knumh } [von: { <m>-datab DATE = ENVIRONMENT } bis: { <m>-datbi DATE = ENVIRONMENT }]|.
        ENDLOOP.

*KONP (Konditionen (Position))
*-> KNUMH (Nummer Konditionssatz)
*-> LOEVM_KO space (Löschkennzeichen für die Konditionsposition)
*
*<- KBETR (Konditionsbetrag/-prozentsatz im Nicht-Staffelfall)
*<- KPEIN (Konditions-Preiseinheit)
*<- KONWA (Konditionseinheit (Währung oder Prozentsatz)
*<- KMEIN (Konditionsmengeneinheit)

        DATA(lv_knumh) = it_a004[ 1 ]-knumh.

        SELECT * FROM konp
          INTO TABLE @it_konp
          WHERE knumh = @lv_knumh
            AND loevm_ko = @space.

        IF sy-subrc = 0.

          LOOP AT it_konp ASSIGNING FIELD-SYMBOL(<p>).
            WRITE: / |                         KONP: Preis: { <p>-kbetr } { <p>-konwa } pro { <p>-kpein } { <p>-kmein }|.
          ENDLOOP.

*
*KONH (Konditionen (Kopf))
*-> KNUMH (Nummer Konditionssatz)

          SELECT * FROM konh
            INTO TABLE @it_konh
            WHERE knumh = @lv_knumh.

          IF sy-subrc = 0.

            LOOP AT it_konh ASSIGNING FIELD-SYMBOL(<h>).
              WRITE: / |                         KONH: KVEWE: { <h>-kvewe } / KOTABNR: { <h>-kotabnr } / KAPPL: { <h>-kappl } / KSCHL: { <h>-kschl }|.
            ENDLOOP.

          ELSE.
            WRITE: / |Keine Konditionen (Kopf) in Tabelle KONH vorhanden.|.
          ENDIF.
        ELSE.
          WRITE: / |Keine Konditionen (Position) in Tabelle KONP vorhanden.|.
        ENDIF.
      ELSE.
        WRITE: / |Keine KNUMH (Nummer Konditionssatz) in Tabelle { lv_tabname } vorhanden.|.
      ENDIF.
    ELSE.
      WRITE: / |Keine KOTABNR (Konditionstabelle) für { lv_kozgf } vorhanden.|.
    ENDIF.
  ELSE.
    WRITE: / |Keine KOZGF (Zugriffsfolge) für { pkschl } vorhanden.|.
  ENDIF.

Weiterführende Infos: Link