[ABAP] MM: Preiskonditionen für Material ändern

TYPES: ty_it_copy_records TYPE STANDARD TABLE OF komv WITH DEFAULT KEY.

DATA(lv_komg) = VALUE komg( bukrs = '0001'       " Buchungskreis (Tabelle T001)
                            matnr = '1234567890' " Materialnummer
                            vkorg = '0100'       " Verkaufsorganisation (Tabelle TVKO)
                            vtweg = '01'         " Vertriebsweg (Tabelle TVTW)
                          ).

DATA(it_copy_records) = VALUE ty_it_copy_records( ( kappl = 'V'     " Applikation: V - Vertrieb (Tabelle T681A / T681B)
                                                    kschl = 'PR00'  " Konditionsart (Tabelle T685)
                                                    kbetr = '10.00' " Konditionsbetrag oder -prozentsatz
                                                    waers = 'EUR'   " Konditionseinheit (Währung oder Prozentsatz) (Tabelle TCURC)
                                                    kpein = '1'     " Konditions-Preiseinheit
                                                    kmein = 'ST'    " Konditionsmengeneinheit (Tabelle T006)
                                                ) ).

DATA: lv_datab TYPE vake-datab.
DATA: lv_datbi TYPE vake-datbi.
DATA: lv_prdat TYPE vake-datbi.

CALL FUNCTION 'RV_CONDITION_COPY'
  EXPORTING
    application                 = 'V'        " Applikation: V - Vertrieb (Tabelle T681A / T681B)
    date_from                   = sy-datum   " von Datum
    date_to                     = '99991231' " max. Datum für Konditionen
    condition_table             = '004'      " Konditionstabelle (Tabelle T681)
    condition_type              = 'PR00'     " Konditionsart (Tabelle T685)
    enqueue                     = abap_true  " Lock
    key_fields                  = lv_komg    " Schlüsselfelder
    maintain_mode               = 'A'        " Modus (A - Anlegen, B - Ändern, C - Anzeigen, D - Anlegen mit Vorlage)
    overlap_confirmed           = abap_true  " automatische Bestätigung bei Zeitraumüberlappung
    no_authority_check          = abap_true  " keine Berechtigungprüfung durchführen
  IMPORTING
    e_datab                     = lv_datab
    e_datbi                     = lv_datbi
    e_prdat                     = lv_prdat
  TABLES
    copy_records                = it_copy_records
  EXCEPTIONS
    enqueue_on_record           = 1
    invalid_application         = 2
    invalid_condition_number    = 3
    invalid_condition_type      = 4
    no_authority_ekorg          = 5
    no_authority_kschl          = 6
    no_authority_vkorg          = 7
    no_selection                = 8
    table_not_valid             = 9
    no_material_for_settlement  = 10
    no_unit_for_period_cond     = 11
    no_unit_reference_magnitude = 12
    invalid_condition_table     = 13
    OTHERS                      = 14.

IF sy-subrc = 0.
  CALL FUNCTION 'RV_CONDITION_SAVE'.
  CALL FUNCTION 'RV_CONDITION_RESET'.
  COMMIT WORK.

  WRITE: / lv_datab.
  WRITE: / lv_datbi.
  WRITE: / lv_prdat.
ENDIF.

Weiterführende Infos: Link

[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