Overblog Alle Blogs
Folge diesem Blog Administration + Create my blog
MENU
Werbung
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.

fi

Verfügbarkeitskontrolle - Mail an Verantwortlichen

Veröffentlicht am 12. Februar 2024 von sapmandoo in Basis-Entwicklung allg., FI, CO

Wer schon mal im Customizing der Budgetierung, speziell im Bereich der Verfügbarkeitskontrolle unterwegs war (z.B. im Kontext Projektcontrolling oder Investitionsmanagement), wird beim Einstellen der Toleranzen festgestellt haben, dass man bei Überschreitung einer gewissen Budget-Ausschöpfung die Auswahl zwischen drei System-Aktionen hat:

  • Warnung
  • Fehlermeldung
  • Warnung mit Mail an den Verantwortlichen

 

Customizing Toleranzen / Budget Verfügbarkeitskontrolle

Customizing Toleranzen / Budget Verfügbarkeitskontrolle

Beim Punkt "Warnung mit Mail an Verantwortlichen" kamen (zumindest bei mir) etliche Fragen auf, z.B.:

  • Wer ist dieser Verantwortliche in diesem Zusammenhang?
  • Wohin wird die Mail eigentlich geschickt?
  • Was steht da genau drin?
  • Kann man das irgendwie beeinflussen?
  • Warum habe ich nix anständiges gelernt...?
Der "Verantwortliche"...

Der für das jeweilige PSP-Element bzw. für den Innenauftrag Verantwortliche wird in den Stammdaten zugeordnet. Während bei den Innenaufträgen direkt der entsprechende SAP-User im Feld "Verantwortlicher Benutzer" eingetragen wird...

... wird beim PSP-Element der Verantwortliche mit Schlüssel und Klarnamen im Customizing definiert und dort der korrespondierende SAP-User zugeordnet.

Im Stammsatz des PSP-Elementes selbst, wird dann der Schlüssel hinterlegt:

 

Für den Fall, dass man im Customizing der Toleranzen die Aktion "Warnung mit Mail an Verantwortlichen" ausgewählt hat aber zu einem Objekt KEIN Verantwortlicher gepflegt ist, wird aus der Warnung eine Fehlermeldung (natürlich ohne Mail, an wen auch...?).

 

Standard-Benachrichtigung

Ohne weiteres Zutun wird die "Mail" als interne SAP-Office-Nachricht an den Business Workplace des jeweiligen verantwortlichen SAP-User gesendet.

Die Nachricht ist dabei wie folgt aufgebaut:

Das funktioniert soweit gut, d.h. wem das genügt, braucht hier nichts weiter einzustellen. Vermutlich wird man sich jedoch einigen weitergehenden Anforderungen gegenüber sehen, z.B. den Inhalt oder Betreff der Mail zu beeinflussen oder die Nachricht als "richtige" Mail an ein externes Mail-System zu senden. 

Einflussnahme

Per Customizing geht hier leider nix. Aber es gibt eine SAP-Erweiterung, mit der man z.B. die Mail-Adressaten überschreiben und die interne Nachricht in eine externe Mail "umwandeln" kann.

Zudem gibt es einen Userexit, mit dem gewisse Eigenschaften der Mail verändert werden können. So kann z.B. ein Verfallsdatum hinzugefügt oder der Betreff angepasst werden. Der Inhalt, d.h. der Text der Mail ist leider ohne Modifikation nicht beeinflussbar, dazu aber später mehr. 

SAP-Erweiterung zur Bestimmung des/der Mailempfänger/s

 

SMOD-Erweiterung

Funktionsexit

Beschreibung

SAPLBPFC

EXIT_SAPLBPFC_001

User-Exit: Mailempfänger bestimmen (Details s. Funktionsbaustein-Dokumentation

Beispiel-Coding:

 

*&---------------------------------------------------------------------*
*& Include          ZXBPFCU01
*&---------------------------------------------------------------------*
* in standard, the message will be sent to the business workplace of
* the SAP user, that is assigned as responsible for the PSP
* element or internal order. We want to send the warning mail
* to the responsible user's regular mail account (e.g. Outlook)

DATA: lt_return  TYPE TABLE OF bapiret2,
      lt_addsmtp TYPE TABLE OF bapiadsmtp.

* In case, responsible in the master data of the PSP element or
* int. order is not maintained, this table is empty and an error
* message will be thrown in the calling application.
CHECK t_mail_receivers[] IS NOT INITIAL.

* As only one responsible can be assigned, we take the first entry
READ TABLE t_mail_receivers INDEX 1 ASSIGNING FIELD-SYMBOL(<ls_mail_receiver>).
CHECK sy-subrc = 0 AND <ls_mail_receiver> IS ASSIGNED.

* Now we replace the SAP-User with the external EMail address. We retrieve
* that from their user data.

* Switch recipient adress type to external email address:
<ls_mail_receiver>-recesc = 'U'.

* Retrieve & set Email-Adress
CALL FUNCTION 'BAPI_USER_GET_DETAIL'
  EXPORTING
    username = <ls_mail_receiver>-recnam
  TABLES
    return   = lt_return
    addsmtp  = lt_addsmtp.

CHECK lt_addsmtp[] IS NOT INITIAL.
READ TABLE lt_addsmtp INDEX 1 ASSIGNING FIELD-SYMBOL(<ls_addsmtp>).
IF sy-subrc = 0 AND <ls_addsmtp> IS ASSIGNED.
  <ls_mail_receiver>-recextnam = <ls_addsmtp>-e_mail.
ENDIF.

Die Tabelle T_MAIL_RECEIVERS darf dabei auch mehrere Empfänger enthalten. Um bspw. CC oder BCC-Empfänger hinzuzufügen, sind die Tabellenfelder SNDBC (BCC) bzw. SNDCP (CC) des entsprechenden Eintrags mit 'X' zu belegen.

 

Userexit

Im Hinweis 879732 wird ein Userexit beschrieben, mit dem gewisse Mail-Attribute beeinflusst werden können. Nachfolgend einige Coding-Beispiele für typische Anwendungsfälle.

*&---------------------------------------------------------------------*
*& Subroutinenpool ZMAILHDR
*&---------------------------------------------------------------------*
*& Change mail properties for mails created by availability control
*& See SAP-Note 879732 for details
*&---------------------------------------------------------------------*
PROGRAM zmailhdr.

FORM mail_header_adjust
  
CHANGING c_sood1 LIKE sood1.
* Adjust header of mails sent along with warnings
* of availability control.

** Example: Determine an expiry date.
** Option 1 - Expiry date = end of this year.
*  C_SOOD1-DLDAT+0(4) = SY-DATLO(4).
*  C_SOOD1-DLDAT+4(4) = '1231'.
** Option 2 - Expiry date = current date + 4 weeks.
*  C_SOOD1-DLDAT = SY-DATLO + 28.

** Example: Change Mail subject
*  c_sood1-OBJDES = 'My subject'.

ENDFORM.

Mail-Inhalt

Der Inhalt der Mail ist leider nicht ohne Modifikation veränderbar. Es wird hierbei der Langtext der entsprechenden Warnmeldung, die bei der Belegerfassung geworfen wird, verwendet und noch um gewisse hart codierte Bestandteile ergänzt.

Falls es doch jemand anpassen will/muss: Der Zusammenbau des Textes findet im Funktionsbaustein BP_CREATE_MAIL, Zeilen 94ff statt.

Kommentare
Werbung

FEB_BSPROC / FEBA_BANK_STATEMENT - Unterbringung eigener Informationen

Veröffentlicht am 17. Januar 2024 von sapmandoo in Basis-Entwicklung allg., FI

In neueren Releases wird die Nachbearbeitung der elektronischen Kontoauszüge (zumindest bei den noch immer zahlreich vorhandenen Fans des SAP-GUI) gerne mithilfe der Transaktion FEB_BSPROC erledigt. Sie kann zugegebenermaßen nicht alles, was die korrespondierende FIORI-App drauf hat (z.B. die Definition eigener Buchungsregeln während der Bearbeitung), aber sie verrichtet nach wie vor zuverlässig ihren Dienst in vielen Bankbuchhaltungsabteilungen.

Ab und zu wurde ich in der Vergangenheit gefragt, ob kundeneigene Informationen in irgendeiner Form (modifikationsfrei!) in die beliebte GUI-Transaktion integriert bzw. in ihr dargestellt werden können. Daraufhin habe ich mich mal damit beschäftigt und zu meiner Überraschung tatsächlich nur einen BTE gefunden, der in diese Richtung zielt.

Es ist z.B. leider nicht möglich, die Arbeitsliste mit den Einzelsätzen im oberen Bereich der Transaktion um eigene, d.h. nicht in der Tabelle FEBEP vorhandene Felder zu erweitern.

Es ist jedoch möglich, im unteren Abschnitt der Transaktion einen eigenen Reiter mit entsprechendem Subscreen einzufügen, in dem kundeneigene Informationen ermittelt/berechnet und dargestellt werden können (hier als Beispiel "Saldo"):

FEB_BSPROC mit kundeneigenem Tab und Subscreen

 

Dies lässt sich mit dem Business Transaction Event 00002340 (P&S-Schnittstelle) bewerkstelligen.

Informationen zu Implementierung von BTEs finden sich u.a. hier.

Im konkreten Fall wird der Musterfunktionsbaustein zum o.g. BTE (SAMPLE_INTERFACE_00002340) in den Kundennamensraum kopiert und die Exportparameter mit folgenden Daten versorgt: 


  e_dynnr = '0100'.
  e_repid = 'SAPLZBTE'.
  e_appl_tab_title = 'Saldo'.

  gs_febep = i_febep.

 

Inhalte der Exportfelder
e_dynnr Nummer des Subscreen-Dynpros
e_repid Rahmenprogramm der Funktionsgruppe, in der die Z-Kopie des Muster-FuBas angelegt wurde. In ihr sollte der Einfachheit halber auch das genannte Dynpro entwicklelt werden.
e_appl_tab_title Beschriftung des Tabs (s. Grafik oben)

 

Sofern Daten aus der Anwendung zur Bereitstellung der gewünschten Informationen im Subscreen benötigt werden, können diese hier in das globale Gedächtnis der Funktionsgruppe kopiert werden, damit auf diese später im Dynpro zugegriffen werden kann (hier bspw. der Inhalt des aktuell bearbeiteten Einzelsatzes).
 

Der Ausgestaltung des Subscreens sind nun kaum noch Grenzen gesetzt und hängt natürlich von der konkreten Anforderung ab. Ich hatte mal eine Anfrage, bei der es dem Anwender ermöglicht werden sollte, das Hauptbuch während der Bearbeitung mit den bereits verbuchten Auszugspositionen abzustimmen. Hierzu sollte der Saldo des Bankkontos 'realtime' dem Saldo des Kontoauszugs gegenübergestellt werden. Letztendlich ist es hierbei nicht zu einer Umsetzung gekommen, deshalb ist das unten aufgeführte Beispiel noch im "Mock-Up"-Status...

Mock-Up Subscreen
Dynpro 100 - Eigenschaften
Dynpro 100 - Ablauflogik
Dynpro 100 - Process before Output (PBO)

 

Kommentare

ALE Verteilung von Anzahlungsanforderungen

Veröffentlicht am 12. Mai 2022 von sapmandoo in ALE, S4, FI, Basis-Entwicklung allg.

Generell ist die ALE-Schnittstelle für FI-Belege (FIDCC1/2) ziemlich restriktiv, was die Verteilung von Sonderhauptbuchbelegen angeht. Im SAP-Hinweis 114814, Punkt 14. wird darauf explizit eingegangen:

Auszug aus HW 114814:

14. Sonderhauptbuchvorgänge SHBV
-------------------------------

Sonderhauptbuchvorgänge sind:

  • Anzahlungen
  • Anzahlungsanforderungen
  • Wechsel
  • sonstige

Beim SAP-Verteilungsszenario für FI-Belege wird davon ausgegangen, daß es sich bei den dezentralen Sender-Systemen um z.B. Logistik-Systeme handelt. Das zentrale Empfänger-System ist das FI-Buchhaltungssystem, in dem alle operativen Prozesse, wie Zahlen, Mahnen usw., stattfinden.
Unter dieser Voraussetzung erscheint das Buchen von Belegen mit Sonderhauptbuchvorgängen (SHBV), ausgenommen Anzahlungsanforderungen, nur im zentralen System sinnvoll. Mit anderen Worten, es besteht keine Notwendigkeit, SHBV in den dezentralen Systemen zu buchen und per ALE zu versenden.

Deshalb wird im SAP-Standard das Versenden von SHBV aus einem dezentralen System heraus nicht unterstützt.
Ist der Nachrichtentyp FIDCC1 oder FIDCC2 aktiv, ist es zwar möglich, im dezentralen System Belege mit SHBV zu buchen und auch zu versenden (außer Anzahlungsanforderungen), aber es ist nicht gewährleistet, daß im Empfängersystem aus diesem IDoc erfolgreich ein FI-Beleg gebucht werden kann.
Versendet der Anwender trotzdem SHBV aus dem dezentralen System, liegt es in seiner Verantwortung und Kontrolle, daß der SHBV-Beleg im Empfängersystem auch erfolgreich, vollständig und richtig verbucht wird.


Ursachen für eventuell auftretende Fehler sind:

  • Der FI-Beleg und das daraus resultierende IDoc beinhalten u.U. nicht alle notwendigen Felder. Z.B. fehlt für den SHBV 'Wechsel' die Struktur BSED.
  • Die RW-Schnittstelle zum Buchen der IDOC-Belege kann nicht alle SHBV verarbeiten, weil die entsprechenden Felder in den Übergabestrukturen ACCIT usw. fehlen. 'Wechsel' werden beispielsweise im RWIN sofort abgewiesen mit der Fehlermeldung: F5 246 Sonderhauptbuchvorgänge der Klasse W werden nicht unterstützt.

(Technisch: In der RW-Schnittstelle werden SHBV-Belege mit BSEG-UMSKS='W' und BKPF-BSTAT='S' nicht verbucht.)

Allerdings kann man in der Regel bei einer reinen FI-Buchung davon ausgehen, daß beim erfolgreichen Einbuchen eines IDoc-Beleges im Empfängersystem, d.h. wenn keine Fehlermeldung auftritt, der SHBV-Beleg tatsächlich vollständig und richtig verbucht wurde.
So könnte es möglich sein, daß beispielsweise reine FI-Anzahlungen erfolgreich verarbeitet werden können. Anzahlungen mit Zusatzkontierungen, z.B. auf Bestellungen, Anlagen, Aufträge, werden nicht vollständig verbucht.
Bei Bestellungen wird die Bestellhistorie nicht fortgeschrieben. Die Bestellungen werden sofort ausgeglichen, es ist keine Verrechnung möglich.
Bei Anlagen werden keine zusätzlichen Verrechnungszeilen erzeugt.
Bei Aufträgen wird kein Anzahlungs-Obligo fortgeschrieben.
Sollte der Anwender trotzdem SHBV aus dem dezentralen System versenden wollen, sind entsprechende Tests des Anwenders unerläßlich!


Anzahlungsanforderungen können im SAP-Standard nicht per ALE versendet werden.
Es ist wegen der Vielzahl der Möglichkeiten, wie ein Anwender ALE FI verwendet, auch nicht geplant (,weil nicht möglich), dafür eine Standardlösung zu entwickeln.
Allerdings ist es im Rahmen einer Kunden-Projektlösung möglich und wurde auch bereits realisiert, entsprechend der speziellen Konstellation beim Anwender, ein Verteilen von Anzahlungsanforderungen zu ermöglichen (-> SAP Beratung).

 

Genau so eine "Kunden-Projektlösung" zu finden, wie im oben rot markierten Abschnitt erwähnt, war gerade meine Aufgabe in meinem aktuellen Kundenprojekt. Es ist hierbei ein zwei System-Szenario gegeben, d.h. ein bestehendes ECC Logistiksystem soll an ein neues S/4-FI/CO System angebunden werden. Wegen der hohen Lizenzkosten und der begrenzten Lebensdauer dieses Szenarios (das Logistiksystem soll im zweiten Schritt ebenfalls in das S/4-System einziehen) wurde der von der SAP favorisierte Central Finance (CFIN) Ansatz verworfen und stattdessen auf ALE-Verteilung gesetzt. Dabei wurden die bekannten Restriktionen, was u.a. SHB-Vorgänge angeht, evaluiert und in Kauf genommen.

Was jedoch (kreditorische) Anzahlungsanforderungen angeht, musste ein Workaround her, da diese Vorgänge zum Teil vom Rechnungsworkflow-System, welches wiederum an das ECC Logistiksystem angebunden ist, ausgelöst werden. D.h., wir mussten einen Weg finden, die Anzahlungsanforderungen am "Türsteher" vorbeizukriegen, damit diese Merkposten vom ECC ans S/4-System verteilt werden, weil dort logischerweise der Zahllauf stattfindet.

 Die Schwierigkeit bei einem komplexen System wie SAP ist, erstmal die Tür zu finden, um im Endeffekt den Türsteher zu lokalisieren. Damit Euch die Suche erspart bleibt, hier die (mir bekannten) Türsteher:

1. Funktionsbaustein FI_IDOC_UPDATE, Zl. 96ff.:

  IF NOT T_BKPF-BSTAT IS INITIAL.
      CHECK X_GLFLEX_ACTIVE = 'X' AND "NewGL ist aktiv
            T_BKPF-BSTAT    = 'L'.    "Buchung in nicht führendes Ledger
  ENDIF.

 

Bei Belegen mit Belegstatus ungleich leer, werden hier nur solche durchgelassen, die den Belegstatus L (Ledgerspezifische Buchung bei aktivem NewGL) tragen. D.h., Merkposten mit Belegstatus S, wozu ja auch die Anzahlungsanforderungen gehören, haben hier keine Chance. 

Um die Tür auch für Merkposten aufzumachen, muss diese Stelle geeignet modifiziert werden, z.B. so:  

IF NOT T_BKPF-BSTAT IS INITIAL.    
   if not ( t_bkpf-bstat = 'S' and line_exists( t_bseg[ umsks = 'A' ] ) ). "<<<<INSERT
   CHECK X_GLFLEX_ACTIVE = 'X' AND "NewGL ist aktiv
            T_BKPF-BSTAT    = 'L'.    "Buchung in nicht führendes Ledger
   ENDIF.     "<<<<INSERT                                                             
 ENDIF.

2. Funktionsbaustein FI_IDOC_PREPARE, Zl. 260ff.:

* Belegstatus prüfen (keine Muster-, Dauerbuchungsurbelege versenden)
    IF NOT t_bkpf-bstat IS INITIAL.
      IF x_send_c3 = 'X'.
        CHECK x_glflex_active = 'X' AND "NewGL ist aktiv
              ( t_bkpf-bstat    = 'L' OR t_bkpf-bstat    = 'S' ).    "Buchung in nicht führendes Ledger + Anzahlungsanf.
      ELSE.
        CHECK x_glflex_active = 'X' AND "NewGL ist aktiv
              t_bkpf-bstat    = 'L'.    "Buchung in nicht führendes Ledger
      ENDIF.
    ENDIF. 

 

Anzahlungsanforderungen (BKPF-BSTAT = 'S') werden hier nur durchgelassen, wenn NewGL aktiv ist und der NewGL-Nachrichtentyp FAGLDT01 verwendet wird. Um Merkposten auch bei nicht aktivem NewGL und Verwendung der Nachrichtentypen FIDCC1 bzw. FIDCC2 zu verteilen, muss der o.g. Abschnitt entsprechend modifiziert werden z.B. so:

* Belegstatus prüfen (keine Muster-, Dauerbuchungsurbelege versenden)
    IF NOT t_bkpf-bstat IS INITIAL.
    if not ( t_bkpf-bstat = 'S' and line_exists( t_bseg[ umsks = 'A' ] ) ). "<<<<INSERT
      IF x_send_c3 = 'X'.
        CHECK x_glflex_active = 'X' AND "NewGL ist aktiv
              ( t_bkpf-bstat    = 'L' OR t_bkpf-bstat    = 'S' ).    "Buchung in nicht führendes Ledger + Anzahlungsanf.
      ELSE.
        CHECK x_glflex_active = 'X' AND "NewGL ist aktiv
              t_bkpf-bstat    = 'L'.    "Buchung in nicht führendes Ledger
      ENDIF.
    endif.    "<<<<INSERT
    ENDIF. 

Wie im eingangs erwähnten SAP-Hinweis beschrieben, müssen solche Eingriffe in die Verteilungslogik natürlich umfänglich getestet werden. Ich habe allerdings zumindest bei der Verteilung von Anzahlungsanforderungen bisher keine unerwünschten Seiteneffekte feststellen können.

Kommentare

Replikation von bereits gebuchten Belegen per ALE

Veröffentlicht am 28. Januar 2021 von sapmandoo in Basis-Entwicklung allg., FI, ALE

Öfter habe ich in letzter Zeit in einschlägigen Foren Anfragen bezüglich einer Möglichkeit gelesen, bereits gebuchte Belege per ALE in ein anderes System zu replizieren. Ohne weiteres ist dies ja nur für neu gebuchte Belege nach der Einrichtung des entsprechenden ALE-Verteilungsszenarios möglich. SAP ruft hierzu im Standard-Ablauf den Funktionsbaustein FI_IDOC_CREATE_FIDCC2 auf. 

Mithilfe eines kundeneigenen Programms kann dieser bei Bedarf auch verwendet werden, um Belege, die vor Einrichtung des ALE-Szenarios gebucht wurden, in das Ziel-System zu replizieren.

Tatsächlich ist eine 1:1-Verteilung vergleichsweise einfach zu programmieren, siehe nachfolgendes Coding-Beispiel...

*&---------------------------------------------------------------------*
*& Report Y_MIGRATE_OPS
*&---------------------------------------------------------------------*
*& REPLICATE FI DOCUMENTS VIA ALE DISTRIBUTION - SAMPLE PROGRAM
*&---------------------------------------------------------------------*
REPORT y_replicate_fidocs.
DATAlt_bkpf TYPE TABLE OF bkpf,
      lt_bseg TYPE TABLE OF bseg,
      lt_bset TYPE TABLE OF bset.
DATAlt_bkpf_sel TYPE TABLE OF bkpf.
DATAlv_ownsys LIKE tbdls-logsys.
DATAlv_buk_global TYPE t001-bukrs_glob.
DATAls_bkpf TYPE bkpf.
DATAlv_prot_title TYPE lvc_title.
SELECT-OPTIONSso_bukrs FOR ls_bkpf-bukrs,
                so_belnr FOR ls_bkpf-belnr,
                so_gjahr FOR ls_bkpf-gjahr.
PARAMETERS:     pa_logsy LIKE tbd03-rcvsystem OBLIGATORY.
PARAMETERS:     pa_xtest AS CHECKBOX DEFAULT 'X'.

START-OF-SELECTION.
  CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
    IMPORTING
      own_logical_system lv_ownsys.

 

  SELECT FROM bkpf INTO TABLE lt_bkpf_sel
      WHERE bukrs IN so_bukrs
        AND belnr IN so_belnr
        AND gjahr IN so_gjahr.

  LOOP AT lt_bkpf_sel INTO ls_bkpf.
    CLEARlt_bkpf[].
    APPEND ls_bkpf TO lt_bkpf.

    CLEARlt_bseg[]lt_bset[].
    SELECT FROM bseg INTO TABLE lt_bseg
        WHERE belnr ls_bkpf-belnr
          AND bukrs ls_bkpf-bukrs
          AND gjahr ls_bkpf-gjahr.
    SELECT FROM bset INTO TABLE lt_bset
        WHERE belnr ls_bkpf-belnr
          AND bukrs ls_bkpf-bukrs
          AND gjahr ls_bkpf-gjahr.

    SELECT SINGLE bukrs_glob FROM t001 INTO lv_buk_global
        WHERE bukrs ls_bkpf-bukrs.

    IF pa_xtest IS INITIAL.

      SET UPDATE TASK LOCAL.
      CALL FUNCTION 'FI_IDOC_CREATE_FIDCC2'
        EXPORTING
          i_sendsys    lv_ownsys
          i_recsys     pa_logsy
          i_bukrs_glob lv_buk_global
        TABLES
          t_bkpf       lt_bkpf
          t_bseg       lt_bseg
          t_bset       lt_bset
        EXCEPTIONS
          error        1
          OTHERS       2.

      COMMIT WORK AND WAIT.

    ENDIF.

  ENDLOOP.

  IF pa_xtest abap_true.
    lv_prot_title 'TEST RUN - List of documents to be replicated - NO IDOCS GENERATED!!!'.
  ELSE.
    lv_prot_title 'PROD RUN - List of replicated documents - IDOCS WERE GENERATED!!!'.
  ENDIF.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_structure_name 'BKPF'
      i_grid_title     lv_prot_title
    TABLES
      t_outtab         lt_bkpf_sel.

Sofern Mappings / Veränderungen einzelner Datenfelder erforderlich sind, müssten diese natürlich noch in das o.g. Coding integriert werden.

Kommentare

Anzeige von Kontierungsinformationen bei der Buchung

Veröffentlicht am 25. November 2020 von sapmandoo in FI, Basis-Entwicklung allg., S4

Öfters kam in Kundenprojekten die Anforderung hoch, Informationen aus dem Kontierungshandbuch dem Belegerfasser während des Buchungsvorganges zugänglich zu machen. Eins vorweg: eine 1A-Lösung, die unabhängig vom verwendeten User-Interface funktioniert, habe ich bisher noch nicht gefunden, aber immerhin eine, die modifikationsfrei eingebaut werden kann und zumindest mal bei den gängigen GUI-Transaktionen (FB01, FB50, FB60 etc.) funktioniert. Sie fusst auf dem Business Transaction Event-Framework (BTE) und setzt voraus, dass die Informationen zum Kontierungshandbuch in Form von Standardtexten am Sachkontenstamm vorliegen. Für die Implementierung sind zumindest Grundkenntnisse in der ABAP-Programmierung vonnöten.

Textablage

Im SAP-Standard ist für die Ablage der Kontierungsinformationen zu einem Konto, die Text-ID 0001 (Kontierungsinfo) des Textobjektes SKB1 (Sachkontentexte im Buchungskr.) vorgesehen. Der technische Name des jeweiligen Textbausteins setzt sich aus der 10-stelligen Kontonummer (ggf. mit führenden Nullen) und dem Schlüssel des Buchungskreises (4-stellig) zusammen (Beispiel: Konto 4711, Buchungskreis 0001: 00000047110001). Diese Texte können in der Buchungskreissicht des Sachkontos mithilfe der Sachkontenpflege FS00 hinterlegt werden.

Sachkontenstammpflege FS00 - Kontierungsinfo

Sachkontenstammpflege FS00 - Kontierungsinfo

Um sich die so gepflegten Kontierungsinformationen anzeigen zu lassen, kann der Standardreport "Kontierungshandbuch" ausgeführt werden. Der Bericht ist im Infosystem des Hauptbuchs, Bereich "Stammdaten" zu finden (Transaktion S_ALR_87012330 - Kontierungshandbuch).

Transaktion S_ALR_87012330 - Kontierungshandbuch

Transaktion S_ALR_87012330 - Kontierungshandbuch

Unter S/4 wurde diese Transaktion als obsolet gekennzeichnet und ist nicht mehr aufrufbar. Um dies bei Bedarf dennoch zu ermöglichen, bitte gemäß Hinweis 2393666 vorgehen.

Um die Pflege der Kontierungsinformationen zu vereinfachen, habe ich mal in einem Kundenprojekt ein kleines Uploadprogramm geschrieben, welches eine entsprechend aufbereitete Excel-Vorlage hochladen kann.

Excel-Vorlage:

Excel-Vorlage für Upload Kontierungshandbuch

Excel-Vorlage für Upload Kontierungshandbuch

Wenn in der Vorlage buchungskreisspezifische Texte hinterlegt werden sollen, ist der Buchungskreis in der entsprechenden Spalte anzugeben. Ist der Wert in der Spalte "Buchungskreis" leer, wird der Text in allen Buchungskreisen, in denen das Konto vorhanden ist und die den angegebenen Kontenplan verwenden, aktualisiert.

Die Felder Kontenplan, Konto, Sprache und Text sind obligatorisch. Führende Nullen bei der Angabe des Kontos können weggelassen werden. Das Programm füllt dies automatisch auf. Der Buchungskreis ist ggf. mit führenden Nullen einzugeben.

Bei der Ausführung des Upload-Programms ist lediglich die Excel-Datei auszuwählen (sie kann ohne vorherige Umformatierung direkt im XLSX-Format verwendet werden) und ggf. anzukreuzen, ob bereits manuell gepflegte Texte bei diesem Lauf überschrieben werden sollen. 

Coding:

REPORT ystxupl1.
*&---------------------------------------------------------------------*
*& Report YSTXUPL1
*&---------------------------------------------------------------------*
*& Upload SAPScript-Texts for accounting manual from Excel
*&---------------------------------------------------------------------*

DATA: data_tab TYPE TABLE OF string.

TYPES: BEGIN OF ty_txt,
         ktopl    TYPE t001-ktopl,
         bukrs    TYPE t001-bukrs,
         spras(2) TYPE c,
         saknr    TYPE skb1-saknr,
         txt      TYPE string,
       END OF ty_txt.

TYPES: tty_bukrs TYPE TABLE OF bukrs,
       tty_t001  TYPE TABLE OF t001.

DATA:  wa_txt TYPE ty_txt.
DATA:  it_txt TYPE TABLE OF ty_txt.

*&---------------------------------------------------------------------*
*& SELECTION-SCREEN
*&---------------------------------------------------------------------*
PARAMETERS: pa_fnam LIKE rlgrap-filename OBLIGATORY. "Excelfilename
PARAMETERS: pa_xovr AS CHECKBOX DEFAULT space.       "Overwrite y/n

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

START-OF-SELECTION.
  PERFORM upload_data.
  PERFORM save_texts.

*&---------------------------------------------------------------------*
*& Form UPLOAD_DATA
*&---------------------------------------------------------------------*
*& upload accounting manual template (Excel)
*&---------------------------------------------------------------------*
FORM upload_data .

  DATA: l_buf   TYPE string,
        l_tabix TYPE sy-tabix.

  CLEAR data_tab[].

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

  IF sy-subrc <> 0.
    WRITE: / 'Fehler', sy-subrc, 'beim Upload der Datei', pa_fnam.
  ENDIF.

  LOOP AT data_tab INTO l_buf.
    CHECK sy-tabix > 1.  "Skip Header
    SPLIT l_buf AT '~' INTO
         wa_txt-ktopl
         wa_txt-bukrs
         wa_txt-spras
         wa_txt-saknr
         wa_txt-txt.

*   clean up multiple text lines.
    IF wa_txt-txt(1) = '"'.
      SHIFT wa_txt-txt BY 1 PLACES LEFT.
    ENDIF.
    DATA(l_lastchar) = strlen( wa_txt-txt ) - 1.
    IF wa_txt-txt+l_lastchar(1) = '"'.
      wa_txt-txt = wa_txt-txt(l_lastchar).
    ENDIF.

    APPEND wa_txt TO it_txt.
  ENDLOOP.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form F4_FILENAME
*&---------------------------------------------------------------------*
*& F4 help Excel-file
*&---------------------------------------------------------------------*
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.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form save_texts
*&---------------------------------------------------------------------*
*& Process accounting manual texts and save them
*&---------------------------------------------------------------------*
FORM save_texts .

  DATA: lt_lines TYPE TABLE OF tline,
        l_name   TYPE thead-tdname,
        l_saknr  TYPE skb1-saknr,
        lt_t001  TYPE tty_t001,
        l_spras  TYPE t001-spras,
        lt_bukrs TYPE tty_bukrs.

  LOOP AT it_txt INTO wa_txt.

*   convert external data into SAP format, if necessary
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = wa_txt-saknr
      IMPORTING
        output = wa_txt-saknr.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        input  = wa_txt-spras
      IMPORTING
        output = l_spras.

*   select company codes assigned to chart of acc.
*   in case company code isn't specified in excel template
    IF lt_t001[] IS INITIAL.
      SELECT * FROM t001 INTO TABLE lt_t001 WHERE ktopl = wa_txt-ktopl.
    ENDIF.

    IF wa_txt-bukrs IS INITIAL.
      PERFORM find_company_codes USING    wa_txt-ktopl
                                          wa_txt-saknr
                                          lt_t001
                                 CHANGING lt_bukrs.
    ELSE.
      CLEAR lt_bukrs[].
      APPEND wa_txt-bukrs TO lt_bukrs.
    ENDIF.

    LOOP AT lt_bukrs INTO wa_txt-bukrs.

      CONCATENATE wa_txt-saknr wa_txt-bukrs INTO l_name.

      IF pa_xovr IS INITIAL.
        CALL FUNCTION 'READ_TEXT'
          EXPORTING
            id                      = '0001'
            language                = l_spras
            name                    = l_name
            object                  = 'SKB1'
          TABLES
            lines                   = lt_lines
          EXCEPTIONS
            id                      = 1
            language                = 2
            name                    = 3
            not_found               = 4
            object                  = 5
            reference_check         = 6
            wrong_access_to_archive = 7
            OTHERS                  = 8.
        IF sy-subrc <> 0.
          PERFORM store_text USING l_spras l_name wa_txt.
        ENDIF.
      ELSE.
        PERFORM store_text USING l_spras l_name wa_txt.
      ENDIF.

    ENDLOOP.

  ENDLOOP.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form find_company_codes
*&---------------------------------------------------------------------*
*& Select all company codes with given chart of accounts
*&---------------------------------------------------------------------*
*&      --> pi_KTOPL
*&      --> pi_SAKNR
*&      --> pt_t001
*&      <-- pt_BUKRS
*&---------------------------------------------------------------------*
FORM find_company_codes  USING    pi_ktopl TYPE t001-ktopl
                                  pi_saknr TYPE skb1-saknr
                                  pt_t001  TYPE tty_t001
                         CHANGING pt_bukrs TYPE tty_bukrs.

  CLEAR pt_bukrs[].
  LOOP AT pt_t001 ASSIGNING FIELD-SYMBOL(<lfs_t001>).
    SELECT SINGLE COUNT(*) FROM skb1
           WHERE saknr = pi_saknr
             AND bukrs = <lfs_t001>-bukrs.
    IF sy-subrc = 0.
      APPEND <lfs_t001>-bukrs TO pt_bukrs.
    ENDIF.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form store_text
*&---------------------------------------------------------------------*
*& Put SAPScript-Tests for accouting mmanual in DB
*&---------------------------------------------------------------------*
*&      --> pi_SPRAS  Language
*&      --> pi_NAME   Textname
*&      --> pi_TXT    Text
*&---------------------------------------------------------------------*
FORM store_text  USING    pi_spras TYPE t001-spras
                          pi_name  TYPE thead-tdname
                          pi_txt   LIKE wa_txt.

  DATA: lt_tline TYPE tline_t.
  DATA: ls_header TYPE thead.

  DATA(lt_strings) = VALUE string_table( ( pi_txt-txt ) ).

* Stringtabelle -> TLINE-Tabelle
* SAPscript: Konvertieung Textstream nach ITF f¸r TextEditControl
  CALL FUNCTION 'CONVERT_STREAM_TO_ITF_TEXT'
    EXPORTING
      stream_lines = lt_strings
      lf           = abap_true
    TABLES
      itf_text     = lt_tline.

  ls_header-tdobject = 'SKB1'.
  ls_header-tdname   = pi_name.
  ls_header-tdspras  = pi_spras.
  ls_header-tdid     = '0001'.
  CALL FUNCTION 'SAVE_TEXT'
    EXPORTING
      header          = ls_header
      savemode_direct = 'X'
    TABLES
      lines           = lt_tline.

ENDFORM.

Interaktive Anzeige der Kontierungsinformationen

Um nun die so gepflegten Texte während des Buchens zur Anzeige zu bringen, implementieren wir die Business Transaction Events (BTE) 00001070 bzw. 00001080 (P/S-Schnittstelle). Details zur Implementierung von BTEs finden sich u.a. hier.

Mustercoding zur Implementierung der BTE-Bausteine:

BTE 00001070

FUNCTION y_interface_00001070.
*"--------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     REFERENCE(I_BKPF) TYPE  BKPF
*"     REFERENCE(I_BSEG) TYPE  BSEG
*"     REFERENCE(I_AKTYP) TYPE  AKTYP
*"     REFERENCE(I_DYNCL) TYPE  DYNCL
*"  EXPORTING
*"     REFERENCE(E_XCHNG) LIKE  OFIWA-XCHNG
*"--------------------------------------------------------------------
  DATAlv_tdname   TYPE stxh-tdname,
       lv_tdobject TYPE stxh-tdobject VALUE 'SKB1',
       lv_tdid     TYPE stxh-tdid VALUE '0001'.

  CONCATENATE i_bseg-hkont i_bkpf-bukrs INTO lv_tdname.

  CALL FUNCTION 'RECA_GUI_TEXTEDIT_POPUP'
    EXPORTING
      id_tdobject lv_tdobject
      id_tdname   
lv_tdname
      id_tdid     
lv_tdid
      id_activity 
'03'
      id_title    TEXT-002.

ENDFUNCTION.

TEXT-002 enthält dabei die Überschrift der Dialogbox, in der die Kontierungsinformation angezeigt wird.

BTE 00001080

FUNCTION y_interface_00001080.
*"--------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     REFERENCE(I_SPRAS) LIKE  SY-LANGU
*"     REFERENCE(I_AKTYP) TYPE  AKTYP
*"     REFERENCE(I_DYNCL) TYPE  DYNCL
*"  EXPORTING
*"     VALUE(E_FTEXT) LIKE  FTEXTS-FTEXT
*"--------------------------------------------------------------------

  e_ftext TEXT-001.

ENDFUNCTION.

TEXT-001 enthält dabei die Aufschrift der Drucktaste, die in den Buchungstransaktionen zusätzlich eingeblendet wird, also z.B. "Kontierungshandbuch".

Im Ergebnis erscheint im Detailbild der Belegerfassung (z.B.in der FB01 oder bei der FB60, wenn ein Doppelklick auf die zu erfassende Belegzeile erfolgt) eine neue Drucktaste. Beim Betätigen der Drucktaste wird die zum aktuellen Konto/Buchungskreis hinterlegte Kontierungsinformation in einer Dialogbox angezeigt.

Neue Drucktaste bei der Erfassung einer Belegposition

Neue Drucktaste bei der Erfassung einer Belegposition

Dialogbox zur Anzeige der hinterlegten Kontierungsinformation

Dialogbox zur Anzeige der hinterlegten Kontierungsinformation

Kommentare
Werbung

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

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
Werbung

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
Werbung
1 2 3 4 > >>