Overblog
Folge diesem Blog Administration + Create my blog
SAPManDoo - SAP Resource

Der vorliegende Blog enthält von mir im Laufe meiner beruflichen Tätigkeit als SAP-Berater zusammengetragene Informationen / Beispiel-Codings zum Themenkreis SAP, speziell FI/CO.

Pivot-Browser - eigene Aktionen

Veröffentlicht am 16. August 2019 von sapmandoo in Basis-Entwicklung allg., FI, S4, SAP Reports, Accruals Management, ACE, ACAC

Der Pivot-Browser (PIVB) ist ein neues Ausgabe-Framework der SAP, welches die Anzeige beliebiger (strukturierter) Dateninhalte in Tabellenform ermöglicht. Die Art der Darstellung der Daten ist dabei an das bekannte ALV-Grid angelehnt. Im Unterschied zum ALV geht der Funktionsumfang des Pivot-Browsers jedoch über die reine Aufbereitung und Anzeige der Daten hinaus. Auch die Datenbeschaffung (HANA-optimiert) sowie die Behandlung von Benutzerinteraktionen ist in das Framework integriert. 

Details hierzu finden sich in den PDF-Anhängen zum Hinweis 2100879 - Pivot Browser: Dokumentation

Einige der im Standard ausgelieferten Funktionalitäten, die auf dem Pivot-Browser basieren, sind die Einzelpostenbrowser in der S/4 Finanzbuchhaltung:

Transaktion Funktion / Beschreibung
FAGLL03H Sachkonteneinzelposten-Browser (ledgerspezifisch)
FBL3H Sachkonteneinzelposten-Browser (einfach)
FBL1H Kreditoren-Einzelposten
FBL5H Debitoren-Einzelposten
Beispiel FAGLL03H

Beispiel FAGLL03H

Während der Anzeige-Bereich (links) weitestgehend identisch zum bekannten ALV funktioniert, ist der Interaktionsbereich (rechts) ein neu gestaltetes Element im Pivot-Browser. 

Im Bereich Spalten können die anzuzeigenden Felder ausgewählt werden. Bei den o.g. FI-Einzelpostenbrowsern stehen gegen Ende der Liste auch Stammdatenfelder und Bezeichnungen zur Verfügung. So kann bspw. zur Kostenstelle die entsprechende Kostenstellenbezeichnung in die Anzeige geholt werden, ohne wie bei den klassischen Einzelpostenlisten (FBLxN) den Feldvorrat erweitern und die Inhalte per BTE/BADI nachlesen zu müssen.

Der Bereich Layouts enthält alle verfügbaren Anzeigelayouts und ermöglicht deren Verwaltung wie unter ALV bekannt (entsprechende Berechtigung vorausgesetzt).

Interessant ist der Bereich Aktionen, in dem für den aktuellen Anzeigevorrat verfügbare Benutzeraktionen dargestellt sind. Diese können in einer (max. zweistufigen) Baumstruktur angeordnet werden, um so gewisse Interaktionen zu gruppieren. 

Bereich "Aktionen" in der FAGLL03H

Bereich "Aktionen" in der FAGLL03H

Sie ahnen es wahrscheinlich schon, dieser Bereich lässt sich modifikationsfrei beliebig erweitern und mit kundenspezifischen Aktionen spicken...

Weiter unten möchte ich ein Beispiel für eine solche kundeneigene Aktion zeigen, das die Erzeugung von Abgrenzungsobjekten der Accrual Engine bzw. des Accruals Management (ab S/4 1809) direkt aus den Einzelpostenbrowsern der Finanzbuchhaltung ermöglicht.

Die einzelnen Anwendungen des Pivot-Browsers werden als Erweiterungsimplementierung des Erweiterungsspots PIVB registriert. Für die EP-Browser im FI (s.o.) ist dies die Implementierung FAGL_LIB_PIVB. In ihr wiederum werden die Implementierungen zur BadI-Definition FAGL_LIB gerufen, zu der auch kundeneigene Implementierungen angelegt werden können.

Für die Aktionen sind die beiden Interface-Methoden SIDEBAR_ACTIONS_SET und SIDEBAR_ACTIONS_HANDLE relevant. In ersterer kann der "Aktionsbaum" um kundeneigene Aktionen erweitert werden, in der zweitgenannten Methode wird dann die eigentliche Aktion ausgestaltet.

Fügen wir also zunächst eine Aktion in einem kundeneigenen Ordner hinzu:

METHOD if_fagl_lib~sidebar_actions_set.

*   Kundeneigene Aktionen im Einzelpostenbrowser 

    TYPE-POOLS: icon.

*   Neuer Ordner am Ende anfügen
    APPEND INITIAL LINE TO c_menu-t_folder_level1 ASSIGNING FIELD-SYMBOL(<lf_folder>).
    <lf_folder>-folder_key = 'ZZACE'.
    <lf_folder>-folder_text = 'Abgrenzungsobjekt'.

*   Aktion in den neuen Ordner einfügen
    APPEND INITIAL LINE TO <lf_folder>-t_item_level2 ASSIGNING FIELD-SYMBOL(<lf_menuitem>).
    <lf_menuitem>-item_key = 'ZZACE_CREATE'.
    <lf_menuitem>-text = 'Abgrenzungsobjekt anlegen'.
    <lf_menuitem>-icon = icon_fencing.

  ENDMETHOD.
Kundeneigener Ordner mit Aktion im Pivot-Browser

Kundeneigener Ordner mit Aktion im Pivot-Browser

...und nun kann die Aktion, die mit der ID ZZACE_CREATE angelegt wurde, ausgestaltet werden.

  METHOD if_fagl_lib~sidebar_actions_handle.

*   Kundeneigene Aktionen im Einzelpostenbrowser 

    DATA: l_checker TYPE i.
    DATA: ls_bseg TYPE bseg.
    DATA: ls_bkpf TYPE bkpf.

    l_checker = 0.

    CASE i_navigate_item_key.
      WHEN 'ZZACE_CREATE'.   "Abgrenzungsobjekt anlegen
        IF it_outtab_selected_rows[] IS NOT INITIAL.                                            "Mind. eine Zeile selektiert?
          LOOP AT it_column ASSIGNING FIELD-SYMBOL(<lf_col>) WHERE fieldname = 'BUKRS' OR       "Felder Bukrs, Belnr, Gjahr und Buzei in Liste?
                                                                   fieldname = 'BELNR' OR
                                                                   fieldname = 'GJAHR' OR
                                                                   fieldname = 'BUZEI'.
            IF <lf_col>-is_invisible = abap_false.
              ADD 1 TO l_checker.
            ENDIF.
          ENDLOOP.
          IF l_checker < 4.
            MESSAGE 'Bitte mind. BUKRS BELNR GJAHR BUZEI in Anzeige holen' TYPE 'I'.
            EXIT.
          ELSE.
            "Belegdaten nachlesen
            READ TABLE it_outtab INDEX it_outtab_selected_rows[ 1 ]-row_id ASSIGNING FIELD-SYMBOL(<lf_row>).
            MOVE-CORRESPONDING <lf_row> TO ls_bseg.
            SELECT SINGLE * FROM bkpf INTO ls_bkpf
                    WHERE bukrs = ls_bseg-bukrs
                      AND belnr = ls_bseg-belnr
                      AND gjahr = ls_bseg-gjahr.
            SELECT SINGLE * FROM bseg INTO ls_bseg
                    WHERE bukrs = ls_bkpf-bukrs
                      AND belnr = ls_bkpf-belnr
                      AND gjahr = ls_bkpf-gjahr
                      AND buzei = ls_bseg-buzei.
            IF sy-subrc = 0.
              "Aufruf Generierungsprogramm f. Abgrenzungsobjekte
              ls_bseg-dmbtr = abs( ls_bseg-dmbtr ).         "Abgrenzungsbetrag muss positiv sein
              IF ls_bseg-koart NE 'S'.                      "Kontokorrente (FBL1H)
                SUBMIT zacac_d_trans_s4 AND RETURN VIA SELECTION-SCREEN
                       WITH p_check  = 'X'
                       WITH p_efdate = sy-datum
                       WITH p_powip = 'X'
                       WITH so_acmth = 'LINEAR'
                       WITH so_acpst = ls_bkpf-budat
                       WITH so_belnr = ls_bkpf-belnr
                       WITH so_bukrs = ls_bkpf-bukrs
                       WITH so_gjahr = ls_bkpf-gjahr
                       WITH p_amnt   = ls_bseg-dmbtr
                       WITH p_text   = ls_bseg-sgtxt.
              ELSE.                                          "FAGLL03H, FBL3H
                SUBMIT zacac_d_trans_s4 AND RETURN VIA SELECTION-SCREEN
                        WITH p_check  = 'X'
                        WITH p_efdate = sy-datum
                        WITH p_powoip = 'X'                  "Bei Sachkontenposten - OHNE Eröffnungbuchung als Default
                        WITH p_powip  = space
                        WITH so_acmth = 'LINEAR'
                        WITH so_acpst = ls_bkpf-budat
                        WITH so_belnr = ls_bkpf-belnr
                        WITH so_bukrs = ls_bkpf-bukrs
                        WITH so_buzei = ls_bseg-buzei
                        WITH so_gjahr = ls_bkpf-gjahr
                        WITH p_amnt   = ls_bseg-dmbtr
                        WITH p_text   = ls_bseg-sgtxt.
              ENDIF.
            ENDIF.
          ENDIF.
        ENDIF.
    ENDCASE.
  ENDMETHOD.

Da der Pivot-Browser HANA optimiert ist, werden nur die Spalten gelesen, die auch im aktuellen Layout benötigt werden. Dies ist ein wesentlicher Unterschied zu den klassischen EP-Listen, die immer alle Spalten eines Postens lesen, unabhängig von deren Verwendung in der Anzeige.

D.h., es muss zunächst geprüft werden, ob die für die weitere Verarbeitung benötigten Felder auch zur Verfügung stehen!

Im weiteren Verlauf dieses Beispiels wird eine angepasste Z-Kopie des Demo-Reports ACAC_D_TRANS_EXAMPLE_S4 gerufen, der aus einem vorgegebenen Belegvorrat Abgrenzungsobjekte im Accruals Management generiert. Für die "alte" Accrual Engine (vor S/4 1809) wäre dies der Report ACAC_DATA_TRANSFER_EXAMPLE.

 

Kommentare

Erweiterung der WE/RE-Kontenfindung

Veröffentlicht am 12. April 2019 von sapmandoo in FI, MM

Sind die Anforderungen an die WE/RE-Kontenfindung durch das Standardcustomizing (Vorgang ‚WRX’) nicht zu bedienen, kann eine sog. Kontomodifikation verwendet werden, die über die SAP-Erweiterung LMR1M002 (User Exit) bestelldatenabhängig gesetzt werden kann. Im Customizing werden dann die WE/RE-Konten in Abhängigkeit von der im Userexit versorgten Kontomodifikation in folgender Form gesetzt:

 

Kontomodifikation

WE/RE Konto

Bezeichnung

YY1

<…..>

WE/RE Konto 1

YY2

<…..>

WE/RE Konto 2

<…..>

Kontomodifikation - WE/RE-Konto

 

IMG: Finanzwesen > Hauptbuch > Geschäftsvorfälle > Integration Materialwirtschaft > Konten für Materialwirtschaft hinterlegen (Vorgang WRX)

 

Ein konkreter Anwendungsfall könnte z.B. sein, dass im Rahmen der buchungskreisübergreifenden Umlagerung (Szenario ‚Cross Company Nachschub') für die internen Wareneingänge und Rechnungen ein separates WE/RE-Konto gefunden werden soll:

 

Beispielcoding:

 

Funktionsbaustein EXIT_SAPLKONT_011, Include ZXM08U18

* WE/RE-Kontenfindung anhand Bestellart

select single bsart into l_bsart from ekko where ebeln = i_wrxmod-ebeln.

if l_bsart = ‘UB’.

  e_konto_modif = ‚YCC’.    „Cross Company

else.

  e_konto_modif = space.    „Normalfall

endif.

 

 

Kommentare

Ausweis von Nettoumsätzen von Debitoren und Kreditoren

Veröffentlicht am 11. März 2019 von sapmandoo in FI

Zwei, drei mal wurde in den letzen Jahren in den einschlägigen deutschsprachigen FICO-Foren nach einer Auswertung von Nettoumsätzen von Debitoren bzw. Kreditoren gefragt. Da der SAP Standard sich hierbei eher bedeckt hält, lief es meist auf einen Z-Report hinaus. 

Eine Lösung, die in die einschlägigen EP-Listen (FBLxN) integriert ist, hat FICO-Forum User Frank Thielemann freundlicherweise zur Verfügung gestellt:

Link

Es handelt sich um einen Ansatz, der die Erweiterungsmöglichkeiten der EP-Listen via Business Transaction Event (BTE) nutzt. Alternativ kann auch das BadI FAGL_ITEMS_CH_DATA herhalten. Details hierzu siehe hier, Abschnitt "Hinzufügen eigener Felder".

Kommentare

Pimp my Batchman

Veröffentlicht am 25. Februar 2019 von sapmandoo in CO, Basis-Entwicklung allg.

Was sich anhört wie der Titel meines gefloppten Rap-Albums, ist in Wahrheit ein Upgrade des beliebten CO-Superhelden BATCHMAN, mit dem CO-Belege aus externen Dateien ins System geladen werden können. Mein Kollege Markus Läller hat hierzu den von SAP ausgelieferten schwachbrüstigen Schummeldiesel rausgerissen und durch ein bärenstarkes 5.0-Liter V8-Aggregat ersetzt.

Im Vergleich zur Standardauslieferung hat der aufgepumpte Batchman folgendes zu bieten:

  • Natives Excel-Format kann ohne vorherige Konvertierung ins CSV-Format verwendet werden
  • Vorlagen auf das Wesentliche reduziert und übersichtlich
  • Keine führenden Nullen in der Uploaddatei für Stammdaten benötigt
  • Zahlenformate mit Dezimalpunkt oder -komma unterstützt
  • Kostenrechnungskreis wird auf Defaultwert gesetzt, sofern nicht gefüllt
  • User wird automatisch gesetzt (SY-UNAME)
  • Automatischer Belegsplit, wenn maximal zulässige Zeilenanzahl überschritten wird

 

Der Download-Link zu den im folgenden beschriebenen,  vereinfachten Excel-Vorlagen findet sich weiter hinten in diesem Artikel.

Wer den BATCHMAN noch gar nicht kennt, kann sich hier mit der Standardauslieferung vertraut machen.

 

Unterstützte Datenübernahmen


Manuelle Kostenverrechnung


Mit Hilfe der manuellen Kostenverrechnung können Kosten umgebucht werden. Dabei wird ein Senderobjekt (z.B. eine Kostenstelle) entlastet und ein Empfängerobjekt (z.B. eine andere Kostenstelle/ein Auftrag) belastet. Dies ist als Ergänzung der maschinellen Verfahren für die Kostenverrechnung (Umlage, Verteilung) zu verstehen, bei denen nicht mit festen Regeln gearbeitet werden kann.
Im SAP Standard wird die manuelle Kostenverrechnung mit der Transaktion KB15N durchgeführt. Mittels der Transaktion BATCHMAN können Massendaten unter Zuhilfenahme folgender Vorlage gebucht werden:

Die Vorlage besitzt folgenden Aufbau:

CO Upload_Vorlage Manuelle Kostenverrechnung

CO Upload_Vorlage Manuelle Kostenverrechnung

Allgemein
Die Spalte A darf nicht verändert werden. Hier stehen die Strukturdaten, die dynamisch die Zeileninformationen aufbauen. Neben den Strukturen stehen die Felder, die in den Strukturen enthalten sind .
Die Daten werden ab Zeile 4 übernommen, d.h. die Zeile 3 (leer) darf nicht gelöscht werden.
Es dürfen maximal 9999 Zeilen angegeben werden (inklusive Leerzeilen).

Belegkopf
Das Feld DOC_NO stellt die Verbindung zwischen Belegkopf und Belegposition her. Somit es möglich, 1 bis n Belege zu erzeugen.
Im Feld DOC_HDR_TX kann ein Belegkopftext angegeben werden.
In den Feldern Belegdatum und Buchungsdatum können Angaben gemacht werden. Bleiben die Felder leer, wird das Systemdatum (=Tagesdatum) übernommen.
Im Feld TRANS_CURR muss die Transaktionswährung angegeben werden.

Belegposition
Das Feld DOC_NO stellt die Verbindung zwischen Belegkopf und Belegposition her. Somit es es möglich, 1 bis n Belege zu erzeugen.
Im Feld COST_ELEM ist die umzubuchende Kostenart anzugeben. Die Kostenart darf ohne führende Nullen angegeben werden.
Im Feld VALUE_TCUR  muss der Wert der Buchung angegeben werden. Dezimalstellen können mit Punkt oder Komma angegeben werden.
Im Feld SEND_CCTR ist die abgebende SAP Kostenstelle anzugeben. Die Kostenstelle darf ohne führende Nullen angegeben werden.
Im Feld REC_CCTR ist die empfangende SAP Kostenstelle anzugeben, sofern kein echter Auftrag kontiert werden soll. Die Kostenstelle darf ohne führende Nullen angegeben werden.
Sofern ein Auftrag kontiert werden soll, ist das Feld REC_ORDER mit der SAP Auftragsnummer zu füllen. Die Auftragsnummer darf ohne führende Nullen angegeben werden.
Im Feld SEG_TEXT kann ein Positionstext angegeben werden.
 

Manuelle Umbuchung Kosten


Mittels der Funktion manuelle Umbuchung Kosten können Primärkosten umgebucht werden. Die Originalkostenart bleibt immer erhalten. Die Funktion wurde vorwiegend konzipiert, um Fehlbuchungen zu korrigieren. Es ist im Einzelfall zu entscheiden, ob wirklich im CO umgebucht werden sollte oder doch lieber die Buchung im Finanzwesen zu korrigieren ist.
Wichtig: Anders als bei der manuellen Kostenverrechnung wird das abgebende Objekt (z.B. die Kostenstelle) nicht mit Entlastungskennzeichen gebucht, sondern mit negativem Belastungskennzeichen.
Im SAP Standard wird die manuelle Umbuchung der Kosten mit der Transaktion KB11N durchgeführt. 

Die Vorlage besitzt folgenden Aufbau:

CO Upload_Vorlage PrimKosten umb

CO Upload_Vorlage PrimKosten umb

Allgemein
Die Spalte A darf nicht verändert werden. Hier stehen die Strukturdaten, die dynamisch die Zeileninformationen aufbauen. Neben den Strukturen stehen die Felder, die in den Strukturen enthalten sind .
Die Daten werden ab Zeile 4 übernommen, d.h. die Zeile 3 (leer) darf nicht gelöscht werden.
Es dürfen maximal 9999 Zeilen angegeben werden (inklusive Leerzeilen).

Belegkopf
Das Feld DOC_NO stellt die Verbindung zwischen Belegkopf und Belegposition her. Somit es möglich, 1 bis n Belege zu erzeugen.
Im Feld DOC_HDR_TX kann ein Belegkopftext angegeben werden.
In den Feldern Belegdatum und Buchungsdatum können Angaben gemacht werden. Bleiben die Felder leer, wird das Systemdatum (=Tagesdatum) übernommen.
Im Feld TRANS_CURR muss die Transaktionswährung angegeben werden.

Belegposition
Das Feld DOC_NO stellt die Verbindung zwischen Belegkopf und Belegposition her. Somit es es möglich, 1 bis n Belege zu erzeugen.
Im Feld COST_ELEM ist die umzubuchende Kostenart anzugeben. Die Kostenart darf ohne führende Nullen angegeben werden.
Im Feld VALUE_TCUR  muss der Wert der Buchung angegeben werden. Dezimalstellen können mit Punkt oder Komma angegeben werden.
Im Feld SEND_CCTR ist die abgebende SAP Kostenstelle anzugeben. Die Kostenstelle darf ohne führende Nullen angegeben werden.
Im Feld REC_CCTR ist die empfangende SAP Kostenstelle anzugeben, sofern kein echter Auftrag kontiert werden soll. Die Kostenstelle darf ohne führende Nullen angegeben werden.
Sofern ein Auftrag kontiert werden soll, ist das Feld REC_ORDER mit der SAP Auftragsnummer zu füllen. Die Auftragsnummer darf ohne führende Nullen angegeben werden.
Im Feld SEG_TEXT kann ein Positionstext angegeben werden.
 

Interne Leistungsverrechnung


Bei der direkten Leistungsverrechnung wird die erbrachte betriebliche Leistung gemessen, erfasst und verrechnet. Hierfür müssen im System die entsprechenden (messbaren) Bezugsgrößen (= Maßgrößen für die Kostenverursachung) angelegt sein. In der Kostenstellenrechnung werden sie als Leistungsarten bezeichnet. Eine Leistungsverrechnung erfolgt beispielsweise durch das Rückmelden von Arbeitsvorgängen bzw. durch Kontieren der Leistung. Hierbei wird die erbrachte Leistung mit dem Tarif der Leistungsart multipliziert.
Dies erfordert auf den entsprechenden Kostenstellen eine Planung der Leistungsarten mit manuell zu setzendem Tarif.
Im SAP Standard wird die Leistungsverrechnung mit der Transaktion KB21N durchgeführt. Mittels der Transaktion BATCHMAN können Massendaten unter zur Hilfenahme folgender Vorlage gebucht werden:
 

CO Upload_Vorlage ILV buchen

CO Upload_Vorlage ILV buchen

Allgemein
Die Spalte A darf nicht verändert werden. Hier stehen die Strukturdaten, die dynamisch die Zeileninformationen aufbauen. Neben den Strukturen stehen die Felder, die in den Strukturen enthalten sind .
Die Daten werden ab Zeile 4 übernommen, d.h. die Zeile 3 (leer) darf nicht gelöscht werden.
Es dürfen maximal 9999 Zeilen angegeben werden (inklusive Leerzeilen).

Belegkopf
Im Feld DOC_HDR_TX kann ein Belegkopftext angegeben werden.
In den Feldern Belegdatum und Buchungsdatum können Angaben gemacht werden. Bleiben die Felder leer, wird das Systemdatum (=Tagesdatum) übernommen.

Belegposition
Im Feld ACTTYPE ist Leistungsart anzugeben. Die Leistungsart darf ohne führende Nullen angegeben werden.
Im Feld ACTVTY_QTY muss die geleistete Menge angegeben werden. Die Leistungseinheit wird aus dem Leistungsartenstammsatz ermittelt und nicht eingebbar.
Im Feld SEND_CCTR ist die abgebende SAP Kostenstelle anzugeben. Die Kostenstelle darf ohne führende Nullen angegeben werden.
Im Feld REC_CCTR ist die empfangende SAP Kostenstelle anzugeben, sofern kein echter Auftrag kontiert werden soll. Die Kostenstelle darf ohne führende Nullen angegeben werden.
Sofern ein Auftrag kontiert werden soll, ist das Feld REC_ORDER mit der SAP Auftragsnummer zu füllen. Die Auftragsnummer darf ohne führende Nullen angegeben werden.
Im Feld SEG_TEXT kann ein Positionstext angegeben werden.
 

Statistische Kennzahl


Statistische Kennzahlen können für Kennzahlenbildungen im Berichtswesen sowie als Bezugsbasis für periodenbezogene Verrechnungen erfasst werden. Dies erfolgt ebenfalls im Rahmen einer vorgangsbezogenen Verrechnung im Controlling.
Im SAP Standard werden statistische Kennzahlen mit der Transaktion KB31N gebucht. Mittels der Transaktion BATCHMAN können Massendaten unter zur Hilfenahme folgender Vorlage gebucht werden:
 

CO Upload_Vorlage Stat Kennzahl buchen

CO Upload_Vorlage Stat Kennzahl buchen

Allgemein
Die Spalte A darf nicht verändert werden. Hier stehen die Strukturdaten, die dynamisch die Zeileninformationen aufbauen. Neben den Strukturen stehen die Felder, die in den Strukturen enthalten sind .
Die Daten werden ab Zeile 4 übernommen, d.h. die Zeile 3 (leer) darf nicht gelöscht werden.
Es dürfen maximal 9999 Zeilen angegeben werden (inklusive Leerzeilen).

Belegkopf
Im Feld DOC_HDR_TX kann ein Belegkopftext angegeben werden.
In den Feldern Buchungsdatum können Angaben gemacht werden. Sofern das Feld leer ist wird das Tagesdatum übernommen.

Belegposition
Im Feld STATKEYFIG ist die statistische Kennzahl anzugeben. Die Kennzahl darf ohne führende Nullen angegeben werden.
Im Feld STAT_QTY muss der Wert/die Menge angegeben werden. Dezimalstellen können mit Komma und Punkt abgetrennt werden.
Im Feld REC_CCTR ist die empfangende SAP Kostenstelle anzugeben, sofern kein echter Auftrag kontiert werden soll. Die Kostenstelle darf ohne führende Nullen angegeben werden.
Sofern ein Auftrag kontiert werden soll, ist das Feld REC_ORDER mit der SAP Auftragsnummer zu füllen. Die Auftragsnummer darf ohne führende Nullen angegeben werden.
Im Feld SEG_TEXT kann ein Positionstext angegeben werden.
 

Vorlagen

Nachfolgend der Download-Link zu den oben beschriebenen Excel-Templates: 

https://drive.google.com/open?id=1PD1TyrMrV0ncoCvSyceVbgiOrvRi_cDD

Es handelt sich im um ein RAR-Archiv, in dem folgende Excel-Vorlagen enthalten sind:

Inhalt Archiv Batchman 2.0 Vorlagen

Inhalt Archiv Batchman 2.0 Vorlagen

Installation

Legen Sie in der SE24 die Klasse ZCL_IM_BATCHMAN an und betätigen Sie die Drucktaste "Quelltext-basiert"

Laden Sie anschließend das Coding der Klasse hier herunter und kopieren Sie es in den Editor ein. Aktivieren Sie die Klasse und verankern Sie diese im Customizing unter 

Controlling - Kostenstellenrechnung - Istbuchungen - Datenübernahme aus Fremdsystemen - BAdI: Übernahme von externen CO-Istdaten implementieren...

BadI-Implementierung

BadI-Implementierung

Legen Sie eine BADI-Implementierung an und geben Sie als implementierende Klasse ZCL_IM_BATCHMAN vor. 

Anschließend ist die Funktionalität aktiv.

Ausführung / Handhabung

In der Transaktion BATCHMAN stehen folgende Funktionen zur Verfügung:

  • Ausführen der Datenübernahme
  • Nachbearbeiten der Datenübernahme
  • Stornieren der Datenübernahme
  • Protokoll zur Datenübernahme anzeigen.
     
Ausführen der Datenübernahme

Ausführen der Datenübernahme

  • Testen/Buchen : Die Datenübernahme kann im Testmodus und im Echtlauf ( Buchen ) gestartet werden. Im Testlauf werden alle erforderlichen Prüfungen durchgeführt, jedoch noch keine Buchungen vorgenommen.
  • Warnungen ignorieren : Ist dieses Kennzeichen gesetzt, werden Belege auch dann gebucht, wenn bei der Belegprüfung Warnmeldungen auftreten. Ist das Kennzeichen nicht gesetzt, verhindert das Auftreten von Warnungen bei der Belegprüfung die Buchung des betreffenden Belegs.
  • Das Feld Externe Nummernvergabe bitte nicht nutzen.
  • Datenübernahme-Text : Den Datenübernahmen kann ein Text zugeordnet werden, um die Identifikation von Daten zu unterstützen.
     
Datenübernahme - Selektion

Datenübernahme - Selektion

Dateiname Buchungsdaten : Alle bei den Belegprüfungen auftretenden Nachrichten werden protokolliert. Im Echtlauf wird das Protokoll unter der Datenübernahme-Kennung gespeichert. Es kann später mit dieser Kennung gefunden und angezeigt werden (s.a. Protokoll zur Datenübernahme ). Daten, die nicht erfolgreich übernommen werden konnten, werden in einen Nachbearbeitungsvorrat gestellt. Dieser wird ebenfalls über die Kennung der Datenübernahme identifiziert. Dadurch wird gewährleistet, dass sich die Daten zwischen Einlesen und Nachbearbeitung nicht ändern.

Die externe Datenquelle kann mehrfach für die Datenübernahme verwendet werden kann. Die Reaktion der Anwendung auf die mehrfache Übernahme der gleichen Datenquelle kann über die Nachrichtensteuerung der Nachricht 001 des Arbeitsgebietes K41C eingestellt werden. Vorab eingestellt ist, dass der Hinweis auf eine bereits mit der gleichen Datenquelle durchgeführte Datenübernahme als Info-Meldung gezeigt wird, die übergangen werden kann.

Wurde die Datenübernahme im Testlauf durchgeführt, wird folgendes Protokoll ausgegeben:
 

Protokoll Testlauf

Protokoll Testlauf

Mittels Buchen kann die Buchung ausgeführt werden:

Echtlauf / Buchen

Echtlauf / Buchen

Das Ergebnis sind entsprechende Buchungsbelege, die wie folgt angezeigt werden können:
 

 

Anzeigen

Storno

Manuelle Kostenverrechnung

KB16N

KB17N

Manuelle Umbuchung Kosten

KB13N

KB14N

Interne Leistungsverrechnung

KB23N

KB24N

Statistische Kennzahl

KB33N

KB34N

Nachbearbeiten der Datenübernahme
Testen/Buchen: Die Nachbearbeitung kann im Testmodus oder im Echtlauf (Buchen) erfolgen.

Möglichkeiten:
·    Manuelle Verarbeitung
·    Halbautomatische Verarbeitung
·    Automatische Verarbeitung

Welche der Optionen am besten für die Nachbearbeitung geeignet ist, hängt von der Art der aufgetretenen Fehler ab.
War zum Beispiel zum Zeitpunkt der Datenübernahme für den gewünschten Vorgang die Buchungsperiode gesperrt, sind in der Regel keine Änderungen an den zu buchenden Daten erforderlich. Der Datenübernahme kann automatisch wiederholt werden, nachdem die Periodensperre aufgehoben wurde.
Ist ein Fehler aufgetreten, der nur durch Korrigieren der übernommenen Daten behoben werden kann, kann dies halbautomatisch oder manuell geschehen. Die halbautomatische Nachbearbeitung ist geeignet, wenn Fehler auf der Ebene des Belegkopfes zu beheben sind (z.B. falsches Buchungsdatum oder falsche Referenz ). Sind einzelne Buchungszeilen falsch, wird es nötig sein, diese einzeln manuell zu korrigieren.
Warnungen Ignorieren: Ist dieses Kennzeichen gesetzt, werden Belege auch dann gebucht, wenn bei der Belegprüfung Warnmeldungen auftreten. Ist das Kennzeichen nicht gesetzt, verhindert das Auftreten von Warnungen bei der Belegprüfung die Buchung des betreffenden Belegs.
Externe Nummernvergabe: Dieses Kennzeichen bitte nicht verwenden.
Datenübernahme-ID: Dieser Parameter bestimmt, welche Datenübernahme nachbearbeitet wird.

Zunächst können die zu bearbeitenden Belege aus dem gesamten Nachbearbeitungsvorrat ausgewählt werden. Es können einzelne Belege, Beleggruppen oder alle Belege zur Nachbearbeitung ausgewählt werden.

Im halbautomatischen Modus können Informationen zum Belegkopf wie Kostenrechnungskreis, Version, Buchungsdatum, usw. korrigiert und die so berichtigten Belege automatisch gebucht werden.

Enthält eine Datenübernahme nur Belege eines Typs, werden nur die dafür relevanten Felder zur Korrektur eingeblendet. Wenn eine Datenübernahme Belege zu verschiedenen Vorgängen enthält (z.B. Leistungsverrechnung und Umbuchung von Primärkosten), werden alle Felder angezeigt, die für mindestens einen der Vorgänge geändert werden dürfen. Die korrigierten Werte werden nur dann in die Belege übernommen, wenn sie für den Vorgang des betreffenden Belegs gültige Eingaben sind. Wird zum Beispiel die Version geändert, wird der Wert nicht in Belege zur Umbuchung von Primärkosten übernommen.

Stornieren der Datenübernahme
Die Anwendung erlaubt es, Datenübernahme-Läufe komplett zu stornieren. Wurden einzelne Belege aus dem Lauf bereits manuell storniert, wird eine entsprechende Fehlermeldung ausgegeben, und es werden nur die noch nicht stornierten Belege zum Übernahmelauf storniert.
Testen/Stornieren : Die Stornierung kann im Testmodus oder im Echtlauf (Stornieren) erfolgen.
Warnungen ignorieren : Ist dieses Kennzeichen gesetzt, werden Belege auch dann gebucht, wenn bei der Belegprüfung Warnmeldungen auftreten. Ist das Kennzeichen nicht gesetzt, verhindert das Auftreten von Warnungen bei der Belegprüfung die Buchung des betreffenden Belegs.
Nachbearbeitungsvorrat löschen : Ist das Kennzeichen gesetzt, werden alle zum Datenübernahme-Lauf gehörenden Einträge im Nachbearbeitungsvorrat gelöscht.
Buchungsdatum für Storno : Der Storno kann mit einem Buchungsdatum versehen werden.
Zu stornierende Datenübernahme : Es werden einzelne Datenübernahmen storniert. Sie wählen hier die Datenübernahme-ID aus.

Protokoll zur Datenübernahme anzeigen.
Zu einer Datenübernahme wird das Protokoll angezeigt. In der Regel ist dies das Protokoll aus den Belegprüfungen bei der Datenübernahme. Falls die Datenübernahme nachbearbeitet worden ist, ist das Protokoll erweitert um die Nachrichten aus der Nachbearbeitung. Eine Stornierung der Datenübernahme wird ebenfalls protokolliert.
 

Kommentare

CO Umlagen - der sog. "Vorbrenner"

Veröffentlicht am 25. Februar 2019 von sapmandoo in CO, Basis-Entwicklung allg., S4, SAP Reports

Umlagen im CO führen insbesondere im Bereich der Konzernumlage immer dann zu Problemen, wenn als Empfängerbezugsbasis die Gesamtkosten einer Kostenstelle herangezogen werden sollen und dazu ggfls. noch eine sehr differenzierte Funktionsbereichsdefinition mit vielen Empfängerkostenstellen vorliegt. Dies führt in Großkonzernen und Retail Gesellschaften mit vielen Filialen und damit einhergehend vielen Empfängerkostenstellen dazu, das bei Aufbau der Sender-/Empfängerbeziehungen eine interne Tabelle aufgebaut wird, die ggfls. die Speichergrenzen übersteigt und zu einem Short Dump führt.
Folgendes Programm sorgt dafür, dass die gebuchten Kostenarten (echte Buchung) auf eine statistische Kennzahl verdichtet werden. 

Der Effekt bei einem Kunden war bspw., dass eine nicht lauffähige Umlage nach 1300 Sekunden durchgebucht wurde.

In diesem Zusammenhang wurde auch eine Meldung bei SAP aufgemacht und es gab diesbezüglich einen regen Austausch mit dem SAP Development Support. Lt. SAP Entwicklung ist demnach die Nutzung solcher „Vorbrenner“ in diesen Konstellationen wohl nicht unüblich.
 

Das nachfolgende Programm stellt einen solchen "Vorbrenner" dar.

Das Programm startet mit folgendem Selektionsbildschirm:

Selection-Screen des Programms

Selection-Screen des Programms

  • Der Kostenrechnungskreis ist mit 1000 vorbelegt.
  • Im Feld Kostenstellengruppe kann eine Gruppe oder Selektionsvariante angegeben werden. Es werden nur die Kostenstellen für die Fortschreibung der kumulierten Kosten berücksichtigt, die in der Gruppe enthalten sind. Dies entspricht in der Umlage der Empfängerbezugsbasis.
  • Mittels der Kostenartengruppe (Gruppe/Selektionsvariante) kann auf bestimmte Kosten eingeschränkt werden, um z.B. um bereits ausgeführte Umlagen / Abrechnungen nicht als Empfängerbezugsbasis heranzuziehen. Sofern gewünscht kann das Feld leer gelassen werden und das Häkchen Gesamtkosten gesetzt werden. In diesem Fall werden alle Kosten der in der Kostenstellengruppe angegeben Kostenstellen berücksichtigt.
  • Geschäftsjahr und Periode müssen angegeben werden. Unter dieser Periode erfolgt die Selektion und Fortschreibung.
  • Die statistische Kennzahl ISTKOS ist die statistische Kennzahl, unter der die Kosten fortgeschrieben werden.
     

Coding:

*&---------------------------------------------------------------------*
*& Report ZCO_POST_COSTASSKF
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zco_post_costasskf.

* Datendeklaration
INCLUDE zco_post_costasskf_top.
* Selektionsbildschirm
INCLUDE zco_post_costasskf_sel.


START-OF-SELECTION.
  IF gs_selection-kstar IS INITIAL AND p_gesam IS INITIAL.
    "Fehlermeldung
  ENDIF.
*Übernahme der Selektionsparameter in Struktur
  gs_selection-kokrs p_kokrs.
  gs_selection-gjahr p_gjahr.
  gs_selection-perio p_perio.
  gs_selection-gesam p_gesam.
  gs_selection-verto p_verto.
  gs_selection-stagr p_stagr.
  LOOP AT s_verfr REFERENCE INTO DATA(ls_verfr).
    APPEND ls_verfr->TO gs_selection-verfr.
  ENDLOOP.
  IF gs_selection-koset IS INITIALgs_selection-koset '0101' && gs_selection-kokrs && p_1kosetENDIF.
  IF gs_selection-kstar IS NOT INITIAL AND p_gesam IS INITIALgs_selection-kstar '0102' && gs_selection-kokrs && p_1kstarENDIF.

* Start der Verarbeitung
  DATA(lo_instance) = zcl_co_cost2statfig=>get_instance( ).
  lo_instance->startgs_selection ).

 

 

*&---------------------------------------------------------------------*
*& Include          ZCO_POST_COSTASSKF_TOP
*&---------------------------------------------------------------------*

DATAgv_kosetname TYPE c LENGTH 10,
      gv_kstarname TYPE c LENGTH 10.

DATAgs_selection TYPE zcl_co_cost2statfig=>ts_selection.

TABLEScsks.

 

*&---------------------------------------------------------------------*
*& Include          ZCO_POST_COSTASSKF_SEL
*&---------------------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-t01.
PARAMETERSp_kokrs TYPE kokrs MATCHCODE OBJECT csh_tka01 OBLIGATORY DEFAULT 1000.
PARAMETERSp_1koset  LIKE rksb1-ksgru OBLIGATORY.
*PARAMETERS: p_2koset  LIKE rgsbs-setnr MODIF ID in5.
PARAMETERSp_1kstar  LIKE rksb1-kagru.
*PARAMETERS: p_2kstar  LIKE rgsbs-setnr MODIF ID in5.
PARAMETERSp_gesam AS CHECKBOX.
SELECTION-SCREEN SKIP 1.
PARAMETERSp_gjahr TYPE gjahr OBLIGATORY.
PARAMETERSp_perio TYPE periode OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b01.

SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME TITLE TEXT-t02.
PARAMETERSp_stagr TYPE ccss-stagr OBLIGATORY.
PARAMETERSp_verto TYPE csks-kosar.
SELECT-OPTIONSs_verfr FOR csks-kosar NO INTERVALS.
SELECTION-SCREEN END OF BLOCK b02.

INITIALIZATION.
* Defaultwert Datum
  SELECT SINGLE lmona FROM tka01
    
WHERE kokrs EQ @p_kokrs
    
INTO @DATA(gv_periv).
  CALL FUNCTION 'DATE_TO_PERIOD_CONVERT'
    EXPORTING
      i_date         sy-datum
*     I_MONMIT       = 00
      i_periv        gv_periv
    
IMPORTING
      e_buper        p_perio
      e_gjahr        
p_gjahr
    
EXCEPTIONS
      input_false    1
      t009_notfound  2
      t009b_notfound 3
      OTHERS         4.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

* Periodenberechnung
  p_perio p_perio 1.
  IF p_perio EQ 0p_perio 12ENDIF.
  IF p_perio EQ 12p_gjahr p_gjahr 1ENDIF.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_1koset.
  CALL FUNCTION 'K_GROUP_SELECT'
    EXPORTING
      class         '0101'
      field_name    'KOSTL                         '
      table         'CCSS                          '
    IMPORTING
      setid         gs_selection-koset
      set_name      
gv_kosetname
    
EXCEPTIONS
      no_set_picked 02.
  IF sy-subrc 0.
    p_1koset gv_kosetname.
  ENDIF.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_1kstar.
  CALL FUNCTION 'K_GROUP_SELECT'
    EXPORTING
      class         '0102'
      field_name    'KSTAR                         '
      table         'CCSS                          '
    IMPORTING
      setid         gs_selection-kstar
      set_name      
gv_kstarname
    
EXCEPTIONS
      no_set_picked 02.
  IF sy-subrc 0.
    p_1kstar gv_kstarname.
  ENDIF.

AT SELECTION-SCREEN.
  IF p_gesam EQ abap_true.
    CLEARp_1kstargs_selection-kstargv_kstarname.
  ENDIF.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    IF screen-name 'P_1KSTAR'.
      IF p_gesam EQ abap_true.
        CLEAR p_1kstar.
        screen-input '0'.
      ELSE.
        screen-input '1'.
      ENDIF.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.

 

CLASS zcl_co_cost2statfig DEFINITION
  PUBLIC
  FINAL
  
CREATE PUBLIC .

  PUBLIC SECTION.

 

    TYPES:
      tr_kosar TYPE RANGE OF csks-kosar .
    TYPES:
      BEGIN OF ts_selection.
    TYPES kokrs TYPE kokrs.
    TYPES koset TYPE rgsbs-setnr.
    TYPES kstar TYPE rgsbs-setnr.
    TYPES gesam TYPE checkbox.
    TYPES gjahr TYPE gjahr.
    TYPES perio TYPE periode.
    TYPES verto TYPE kosar.
    TYPES verfr TYPE tr_kosar.
    TYPES stagr TYPE stagr.
    TYPES END OF ts_selection .

    TYPES BEGIN OF ts_csks.
    TYPES kokrs TYPE kokrs.
    TYPES kostl TYPE kostl.
    TYPES datbi TYPE datbi.
    TYPES bukrs TYPE bukrs.
    TYPES prctr TYPE prctr.
    TYPES kosar TYPE kosar.
    TYPES END OF ts_csks.

    TYPES tt_csks TYPE STANDARD TABLE OF ts_csks WITH DEFAULT KEY
                                                 WITH UNIQUE HASHED KEY k1 COMPONENTS kokrs kostl datbi
                                                 
WITH NON-UNIQUE SORTED KEY k2 COMPONENTS kosar.

    TYPES tt_cskb TYPE STANDARD TABLE OF cskb WITH DEFAULT KEY.

    TYPES BEGIN OF ts_costs.
    TYPES kokrs TYPE kokrs.
    TYPES kostl TYPE kostl.
    TYPES bukrs TYPE bukrs.
    TYPES prctr TYPE prctr.
    TYPES kosar TYPE kosar.
    TYPES wrttp TYPE co_wrttp.
    TYPES sum   TYPE coep-wkgbtr.
    TYPES END OF ts_costs.

    TYPES tt_costs TYPE STANDARD TABLE OF ts_costs WITH DEFAULT KEY.

    CLASS-METHODS get_instance
      RETURNING
        
VALUE(ro_instanceTYPE REF TO zcl_co_cost2statfig .
    METHODS start
      
IMPORTING
        !is_selection TYPE ts_selection .
protected section.
private section.

  data CV_FAILURE type ABAP_BOOL .
  data GT_COSTS type TT_COSTS .
  data CV_VERTO type KOSAR .
  data GR_KSTAR type REP_EAPS_TAB_KSTAR_RANGE .
  data GT_VERTO type TT_CSKS .
  data RT_VERFR type TR_KOSAR .
  data CV_GESAM type CHECKBOX .
  data CV_DATAB type DATEFROM .
  data CV_DATBI type DATETO .
  data CV_GJAHR type GJAHR .
  data CV_KOKRS type KOKRS .
  data CV_PERIO type PERIODE .
  class-data GO_INSTANCE type ref to ZCL_CO_COST2STATFIG .
  data GT_CSKB type TT_CSKB .
  data GR_KOSTL type HRPP_SEL_KOSTL .
  data CV_STAGR type STAGR .
  data GT_RETURN type BAPIRET2_T .

  methods CALCULATE_COSTS .
  methods DBSEL_CSKB
    
importing
      !IT_KSTAR type REP_EAPS_TAB_KSTAR_RANGE
    returning
      
value(RT_CSKBtype TT_CSKB .
  methods DBSEL_CSKS
    
importing
      !IT_KOSTL type HRPP_SEL_KOSTL
    returning
      
value(RT_CSKStype TT_CSKS .
  methods POST_STATFIG .
  methods REVERSE_STATFIGPOST .
  methods SHOW_LOG .
  methods SET_DATA
    
importing
      !IS_SELECTION type TS_SELECTION .
  methods SET_KOSTENARTEN
    
importing
      !IS_SELECTION type TS_SELECTION .
  methods SET_KOSTENSTELLEN
    
importing
      !IS_SELECTION type TS_SELECTION .
  methods SET_SELMAIN
    
importing
      !IS_SELECTION type TS_SELECTION .
ENDCLASS.



CLASS ZCL_CO_COST2STATFIG IMPLEMENTATION.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_CO_COST2STATFIG->CALCULATE_COSTS
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD calculate_costs.

    DATAlv_tabix     TYPE sy-tabix,
          ls_costverto TYPE ts_costs,
          lt_costverto TYPE tt_costs.

*   Prüfen, ob bereits eine Fehlersituation vorliegt
    CHECK cv_failure IS INITIAL.
*   Select aus COEP, da hier die Daten mit Vorzeichen vorliegen
    SELECT
      a~kokrsa~kostlb~bukrsb~prctrb~kosar,
      a~wrttpSUMa~wkgbtr AS sum "Direkte Summierung möglich, da Werte positiv und negativ vorliegen
      FROM coep AS a
      INNER 
JOIN csks AS b
      
ON a~kokrs EQ b~kokrs AND a~kostl EQ b~kostl
      
WHERE a~kokrs EQ @cv_kokrs
      
AND   a~lednr EQ '00'
      AND   a~gjahr EQ @cv_gjahr
      
AND   a~perio EQ @cv_perio
      
AND   a~kstar IN @gr_kstar
      
AND   a~kostl IN @gr_kostl
      
GROUP BY a~kokrsb~bukrsb~prctra~kostlb~kosara~wrttp
      
INTO CORRESPONDING FIELDS OF TABLE @gt_costs.
*   Buchungskreis 1003 hat Filialkostenstellen, die irrelevant sind, Nullzeilen ignorieren!
    DELETE gt_costs WHERE bukrs '1003' AND kosar EQ cv_verto OR sum IS INITIAL.
    DELETE gt_costs WHERE wrttp NE '04'.
*   Verdichtung
    LOOP AT gt_verto REFERENCE INTO DATA(ls_verto).
      CLEAR ls_costverto.
      MOVE-CORRESPONDING ls_verto->TO ls_costverto.
      LOOP AT gt_costs REFERENCE INTO DATA(ls_costs)
        WHERE bukrs EQ ls_verto->bukrs
        
AND   prctr EQ ls_verto->prctr
        
AND   

* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_CO_COST2STATFIG->DBSEL_CSKB
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_KSTAR                       TYPE        REP_EAPS_TAB_KSTAR_RANGE
* | [<-()] RT_CSKB                        TYPE        TT_CSKB
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD dbsel_cskb.

    IF cv_gesam IS INITIAL AND it_kstar IS NOT INITIAL.
      SELECT kokrskstarkatyp FROM cskb
        
WHERE kokrs EQ @cv_kokrs
        
AND   kstar IN @it_kstar
        
AND   datbi GE @cv_datbi
        
INTO CORRESPONDING FIELDS OF TABLE @rt_cskb.
    ELSE.
      SELECT kokrskstarkatyp FROM cskb
        
WHERE kokrs EQ @cv_kokrs
        
AND   datbi GE @cv_datbi
        
INTO CORRESPONDING FIELDS OF TABLE @rt_cskb.
    ENDIF.

  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_CO_COST2STATFIG->DBSEL_CSKS
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_KOSTL                       TYPE        HRPP_SEL_KOSTL
* | [<-()] RT_CSKS                        TYPE        TT_CSKS
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD dbsel_csks.

    SELECT kokrskostldatbibukrsprctrkosar
      
FROM csks
      
WHERE kokrs EQ @cv_kokrs
      
AND   kostl IN @it_kostl
      
AND   datbi GE @cv_datbi
      
AND   datab LE @cv_datab
      
and   kosar EQ @cv_verto
      
INTO CORRESPONDING FIELDS OF TABLE @rt_csks.


  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_CO_COST2STATFIG=>GET_INSTANCE
* +-------------------------------------------------------------------------------------------------+
* | [<-()] RO_INSTANCE                    TYPE REF TO ZCL_CO_COST2STATFIG
* +--------------------------------------------------------------------------------------</SIGNATURE>
  method GET_INSTANCE.

    IF go_instance IS INITIAL.
      CREATE OBJECT go_instance.
    ENDIF.

    ro_instance go_instance.


  endmethod.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_CO_COST2STATFIG->POST_STATFIG
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD post_statfig.

    DATAlt_item   TYPE STANDARD TABLE OF bapiskfitm WITH DEFAULT KEY,
          lt_return TYPE bapiret2_t,
          ls_return TYPE REF TO bapiret2,
          lv_count  TYPE i.

*   Bei Fehler keine weitere Verarbeitung
    CHECK cv_failure IS INITIAL.
*   Ohne Daten keine Competition
    CHECK gt_costs IS NOT INITIAL.
*   Kopfdaten füllen
    DATA(ls_header) = VALUE bapidochdrpco_area    cv_kokrs
                                         postgdate  
cv_datbi
                                         doc_hdr_tx 
'CUM_COSTS' && ' ' && cv_gjahr && '/' && cv_perio
                                         username   
sy-uname ).
*   Positionsdaten füllen
    LOOP AT gt_costs REFERENCE INTO DATA(ls_costs).
      lv_count lv_count + 1.
      APPEND VALUE bapiskfitmstatkeyfig cv_stagr
                               stat_qty   
CONV smexxxls_costs->sum )
                               seg_text   ' '
                               rec_cctr   ls_costs->kostl TO lt_item.
      IF lv_count 899.
*       Funktionsbaustein aufrufen
        CALL FUNCTION 'BAPI_ACC_STAT_KEY_FIG_POST'
          EXPORTING
            doc_header ls_header
*           IGNORE_WARNINGS       = ' '
*      IMPORTING
*           doc_no     = lv_belnr
          TABLES
            doc_items  lt_item
            
return     lt_return.
*       Rückgabetabelle auswerten
        LOOP AT lt_return REFERENCE INTO ls_return.
          IF ls_return->type CA 'AEX'.
            cv_failure abap_true.
          ENDIF.
          APPEND ls_return->TO gt_return.
        ENDLOOP.
*       Clear
        CLEARlv_countlt_itemlt_return.
      ENDIF.
    ENDLOOP.

*   Letzter Block
    IF lt_item IS NOT INITIAL.
*     Funktionsbaustein aufrufen
      CALL FUNCTION 'BAPI_ACC_STAT_KEY_FIG_POST'
        EXPORTING
          doc_header ls_header
*         IGNORE_WARNINGS       = ' '
*      IMPORTING
*         doc_no     = lv_belnr
        TABLES
          doc_items  lt_item
          
return     lt_return.
*     Rückgabetabelle auswerten
      LOOP AT lt_return REFERENCE INTO ls_return.
        IF ls_return->type CA 'AEX'.
          cv_failure abap_true.
        ENDIF.
        APPEND ls_return->TO gt_return.
      ENDLOOP.
*       Clear
      CLEARlv_countlt_itemlt_return.
    ENDIF.

*   Fehlerprüfung
    IF cv_failure NE abap_true.
*     Auf Datenbank schreiben
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait abap_true.
    ELSE.
*     Nicht auf DB schreiben
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    ENDIF.

  ENDMETHOD.

 

* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_CO_COST2STATFIG->REVERSE_STATFIGPOST
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD reverse_statfigpost.

*   Erst mal kein Storno, sondern nur Fehlermeldung ausgeben
*   Selektion Kopf und Position
    SELECT
      a~kokrsa~belnr,
      SUMb~smebtr AS wert
      
FROM cobk AS a
      INNER 
JOIN coepr AS b
      
ON  a~kokrs EQ b~kokrs
      
AND a~belnr EQ b~belnr
      
WHERE a~kokrs EQ @cv_kokrs
      
AND   a~gjahr EQ @cv_gjahr
*      AND   a~versn EQ 0
      AND   a~vrgng EQ 'RKS'
      AND   a~perab EQ @cv_perio
      
AND   a~stflg NE @abap_true
      
AND   a~stokz NE @abap_true
      
AND   b~stagr EQ @cv_stagr
      
GROUP BY a~kokrsa~belnr
      
INTO TABLE @DATA(lt_cobk).

*   Daten gefunden? Dann Fehler und Returntabelle füllen
    LOOP AT lt_cobk REFERENCE INTO DATA(ls_cobk).
      cv_failure abap_true.
      APPEND VALUE bapiret2id         'ZCO'
                             number     5       "Bitte &1 / &2 in &3 mittels KB34N stornieren (Wert: &4).
                             type       'E'
                             message_v1 ls_cobk->kokrs
                             message_v2 
ls_cobk->belnr
                             message_v3 
cv_gjahr && '/' && cv_perio
                             message_v4 
CONV char13ls_cobk->wert ) ) TO gt_return.
    ENDLOOP.

  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_CO_COST2STATFIG->SET_DATA
* +-------------------------------------------------------------------------------------------------+
* | [--->] IS_SELECTION                   TYPE        TS_SELECTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD set_data.

*   Datum/Kostenrechnungskreis setzen
    set_selmainis_selection ).
*   Kostenstellen festlegen
    set_kostenstellenis_selection ).
*   Kostenarten festlegen
    set_kostenartenis_selection ).

  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_CO_COST2STATFIG->SET_KOSTENARTEN
* +-------------------------------------------------------------------------------------------------+
* | [--->] IS_SELECTION                   TYPE        TS_SELECTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD set_kostenarten.

    DATAlt_setvalues TYPE TABLE OF setvalues,
          lr_kstar     TYPE rep_eaps_tab_kstar_range.

    IF is_selection-kstar IS NOT INITIAL.
*     Werte importieren
      CALL FUNCTION 'G_SET_TREE_IMPORT'
        EXPORTING
          client          sy-mandt
          setid           
is_selection-kstar
*         tabname         = table
*         fieldname       = fieldname
          no_descriptions abap_true
          no_rw_info      
abap_true
          date_from       
cv_datab
          date_to         
cv_datbi
        
TABLES
*         set_hierarchy   =
          set_values      lt_setvalues
        
EXCEPTIONS
          set_not_found   1
          OTHERS          3.
*     Werte in Rangetabelle übernehmen
      LOOP AT lt_setvalues REFERENCE INTO DATA(ls_set).
        APPEND VALUE rep_eaps_str_kstar_rangesign    'I'
                                               option  'BT'
                                               low     ls_set->from
                                               high    ls_set->to TO gr_kstar.
      ENDLOOP.
    ENDIF.
*   Benötigte Daten selektieren und in Attributtabelle stellen
    gt_cskb dbsel_cskbgr_kstar ).

  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_CO_COST2STATFIG->SET_KOSTENSTELLEN
* +-------------------------------------------------------------------------------------------------+
* | [--->] IS_SELECTION                   TYPE        TS_SELECTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD set_kostenstellen.

    DATAlt_setvalues TYPE TABLE OF setvalues.

    CALL FUNCTION 'G_SET_TREE_IMPORT'
      EXPORTING
        client          sy-mandt
        setid           
is_selection-koset
*       tabname         = table
*       fieldname       = fieldname
        no_descriptions abap_true
        no_rw_info      
abap_true
        date_from       
cv_datab
        date_to         
cv_datbi
      
TABLES
*       set_hierarchy   =
        set_values      lt_setvalues
      
EXCEPTIONS
        set_not_found   1
        OTHERS          3.

    LOOP AT lt_setvalues REFERENCE INTO DATA(ls_set).
      APPEND VALUE hrpp_sel_st_kostlsign    'I'
                                      option  'BT'
                                      low     ls_set->from
                                      high    ls_set->to TO gr_kostl.
    ENDLOOP.

    gt_verto dbsel_csksgr_kostl ).


  ENDMETHOD.



 

* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_CO_COST2STATFIG->SET_SELMAIN
* +-------------------------------------------------------------------------------------------------+
* | [--->] IS_SELECTION                   TYPE        TS_SELECTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD set_selmain.

*   Übernahme in globale Attribute
    cv_gjahr is_selection-gjahr.
    cv_perio is_selection-perio.
    cv_kokrs is_selection-kokrs.
    cv_gesam is_selection-gesam.
    rt_verfr is_selection-verfr.
    cv_verto is_selection-verto.
    cv_stagr is_selection-stagr.
*   Datum ermitteln
    SELECT SINGLE lmona FROM tka01
      
WHERE kokrs EQ @cv_kokrs
      
INTO @DATA(lv_periv).
*   Anfangsdatum
    CALL FUNCTION 'FIRST_DAY_IN_PERIOD_GET'
      EXPORTING
        i_gjahr        cv_gjahr
*       I_MONMIT       = 00
        i_periv        lv_periv
        i_poper        
cv_perio
      
IMPORTING
        e_date         cv_datab
      
EXCEPTIONS
        input_false    1
        t009_notfound  2
        t009b_notfound 3
        OTHERS         4.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.
*   Enddatum
    CALL FUNCTION 'LAST_DAY_OF_MONTHS'
      EXPORTING
        day_in            cv_datab
      
IMPORTING
        last_day_of_month cv_datbi
      
EXCEPTIONS
        day_in_no_date    1
        OTHERS            2.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.



  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_CO_COST2STATFIG->SHOW_LOG
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD show_log.

    CALL FUNCTION 'C14ALD_BAPIRET2_SHOW'
      TABLES
        i_bapiret2_tab gt_return.

  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_CO_COST2STATFIG->START
* +-------------------------------------------------------------------------------------------------+
* | [--->] IS_SELECTION                   TYPE        TS_SELECTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD start.

*   Wesentliche Attribute füllen
    set_datais_selection ).
*   Ggfls. bisherige stat. Kennzahl stornieren
    reverse_statfigpost( ).
*   Kosten ermitteln und Verdichten
    calculate_costs( ).
*   Wert buchen
    post_statfig( ).
*   Protokoll ausgeben
    show_log( ).

  ENDMETHOD.
ENDCLASS.

Kommentare

Workflowbasierte Bearbeitung und Freigabe des Zahlungsvorschlags

Veröffentlicht am 12. Februar 2019 von sapmandoo in FI, workflow

In neueren Releases (S/4 bzw. ab SAP_FIN 617) gibt es die Funktion "Workflow-basierte Freigabe des Zahlungsvorschlags". Hiermit lassen sich (arbeitsteilige) Abarbeitungs- bzw. Fertigmeldungsszenarien für den Zahllauf (F110 bzw. F111) implementieren. 

Relevante Hinweise

  • 2441770 - FI-Zahlprogramm: Workflow-basierte Freigabe des Zahlungsvorschlags

Installation:

  • 2418713 - F110 F111: Workflow-basierte Freigabe des Zahlungsvorschlags (Prozess-Integration zu Hinweis 2441805)
  • 2441804 - F110 F111: Workflow-basierte Freigabe des Zahlungsvorschlags (Installation zu Hinweis 2441805)
  • 2441805 - F110 F111: Workflow-basierte Freigabe des Zahlungsvorschlags

 

Mithilfe der Customizing-Transaktion F110WFR bzw. IMG: Finanzwesen - Debitoren- und Kreditorenbuchhaltung - Geschäftsvorfälle - Zahlungsausgang - Zahlungsausgang automatisch - Zahlungsvorschlagsbearbeitung - Workflow für die Zahlungsvorschlagsbearbeitung einrichten lässt sich der Workflow aktivieren und die Bearbeiterfindung ausprägen. Für dieses Beispiel richten wir eine arbeitsteilige Bearbeitung des Zahlvorschlags (nach Sachbearbeiter-Kürzeln) ein.

Workflow aktivieren

Workflow aktivieren

Aktivieren Sie den Workflow im entsprechenden zahlenden Buchungskreis und geben Sie die Zahlwege vor, für die der Workflow greifen soll.

Workflow-Bearbeiterfindung

Workflow-Bearbeiterfindung

Im Rahmen dieser Aktivität bietet das System einen einfachen Regel-Editor, mit dem in Abhängigkeit von gewissen Feldinhalten der Zahlvorschlag paketiert und entsprechende Bearbeiter (z.B. SAP-User) zugeordnet werden können.

Im vorliegenden Fall wird der Zahlvorschlag nach Sachbearbeiter-Kürzeln (01, 02) am Kreditoren- bzw. Debitorenstammsatz aufgeteilt und die Arbeitspakete werden den zuständigen Zahlvorschlagsbearbeitern zugeordnet. 

Als letzter Eintrag ohne Regel ist ein Default-User eingerichtet, der den schwarzen Peter bekommt, wenn durch Anwendung der vorherigen Regeln bis dorthin kein Bearbeiter gefunden werden konnte. 

Ein komplexeres Regelwerk zur Bearbeiterfindung lässt sich über die Ausgestaltung eines BAdIs implementieren. Details hierzu und weitere Informationen zu diesem Themenkreis finden sich in der Dokumentation zur IMG-Aktivität. 

Über die Methode GET_WF_PACKAGE_ACTORS liessen sich bspw. die zuständigen Bearbeiter aus der Tabelle T001S (Sachbearbeiterkürzel) nachlesen und dynamisch den Arbeitspaketen zuteilen.

Der ausgelieferte Workflow (WS23200018) besteht aus folgenden Aufgaben/Schritten:

Workflow Zahlungsvorschlagsbearbeitung Teil 1

Workflow Zahlungsvorschlagsbearbeitung Teil 1

Nach dem Startereignis (Zahlungsvorschlag wurde in der F110 erstellt) werden die Arbeitspakete erstellt und an die zugeteilten Bearbeiter weitergeleitet. Die Bearbeiter haben nun entsprechende ausführbare Workpackages in ihrem SAP Business Workplace. Der weitere Ablauf kann nun wie folgt variieren:

  • Der Vorschlag wird gelöscht
  • Die Arbeitspakete werden von den jeweiligen Bearbeitern abgearbeitet, bis die Anzahl der offenen Pakete 0 ist, also alles bestätigt wurde

Den Status der Abarbeitung kann jederzeit in der F110 eingesehen werden über "Zahlvorschlag anzeigen"

Status Zahlvorschlagsbearbeitung in der F110

Status Zahlvorschlagsbearbeitung in der F110

Sofern der Zahlvorschlag vor Beginn der Abarbeitung gelöscht wurde, ist der Workflow beendet. Wurden alle Arbeitspakete durch die jeweiligen Bearbeiter bestätigt, wird der Zahlvorschlag vom System gesperrt und die Abschlußarbeiten nach Workflow eingeleitet. In der Standardauslieferung wird hierbei der Zahllauf inkl. Zahlungsträgererstellung und Druck angestossen.

Workflow Zahlungsvorschlagsbearbeitung Teil 2

Workflow Zahlungsvorschlagsbearbeitung Teil 2

Die einzelnen Schritte und deren konkrete Ausgestaltung sind in einem Default-BadI (FI_PAYMENT_PROPOSAL_WF) implementiert, welches von SAP ausgeliefert wird. Nachfolgend ein kurzer Überblick über die ausgelieferten Funktionalitäten:

 
Methode Ausgelieferte Funktionalität
CHECK_WF_ACTIVE Es wird geprüft, ob der Workflow im Cust. für den entsprechenden zahlenden Buchungskreis und Zahlweg aktiviert ist.
DELETE_WF_PACKAGES Wird der Zahlungsvorschlag gelöscht, werden alle erstellten Arbeitspakete mitgelöscht.
GET_WF_PACKAGE_1 Paketierung des Zahlungsvorschlages gemäß Regeleditor im Customizing, wenn die regelnden Felder im Zahlungskopf enthalten sind (REGUH)
GET_WF_PACKAGE_2 Paketierung des Zahlungsvorschlages gemäß Regeleditor im Customizing, wenn die regelnden Felder in der Zahlungsposition enthalten sind (REGUP)
GET_WF_PACKAGE_ACTORS Zuteilung des Bearbeiters zum jeweiligen Arbeitspaket anhand der Zuordnung im Customizing (s.o.)
GET_WF_PACKAGE_DESCRIPTION Generischer Aufbau der Arbeitspaketbeschreibung anhand der techn. Beschreibung des Feldnamens aus der Regel und der vorgegebenen Werte, z.B.: BUSAB = 01 wird zu "Buchhaltungs-Sachbearbeiter 01"
START_WF_POSTPROCESSING Abschlußarbeiten, wenn alle Arbeitspakete bestätigt wurden: Starten des Zahllaufs inkl. Zahlungsträgererstellung und Druck 

 

Durch eine eigene BadI-Implementierung lassen sich alle oder einzelne Funktionen durch kundeneigenes Coding übersteuern.

Kommentare

Upload-Tool für Hauptbuchbelege (SAPGUI)

Veröffentlicht am 4. Februar 2019 von sapmandoo in S4, FI, SAP Reports

Eine viel nachgefragte Funktion im FI ist die Möglichkeit, Belege in Excel aufzubereiten und unter SAP hochzuladen, z.B. für Sachkonten-Umbuchungen im Rahmen von Abschlusstätigkeiten. Unter S/4 (ab Rel. 1511) gibt es hierfür eine Fiori-App zum Upload von Hauptbuchbelegen via Excel-Template, ab Release 1809 gibt es diese auch für kreditorische Belege... 

Bis dahin hilft meines Wissens tatsächlich nur eine selbstgebaute Upload-Funktion oder ggf. ein 3rd Party-Produkt.

Ein einfaches Programm inkl. Testlauf-/Prüffunktion findet sich in diesem Artikel. Hinweise zur Installation und zum Format der Quell-Datei finden sich am Ende des Codings...

*&---------------------------------------------------------------------*
*& Report ZFI_UPLOAD_DOCUMENT
*----------------------------------------------------------------------*
* Funktion       : Upload Belege aus Excel                             *
*----------------------------------------------------------------------*
* Beschreibung   : Upload von Belegen und Verbuchung via Excel         *
*                  (Ausweichtool für Fiori-App)                        *
*----------------------------------------------------------------------*
REPORT zfi_upload_document.

***********************************************************************
******************** GLOBAL DATA **************************************
***********************************************************************

CONSTANTS: gc_delimiter(1) TYPE c VALUE '~'.

SET EXTENDED CHECK OFF.
INCLUDE:
  sbal_constants,
  <icon>.
SET EXTENDED CHECK ON.

DATA:
  g_s_log             TYPE bal_s_log,
  g_log_handle        TYPE balloghndl,
  g_t_log_handle      TYPE bal_t_logh,
  g_s_display_profile TYPE bal_s_prof.

DATA: g_dummy         TYPE c.

DATA: data_tab TYPE TABLE OF string.

TYPES: BEGIN OF tax_item,
         mwskz      TYPE mwskz,
         direct_tax TYPE abap_bool,
         basis      TYPE fwbas,
         steuer     TYPE fwste,
       END OF tax_item.

DATA: git_taxitems TYPE TABLE OF tax_item,
      gs_taxitem   TYPE tax_item.

TYPES: BEGIN OF doc_header,
         bukrs     TYPE bukrs,
         blart     TYPE blart,
         bldat(10) TYPE c,
         budat(10) TYPE c,
         bumon     TYPE bumon,
         bktxt     TYPE bktxt,
         waers     TYPE waers,
         ldgrp     TYPE fagl_ldgrp,
         ukurs(12) TYPE c,
         umdat(10) TYPE c,
         xblnr     TYPE xblnr,
         pargb     TYPE pargb,
       END OF doc_header.

TYPES: BEGIN OF doc_item,
         bukrs     TYPE bukrs,
         hkont     TYPE hkont,
         sgtxt     TYPE sgtxt,
         wrsol(15) TYPE c,
         wrhab(15) TYPE c,
         dmbtr(15) TYPE c,
         dmbe2(15) TYPE c,
         mwskz     TYPE mwskz,
         txjcd     TYPE txjcd,
         kostl     TYPE kostl,
         prctr     TYPE prctr,
         aufnr     TYPE aufnr,
         ps_posid  TYPE ps_posid,
         valut(10) TYPE c,
         hbkid     TYPE hbkid,
         hktid     TYPE hktid,
         zuonr     TYPE dzuonr,
         vbund     TYPE vbund,
       END OF doc_item.

DATA: gs_doc    TYPE doc_header,
      gs_item   TYPE doc_item,
      git_items TYPE TABLE OF doc_item.


* Schnittstellendaten für Verbuchungs-BAPI
DATA:
* Returnparameter des BAPIs
  g_obj_type         TYPE bapiache09-obj_type,  "Objekttyp
* Objejktschlüssel erhält vom BAPI die Belegidentifikation:
* NNNNNNNNNNYYYYBBBB  N = Belegnummer, Y = GJahr, B = Buchungskreis
  g_obj_key          TYPE bapiache09-obj_key,   "Objektschlüssel
  g_obj_sys          TYPE bapiache09-obj_sys,   "log. System

* Belegkopf
  gs_documentheader  TYPE bapiache09,

* Sachkontenpositionen
  git_accountgl      TYPE TABLE OF bapiacgl09,
  gs_accountgl       TYPE bapiacgl09,

* Steuerzeilen
  git_accounttax     TYPE TABLE OF bapiactx09,
  gs_accounttax      TYPE bapiactx09,

* Betragsinformationen
  git_currencyamount TYPE TABLE OF bapiaccr09,
  gs_currencyamount  TYPE bapiaccr09,

* Meldungen des BAPI's
  git_return         TYPE TABLE OF bapiret2,
  gs_return          TYPE bapiret2.

DATA:
  g_itemno           TYPE posnr_acc.           "Postionsnummer 


*&---------------------------------------------------------------------*
*& SELECTION-SCREEN
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-b01.
PARAMETERS: pa_fnam LIKE rlgrap-filename OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b01.

SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME TITLE TEXT-b02.
PARAMETERS: pa_test AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK b02.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_fnam.
  PERFORM f4_filename.

*-----------------------------------------------------------------------
START-OF-SELECTION.
*-----------------------------------------------------------------------

  PERFORM init.
  PERFORM upload_data.
  PERFORM map_data.
  IF pa_test IS INITIAL.
    PERFORM post_document.
  ELSE.
    PERFORM check_document.
  ENDIF.
  PERFORM add_msg_to_prot.
  PERFORM log_display.

*&---------------------------------------------------------------------*
*& Form F4_FILENAME
*&---------------------------------------------------------------------*
*& F4 Hilfe Excel-Datei
*&---------------------------------------------------------------------*
FORM f4_filename .

  CALL FUNCTION 'FAA_FILE_F4'
    EXPORTING
      i_default_extension = 'XLS'
    IMPORTING
      e_filename          = pa_fnam
    EXCEPTIONS
      interface_error     = 1
      OTHERS              = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    PERFORM msg_add USING probclass_high.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form UPLOAD_DATA
*&---------------------------------------------------------------------*
*& Upload der Excel-Tabelle mit den Belegdaten
*&---------------------------------------------------------------------*
FORM upload_data .

  DATA: l_buf      TYPE string,
        l_tabix    TYPE sy-tabix,
        l_msg(200) TYPE c.

  CLEAR data_tab[].

  CALL FUNCTION 'FAA_FILE_UPLOAD_EXCEL'
    EXPORTING
      i_filename           = pa_fnam
      i_delimiter          = gc_delimiter
    TABLES
      et_filecontent       = data_tab
    EXCEPTIONS
      error_accessing_file = 1
      OTHERS               = 2.

  IF sy-subrc <> 0.
    MESSAGE i600(fr) WITH 'Fehler' sy-subrc 'beim Upload'.
  ELSE.
    CONCATENATE TEXT-001 pa_fnam INTO l_msg SEPARATED BY space.
    PERFORM msg_add_free_text USING l_msg.
  ENDIF.

  LOOP AT data_tab INTO l_buf.
    IF sy-tabix = 5.
      SPLIT l_buf AT gc_delimiter INTO
            gs_doc-bukrs
            gs_doc-blart
            gs_doc-bldat
            gs_doc-budat
            gs_doc-bumon
            gs_doc-bktxt
            gs_doc-waers
            gs_doc-ldgrp
            gs_doc-ukurs
            gs_doc-umdat
            gs_doc-xblnr
            gs_doc-pargb.
    ENDIF.
    IF sy-tabix GE 9.
      SPLIT l_buf AT gc_delimiter INTO
            gs_item-bukrs
            gs_item-hkont
            gs_item-sgtxt
            gs_item-wrsol
            gs_item-wrhab
            gs_item-dmbtr
            gs_item-dmbe2
            gs_item-mwskz
            gs_item-txjcd
            gs_item-kostl
            gs_item-prctr
            gs_item-aufnr
            gs_item-ps_posid
            gs_item-valut
            gs_item-hbkid
            gs_item-hktid
            gs_item-zuonr
            gs_item-vbund.
      APPEND gs_item TO git_items.
    ENDIF.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form INIT_PROTOCOL
*&---------------------------------------------------------------------*
*& Anwendungsprotokoll aufbauen
*&---------------------------------------------------------------------*
FORM init_protocol .

* create a log
  g_s_log-extnumber = 'Beleg-Upload'(ext).
  CALL FUNCTION 'BAL_LOG_CREATE'
    EXPORTING
      i_s_log      = g_s_log
    IMPORTING
      e_log_handle = g_log_handle
    EXCEPTIONS
      OTHERS       = 1.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.

*--------------------------------------------------------------------
* FORM ADD_MSG_TO_PROT
*--------------------------------------------------------------------
FORM add_msg_to_prot.

  DATA:
    l_s_msg   TYPE bal_s_msg,
    l_context TYPE bal_s_ex01.

  DATA:
    l_s_return  LIKE LINE OF git_return.

  LOOP AT git_return INTO l_s_return.

*   define data of message for Application Log
    l_s_msg-msgty           = l_s_return-type.
    l_s_msg-msgid           = l_s_return-id.
    l_s_msg-msgno           = l_s_return-number.
    l_s_msg-msgv1           = l_s_return-message_v1.
    l_s_msg-msgv2           = l_s_return-message_v2.
    l_s_msg-msgv3           = l_s_return-message_v3.
    l_s_msg-msgv4           = l_s_return-message_v4.

* add this message to log file
    CALL FUNCTION 'BAL_LOG_MSG_ADD'
      EXPORTING
*       I_LOG_HANDLE  =
        i_s_msg       = l_s_msg
      EXCEPTIONS
        log_not_found = 0
        OTHERS        = 1.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
  ENDLOOP.

ENDFORM.

FORM log_display.
  DATA:
    l_s_display_profile TYPE bal_s_prof,
    l_s_fcat            TYPE bal_s_fcat.

* get standard display profile
  CALL FUNCTION 'BAL_DSP_PROFILE_SINGLE_LOG_GET'
    IMPORTING
      e_s_display_profile = l_s_display_profile
    EXCEPTIONS
      OTHERS              = 1.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

* for display variants add report id
  l_s_display_profile-disvariant-report = sy-repid.
* when you use also other ALV lists in your report,
* please specify a handle to distinguish between the display
* variants of these different lists, e.g:
  l_s_display_profile-disvariant-handle = 'LOG'.

* show log file with modified output profile
* - we specify the display profile since we created our own
* - we do not specify any filter (like I_S_LOG_FILTER, ...,
*   I_T_MSG_HANDLE) since we want to display all messages available
  CALL FUNCTION 'BAL_DSP_LOG_DISPLAY'
    EXPORTING
*     I_S_LOG_FILTER      =
*     I_T_LOG_CONTEXT_FILTER =
*     I_S_MSG_FILTER      =
*     I_T_MSG_CONTEXT_FILTER =
*     I_T_LOG_HANDLE      =
*     I_T_MSG_HANDLE      =
      i_s_display_profile = l_s_display_profile
    EXCEPTIONS
      OTHERS              = 1.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.
*--------------------------------------------------------------------
* FORM MSG_ADD_FREE_TEXT
*--------------------------------------------------------------------
FORM msg_add_free_text USING VALUE(i_text) TYPE c.

* add this message to log file
  CALL FUNCTION 'BAL_LOG_MSG_ADD_FREE_TEXT'
    EXPORTING
*     I_LOG_HANDLE  =
      i_msgty       = 'S'
      i_text        = i_text
    EXCEPTIONS
      log_not_found = 0
      OTHERS        = 1.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form INIT
*&---------------------------------------------------------------------*
*& Initialisierung
*&---------------------------------------------------------------------*
FORM init .
  CLEAR: git_accountgl[],
         git_accounttax[],
         git_currencyamount[],
         git_return[].
  CLEAR g_itemno.
  PERFORM init_protocol.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form POST_DOCUMENT
*&---------------------------------------------------------------------*
*& Beleg buchen
*&---------------------------------------------------------------------*
FORM post_document .

  DATA: l_error TYPE abap_bool VALUE abap_false.

*-----------------------------------------------------------------------
* BAPI-Aufruf
*-----------------------------------------------------------------------
  CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
    EXPORTING
      documentheader = gs_documentheader
    IMPORTING
      obj_type       = g_obj_type
      obj_key        = g_obj_key
      obj_sys        = g_obj_sys
    TABLES
      accountgl      = git_accountgl
      accounttax     = git_accounttax
      currencyamount = git_currencyamount
      return         = git_return.

  LOOP AT git_return TRANSPORTING NO FIELDS
          WHERE type = 'A' OR type = 'E'.
    l_error = abap_true.
  ENDLOOP.
  IF l_error = abap_false.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form CHECK_DOCUMENT
*&---------------------------------------------------------------------*
*& Beleg prüfen
*&---------------------------------------------------------------------*
FORM check_document .
  CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
    EXPORTING
      documentheader = gs_documentheader
    TABLES
      accountgl      = git_accountgl
      accounttax     = git_accounttax
      currencyamount = git_currencyamount
      return         = git_return.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form MAP_DATA
*&---------------------------------------------------------------------*
*& Mapping der Excel-Daten auf BAPI-Strukturen
*&---------------------------------------------------------------------*
FORM map_data .

  DATA: l_netto  TYPE wrbtr,
        l_brutto TYPE wrbtr,
        l_steuer TYPE fwste,
        l_basis  TYPE fwbas.

  DATA: l_mwskz  TYPE skb1-mwskz.
*-----------------------------------------------------------------------
* Belegkopf
*-----------------------------------------------------------------------
  CLEAR gs_documentheader.
  gs_documentheader-bus_act    = 'RFBU'.
  gs_documentheader-username   = sy-uname.
  gs_documentheader-comp_code  = gs_doc-bukrs.
  PERFORM _convert USING gs_doc-bldat gs_documentheader-doc_date   'BLDAT'.
  PERFORM _convert USING gs_doc-budat gs_documentheader-pstng_date 'BUDAT'.
  IF gs_doc-bumon IS NOT INITIAL AND gs_doc-bumon NE space.
    gs_documentheader-fis_period = gs_doc-bumon.
  ENDIF.
  gs_documentheader-ref_doc_no = gs_doc-xblnr.
  gs_documentheader-header_txt = gs_doc-bktxt.
  gs_documentheader-doc_type   = gs_doc-blart.

*-----------------------------------------------------------------------
* Belegpositionen
*-----------------------------------------------------------------------
  LOOP AT git_items INTO gs_item.

    ADD 1 TO g_itemno.
    CLEAR: gs_accountgl, gs_currencyamount.

    gs_accountgl-itemno_acc      = g_itemno.
    PERFORM _convert USING gs_item-hkont gs_accountgl-gl_account 'HKONT'.
    gs_accountgl-item_text       = gs_item-sgtxt.
    IF gs_item-kostl IS NOT INITIAL.
      PERFORM _convert USING gs_item-kostl gs_accountgl-costcenter 'KOSTL'.
    ENDIF.
    IF gs_item-prctr IS NOT INITIAL.
      PERFORM _convert USING gs_item-prctr gs_accountgl-profit_ctr 'PRCTR'.
    ENDIF.
    IF gs_item-aufnr IS NOT INITIAL.
      PERFORM _convert USING gs_item-aufnr gs_accountgl-orderid 'AUFNR'.
    ENDIF.
    IF gs_item-ps_posid IS NOT INITIAL.
      PERFORM _convert USING gs_item-ps_posid gs_accountgl-wbs_element 'PS_POSID'.
    ENDIF.
    gs_accountgl-alloc_nmbr      = gs_item-zuonr.
    gs_accountgl-trade_id        = gs_item-vbund.
    gs_accountgl-tax_code        = gs_item-mwskz.
    IF gs_item-valut IS NOT INITIAL.
      PERFORM _convert USING gs_item-valut gs_accountgl-value_date 'VALUT'.
    ENDIF.

    IF gs_item-wrsol IS NOT INITIAL.
      PERFORM _convert USING gs_item-wrsol l_brutto 'WRBTR'.
    ENDIF.
    IF gs_item-wrhab IS NOT INITIAL.
      PERFORM _convert USING gs_item-wrhab l_brutto 'WRBTR'.
      MULTIPLY l_brutto BY -1.
    ENDIF.

*   Sachkonto mit Steuer zu bebuchen
    CLEAR l_mwskz.
    SELECT SINGLE mwskz FROM skb1 INTO l_mwskz
            WHERE saknr = gs_accountgl-gl_account
              AND bukrs = gs_documentheader-comp_code.
    IF sy-subrc = 0 AND l_mwskz IS INITIAL.
      "keine Steuer erlaubt --> St. KZ. löschen (Verhalten analog FIORI-App)
      CLEAR: gs_item-mwskz, gs_accountgl-tax_code.
    ENDIF.

    CLEAR: l_steuer, l_netto, l_basis.
*   Mit Steuer?
    IF gs_item-mwskz IS NOT INITIAL.
      IF l_mwskz = '>' OR l_mwskz = '<'.  "Direct Tax
        CALL FUNCTION 'RE_CALCULATE_BASE_AMOUNT'
          EXPORTING
            i_taxam = l_brutto
            i_mwskz = gs_item-mwskz
            i_waers = gs_doc-waers
            i_bukrs = gs_documentheader-comp_code
          IMPORTING
            e_fwbas = l_basis.
        l_steuer = l_netto = l_brutto.
      ELSE.
        CALL FUNCTION 'CALCULATE_TAX_FROM_GROSSAMOUNT'
          EXPORTING
            i_bukrs = gs_documentheader-comp_code
            i_mwskz = gs_item-mwskz
            i_waers = gs_doc-waers
            i_wrbtr = l_brutto
          IMPORTING
            e_fwste = l_steuer
          EXCEPTIONS
            OTHERS  = 16.

        IF sy-subrc <> 0.
          MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO g_dummy.
          PERFORM msg_add USING probclass_high.
        ENDIF.
        l_netto = l_brutto - l_steuer.
        l_basis = l_netto.
      ENDIF.

*-----------------------------------------------------------------------
*     korrespondierende Steuerzeile sammeln
*-----------------------------------------------------------------------
      CLEAR gs_taxitem.
      gs_taxitem-mwskz  = gs_item-mwskz.
      gs_taxitem-steuer = l_steuer.
      gs_taxitem-basis  = l_basis.
      IF l_mwskz = '>' OR l_mwskz = '<'.  "Direct Tax
        gs_taxitem-direct_tax = abap_true.
      ELSE.
        gs_taxitem-direct_tax = abap_false.
      ENDIF.
      COLLECT gs_taxitem INTO git_taxitems.

    ELSE.
      l_netto = l_brutto.
    ENDIF.

    IF NOT ( l_mwskz = '>' OR l_mwskz = '<' ).  "Direct Tax
      gs_currencyamount-itemno_acc = gs_accountgl-itemno_acc.
      gs_currencyamount-currency   = gs_doc-waers.
      gs_currencyamount-amt_doccur = l_netto.

      APPEND: gs_accountgl      TO git_accountgl,
              gs_currencyamount TO git_currencyamount.
    ENDIF.

  ENDLOOP.

*-----------------------------------------------------------------------
*     gesammelte Steuerzeilen aufbereiten und anhängen
*-----------------------------------------------------------------------
  LOOP AT git_taxitems INTO gs_taxitem.
    ADD 1 TO g_itemno.
    CLEAR: gs_accounttax, gs_currencyamount.
    gs_accounttax-itemno_acc     = g_itemno.
    gs_accounttax-tax_code       = gs_taxitem-mwskz.
    gs_accounttax-direct_tax     = gs_taxitem-direct_tax.
    gs_currencyamount-itemno_acc = gs_accounttax-itemno_acc.
    gs_currencyamount-currency   = gs_doc-waers.
    gs_currencyamount-amt_doccur = gs_taxitem-steuer.
    gs_currencyamount-amt_base   = gs_taxitem-basis.

    APPEND: gs_accounttax     TO git_accounttax,
            gs_currencyamount TO git_currencyamount.
  ENDLOOP.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form _CONVERT
*&---------------------------------------------------------------------*
*& Daten ins SAP-Format konvertieren
*&---------------------------------------------------------------------*
*&      --> in/out Ein/Ausgabe
*&      --> Dtel   Datenelement
*&---------------------------------------------------------------------*
FORM _convert  USING    in out VALUE(dtel).

  CALL FUNCTION 'RS_CONV_EX_2_IN_DTEL'
    EXPORTING
      input_external  = in
      dtel            = dtel
    IMPORTING
      output_internal = out.

  IF sy-subrc <> 0.
    MESSAGE a600(fr) WITH 'Fehler' sy-subrc 'bei der Konvertierung' dtel.
  ENDIF.

ENDFORM.

*--------------------------------------------------------------------
* FORM MSG_ADD
*--------------------------------------------------------------------
FORM msg_add USING VALUE(i_probclass) TYPE bal_s_msg-probclass.
  DATA:
    l_s_msg TYPE bal_s_msg.

* define data of message for Application Log
  l_s_msg-msgty     = sy-msgty.
  l_s_msg-msgid     = sy-msgid.
  l_s_msg-msgno     = sy-msgno.
  l_s_msg-msgv1     = sy-msgv1.
  l_s_msg-msgv2     = sy-msgv2.
  l_s_msg-msgv3     = sy-msgv3.
  l_s_msg-msgv4     = sy-msgv4.
  l_s_msg-probclass = i_probclass.

* add this message to log file
  CALL FUNCTION 'BAL_LOG_MSG_ADD'
    EXPORTING
*     I_LOG_HANDLE  =
      i_s_msg       = l_s_msg
    EXCEPTIONS
      log_not_found = 0
      OTHERS        = 1.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.

Hinweise zur Installation:

Textelemente:

001    Verarbeitung der Datei
B01    Excel-Datei auswählen
B02    Testlauf ohne Buchen

Selektionstexte:

PA_FNAM    Name der Datei
PA_TEST    Testlauf - nur prüfen

 

Link zur Excel-Vorlage, die mit dem oben stehenden Programm verarbeitet werden kann.

https://drive.google.com/open?id=13XQEsF9yEa1wv6DE6SPn5zPNm8D9p9n-

Hinweis: die Vorlage ist an das Template für die S/4-FIORI-App "Hauptbuchbelege hochladen" angepasst. Es versteht sich wohl von selbst, dass Anpassungen am Programm gemacht werden müssen, wenn das Template abgeändert wird.

Excel-Template

Excel-Template

Kommentare

Kontenfindung für buchungskreisübergreifende CO Umlagen

Veröffentlicht am 15. Januar 2019 von sapmandoo in CO, S4

Grundsätzlich ist ja möglich, CO Umlagen buchungskreisübergreifend zu definieren, wenn die beteiligten Buchungskreise einem Kostenrechnungskreis zugeordnet sind. Dabei werden ohne weiteres Zutun die im Rahmen der CO-FI Integration im Customizing der Finanzbuchhaltung hinterlegten Buchnungskreisverrechnungskonten (Vorgang BUV) angebucht. Dies ist nicht immer gewünscht, weil Umlagen im CO zumeist nur interne Werteflüsse abbilden und keine echten Intercompany-Geschäftsvorfälle darstellen. 

In den Hinweisen 2483347 bzw. 2457163 wird das Vorgehen beschrieben, wie für Umlagekostenarten eine dedizierte Kontenfindung abseits der 'normalen' Buchungskreisverrechnungskonten eingestellt werden kann.

Kommentare

Tarifierung mit BAPI analog zur KP26

Veröffentlicht am 11. Dezember 2018 von sapmandoo in CO

Die Planung von Leistungserbringungen und Tarifen erfolgt im Dialog mithilfe der KP26. In einigen Planungsszenarien stellt sich die Aufgabe, externe Daten ins SAP-System zu laden. Hierfür können verschiedene Importszenarien verwendet werden, u.a. der Upload via BAPI BAPI_COSTACTPLN_POSTACTOUTPUT.

Die Schnittstelle des BAPIs ist dabei nicht gerade ein Ausbund an selbsterklärender Offenherzigkeit, deshalb nachfolgend ein Mustercoding sowohl für periodische als auch Gesamt-Planung. 

Das nachfolgende Coding habe ich auf einem S/4 HANA on premise (1709)  getestet, es sollte aber auch auf älteren Releases lauffähig sein.

*&---------------------------------------------------------------------*
*& Report ZTEST_KP26
*&---------------------------------------------------------------------*
*& KP26 tariff planning
*&---------------------------------------------------------------------*
REPORT ztest_kp26.

DATAit_actout_index    LIKE bapiacpstru OCCURS WITH HEADER LINE.
DATAit_actout_pervalue LIKE bapiacpval  OCCURS WITH HEADER LINE.
DATAit_actout_totvalue LIKE bapiacptot  OCCURS WITH HEADER LINE.
DATAit_actout_object   LIKE bapiacpobj  OCCURS WITH HEADER LINE.
DATAit_return          LIKE bapiret2    OCCURS WITH HEADER LINE.
DATArec_headerinfo     LIKE bapiplnhdr.
DATAfp_error(1TYPE c.

" Object index / value index:
" You can post several objects/values at once (with one BAPI call).
" Please make sure, that object and value key correspond in object
" and value tables...
DATAgw_objcnt(6TYPE n,
      gw_valcnt(6TYPE n.

PARAMETERSp_tariff LIKE bapiacpval-price_var_per01 OBLIGATORY,
            p_kokrs  LIKE rec_headerinfo-co_area OBLIGATORY,
            p_kostl  LIKE it_actout_object-costcenter OBLIGATORY,
            p_lstar  LIKE it_actout_object-acttype OBLIGATORY,
            p_year   LIKE rec_headerinfo-fisc_year OBLIGATORY,
            p_from   LIKE rec_headerinfo-period_from OBLIGATORY,
            p_to     LIKE rec_headerinfo-period_to OBLIGATORY,
            p_versn  LIKE rec_headerinfo-version OBLIGATORY.
PARAMETERSp_tot RADIOBUTTON GROUP r1 DEFAULT 'X',    "totals planning
            p_per RADIOBUTTON GROUP r1.                "periodic planning

START-OF-SELECTION.
  IF p_per 'X'.
    PERFORM make_bapi_data_for_actout_per.
  ELSE.
    PERFORM make_bapi_data_for_actout_tot.
  ENDIF.

*&---------------------------------------------------------------------*
* TOTALS
*&---------------------------------------------------------------------*
FORM make_bapi_data_for_actout_tot.

* init. variables
  CLEARgw_objcntgw_valcnt.

* header data
  CLEARrec_headerinfo.
  rec_headerinfo-co_area       p_kokrs.        "Controlling area
  rec_headerinfo-fisc_year     p_year.         "Fiscal year
  rec_headerinfo-period_from   p_from.         "From period
  rec_headerinfo-period_to     p_to.           "To period
  rec_headerinfo-version       p_versn.        "Version
  rec_headerinfo-plan_currtype 'C'.            "Planning Currency

  ADD TO gw_objcnt.

* object list (cost center/activity type or business process)
  CLEARit_actout_object.
  it_actout_object-costcenter   p_kostl.       "Costcenter
  it_actout_object-acttype      =  p_lstar.      "act. type
  it_actout_object-object_index gw_objcnt.     "Object Index
  APPEND it_actout_object.

  ADD TO gw_valcnt.

* plan values totals
  CLEARit_actout_totvalue.
* check structure of table for other values such as quantities, capacities...
  it_actout_totvalue-value_index        gw_valcnt.       "Value Index
  it_actout_totvalue-price_unit         1.               "price unit
  it_actout_totvalue-price_var          p_tariff.        "var. tariff
  it_actout_totvalue-currency           'EUR'.
  it_actout_totvalue-dist_key_price_var '2'.             "distr.key
  APPEND it_actout_totvalue.

* assignment of objects, values and control data
  "the items given in the object and value tables are linked by  the index value
  "this is important, if you want to plan multiple objects with one BAPI call
  CLEARit_actout_index.
  it_actout_index-object_index gw_objcnt.          "Object Index
  it_actout_index-value_index  gw_valcnt.          "Value Index
  APPEND it_actout_index.

  CALL FUNCTION 'BAPI_COSTACTPLN_POSTACTOUTPUT'
    EXPORTING
      headerinfo     rec_headerinfo
    TABLES
      indexstructure it_actout_index
      coobject       it_actout_object
      totvalue       it_actout_totvalue
      return         it_return.

  IF it_return[] IS INITIAL.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait 'X'.
  ELSE.
    fp_error 'X'.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ENDIF.

ENDFORM.                    " MAKE_BAPI_DATA_FOR_ACTOUT

*&---------------------------------------------------------------------*
* PERIODIC VALUES
*&---------------------------------------------------------------------*
FORM make_bapi_data_for_actout_per .

* init. variables
  CLEARgw_objcntgw_valcnt,
         it_actout_index[],    it_actout_object[],
         it_actout_pervalue[].

* header data
  CLEARrec_headerinfo.
  rec_headerinfo-co_area       p_kokrs.        "Controlling area
  rec_headerinfo-fisc_year     p_year.         "Fiscal year
  rec_headerinfo-period_from   p_from.         "From period
  rec_headerinfo-period_to     p_to.           "To period
  rec_headerinfo-version       p_versn.        "Version
  rec_headerinfo-plan_currtype 'C'.            "Planning Currency

  ADD TO gw_objcnt.

*  object list (cost center/activity type or business process)
  CLEARit_actout_object.
  it_actout_object-costcenter   p_kostl.       "Costcenter
  it_actout_object-acttype      =  p_lstar.      "act. type
  it_actout_object-object_index gw_objcnt.     "Object Index
  APPEND it_actout_object.

  ADD TO gw_valcnt.

* plan values per period
  CLEARit_actout_pervalue.
* check structure of table for other values such as quantities, capacities...
  it_actout_pervalue-value_index   gw_valcnt.       "Value Index
  it_actout_pervalue-price_unit_per01 1.            "price unit per.
  it_actout_pervalue-price_unit_per02 1.
  it_actout_pervalue-price_unit_per03 1.
  it_actout_pervalue-price_unit_per04 1.
  it_actout_pervalue-price_unit_per05 1.
  it_actout_pervalue-price_unit_per06 1.
  it_actout_pervalue-price_unit_per07 1.
  it_actout_pervalue-price_unit_per08 1.
  it_actout_pervalue-price_unit_per09 1.
  it_actout_pervalue-price_unit_per10 1.
  it_actout_pervalue-price_unit_per11 1.
  it_actout_pervalue-price_unit_per12 1.
  it_actout_pervalue-price_var_per01 p_tariff.     "var. tariff per.
  it_actout_pervalue-price_var_per02 p_tariff.
  it_actout_pervalue-price_var_per03 p_tariff.
  it_actout_pervalue-price_var_per04 p_tariff.
  it_actout_pervalue-price_var_per05 p_tariff.
  it_actout_pervalue-price_var_per06 p_tariff.
  it_actout_pervalue-price_var_per07 p_tariff.
  it_actout_pervalue-price_var_per08 p_tariff.
  it_actout_pervalue-price_var_per09 p_tariff.
  it_actout_pervalue-price_var_per10 p_tariff.
  it_actout_pervalue-price_var_per11 p_tariff.
  it_actout_pervalue-price_var_per12 p_tariff.
  it_actout_pervalue-currency 'EUR'.
  APPEND it_actout_pervalue.

* assignment of objects, values and control data
  CLEARit_actout_index.
  it_actout_index-object_index gw_objcnt.          "Object Index
  it_actout_index-value_index  gw_valcnt.          "Value Index
  APPEND it_actout_index.

  CALL FUNCTION 'BAPI_COSTACTPLN_POSTACTOUTPUT'
    EXPORTING
      headerinfo     rec_headerinfo
    TABLES
      indexstructure it_actout_index
      coobject       it_actout_object
      pervalue       it_actout_pervalue
      return         it_return.

  IF it_return[] IS INITIAL.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait 'X'.
  ELSE.
    fp_error 'X'.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ENDIF.

ENDFORM.                    " MAKE_BAPI_DATA_FOR_ACTOUT

Eingabewerte BAPI

Eingabewerte BAPI

Kommentare

Konfiguration Umsatzsteuermeldung DE

Veröffentlicht am 26. September 2018 von sapmandoo in FI

Ich habe aktuell im Netz nur wenig brauchbare Konfigurationsvorschläge für die elektronische Umsatzsteuermeldung gefunden. Dies umfasst einerseits die verwendeten Steuerkennzeichen und zum anderen die Zuordnung zur entsprechenden Gruppennummer im Formular.

Deshalb nachfolgend ein Konfigurationsvorschlag für die USTVA Stand 2018...

 

Steuerkennzeichen definieren (FTXP)

St.Kz.TextSt.ArtEG-Kennz.
A0Kein SteuervorgangA 
A1Ausgangssteuer 19%A 
A2Ausgangssteuer Inland  7%A 
A6Ausgangssteuer 0% EG-WarenlieferungA1
A8Ausgangssteuer Inland steuerbar steuerfreiA 
A9Ausgangssteuer Ausland steuerbar steuerfr.A 
ABNicht steuerbare sonstige LeistungA1
ACÜbrige nicht steuerbare UmsätzeA 
ADAusgangssteuer innergemein. DreiecksgeschäftA1
ARÜbrige steuerpflichtige Umsätze nach $13b USt A. 5A 
B9Steuerfreie Umsätze neue Fahrzeuge an AbnehmerA 
E1Erwerbssteuer 19% EG-WarenlieferungV9
E2Erwerbssteuer  7% EG-WarenlieferungV9
E3Erwerbssteuer 19% EG-LohnveredelungV9
F1Reverse Charge §13b, Abs. 1 UStGV5
F2Reverse Charge §13b, Abs. 2, Nr. 1+5 UStGV5
F3Reverse Charge §13b, Abs. 2, Nr. 2+3 UStGV5
F4Reverse Charge §13b, Abs. 2, Nr. 4, 6ff. UStGV5
U1Einfuhrumsatzsteuer 19 %V 
V0Kein SteuervorgangV 
V1Vorsteuer Inland 19%V 
V2Vorsteuer Inland  7%V 
V9Vorsteuer Ausland steuerbar steuerfreiV 

Die blau markieren Einträge sind selbst definierte Steuerkennzeichen, wohingegen die übrigen der SAP-Auslieferung entnommen sind.

Die Zuordnung der Steuerkennzeichen zu den einzelnen Zeilen des USTVA-Formulars stellt sich wie folgt dar:

Zuordnung Steuerkennzeichen zur Zeile im Formular (Seite 1)

Zuordnung Steuerkennzeichen zur Zeile im Formular (Seite 1)

Zuordnung Steuerkennzeichen zur Zeile im Formular (Seite 2)

Zuordnung Steuerkennzeichen zur Zeile im Formular (Seite 2)

Nachfolgend werden die entsprechenden Einstellungen im Customizing skizziert, welche oben stehende Zuordnung abbilden.

Zunächst muss eine Steuergruppenversion zum entsprechenden Gültigkeitsdatum angelegt werden.

IMG - Finanzwesen - Hauptbuchhaltung - Periodische Arbeiten - Melden - Umsatzsteuermeldung - Steuergruppenversion zeitabhängig zuordnen...

 

Steuergruppenversionen
LandGültig abSteuergruppenversion
DE1.1.2018EDCL

In bestehenden Systemen wird die Version EDCL bereits vorhanden sein. In diesem Fall ist eine neue Version anzulegen.

Steuerbasissaldengruppierung

IMG - Finanzwesen - Hauptbuchhaltung - Periodische Arbeiten - Melden - Umsatzsteuermeldung - Steuerbasissalden gruppieren...

 

 

LndVersionStVorSaldoGrpNr
DEEDCLA1MWS 81
DEEDCLA2MWS 86
DEEDCLA3MWS 36
DEEDCLA6MWS 41
DEEDCLA8MWS 48
DEEDCLA9MWS 43
DEEDCLABMWS 21
DEEDCLACMWS 45
DEEDCLADMWS 42
DEEDCLARMWS 60
DEEDCLB9MWS 44
DEEDCLE1ESA 89
DEEDCLE2ESA 93
DEEDCLE3MWS 46
DEEDCLF2ESA 67
DEEDCLF2ESA 73
DEEDCLF3ESA 67
DEEDCLF4ESA 84
DEEDCLU1MWS 62

Steuersalden gruppieren

IMG - Finanzwesen - Hauptbuchhaltung - Periodische Arbeiten - Melden - Umsatzsteuermeldung - Steuersalden gruppieren...

 

LndVersionStVorSaldoGrpNr
DEEDCLE1ESE 67
DEEDCLE2ESE 67
DEEDCLV1VST 66
DEEDCLV2VST 66
DEEDCLV3VST 66

Hinweis für den Druck der USTVA

In einigen Fällen besteht die Anforderung, die Steuer- und Steuerbasisbeträge zu drucken. Hierfür wird zuweilen der Report RFUVDE00 verwendet (Details zur Konfiguration des Drucks s. Report-Doku). Bitte beachtet dabei, dass dieser Report die Zuordnung von Steuerkennzeichen zu Gruppennummern immer mit der Steuergruppenversion initial nachliest, d.h. hier ist ggf. das Customizing entsprechend anzugleichen. 

Kommentare
<< < 1 2 3 4 5 6 7 8 > >>