[ABAP] Material-Ledger: Materialpreise für unterschiedliche Währungstypen pflegen

* MATNR
PARAMETERS: p_matnr TYPE mara-matnr.
* Bewertungskreis
PARAMETERS: p_bwkey TYPE t001k-bwkey.
* Preis
PARAMETERS: p_price TYPE bapi_matval_prices-price DEFAULT '1.00'.
* Währung
PARAMETERS: p_waers TYPE tcurc-waers DEFAULT 'EUR'.

START-OF-SELECTION.

* Bewertungskreis (MBEW-BWKEY) == WERKS
  DATA(lv_valuationarea) = CONV bapi_matval_key-val_area( p_bwkey ).
* Bewertungsart (MBEW-BWTAR), siehe Tabelle T149D
  DATA(lv_valuationtype) = CONV bapi_matval_key-val_type( ' ' ).
* Struktur Preisänderungs-Datum
  DATA(lv_pricedate) = VALUE bapi_matval_pricedate( price_date  = sy-datum
                                                    fisc_period = sy-datum+4(2)
                                                    fisc_year   = sy-datum+0(4)
                                                  ).
* Belegkopftext
  DATA(lv_doc_header_text) = CONV bktxt( 'Materialbeleg Text' ).

* Material-Ledger-Typ zum Bewertungskreis
  SELECT SINGLE FROM tckm2
    FIELDS matled
    WHERE bwkey = @p_bwkey
    INTO @DATA(lv_matled).

  IF sy-subrc = 0.
* Währungs-, Bewertungstypen zum Material-Ledger-Typ
* CURTP (Währungstyp)
    SELECT FROM tckmit
      INNER JOIN tcval ON tckmit~cvtyp = tcval~cvtyp
      FIELDS tckmit~cvtyp,  " Währungs- und Bewertungstyp
             tcval~currtyp, " Währungstyp
             tcval~valutyp  " Bewertungssicht
      WHERE matled = @lv_matled
      INTO TABLE @DATA(it_cvtyp).

    IF sy-subrc = 0.
* Währungscodes
      SELECT SINGLE FROM tcurc
        FIELDS altwr
        WHERE waers = @p_waers
        INTO @DATA(lv_iso).

      IF sy-subrc = 0.
* Preise für alle Währungstypen (CVTYP) setzen
        DATA: it_prices TYPE STANDARD TABLE OF bapi_matval_prices WITH DEFAULT KEY.

        LOOP AT it_cvtyp ASSIGNING FIELD-SYMBOL(<cv>).
* Beispiel:
*   Preise + Währungen für alle Währungstypen des Ledgers zum Bewertungskreis gleich setzen
* Beachte: es gibt andere Anwendungsfälle, insbesondere bei abweichenden Währungstypen (anderen Konzernwährungen (USD usw.)),
*          bei denen die Preise unterschiedlich sein können
* siehe auch MM03 (Reiter "Buchhaltung 1")
          APPEND VALUE #( valuation_view = <cv>-valutyp            " DOMÄNE VALUTYP: 0  - Legale Bewertung, 1 - Konzernbewertung, 2 - Profit-Center-Bewertung
                          curr_type      = <cv>-cvtyp              " 10 - Buchungskreiswährung, 30 - Konzernwährung, 31 - Konzernwährung, Konzernbewertung
                          currency       = p_waers                 " EUR
                          currency_iso   = lv_iso                  " EUR -> 978
                          price_unit     = 1                       " Preiseinheit aus MBEW-BWPEI
                          price          = p_price ) TO it_prices. " Preis ggf. aus MBEW-VERPR
        ENDLOOP.

* Materialpreis-Änderungsbeleg
        DATA: lv_pricechangedocument TYPE bapi_pricechange_document.
* Fehlermeldungen des BAPIs
        DATA(it_bapiret2) = VALUE bapiret2_t( ).

* Materialpreis-Änderung
* Voraussetzung ist Pflege der Materialbewertung zum Materialstamm
        CALL FUNCTION 'BAPI_MATVAL_PRICE_CHANGE'
          EXPORTING
            material            = CONV bapi_matval_key-material( p_matnr ) " MARA-MATNR
            valuationarea       = lv_valuationarea                         " MBEW-BWKEY
            valuationtype       = lv_valuationtype                         " MBEW-BWTAR
            pricedate           = lv_pricedate
            doc_header_text     = lv_doc_header_text
          IMPORTING
            pricechangedocument = lv_pricechangedocument
          TABLES
            prices              = it_prices
            return              = it_bapiret2.

        IF lines( it_bapiret2 ) > 0.
          IF it_bapiret2[ 1 ]-type CA 'EAX'.
* bei Fehler: Rollback
            CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
          ELSE.
            DATA(lv_return) = VALUE bapiret2( ).
* alles ok: COMMIT
            CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
              EXPORTING
                wait   = abap_true
              IMPORTING
                return = lv_return.
          ENDIF.
        ENDIF.

        cl_demo_output=>write_data( p_matnr ).
        cl_demo_output=>write_data( p_bwkey ).
        cl_demo_output=>write_data( lv_pricedate ).
        cl_demo_output=>write_data( lv_doc_header_text ).
        cl_demo_output=>write_data( it_prices ).
        cl_demo_output=>write_data( lv_pricechangedocument ).
        cl_demo_output=>write_data( it_bapiret2 ).
        cl_demo_output=>write_data( lv_return ).

* HTML-Code vom Demo-Output holen
        DATA(lv_html) = cl_demo_output=>get( ).

* Daten im Inline-Browser im SAP-Fenster anzeigen
        cl_abap_browser=>show_html( EXPORTING title       = 'Daten'
                                              html_string = lv_html
                                              container   = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
        WRITE: space.
      ENDIF.
    ENDIF.
  ENDIF.

[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