basis-entwicklung allg.
Bearbeitung von IDocs via Transaktion WLF_IDOC
Über folgendes Customizing kann man die manuelle Änderung und Nachbearbeitung von IDocs direkt über den IDoc-Monitor WLF_IDOC aktivieren:
IMG: Anwendungsübergreifende Komponenten > IDoc-Monitor > Einstellungen zur IDoc-Bearbeitung
Hier kann man pro Nachrichtentyp die Segmenttypen angeben, die via WLF_IDOC direkt editierbar sein sollen – z.B.:
Pro Segmenttyp kann man alle Felder auf änderbar setzen (wie im Bild) oder alternativ links über „Editierbare IDoc-Felder“ einzeln die techn. Namen der editierbaren Idoc-Felder angeben:
Anschließend kann man direkt über die WLF_IDOC und den Stift in den Änderungsmodus zu einem Idoc springen:
Die zuvor auf "editierbar" gesetzten Segmente und Felder des aktuell bearbeiteten IDocs sind nun eingabebereit und können mit Werten befüllt werden.
Beim Speichern wird das ursprüngliche IDoc mit dem Status 70 (Original) und das IDoc mit den neuen Werten als Kopie mit dem Original-Status gesichert. Dieses kann nun einer erneuten Verarbeitung zugeführt werden.
Integration von Zahlungsmitteldienstleistern in die SAP Finanzbuchhaltung
In den Workshops zur Bankbuchhaltung kommt bei den meisten Kunden (zumindest im Handels-Sektor) irgendwann die Frage nach der Integration von Zahlungsmitteldienstleistern ("Payment Service Provider", kurz PSP) wie PayPal oder Amazon Payments auf.
Mit "Integration" ist dabei üblicherweise das Einlesen und Verbuchen der Avise der verschiedenen PSPs gemeint. Die Antwort darauf lautete bis dato meist: Individualentwicklung.
Mit der Komponente Web Channel Experience Management hat SAP nun ein entsprechendes Framework zur Verfügung gestellt, um neben vielen anderen Funktionen auch diese lästige, aber oft nachgefragte Aufgabe zu bewerkstelligen.
Wer nun aber denkt, dass die Integration wenigstens der gängigsten PSPs per Customizing eingestellt werden kann, wird ähnlich enttäuscht sein, wie über das Abschneiden der deutschen Elf bei den beiden zurückliegenden Weltmeisterschaften. Immerhin für PayPal habe ich mir die Mühe gemacht, dass entsprechende Prozedere genau aufzuschreiben, so dass es Ihnen erspart bleibt.
Es handelt sich dabei um einen Lösungsansatz, der die Funktionen des elektronischen Kontoauszugs (ELKO) verwendet. Im Kern wird so getan, als ob die jeweiligen PSPs (Haus-)Banken sind, die Kontoauszüge anliefern. Der Ablauf des Verfahrens ist dabei wie folgt:
- Einlesen der Avis-Datei des PSPs
- Mapping der eingelesenen Daten auf eine an den ELKO angelehnte SAP Zwischenstruktur
- Abspeichern der Zwischenstrukturen als elektronische Kontoauszüge
- Aufruf der Buchungsfunktion des ELKO
Die oben beschriebenen Punkte werden durch die Transaktion FEBPS (Report RFEBKAPSP) initiiert. Hört sich alles im Grunde nicht schlecht an, bis man merkt, dass die (natürlich aufwändigsten) Punkte 1. und 2. komplett selber in Form einer BADI-Implementierung zu entwickeln sind, zu der es auch keinerlei Standard-Implementierung gibt...
Aber nun ja - hilft ja nix, also zunächst sind folgende Business Functions zu aktivieren:
- LOG_SD_SIMP_02 Vereinfachte Verkaufsprozesse im Vertrieb 2
- LOG_SD_CI_02 Sales & Distribution 2
- ERP_WEB_CHANNEL_1 SAP Web Channel Experience Management für SAP ERP
- ERP_WEB_CHANNEL_2 SAP Web Channel Experience Management 2.0
- ERP_WEB_CHANNEL_3 SAP Web Channel Experience Management 3.0
Ich habe keinerlei unerwünschte Seiteneffekte der o.g. BF feststellen können, die Aktivierung kann also m.E. bedenkenlos durchgeführt werden.
U.a. wird dadurch der folgende Customizing-Pfad eingeblendet: IMG - Vertrieb - SAP Web Channel Experience Management...
Im Abschnitt Zahlungsdienstleister können nun die benötigten PSPs dem System bekannt gemacht werden. Unter Business Add-Ins (BAdIs) - BAdI: Import der Abrechnungsdatei pro Zahlungsdienstleister erfolgt die Implementierung der weiter oben genannten Teilfunktionen 1. & 2. (Mustercoding s.u.).
Alles weitere Customizing ist das kleine Einmaleins des elektronischen Kontoauszugs. Im Customizing des ELKO werden nun für jeden PSP ein Vorgangstyp, die entsprechenden externen Vorgangscodes (Details siehe Abschnitt "Mapping") nebst Zuweisung der Buchungsregeln und abschließend die Zuordnung der Pseudobank des PSP zum entsprechenden Vorgangstyp hinterlegt. Diese Pseudobank muss auch als Hausbank mit Zuordnung zum entsprechenden Verrechnungskonto angelegt werden.
Ich habe zur Definition der Pseudobank einfach den Namen des PSP als Bankschlüssel und die Vertragsnummer als Kontonummer verwendet. Für die Anlage solcher Pseudo- bzw. internen Banken gibt es die Transaktion FIPS, mit der die länderspezifischen Prüfungen der BLZ ignoriert werden. Auf diese Weise lässt sich also bspw. auch ein nicht-numerischer Bankschlüssel anlegen.
Nachfolgend ist ein Beispiel-Customizing für den Zahlungsdienstleister PayPal aufgeführt:
Legen Sie zunächst mithilfe der Transaktion FIPS die Pseudo-Hausbank des PSP an:
/image%2F1473637%2F20240116%2Fob_b76b31_fips.png)
Geben Sie unbedingt den Bankschlüssel auch unter SWIFT/BIC an, sonst findet die Eingangsverarbeitung des Kontoauszuges die Pseudobank nicht.
Prägen Sie in der FI12 die Pseudobank als Hausbank aus und legen Sie ein entsprechendes Hausbankkonto dazu an. Im vorliegenden Beispiel wurde die Vertragskontonummer als Kontonummer verwendet.
/image%2F1473637%2F20240116%2Fob_656cff_fi12.png)
Die Hinterlegung einer IBAN ist natürlich nicht zwingend. Geben Sie das zu verwendende Hauptbuchkonto an. Denken Sie daran, auch ein entsprechendes Bankunterkonto anzulegen, welches später im Customizing des elektronischen Kontoauszugs zu hinterlegen ist.
Hinterlegen Sie im Customizing (OBXK) ein Konto für die Bankspesen, auf das die PayPal Gebühren zu buchen sind. Sofern es sich dabei um eine Kostenart handelt, muss ggf. eine CO Vorschlagskontierung (OKB9) zur Kostenart gepflegt werden.
/image%2F1473637%2F20240116%2Fob_af4ab2_bsp.png)
Definieren und aktiveren Sie dann in der Komponente Web Channel Experience Management, die benötigen Zahlungsdienstleister
(IMG: Vertrieb - SAP Web Channel Experience Management - Zahlungsdienstleister - Zahlungsdienstleister definieren / Zahlungsdienstleister aktivieren (mandantenabhängig))
/image%2F1473637%2F20240116%2Fob_698b95_psp1.png)
/image%2F1473637%2F20240116%2Fob_9a817e_psp2.png)
Fügen Sie abschließend das Customizing für den elektronischen Kontoauszug hinzu. Legen Sie zunächst die benötigten Kontosymbole an und ordnen Sie die entsprechenden Konten zu. Im vorliegenden Beispiel genügt die Angabe des Bankkontos sowie des korrespondierenden Bankunterkontos:
/image%2F1473637%2F20240116%2Fob_fda28b_ks.png)
Legen Sie die Buchungsregeln und deren konkrete Ausgestaltung an. Im vorliegenden Fall sind es die Buchungsregeln für die Geschäftsvorfälle "Zahlungseingang" und "Rückerstattung":
/image%2F1473637%2F20240116%2Fob_b6c231_br1.png)
Die Buchungsregeln buchen im Hauptbuch (Buchungsbereich 1) PayPal-Bank an PayPal Unterkonto bzw. umgekehrt und versuchen im Nebenbuch einen debitorischen Ausgleich gegen das PayPal Unterkonto:
/image%2F1473637%2F20240116%2Fob_63ab81_br2.png)
Legen Sie einen Vorgangstyp namens PAYPAL an und weisen Sie die die externen Vorgangsschlüssel T0006 (Zahlungseingänge) und T1107 (Rückerstattungen) mit ihren korrespondierenden Buchungsregeln und einem passenden Interpretationsalgorithmus zu.
/image%2F1473637%2F20240116%2Fob_d0e9d5_vgt.png)
Ordnen Sie abschließend das Pseudo-Hausbankkonto dem Vorgangstyp zu.
Für die Ausgestaltung des Customizings des elektr. Kontoauszugs ist natürlich die gewünschte Buchungslogik maßgeblich. Eine mögliche Ausprägung könnte wie folgt aussehen:
Im obenstehenden Beispiel wird ein Filialverkauf mit direkter Bezahlung bei Mitnahme des Artikels per Kreditkarte dargestellt.
Aus der Filiale wird der Verkauf mit Angabe des verwendeten Zahlungsmittels an die Finanzbuchhaltung gemeldet.
In regelmäßigen Abständen sendet der Zahlungsmittelprovider Avise über abgerechnete Zahlungen an den Händler üblicherweise unter Angabe sämtlicher Transaktionsdaten und der angefallenen Gebühren. Diese Avise werden über die FEBPS eingelesen und verbucht. Für diese Verbuchung sind die entsprechenden Buchungsregeln auszuprägen und ggf. Suchmuster oder Userexits zu verwenden, um bspw. der Gebührenposition das passende Steuerkennzeichen und ggf. eine Kostenstelle zuzuführen (vgl. hier).
Der tatsächliche Zahlungseingang wird dann über den "echten" Kontoauszug desjenigen Bankkontos verbucht, auf welches der PSP reguliert hat.
Elementarer Bestandteil des Prozesses ist natürlich, das Mapping der externen Daten des PSP auf die internen Kontoauszugsstrukturen herzustellen. Die internen Strukturen haben den Typ
FPS_HEADER - Auszugskopf
FPS_ITEM - Umsätze
Für das Mapping habe ich mir eine Excel-Tabelle angelegt, in der in einfacher Form Quelle, Ziel und Verarbeitungshinweise aufgeführt sind.
In das Feld GCODE der Umsatztabelle ist also der externe Vorgangscode abzufüllen, zu dem im Customizing d. elektr. Kontoauszugs auch die entsprechenden Buchungsregeln hinterlegt werden.
Nach dem Mapping kann dann die BadI-Implementierung erfolgen. Eine mögliche Ausprägung des Codings könnte so aussehen:
**************************************************************************
* Upload und Mapping der Datei vom PSP in SAP-Strukturen
**************************************************************************
* Bsp: PAYPAL
**************************************************************************
METHOD if_ex_fps_import_paysp_file~read_paysp_settlement_file.
DATA: lt_paypal TYPE ltt_paypal,
lt_buf TYPE TABLE OF string.
CASE i_flt_vl.
WHEN 'ZPP'. "PayPal
CHECK i_pfname IS NOT INITIAL.
lt_buf = upload_data( i_pfname ).
structurize_data_paypal( EXPORTING it_buf = lt_buf
IMPORTING et_paypal = lt_paypal ).
map_data_paypal( EXPORTING i_bank = i_bank
i_account = i_account
it_paypal = lt_paypal
IMPORTING et_header = et_header
et_items = et_items
CHANGING ct_return = et_return ).
ENDCASE.
ENDMETHOD.
Im ersten Schritt wird die Datei vom Zahlungsdienstleister in eine Puffer-Tabelle geladen (in diesem Fall CSV-Format) und anschließend strukturiert in eine interne Arbeitstabelle (hier vom Typ ltt_paypal, Satzbett PayPal-Umsätze) abgelegt (Methode STRUCTURIZE_DATA_<psp>). Dieser Abschnitt ist natürlich wesentlich vom Format und Inhalt der PSP-Datei abhängig.
Die entscheidende Verarbeitung erfolgt jedoch in der Methode MAP_DATA_<psp>, in der die zuvor strukturiert abgelegte Datei des PSP in die internen SAP Tabellen ET_HEADER und ET_ITEMS überführt werden.
Nachfolgend das komplette Mustercoding für den Upload der Avise des PSP PayPal:
Datendeklaration PayPal-Satzbett
PROTECTED SECTION.
TYPES:
BEGIN OF lty_paypal,
section(2) TYPE c,
transaction TYPE string,
invoice(14) TYPE c,
reference(16) TYPE c,
type(3) TYPE c,
code(5) TYPE c,
start_date(25) TYPE c,
end_date(25) TYPE c,
debit_credit(2) TYPE c,
amount TYPE string,
currency(3) TYPE c,
com_debit_credit(2) TYPE c,
amount_com TYPE string,
com_currency(3) TYPE c,
no_use(2) TYPE c,
id(13) TYPE c,
follow_up_nb TYPE string,
shop TYPE string,
bank_id TYPE string,
END OF lty_paypal.
TYPES: ltt_paypal TYPE STANDARD TABLE OF lty_paypal.
Methode upload_data:
Importing I_PFNAME TYPE STRING Dateiname
Returning value( RT_BUF ) TYPE STR_TAB String Tabelle
METHOD upload_data.
CALL METHOD cl_gui_frontend_services=>gui_upload
EXPORTING
filename = i_pfname
filetype = 'ASC'
CHANGING
data_tab = rt_buf[].
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDMETHOD.
Methode structurize_data_paypal
Importing IT_BUF TYPE STR_TAB String Tabelle
Exporting ET_PAYPAL TYPE LTT_PAYPAL Satzbett PayPal
METHOD STRUCTURIZE_DATA_PAYPAL.
DATA: ls_paypal TYPE lty_paypal,
lv_rec TYPE string.
LOOP AT it_buf INTO lv_rec.
CLEAR ls_paypal.
TRANSLATE lv_rec USING '" '.
CONDENSE lv_rec NO-GAPS.
SPLIT lv_rec AT ',' INTO
ls_paypal-section
ls_paypal-transaction
ls_paypal-invoice
ls_paypal-reference
ls_paypal-type
ls_paypal-code
ls_paypal-start_date
ls_paypal-end_date
ls_paypal-debit_credit
ls_paypal-amount
ls_paypal-currency
ls_paypal-com_debit_credit
ls_paypal-amount_com
ls_paypal-com_currency
ls_paypal-no_use
ls_paypal-id
ls_paypal-follow_up_nb
ls_paypal-shop
ls_paypal-bank_id.
APPEND ls_paypal TO et_paypal.
ENDLOOP.
ENDMETHOD.
Methode map_data_paypal
Importing I_BANK TYPE BANKK Bank
Importing I_ACCOUNT TYPE BANKN Konto
Importing IT_PAYPAL TYPE LTT_PAYPAL Paypal Records
Exporting ET_HEADER TYPE FPS_T_HEADER Auszug
Exporting ET_ITEMS TYPE FPS_T_ITEMS Umsatz
Changing CT_RETURN TYPE BAPIRET2_T Returntabelle
METHOD map_data_paypal. *-------------------------------------------------------------------- * PayPal-Daten in SAP Kontoauszugsdaten mappen *-------------------------------------------------------------------- DATA: ls_paypal TYPE lty_paypal, ls_header LIKE LINE OF et_header, ls_item LIKE LINE OF et_items, ls_return LIKE LINE OF ct_return, ls_t028b TYPE t028b, lv_t028b_key TYPE absnd_eb. *-------------------------------------------------------------------- * HEADER *-------------------------------------------------------------------- CLEAR ls_header. * Bankdaten IF i_bank IS NOT INITIAL. ls_header-bank = i_bank. ENDIF. IF i_account IS NOT INITIAL. ls_header-ktonr = i_account. ENDIF. IF ls_header-bank IS INITIAL OR ls_header-ktonr IS INITIAL. "Pseuobank/Konto des PSP ermitteln SELECT * FROM t028b UP TO 1 ROWS INTO ls_t028b WHERE vgtyp = 'PAYPAL'. ENDSELECT. IF sy-subrc = 0. ls_header-bank = ls_t028b-bankl. ls_header-ktonr = ls_t028b-ktonr. ELSE. "Fehler: keine Pseudo-Bank ermittelbar ls_return-type = 'E'. ls_return-id = 'ZFIC_PSP'. ls_return-number = '001'. ls_return-message_v1 = 'PAYPAL'. APPEND ls_return TO ct_return. ENDIF. ENDIF. * Auszugsnummer CONCATENATE ls_header-bank '%' ls_header-ktonr '%' INTO lv_t028b_key. SELECT aznum FROM febko INTO ls_header-aznum UP TO 1 ROWS WHERE absnd LIKE lv_t028b_key ORDER BY aznum DESCENDING. ENDSELECT. IF sy-subrc = 0. ADD 1 TO ls_header-aznum. ELSE. ls_header-aznum = 1. ENDIF. * Auszugsdatum READ TABLE it_paypal INTO ls_paypal WITH KEY section = 'RH'. IF sy-subrc = 0. ls_header-azdat(4) = ls_paypal-transaction(4). ls_header-azdat+4(2) = ls_paypal-transaction+5(2). ls_header-azdat+6(2) = ls_paypal-transaction+8(2). ELSE. ls_header-azdat = sy-datum. ENDIF. * Auszugs-Währung ls_header-waers = 'EUR'. * Start-Saldo "n/a * End-Saldo "n/a *-------------------------------------------------------------------- * ITEMS *-------------------------------------------------------------------- LOOP AT it_paypal INTO ls_paypal WHERE section = 'SB'. "Die Einzelpos. tragen Satzart SB CHECK ls_paypal-code NE 'T0400'. "GVC 'interne Umbuchungen' ignorieren * Bankdaten ls_item-bank = ls_header-bank. ls_item-ktonr = ls_header-ktonr. ls_item-aznum = ls_header-aznum. * Valutadatum & Zeit ls_item-valut(4) = ls_paypal-end_date(4). ls_item-valut+4(2) = ls_paypal-end_date+5(2). ls_item-valut+6(2) = ls_paypal-end_date+8(2). ls_item-uzeit(2) = ls_paypal-end_date+10(2). ls_item-uzeit+2(2) = ls_paypal-end_date+13(2). ls_item-uzeit+4(2) = ls_paypal-end_date+16(2). ls_item-bvdat = ls_item-valut. * Beträge ls_item-waers = ls_paypal-currency. _convert( EXPORTING in = ls_paypal-amount IMPORTING out = ls_item-wrbtr ). DIVIDE ls_item-wrbtr BY 100. IF ls_paypal-debit_credit = 'DR'. MULTIPLY ls_item-wrbtr BY -1. ENDIF. "Gebühren _convert( EXPORTING in = ls_paypal-amount_com IMPORTING out = ls_item-spesk ). DIVIDE ls_item-spesk BY 100. IF ls_paypal-debit_credit = 'DR'. MULTIPLY ls_item-spesk BY -1. ENDIF. * Verwendungszweck & Buchungstexte ls_item-vwz01 = ls_paypal-invoice. * GVC extern ls_item-gcode = ls_paypal-code. TRANSLATE ls_item-gcode TO UPPER CASE. * Header-Infos aktualisieren ADD 1 TO ls_header-anzum. IF ls_paypal-debit_credit = 'CR'. ADD ls_item-wrbtr TO ls_header-sumso. ENDIF. IF ls_paypal-debit_credit = 'DR'. ADD ls_item-wrbtr TO ls_header-sumha. ENDIF. APPEND ls_item TO et_items. ENDLOOP. APPEND ls_header TO et_header. ENDMETHOD.
Methode _convert
Hilfsmethode zum Konvertieren von Werten in Strings in CURR-Felder:
Importing IN TYPE STRING
Exporting out TYPE KWBTR_EB.
METHOD _convert.
DATA(hlp) = in.
out = 0.
IF hlp CO '0123456789,. '.
TRANSLATE hlp USING ',.'.
CONDENSE hlp NO-GAPS.
out = hlp.
ENDIF.
ENDMETHOD.
Zunächst werden im Auszugskopf Bank und Kontonummer mit der Pseudobank des PSP gefüllt, sowie Auszugsnummer, -Datum und Währung gesetzt.
Bei den Umsätzen werden Betrag und Gebühr gefüllt sowie das Valutadatum und Verwendungszweckinformationen eingesetzt. Als externen GVC setze ich hier den in der PSP-Datei enthaltenen Vorgangscode in diesem Fall 'T0006' (Zahlung) bzw. 'T1107' (Rückerstattung). Im Customizing des ELKO muss dann zu diesen GVCs eine geeignete Buchungsregel hinterlegt werden.
Nach Durchlauf des BadI erzeugt der Standardreport RFEBKAPSP aus den so gemappten Tabellen einen Kontoauszug (Tab. FEBKO, FEBEP, FEBRE) und übergibt diesen an die Standard-Kontoauszugsverarbeitung (RFEBBU01).
Der Report RFEBKAPSP wird mithilfe der Transaktion FEBPS gestartet. Das Selektionsbild ähnelt dabei stark der Starttransaktion des elektronischen Kontoauszuges FF_5.
/image%2F1473637%2F20240116%2Fob_51a95c_febps.png)
Für die Verbuchung der Gebühren ist ggf. noch eine weitere BadI-Implementierung notwendig. Im Falle von Rückerstattungen kann es vorkommen, dass der Gebührenanteil negativ wird. In diesen Fällen steigt die Standard-Kontoauszugsverbuchung mit der Fehlermeldung aus, dass das Feld BSEG-WRBTR einen Formatfehler aufweist. Wer schonmal eine FI-Buchung manuell durchgeführt hat, weiß, dass Beträge nur positiv eingegeben werden können und das Vorzeichen durch den Buchungsschlüssel bestimmt wird.
Für diese Fälle empfiehlt es sich in einer Implementierung zur BadI-Definition FEB_BADI die Kontoauszugsbuchung zu beeinflussen bzw. in diesem Fall zu korrigieren:
FEB_BADI, Methode CHANGE_POSTING_DATA:
METHOD if_ex_feb_badi~change_posting_data.
FIELD-SYMBOLS: <lf_ftpost> TYPE ftpost.
CHECK i_febko-anwnd = '0001'. "nur Elko
CHECK NOT t_ftpost[] IS INITIAL. "Buchungen?
* S.Rohde Consenso 01/2024
* PayPal Gebühren richtig kontieren
IF i_febko-hbkid = 'PAYP' AND "Pseusobank Paypal
i_febko-hktid = 'PAYP1' AND "Pseudokonto PayPal
i_posting_area = '2' AND "Nebenbuch
i_febep-vgint = 'APP2'. "<<< hier die Buchungsregel für Rückerstattung angeben
LOOP AT t_ftpost ASSIGNING <lf_ftpost>.
CHECK <lf_ftpost>-count = '002' AND <lf_ftpost>-stype = 'P'.
CASE <lf_ftpost>-fnam.
WHEN 'BSEG-WRBTR'. "Minuszeichen rausschmeissen
IF <lf_ftpost>-fval CA '-'.
TRANSLATE <lf_ftpost>-fval USING '- '.
CONDENSE <lf_ftpost>-fval.
ENDIF.
WHEN 'BSEG-BSCHL'. "Buchungsschlüssel drehen
IF <lf_ftpost>-fval = '40'.
<lf_ftpost>-fval = '50'.
ENDIF.
ENDCASE.
ENDLOOP.
ENDIF.
ENDMETHOD.
Anlagen-Migration unter S/4 HANA mithilfe des BAPIs
Gerade erfolgreich unter S/4 1709 on premise getestet, deshalb hier druckfrisch meine gewonnen Erkenntnisse...
Es soll eine Excel-Datei mit Altanlagen und -werten in SAP-Anlagen migriert werden. Die Übernahme erfolgt zum Jahresende, d.h., es findet keine Übernahme von unterjährigen Bewegungen statt. Es werden zwei Bewertungsbereiche (HGB & IFRS) berücksichtigt.
Die Migrationsdatei hat folgenden Aufbau:
Die Excel-Datei kann unkonvertiert verwendet werden, d.h. ein vorheriges Abspeichern im TXT-Format oder ähnliches ist nicht erforderlich. Die Nummer der Altanlage ist in der Spalte "Inventarnummer" hinterlegt. Die SAP-Anlagennummern werden in diesem Fall neu intern vergeben.
Die Übernahme erfolgt mit eigenem Programm unter Zuhilfenahme des BAPIs BAPI_FIXEDASSET_OVRTAKE_CREATE. Der genannte BAPI erzeugt in einem Arbeitsgang sowohl den Stammsatz als auch die unter S/4 zwingend erforderliche Übernahmebuchung (ABLDT). Der gute alte Button "Übernahmewerte" in der AS91 und die anschließende Einbuchung der Salden (OASV) ist ja passé...
Im Grunde sind die Einstellungen zur Anlagenmigration weitestgehend identisch mit denen unter ECC/ERP. Hinzu kommt die Angabe der Belegart (für die Übernahmebuchung) und in der Fixkontentabelle muss noch ein Übernahmekonto für die Anlagenmigration hinterlegt werden, gegen dass die jeweiligen AHKs und die kumulierte Abschreibung gebucht werden. Hier hat's mich im Q-System zerlegt, weil es ein Problem mit dem Transportanschluss für eben diese Kontenfindung gibt/gab. Hinweise 2376485 und 2289443 schaffen Abhilfe...
Zuvor muss zudem die neue Anlagenbuchhaltung aktiviert werden (IMG: Finanzwesen - Anlagenbuchhaltung - Produktionsvorbereitung - Produktivstart - neue Anlagenbuchhaltung aktivieren (Neukunden)).
Die Übernahmeparameter haben keinen Transportanschluß, d.h. sie müssen ggf. in jedem System/Mandanten eingetragen werden.
Die obenstehende Excel-Datei kann mit dem untenstehenden Programm eingelesen und verarbeitet werden. Das meiste Coding ging dabei für die Protokollausgabe drauf. Inhaltlich Interessant ist eigentlich nur die Routine "MAP_DATA".
Im ersten Versuch hatte ich die kum. Abschreibungen mit positivem Vorzeichen (also so wie sie in der Excel-Tabelle stehen) an das BAPI übergeben - sah nicht gut aus... Einmal mit -1 multiplizieren reduziert die blutroten Meldungen drastisch...
Zudem hatte ich zuerst den klassischen Anfängerfehler gemacht und das COMMIT nach dem BAPI-Aufruf vergessen.
*&---------------------------------------------------------------------*
*& Report ZFI_MIG_ANLAGEN
*&---------------------------------------------------------------------*
*& Anlagenstamm-Migration (Stammdaten & Werte)
*&---------------------------------------------------------------------*
REPORT zfi_mig_anlagen.
***********************************************************************
******************** GLOBAL DATA **************************************
***********************************************************************
TABLES: t001.
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.
TYPES: BEGIN OF ty_mig, "Spaltenstruktur Excel Datei
bukr LIKE anla-bukrs,
anlagenklasse LIKE anla-anlkl,
anlage LIKE anla-anln1,
anlagenbezeichnung1 LIKE anla-txt50,
anlagenbezeichnung2 LIKE anla-txa50,
inventarnummer LIKE anla-invnr,
aktivdatum(10),
kostenst LIKE anlz-kostl,
standort LIKE anlz-stort,
seriennummer LIKE anla-sernr,
filiale LIKE anlz-werks,
innenauftrag_kost2 LIKE anlz-caufn,
hgb_afaschl(20),
hgb_ntz LIKE anlb-ndjar,
hgb_per LIKE anlb-ndper,
hgb_nafabeg(10),
hbg_kumanschwert(15),
hgb_kumnormalafa(15),
ifrs_afaschl(20),
ifrs_ntz LIKE anlb-ndjar,
ifrs_per LIKE anlb-ndper,
ifrs_nafabeg(10),
ifrs_kumanschwert(15),
ifrs_kumnormalafa(15),
END OF ty_mig.
DATA: it_mig TYPE TABLE OF ty_mig,
wa_mig TYPE ty_mig.
DATA: key TYPE bapi1022_key,
reference LIKE bapi1022_reference,
createsubnumber LIKE bapi1022_misc-xsubno,
creategroupasset LIKE bapi1022_misc-xanlgr,
testrun LIKE bapi1022_misc-testrun,
generaldata LIKE bapi1022_feglg001,
generaldatax LIKE bapi1022_feglg001x,
inventory LIKE bapi1022_feglg011,
inventoryx LIKE bapi1022_feglg011x,
postinginformation LIKE bapi1022_feglg002,
postinginformationx LIKE bapi1022_feglg002x,
timedependentdata LIKE bapi1022_feglg003,
timedependentdatax LIKE bapi1022_feglg003x,
allocations LIKE bapi1022_feglg004,
allocationsx LIKE bapi1022_feglg004x,
origin LIKE bapi1022_feglg009,
originx LIKE bapi1022_feglg009x,
investacctassignmnt LIKE bapi1022_feglg010,
investacctassignmntx LIKE bapi1022_feglg010x,
networthvaluation LIKE bapi1022_feglg006,
networthvaluationx LIKE bapi1022_feglg006x,
realestate LIKE bapi1022_feglg007,
realestatex LIKE bapi1022_feglg007x,
insurance LIKE bapi1022_feglg008,
insurancex LIKE bapi1022_feglg008x,
leasing LIKE bapi1022_feglg005,
leasingx LIKE bapi1022_feglg005x.
DATA: companycode LIKE bapi1022_1-comp_code,
asset LIKE bapi1022_1-assetmaino,
subnumber LIKE bapi1022_1-assetsubno,
assetcreated LIKE bapi1022_reference.
DATA: depreciationareas LIKE TABLE OF bapi1022_dep_areas WITH HEADER LINE,
depreciationareasx LIKE TABLE OF bapi1022_dep_areasx WITH HEADER LINE,
investment_support LIKE TABLE OF bapi1022_inv_support WITH HEADER LINE,
extensionin LIKE TABLE OF bapiparex WITH HEADER LINE,
cumulatedvalues LIKE TABLE OF bapi1022_cumval WITH HEADER LINE,
postedvalues LIKE TABLE OF bapi1022_postval WITH HEADER LINE,
transactions LIKE TABLE OF bapi1022_trtype WITH HEADER LINE,
proportionalvalues LIKE TABLE OF bapi1022_propval WITH HEADER LINE,
return LIKE TABLE OF bapiret2 WITH HEADER LINE,
postingheaders LIKE TABLE OF bapi1022_postingheader WITH HEADER LINE.
DATA: data_tab TYPE TABLE OF string.
*&---------------------------------------------------------------------*
*& SELECTION-SCREEN
*&---------------------------------------------------------------------*
PARAMETERS: pa_test AS CHECKBOX DEFAULT 'X'.
PARAMETERS: pa_fnam LIKE rlgrap-filename OBLIGATORY.
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_fnam.
*&---------------------------------------------------------------------*
PERFORM f4_filename.
*&---------------------------------------------------------------------*
START-OF-SELECTION.
*&---------------------------------------------------------------------*
PERFORM upload_data.
IF it_mig[] IS NOT INITIAL.
PERFORM init_protocol.
LOOP AT it_mig INTO wa_mig.
PERFORM map_data.
PERFORM bapi_call.
ENDLOOP.
PERFORM protocol.
ELSE.
MESSAGE i600(fr) WITH 'Datei enthält keine' 'verarbeitbaren' 'Datensätze'.
ENDIF.
*&---------------------------------------------------------------------*
*& Form BAPI_CALL
*&---------------------------------------------------------------------*
*& Anlagen-Migrations-BAPI rufen, Meldungen speichern und f...ing COMMIT
*&---------------------------------------------------------------------*
FORM bapi_call.
DATA: l_error TYPE abap_bool VALUE abap_false.
CALL FUNCTION 'BAPI_FIXEDASSET_OVRTAKE_CREATE'
EXPORTING
key = key
* REFERENCE =
* CREATESUBNUMBER =
* CREATEGROUPASSET =
testrun = pa_test
generaldata = generaldata
generaldatax = generaldatax
inventory = inventory
inventoryx = inventoryx
postinginformation = postinginformation
postinginformationx = postinginformationx
timedependentdata = timedependentdata
timedependentdatax = timedependentdatax
allocations = allocations
allocationsx = allocationsx
origin = origin
originx = originx
* INVESTACCTASSIGNMNT =
* INVESTACCTASSIGNMNTX =
* NETWORTHVALUATION =
* NETWORTHVALUATIONX =
* REALESTATE =
* REALESTATEX =
* INSURANCE =
* INSURANCEX =
* LEASING =
* LEASINGX =
IMPORTING
companycode = companycode
asset = asset
subnumber = subnumber
assetcreated = assetcreated
TABLES
depreciationareas = depreciationareas
depreciationareasx = depreciationareasx
* INVESTMENT_SUPPORT =
* EXTENSIONIN =
cumulatedvalues = cumulatedvalues
* POSTEDVALUES =
* TRANSACTIONS =
* PROPORTIONALVALUES =
return = return
postingheaders = postingheaders.
LOOP AT return 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.
PERFORM add_msg_to_prot.
ENDFORM.
Wichtig: bitte beachten Sie, dass in Ihrem Migrationsprogramm auch im Testlauf ein Rollback gemacht wird, bspw. mithilfe des BAPI_TRANSACTION_ROLLBACK. Andernfalls bauen sich bei vielen zu migrierenden/testenden Anlagen Puffer- und Arbeitstabellen so auf, dass die Performance rapide in den Keller geht und die Laufzeit exponentiell ansteigt.
(Quelle: Hinweis 2554160 - SAP-S/4HANA-Migrationscockpit: Anlage: Schlechtere Performance beim Simulationslauf)
*&---------------------------------------------------------------------*
*& Form UPLOAD_DATA
*&---------------------------------------------------------------------*
*& Anlagendatei uploaden
*&---------------------------------------------------------------------*
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.
SPLIT l_buf AT '~' INTO
wa_mig-bukr
wa_mig-anlagenklasse
wa_mig-anlage
wa_mig-anlagenbezeichnung1
wa_mig-anlagenbezeichnung2
wa_mig-inventarnummer
wa_mig-aktivdatum
wa_mig-kostenst
wa_mig-standort
wa_mig-seriennummer
wa_mig-filiale
wa_mig-innenauftrag_kost2
wa_mig-hgb_afaschl
wa_mig-hgb_ntz
wa_mig-hgb_per
wa_mig-hgb_nafabeg
wa_mig-hbg_kumanschwert
wa_mig-hgb_kumnormalafa
wa_mig-ifrs_afaschl
wa_mig-ifrs_ntz
wa_mig-ifrs_per
wa_mig-ifrs_nafabeg
wa_mig-ifrs_kumanschwert
wa_mig-ifrs_kumnormalafa.
APPEND wa_mig TO it_mig.
ENDLOOP.
* Irrelevante Zeilen (Überschriften etc.) ausfiltern
LOOP AT it_mig INTO wa_mig.
l_tabix = sy-tabix.
"ist die erste Spalte ein gültiger Buchungskreis?
"dann gehen wir davon aus, dass es sich um eine Anlagenzeile handelt
SELECT SINGLE COUNT(*) FROM t001 WHERE bukrs = wa_mig-bukr.
IF sy-subrc NE 0.
DELETE it_mig INDEX l_tabix.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form MAP_DATA
*&---------------------------------------------------------------------*
*& Upload daten in SAP BAPI-Strukturen überführen
*&---------------------------------------------------------------------*
FORM map_data .
PERFORM init.
"Buchungskreisdaten lesen
SELECT SINGLE * FROM t001 WHERE bukrs = wa_mig-bukr.
*&---------------------------------------------------------------------*
* Schlüssel (mit Altanlagennummer füllen)
*&---------------------------------------------------------------------*
key-companycode = wa_mig-bukr.
key-asset = wa_mig-inventarnummer.
key-subnumber = 0.
*&---------------------------------------------------------------------*
* Allg. Daten
*&---------------------------------------------------------------------*
PERFORM _convert USING wa_mig-anlagenklasse generaldata-assetclass 'ANLKL'.
generaldata-descript = wa_mig-anlagenbezeichnung1.
generaldata-descript2 = wa_mig-anlagenbezeichnung2.
generaldata-serial_no = wa_mig-seriennummer.
generaldata-invent_no = wa_mig-inventarnummer.
generaldatax-assetclass = abap_true.
generaldatax-descript = abap_true.
generaldatax-descript2 = abap_true.
generaldatax-serial_no = abap_true.
generaldatax-invent_no = abap_true.
*&---------------------------------------------------------------------*
* Buchungsinfos
*&---------------------------------------------------------------------*
PERFORM _convert USING wa_mig-aktivdatum postinginformation-cap_date 'AKTIVD'.
postinginformationx-cap_date = abap_true.
*&---------------------------------------------------------------------*
* Zeitabhängige Daten
*&---------------------------------------------------------------------*
timedependentdata-location = wa_mig-standort.
timedependentdatax-location = abap_true.
PERFORM _convert USING wa_mig-kostenst timedependentdata-costcenter 'KOSTL'.
timedependentdatax-costcenter = abap_true.
"INTERN_ORD
"PLANT
*&---------------------------------------------------------------------*
* Bewertungsbereichsdaten
*&---------------------------------------------------------------------*
* 01 HGB / local GAAP
IF generaldata-assetclass <> '00013000'. "IFRS Leasingobjekte
depreciationareasx-area = depreciationareas-area = '01'.
TRANSLATE wa_mig-hgb_afaschl TO UPPER CASE.
CASE wa_mig-hgb_afaschl.
WHEN 'LINEAR'. depreciationareas-dep_key = 'LINI'.
WHEN 'KEINE'. depreciationareas-dep_key = '0000'.
WHEN 'MANUELL'. depreciationareas-dep_key = 'MANU'.
ENDCASE.
depreciationareas-ulife_yrs = wa_mig-hgb_ntz.
depreciationareas-ulife_prds = wa_mig-hgb_per.
PERFORM _convert USING wa_mig-hgb_nafabeg depreciationareas-odep_start_date 'BF_AFABG'.
APPEND depreciationareas.
depreciationareasx-dep_key = abap_true.
depreciationareasx-ulife_yrs = abap_true.
depreciationareasx-ulife_prds = abap_true.
depreciationareasx-odep_start_date = abap_true.
APPEND depreciationareasx.
ENDIF.
* 02 IFRS
depreciationareasx-area = depreciationareas-area = '30'.
TRANSLATE wa_mig-ifrs_afaschl TO UPPER CASE.
CASE wa_mig-ifrs_afaschl.
WHEN 'LINEAR'. depreciationareas-dep_key = 'LINI'.
WHEN 'KEINE'. depreciationareas-dep_key = '0000'.
WHEN 'MANUELL'. depreciationareas-dep_key = 'MANU'.
ENDCASE.
depreciationareas-ulife_yrs = wa_mig-ifrs_ntz.
depreciationareas-ulife_prds = wa_mig-ifrs_per.
PERFORM _convert USING wa_mig-ifrs_nafabeg depreciationareas-odep_start_date 'BF_AFABG'.
APPEND depreciationareas.
depreciationareasx-dep_key = abap_true.
depreciationareasx-ulife_yrs = abap_true.
depreciationareasx-ulife_prds = abap_true.
depreciationareasx-odep_start_date = abap_true.
APPEND depreciationareasx.
*&---------------------------------------------------------------------*
* Kumulierte Anlagenwerte
*&---------------------------------------------------------------------*
* 01 HGB
IF generaldata-assetclass <> '00013000'. "IFRS Leasingobjekte
cumulatedvalues-fisc_year = '2018'.
cumulatedvalues-area = '01'.
PERFORM _convert USING wa_mig-hbg_kumanschwert cumulatedvalues-acq_value 'BF_KANSW'.
PERFORM _convert USING wa_mig-hgb_kumnormalafa cumulatedvalues-ord_dep 'BF_KNAFA'.
* Achtung: kum.AfA muss negativ vorgegeben werden
MULTIPLY cumulatedvalues-ord_dep BY -1.
cumulatedvalues-currency = t001-waers.
APPEND cumulatedvalues.
ENDIF.
* 02 IFRS
cumulatedvalues-fisc_year = '2018'.
cumulatedvalues-area = '30'.
PERFORM _convert USING wa_mig-ifrs_kumanschwert cumulatedvalues-acq_value 'BF_KANSW'.
PERFORM _convert USING wa_mig-ifrs_kumnormalafa cumulatedvalues-ord_dep 'BF_KNAFA'.
* Achtung: kum.AfA muss negativ vorgegeben werden
MULTIPLY cumulatedvalues-ord_dep BY -1.
cumulatedvalues-currency = t001-waers.
APPEND cumulatedvalues.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form PROTOCOL
*&---------------------------------------------------------------------*
*& Return-Tabelle ausgeben
*&---------------------------------------------------------------------*
FORM protocol .
* define how message should be displayed
PERFORM create_display_profile
CHANGING
g_s_display_profile.
* display log
INSERT g_log_handle INTO TABLE g_t_log_handle.
CALL FUNCTION 'BAL_DSP_LOG_DISPLAY'
EXPORTING
i_s_display_profile = g_s_display_profile
i_t_log_handle = g_t_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 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.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form INIT
*&---------------------------------------------------------------------*
*& BAPI-Strukturen und -tabellen initialisieren
*&---------------------------------------------------------------------*
FORM init .
CLEAR: key,
reference,
createsubnumber,
creategroupasset,
testrun,
generaldata,
generaldatax,
inventory,
inventoryx,
postinginformation,
postinginformationx,
timedependentdata,
timedependentdatax,
allocations,
allocationsx,
origin,
originx,
investacctassignmnt,
investacctassignmntx,
networthvaluation,
networthvaluationx,
realestate,
realestatex,
insurance,
insurancex ,
leasing,
leasingx,
companycode,
asset,
subnumber,
assetcreated,
depreciationareas[],
depreciationareasx[],
investment_support[],
extensionin[],
cumulatedvalues[],
postedvalues[],
transactions[],
proportionalvalues[],
return[],
postingheaders[].
CLEAR: depreciationareas,
depreciationareasx,
investment_support,
extensionin,
cumulatedvalues,
postedvalues,
transactions,
proportionalvalues,
return,
postingheaders.
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.
WRITE: / 'Fehler', sy-subrc, 'bei der Konvertierung von', in, 'Datenelement', dtel.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form INIT_PROTOCOL
*&---------------------------------------------------------------------*
*& Anwendungsprotokoll aufbauen
*&---------------------------------------------------------------------*
FORM init_protocol .
DATA:
l_s_message_defaults TYPE bal_s_mdef.
* create a log
g_s_log-extnumber = 'Anlagenmigration'(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.
* set default log for all following messages
l_s_message_defaults-log_handle = g_log_handle.
CALL FUNCTION 'BAL_GLB_MSG_DEFAULTS_SET'
EXPORTING
i_s_msg_defaults = l_s_message_defaults
EXCEPTIONS
OTHERS = 0.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CREATE_DISPLAY_PROFILE
*&---------------------------------------------------------------------*
*& Protokollausgabe individualisieren
*&---------------------------------------------------------------------*
*& <-- C_S_DISPLAY_PROFILE
*&---------------------------------------------------------------------*
FORM create_display_profile
CHANGING
c_s_display_profile TYPE bal_s_prof.
DATA:
l_s_fcat TYPE bal_s_fcat,
l_s_sort TYPE bal_s_sort.
* set title of dynpro
c_s_display_profile-title = 'Migrationsprotokoll Anlagen'(set).
* set header of tree
c_s_display_profile-head_text = 'Alte AnlagenNr'(raf).
c_s_display_profile-head_size = 35.
* set size of tree
c_s_display_profile-tree_size = 22.
* set report for display variants
c_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:
c_s_display_profile-disvariant-handle = 'LOG'.
* all messages should be displayed immediately
c_s_display_profile-show_all = 'X'.
************* define structure of message table
* message text
CLEAR l_s_fcat.
l_s_fcat-ref_table = 'BAL_S_SHOW'.
l_s_fcat-ref_field = 'T_MSG'.
l_s_fcat-outputlen = 50.
l_s_fcat-col_pos = 1.
APPEND l_s_fcat TO c_s_display_profile-mess_fcat.
* alte Anlagen Nummer
CLEAR l_s_fcat.
l_s_fcat-ref_table = 'BAL_S_EX03'.
l_s_fcat-ref_field = 'INVOICE'.
l_s_fcat-coltext = 'ALTANLAGE'(c01).
l_s_fcat-col_pos = 2.
APPEND l_s_fcat TO c_s_display_profile-mess_fcat.
************* define structure of level 1 in tree
* external number
CLEAR l_s_fcat.
l_s_fcat-ref_table = 'BAL_S_SHOW'.
l_s_fcat-ref_field = 'EXTNUMBER'.
l_s_fcat-outputlen = 40.
APPEND l_s_fcat TO c_s_display_profile-lev1_fcat.
************* define structure of level 2 in tree
CLEAR l_s_fcat.
l_s_fcat-ref_table = 'BAL_S_EX04'.
l_s_fcat-ref_field = 'TXT_CARRID'.
l_s_fcat-is_extern = 'X'.
l_s_fcat-col_pos = 1.
APPEND l_s_fcat TO c_s_display_profile-lev2_fcat.
* define callback routine which derives the external fields
c_s_display_profile-clbk_read-userexitt = const_callback_form.
c_s_display_profile-clbk_read-userexitp = sy-repid.
c_s_display_profile-clbk_read-userexitf = 'CALLBACK_READ'.
* define if grid is to be used for display
c_s_display_profile-use_grid = abap_true.
* define up to which level the tree should be expanded
c_s_display_profile-exp_level = 1.
ENDFORM.
*--------------------------------------------------------------------
* FORM callback_read
*--------------------------------------------------------------------
FORM callback_read "#EC CALLED
USING "#EC CALLED
i_s_info TYPE bal_s_cbrd "#EC CALLED #EC NEEDED
CHANGING "#EC CALLED
c_display_data TYPE bal_s_show "#EC NEEDED
c_context_header TYPE bal_s_cont "#EC NEEDED
c_context_message TYPE bal_s_cont "#EC NEEDED
c_field TYPE any. "#EC NEEDED
STATICS:
l_s_context TYPE bal_s_ex03.
IF i_s_info-ref_table = 'BAL_S_EX04' AND
i_s_info-ref_field = 'TXT_CARRID'.
* give back DATEV-Anlagennummer
l_s_context = c_context_message-value.
c_field = l_s_context-invoice.
ENDIF.
ENDFORM.
*--------------------------------------------------------------------
* FORM ADD_MSG_TO_PROT
*--------------------------------------------------------------------
FORM add_msg_to_prot.
DATA:
l_s_msg TYPE bal_s_msg,
l_s_context TYPE bal_s_ex03.
DATA:
l_s_return LIKE LINE OF return.
LOOP AT 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.
l_s_context-invoice = wa_mig-inventarnummer. "DATEV-Nummer
l_s_msg-context-tabname = 'BAL_S_EX03'.
l_s_msg-context-value = l_s_context.
* add this message to log file
* we do not specify I_LOG_HANDLE since we want to add this message
* to the default log. If it does not exist we do not care
* (EXCEPTIONS log_not_found = 0).
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.
Die Ergebnisse werden in einem Anwendungsprotokoll ausgegeben, wobei zur leichteren Fehlersuche die Meldungen unter der Nummer der Altanlage referenziert werden.
Über den Selektionsparameter "Testlauf" kann die Migration zunächst getestet werden, um vor der Übernahme etwaige Fehler zu eliminieren.
Folgendes ist bei der Übernahme noch zu beachten:
- Gegeben seien folgende Rahmenbedingungen:
- Geschäftsjahr = Kalenderjahr
- Die Übernahme erfolge zum 31.12.2017
- Bei der Übernahme muss das Geschäftsjahr 2017 in der Anlagenbuchhaltung abgeschlossen sein (AJAB).
- Die Übernahme muss zum letzten Buchungstag des letzten geschlossenen Geschäftsjahres erfolgen (31.12.17)
- Das Übernahmejahr ist kurioserweise das Folgejahr (also 2018 im vorliegenden Fall).
- Es muss bereits das Übernahmejahr (2018) per Saldovortrag in der AnBu geöffnet worden sein (FAGLGVTR).
Zusammenfassende Infos zum Mailversand von FI-Korrespondenzen, Avisen & Mahnungen
Eine heutzutage praktisch bei jedem Projekt aufkommende Anforderung ist, die aus FI entstehenden Schriftstücke wie Zahlungsavise, Mahnungen, Saldenbestätigungen und sonstige Korrespondenzen per Mail versenden zu können.
Anders als bei der MM- bzw. SD-Nachrichtenfindung ist diese Funktionalität im FI leider nicht nativ vorhanden, d.h. es muss immer etwas zusätzliches Coding in Form von sog. Business Transaction Events (BTE) verbaut werden.
Somit ist etwas Konzeption und ein wenig ABAP Programmierung notwendig. Die Konzeption besteht im wesentlichen daraus, festzulegen, unter welchen Voraussetzungen ein Geschäftspartner ein Dokument per Mail erhält und woher ggf. die eMail-Adresse gezogen werden soll. Das kann u.U. dann knifflig werden, wenn der GP auch andere Nachrichten per Mail erhält wie bspw. Bestellungen oder Rechnungen und diese Nachrichten an unterschiedliche Mail-Adressen versendet werden sollen.
Üblicherweise wird für FI-Korrespondenzen das Feld "Internet Sachbearbeiter" aus der Buchungskreissicht des Debitors bzw. Kreditors herangezogen (KNB1- bzw. LFB1-INTAD).
Nachfolgend sind die wichtigsten Korrespondenzen und die jeweiligen für den Mailversand zuständigen BTEs aufgeführt:
| Korrespondenz | BTE | Weitere Informationen |
|---|---|---|
| Zahlungsavis | 2040 Prozess-Schnittstelle | s. Artikel hier |
| Mahnungen | 1040 Prozess-Schnittstelle | s. Artikel hier + Hinweis 2838984 |
| Saldenbestätigungen | 2410 Prozess-Schnittstelle | s. Hinweis 563112 |
| Sonstige Korrespondenzen | 2310 Prozess-Schnittstelle | s. Hinweis 549119, Pkt 5. |
In den nachfolgend aufgeführten Hinweisen wird behandelt, wie erweiterte Mailoptionen gesetzt werden können, z.B. einen einleitenden Text in der Mail, CC/BCC-Empfänger, Priorität und so weiter...
| Korrespondenz | Informationen zu erweiterten Mail-Optionen |
|---|---|
| Zahlungsavis | s. Hinweis 1033893 |
| Mahnungen | s. Hinweis 1042992 |
| Saldenbestätigungen | s. Hinweis 1377820 |
| Sonstige Korrespondenzen | s. Hinweis 1360070 |
Bei vielen FI-Korrespondenzarten wird mittlerweile die Verwendung von PDF-Formularen unterstützt. Nachfolgend einige Hinweise zum Thema PDF-Formulare & Mail-Versand:
- 1251408 - Avis mit Adobe: Keine optische Archivierung bei Mail / Fax
- 1460038 - Mahnbriefe im PDF-Format per Mail oder FAX verschicken
- 1345695 - Faxen von Avisen mit Adobe / PDF
- tbc
Solltet Ihr in diesem Kontext noch über Hinweise oder Erkenntnisse stolpern, bitte seid so nett und lasst es mich in den Kommentaren wissen...
|
Kostenartentexte und Sachkontentexte in andere Sprache kopieren
Das hat vermutlich jeder schon mal erlebt: man meldet sich in einer Sprache <> DE im System an und bei der Anzeige von Sachkonten und/oder Kostenarten fehlen die Texte, weil bei der Anlage von neuen Konten das Übersetzen vergessen bzw. unterlassen wurde.
Anbei zwei Reports, die Kostenarten- und Sachkontentexte von einer Quellsprache in eine Zielsprache kopieren. Ein Anwendungsfall könnte bspw. sein, dass die englischen Texte in andere (Fremd-) Sprachen kopiert werden sollen, damit die ausländischen Kollegen in ihren Reports wenigstens die englischen Kontenbezeichnungen sehen...
Kopieren von Sachkontentexten
REPORT z_copy_sako_texts
NO STANDARD PAGE HEADING LINE-SIZE 255.
*******************************************************************
* Rohde 01/2010
*******************************************************************
* Kopieren(!) von Sachkonten-Texten (Kurz und Langtext) von einer
* Sprache in eine andere. So lassen sich z.B. die englischen
* Sachkontenbezeichnungen auch in andere Sprachen kopieren, damit
* man bspw. bei Anmeldung in Spanisch keine leeren Sachkontentexte
* vorfindet. Die Betonung liegt auf KOPIEREN, nicht übersetzen,
* so schlau ist das Programm leider noch nicht!!!!
* Die Änderungen werden per Batch-Input durchgeführt. Bestehende
* Texte in der Zielsprache werden NICHT überschrieben.
*******************************************************************
TABLES: skat, ska1, t001.
INCLUDE bdcrecx1.
SELECTION-SCREEN ULINE.
SELECT-OPTIONS: so_saknr FOR skat-saknr. "Sachkonten
* Achtung: die Angabe Buchungskreis wird nur zur Ermitlung des
* Kontenplans benötigt. Das Programm muss nicht pro Buchungskreis
* laufen, da die Texte buchungskreisunabhängig sind!!!!
PARAMETERS: pa_bukrs LIKE t001-bukrs OBLIGATORY. "Buchungskreis
PARAMETERS: pa_qlang LIKE sy-langu OBLIGATORY. "Quell-Sprache
PARAMETERS: pa_zlang LIKE sy-langu OBLIGATORY. "Ziel-Sprache
PARAMETERS: pa_test AS CHECKBOX DEFAULT 'X'. "Testlauf
DATA: i_skat TYPE TABLE OF skat.
DATA: wa_skat TYPE skat.
START-OF-SELECTION.
IF pa_test IS INITIAL.
PERFORM open_group.
ENDIF.
* Buchungskreisdaten inkl. Kontenplan holen
SELECT SINGLE * FROM t001 WHERE bukrs = pa_bukrs.
CHECK sy-subrc = 0.
SELECT * FROM skat INTO TABLE i_skat
WHERE spras = pa_qlang
AND ktopl = t001-ktopl
AND saknr IN so_saknr.
LOOP AT i_skat INTO wa_skat.
SELECT SINGLE COUNT(*) FROM skat
WHERE spras = pa_zlang
AND ktopl = wa_skat-ktopl
AND saknr = wa_skat-saknr.
IF sy-subrc = 0.
WRITE: / 'Konto', wa_skat-saknr,
'Text in Sprache', pa_zlang, 'schon vorhanden'.
ELSE.
PERFORM protokoll.
IF pa_test IS INITIAL.
PERFORM fs00.
ENDIF.
ENDIF.
ENDLOOP.
IF pa_test IS INITIAL.
PERFORM close_group.
ENDIF.
*&---------------------------------------------------------------------*
*& Form fs00
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM fs00.
PERFORM bdc_dynpro USING 'SAPLGL_ACCOUNT_MASTER_MAINTAIN' '2001'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=TAB04'.
PERFORM bdc_field USING 'BDC_CURSOR'
'GLACCOUNT_SCREEN_KEY-SAKNR'.
PERFORM bdc_field USING 'GLACCOUNT_SCREEN_KEY-SAKNR'
wa_skat-saknr.
PERFORM bdc_field USING 'GLACCOUNT_SCREEN_KEY-BUKRS'
pa_bukrs.
PERFORM bdc_dynpro USING 'SAPLGL_ACCOUNT_MASTER_MAINTAIN' '2001'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=ACC_MOD'.
PERFORM bdc_field USING 'BDC_CURSOR'
'GLACCOUNT_SCREEN_KEY-SAKNR'.
PERFORM bdc_field USING 'GLACCOUNT_SCREEN_KEY-SAKNR'
wa_skat-saknr.
PERFORM bdc_field USING 'GLACCOUNT_SCREEN_KEY-BUKRS'
pa_bukrs.
PERFORM bdc_dynpro USING 'SAPLGL_ACCOUNT_MASTER_MAINTAIN' '2001'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=2105_P++'.
PERFORM bdc_field USING 'BDC_CURSOR'
'GLACCOUNT_SCREEN_COA-LANGU_KW(01)'.
PERFORM bdc_dynpro USING 'SAPLGL_ACCOUNT_MASTER_MAINTAIN' '2001'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=SAVE'.
PERFORM bdc_field USING 'BDC_CURSOR'
'GLACCOUNT_SCREEN_COA-TXT50_TX(01)'.
PERFORM bdc_field USING 'GLACCOUNT_SCREEN_COA-LANGU_TX(01)'
pa_zlang.
PERFORM bdc_field USING 'GLACCOUNT_SCREEN_COA-TXT20_TX(01)'
wa_skat-txt20.
PERFORM bdc_field USING 'GLACCOUNT_SCREEN_COA-TXT50_TX(01)'
wa_skat-txt50.
PERFORM bdc_transaction USING 'FS00'.
ENDFORM. "fs00
*&---------------------------------------------------------------------*
*& Form PROTOKOLL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM protokoll .
WRITE: / wa_skat-saknr,
pa_zlang,
wa_skat-txt20,
wa_skat-txt50.
ENDFORM. " PROTOKOLL
Kopieren von Kostenartentexten
REPORT z_copy_kstar_texts. ******************************************************************* * Rohde 01/2010 ******************************************************************* * Kopieren(!) von Kostenarten-Texten (Kurz und Langtext) von einer * Sprache in eine andere. So lassen sich z.B. die englischen * Kostenartenbezeichnungen auch in andere Sprachen kopieren, damit * man bspw. bei Anmeldung in Spanisch keine leeren Kostenartentexte * vorfindet. Die Betonung liegt auf KOPIEREN, nicht übersetzen, * so schlau ist das Programm leider noch nicht!!!! * Die Änderungen werden per BAPI durchgeführt. Bestehende * Texte in der Zielsprache werden NICHT überschrieben. ******************************************************************* TABLES: csku, tka01. DATA: git_csku TYPE TABLE OF csku, gs_csku TYPE csku. DATA: git_textmdco TYPE TABLE OF textmdco, gs_textmdco TYPE textmdco. ******************************************************************* PARAMETERS: pa_kokrs LIKE tka01-kokrs OBLIGATORY. "Kostenrech.kreis SELECT-OPTIONS: so_kstar FOR csku-kstar. "Kostenart PARAMETERS: pa_qlang LIKE csku-spras OBLIGATORY, "Quell-Sprache pa_zlang LIKE csku-spras OBLIGATORY. "Ziel-Sprache PARAMETERS: pa_test AS CHECKBOX DEFAULT 'X'. "Testlauf ******************************************************************* ******************************************************************* START-OF-SELECTION. ******************************************************************* SELECT SINGLE * FROM tka01 WHERE kokrs = pa_kokrs. IF sy-subrc NE 0. MESSAGE e600(fr) WITH 'Kostenrechungskreis' pa_kokrs 'ungültig'. ENDIF. SELECT * FROM csku INTO TABLE git_csku WHERE spras = pa_qlang AND ktopl = tka01-ktopl AND kstar IN so_kstar. LOOP AT git_csku INTO gs_csku. SELECT SINGLE * FROM csku WHERE spras = pa_zlang AND ktopl = gs_csku-ktopl AND kstar = gs_csku-kstar. IF sy-subrc = 0. SUMMARY. WRITE: / 'Text zu Kostenart', gs_csku-kstar, 'in Sprache', pa_zlang, 'schon vorhanden'. ELSE. REFRESH git_textmdco. CLEAR gs_textmdco. gs_textmdco-spras = pa_zlang. gs_textmdco-ktext = gs_csku-ktext. gs_textmdco-ltext = gs_csku-ltext. APPEND gs_textmdco TO git_textmdco. IF pa_test = space. PERFORM update_kstar_texts. ELSE. DETAIL. WRITE: / gs_csku-ktopl, gs_csku-kstar, gs_textmdco-spras, gs_textmdco-ktext, gs_textmdco-ltext. ENDIF. ENDIF. ENDLOOP. *&---------------------------------------------------------------------* *& Form update_kstar_texts *&---------------------------------------------------------------------* * BAPI-Aufruf Ändern Kostenartentext *----------------------------------------------------------------------* FORM update_kstar_texts. CALL FUNCTION 'K_COSTELEMENT_CHANGE_TEXT' EXPORTING ktopl = gs_csku-ktopl kstar = gs_csku-kstar TABLES texttable = git_textmdco EXCEPTIONS not_found = 1 foreign_lock = 2 OTHERS = 3. IF sy-subrc <> 0. SUMMARY. WRITE: 'Fehler', sy-subrc, 'beim Update Kostenart', gs_csku-kstar. ELSE. DETAIL. WRITE: 'Kostenart', gs_csku-kstar, 'aktualisiert'. ENDIF. ENDFORM. "update_kstar_texts
Standardtexte in andere Sprachen kopieren
Anbei ein kleines Hilfstool, mit dem Standardtexte (SO10) in anderen Sprachen angelegt werden können. Es versteht sich wohl von selbst, dass die Texte nur kopiert und nicht übersetzt werden. Das Verfahren eignet sich z.B. für die Vervielfältigung von Adress-Textbausteinen in andere Sprachen...
Beispiel: "Kopiere alle Texte ZADR*, Text-ID ADRS von DE nach IT"
* Standardtexte (SO10) von einer Sprache in eine * andere kopieren (nur kopieren[!] nicht übersetzen[!]) * Wer möchte, kann natürlich gerne einen Übersetzungsroboter * dazubauen!!! REPORT yytxcopy NO STANDARD PAGE HEADING LINE-SIZE 255. TABLES: rssce, stxh. INCLUDE bdcrecx1. SELECTION-SCREEN ULINE. SELECT-OPTIONS: so_txnam FOR rssce-tdname OBLIGATORY. "Text-name PARAMETERS: pa_tdid LIKE rssce-tdid OBLIGATORY, "Text-ID pa_slang LIKE sy-langu OBLIGATORY "Source language DEFAULT sy-langu, p_tlang LIKE sy-langu OBLIGATORY. "Target language START-OF-SELECTION. PERFORM open_group. SELECT * FROM stxh WHERE tdobject = 'TEXT' AND tdname IN so_txnam AND tdid = pa_tdid AND tdspras = pa_slang. PERFORM so10. ENDSELECT. PERFORM close_group. *&---------------------------------------------------------------------* *& Form so10 *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM so10. PERFORM bdc_dynpro USING 'SAPMSSCE' '1100'. PERFORM bdc_field USING 'BDC_CURSOR' 'RSSCE-TDSPRAS'. PERFORM bdc_field USING 'BDC_OKCODE' '=EDIT'. PERFORM bdc_field USING 'RSSCE-TDNAME' stxh-tdname. PERFORM bdc_field USING 'RSSCE-TDID' stxh-tdid. PERFORM bdc_field USING 'RSSCE-TDSPRAS' stxh-tdspras. PERFORM bdc_dynpro USING 'SAPLSTXX' '1100'. PERFORM bdc_field USING 'BDC_CURSOR' 'RSTXT-TXLINE(02)'. PERFORM bdc_field USING 'BDC_OKCODE' '=TXNA'. PERFORM bdc_dynpro USING 'SAPLSTXX' '1111'. PERFORM bdc_field USING 'BDC_CURSOR' 'RSTXT-TDSPRAS'. PERFORM bdc_field USING 'BDC_OKCODE' '=PPUP'. PERFORM bdc_field USING 'RSTXT-TDNAME' stxh-tdname. PERFORM bdc_field USING 'RSTXT-TDID' stxh-tdid. PERFORM bdc_field USING 'RSTXT-TDSPRAS' p_tlang. PERFORM bdc_dynpro USING 'SAPLSTXX' '1100'. PERFORM bdc_field USING 'BDC_CURSOR' 'RSTXT-TXLINE(02)'. PERFORM bdc_field USING 'BDC_OKCODE' '=TXBA'. PERFORM bdc_dynpro USING 'SAPMSSCE' '1100'. PERFORM bdc_field USING 'BDC_CURSOR' 'RSSCE-TDNAME'. PERFORM bdc_dynpro USING 'SAPMSSCE' '1100'. PERFORM bdc_field USING 'BDC_CURSOR' 'RSSCE-TDSPRAS'. PERFORM bdc_field USING 'BDC_OKCODE' '=TXBA'. PERFORM bdc_field USING 'RSSCE-TDNAME' stxh-tdname. PERFORM bdc_field USING 'RSSCE-TDID' stxh-tdid. PERFORM bdc_field USING 'RSSCE-TDSPRAS' stxh-tdspras. PERFORM bdc_transaction USING 'SO10'. REFRESH bdcdata. ENDFORM. "so10
IDoc-Monitor WLF_IDOC um eigene Funktionen ergänzen
Der neue (na ja - so neu ist er auch nicht mehr) IDoc-Monitor bietet gegenüber der guten alten WE02 bzw. WE09 doch einige Vorteile, insbesondere in punkto Übersichtlichkeit und Folgebeleg-Absprünge. Was mich jedoch nervt ist, dass es z.B. keinen Absprung in den POS-Monitor (WPER) für POS-Nachrichtentypen gibt. Ok - ist sicherlich auch eine etwas extravagante Anforderung, aber gut dass es da BAdIs gibt (Details s. Hinweis 1897880 - BAdIs für WLF_IDOC).
Mithilfe des BAdIs WLF_REPORT_PROCESS_BD können eigene OK-Codes hinzugefügt und ausgewertet werden. Das BAdI beherbergt die Methoden...
ADJUST_STATUS
Hier kann ein eigener Oberflächenstatus gesetzt werden. Hierzu habe ich mithilfe der SE41 den Status STANDARD des Reports RWLFIDOC_NEW in einen (leeren) Z-Report kopiert und eine Drucktaste/Funktionscode (ZWPER) hinzugefügt.
In der BAdI-Implementierung setze ich lediglich über den CHANGING-Parameter CV_PROGRAM mein leeres Z-Programm, so dass der namensgleiche Status mit dem neuen FCODE gezogen wird.
method IF_WLF_REPORT_PROCESS_BD~ADJUST_STATUS.
cv_program = 'ZWLF_IDOC'.
endmethod. HANDLE_FCODE
Hier wird dann auf die (eigenen) Funktionscodes reagiert und (in diesem Fall) in die WPER abgesprungen. In der Struktur IS_DOC_LIST_OUT stehen die Daten des aktuell selektierten bzw. markierten IDocs zur Verfügung. Über den CHANGING-Parameter CV_FCODE_PROCESSED wird dem System mitgeteilt, dass der (eigene) Funktionscode prozessiert wurde.
METHOD if_wlf_report_process_bd~handle_fcode.
CASE iv_okcode.
WHEN 'ZWPER'.
cv_fcode_processed = abap_true.
CHECK is_idoc_list_out-docnum IS NOT INITIAL.
CHECK is_idoc_list_out-mestyp(3) = 'WPU'. "nur für WPUxxx-IDocs
SUBMIT sapmwper AND RETURN
WITH p_dat_b = is_idoc_list_out-credat
WITH p_dat_v = is_idoc_list_out-credat
WITH s_docnum = is_idoc_list_out-docnum.
ENDCASE.
ENDMETHOD. Dies ist natürlich nur ein Beispiel für eine sinnvolle Funktionserweiterung in Retail-Systemen. Euch fällt sicherlich auch noch was besseres ein...
Der o.g. BAdI ist übrigens nur ein Teil des Erweiterungsframeworks, welches in diesem Kontext zur Verfügung steht. Der Erweiterungsspot WLF_IDOC_PROCESSING umfasst weitere BAdIs, z.B. WLF_ENH_IDOC_DATA_BADI, mit dem der IDoc-Liste zusätzliche Felder hinzugefügt werden können.
IDoc ACC_DOCUMENT - Beispiele
Will man FI-Belege aus externen Quellen ins System buchen, bietet sich die Verwendung von IDocs des Typs ACC_DOCUMENT an. In den nachfolgenden Abschnitten wird die ordnungsgemäße Befüllung des IDoc-Inhalts beschrieben.
Eigenschaften der IDocs des Typ ACC_DOCUMENT
Nachrichtentyp: ACC_DOCUMENT
Basistyp: ACC_DOCUMENT04
Struktur
Die relevanten Segmente des IDocs sind:
- E1BPACHE09 : Kopfzeile
Status : Optional , min. Anzahl : 1 , max. Anzahl : 1
- E1BPACGL09 : Sachkontenzeile
Status : Optional , min. Anzahl : 1 , max. Anzahl : 999999999
- E1BPACAR09 : Debitorzeile
Status : Optional , min. Anzahl : 1 , max. Anzahl : 999999999
- E1BPACAP09 : Kreditorzeile
Status : Optional , min. Anzahl : 1 , max. Anzahl : 999999999
- E1BPACTX09 : Steuerzeile
Status : Optional , min. Anzahl : 1 , max. Anzahl : 999999999
- E1BPACCR09 : Währungspositionen
Status : Optional , min. Anzahl : 1 , max. Anzahl : 999999999
Der generelle Aufbau ist wie folgt: Ein valides IDoc besteht aus genau einem Kopfsegment E1BPACHE09 und mindestens 2 Positionen. Die Positionen setzen sich jeweils aus einem Segment der Typen E1BPACGL09, E1BPACAP09 oder E1BPACAR09 mit jeweils einem korrespondierenden Betragssegment E1BPACCR09 zusammen. Die Verknüpfung zwischen den Belegpositionen und den Betragssegmenten erfolgt über das Feld ITEMNO_ACC (Positionsnummer).
Minimal-Beleg:
Belegkopf E1BPACHE09 |
Position 000001 Sachkontenzeile E1BPACGL09 oder Kreditorenzeile E1BPACAP09 oder Debitorenzeile E1BPACAR09 |
Position 000002 Sachkontenzeile E1BPACGL09 oder Kreditorenzeile E1BPACAP09 oder Debitorenzeile E1BPACAR09 |
Position 000001 Betragssegment E1BPACCR09 |
Position 000002 Betragssegment E1BPACCR09 |
Die Positionsnummern können im Prinzip beliebig vergeben werden, es empfiehlt sich jedoch, eine aufsteigende nummerische Positionsnummernvergabe vorzusehen.
Befüllung
Der oben beschriebene Minimalbeleg benötigt mindestens folgende Feldversorgungen:
E1BPACHE09
BUS_ACT RFBU (Vorgang fix)
USERNAME USERXYZ
HEADER_TXT KOPFTEXT (Belegkopftext, optional, sofern Belegart keine Eingabe erfordert)
COMP_CODE 1000 (Buchungskreis)
DOC_DATE 20150227 (Belegdatum)
PSTNG_DATE 20150227 (Buchungsdatum)
DOC_TYPE SA (Belegart)
REF_DOC_NO REFERENZ-NR (Referenznummer, optional, sofern Belegart keine Eingabe erfordert)
E1BPACGL09 (1. Position, Sachkontenposition)
ITEMNO_ACC 000010 (Positionsnummer)
GL_ACCOUNT 0000160000 (Sachkonto)
ITEM_TEXT BUCHUNGSTEXT (optional)
ALLOC_NMBR ZUORDNUNG (optional, ansonsten wird Zuordnung systemseitig gemäß Einstellung im Sachkontenstamm befüllt)
E1BPACGL09 (2. Position, Sachkontenposition)
ITEMNO_ACC 000020 (Positionsnummer)
GL_ACCOUNT 0000151000 (Sachkonto)
ITEM_TEXT BUCHUNGSTEXT (optional)
ALLOC_NMBR ZUORDNUNG (optional, ansonsten wird Zuordnung systemseitig gemäß Einstellung im Sachkontenstamm befüllt)
E1BPACCR09 (zu Position 1)
ITEMNO_ACC 000010
CURRENCY EUR (Belegwährung)
AMT_DOCCUR 10.00 (Betrag in Belegwährung)
E1BPACCR09 (zu Position 2)
ITEMNO_ACC 000020
CURRENCY EUR
AMT_DOCCUR 10.00-
(Achtung: Soll und Haben wird durch positiven bzw. negatives Vorzeichen unterschieden, - = Haben, + = Soll)
Besonderheit bei Buchung mit Umsatzsteuer
Im Gegensatz zum Batch-Input-Verfahren ist es mit dem Nachrichtentyp ACC_DOCUMENT (bzw. im Endeffekt mit dem dahinterliegenden BAPI_ACC_DOCUMENT_POST) nicht möglich, den Steueranteil einer Buchung vom System generieren zu lassen. D.h., die Steuerinformationen müssen dem IDoc auf folgende Weise mitgegeben werden:
Bei der Position, die die Steuer beinhaltet (i.d.R. die Sachkontenposition) wird der Betrag netto mitgegeben. Zusätzlich wird eine Steuerzeile des Segmenttyps E1BPACTX09 nebst Betragssegment (E1BPACCR09) mit folgenden Informationen benötigt:
E1BPACTX09
ITEMNO_ACC 000030
TAX_CODE V1 (Steuerkennzeichen)
E1BPACCR09
ITEMNO_ACC 000030
CURRENCY EUR
AMT_DOCCUR 1.60 (Steuerbetrag)
AMT_BASE 8.40 (Steuerbasis)
Beispiel:
Kreditorische Buchung
per Stromkosten 632500 8,40,-- an Kreditor 100003 10,--
Vorsteuer (V1) 1,60,--
Belegkopf E1BPACHE09:
BUS_ACT: RFBU
USERNAME: USERXYZ
HEADER_TXT: KOPFTEXT
COMP_CODE: 1000
DOC_DATE: 20150227
PSTNG_DATE: 20150227
DOC_TYPE: KR
REF_DOC_NO: 378455676
Kreditorenposition E1BPACAP09:
ITEMNO_ACC 000010
VENDOR_NO 0000100003 (Kreditorennummer)
Betragsposition zur Kreditorenposition E1BPACCR09
ITEMNO_ACC 000010
CURRENCY EUR
AMT_DOCCUR 10-
Sachkontenposition E1BPACGL09
ITEMNO_ACC 000020
GL_ACCOUNT 0000632500
ITEM_TEXT TESTBUCHUNG MIT STEUER
TAX_CODE V1 (Steuerkennzeichen!)
COSTCENTER 0000001000 (Kostenstelle, Konto 632500 ist Kostenart!)
Betragsposition zur Sachkontenposition E1BPACCR09
ITEMNO_ACC 000020
CURRENCY EUR
AMT_DOCCUR 8.40 (netto!)
Steuerzeile E1BPACTX09
ITEMNO_ACC 000030
TAX_CODE V1
Betragsposition zur Steuerzeile E1BPACCR09
ITEMNO_ACC 000030
CURRENCY EUR
AMT_DOCCUR 1.60 (Steuerbetrag)
AMT_BASE 8.40 (Steuerbasis)
Variablen in Selektionsvarianten
Verwendung von Variablen in Selektionsvarianten:
Die dynamische Datumsberechnung ist für alle Selektionsparameter möglich, die vom Typ DATUM (Typ DATS) oder Zeit (TIMS) sind.
Selektionsvariable D

Name der Variablen --> passenden Eintrag auswählen

Beispiel: Tagesdatum – 2 Arbeitstage

-->
Die Definition eigener Variablen ist leider ohne Modifikation nicht möglich. Die Liste der zur Verfügung stehenden dynamischen Datumsvariablen wird im Funktionsbaustein RS_VARI_V_INIT aufgebaut. Hierbei werden Bezeichnung, Typ und Berechnungsfunktionsbaustein pro Variable im System bekannt gemacht. Ggf. könnte man über eine geeignete Erweiterungsimplementierung des o.g. Funktionsbausteins die Liste der Variablen erweitern. Dazu müsste dann noch ein eigener Berechnungsbaustein (z.B. als Kopie des FB RS_VARI_V_1_NEXT_MONTH) ausprogrammiert werden. Sofern zur Berechnung weitere Daten eingegeben werden müssen (z.B. Fabrikkalender), ist darüber hinaus der SAP-Funktionsbaustein RS_VARI_V_SAVE umfänglich anzupassen.
Vor diesem Hintergrund ist von der Verwendung kundeneigener dynamischer Datumsvariablen eher abzuraten.
Für andere Datentypen mit variablem Inhalt kann in der Tabelle TVARV eine Variable angelegt und in Varianten verwendet werden:
SM31 – TVARV – pflegen oder Transaktion STVARV

Auf diese Weise definierte Variablen können nun in Varianten verwendet werden. Der Datentyp des Selektionsparameters muss natürlich mit dem angegebenen Variableninhalt kompatibel sein.

Der Variableninhalt kann entweder manuell im Dialog über die Tabelle TVARV gepflegt oder programmtechnisch gesetzt werden.
Die o.g. Bsp. genannte Variable ZFIC_COPA_PREV_PERIOD wird automatisch auf den „richtigen“ Wert (d.h. im Feb 2012 auf 001.2012) durch ein entsprechendes kundeneigenes Programm gesetzt (Beispielcoding s.u.).
D.h. sofern dafür Sorge getragen wird, dass der Report immer am 1. des Monats VOR allen anderen Reports, die entsprechende Variablen verwenden, läuft, kann die Variable ohne Probleme verwendet werden und ist in Bezug zum aktuellen Datum korrekt gefüllt.
Beispielcoding:
REPORT Y_TVARVC_UPDATE.
TABLES: TVARVC .
DATA: DATUM LIKE SY-DATUM.
DATA: NDAYS TYPE i.
* To be on the safe side, En-/Dequeues
* should be performed on table TVARVC
*...
* Example for Parameter-Variable
TVARVC-TYPE = 'P'.
TVARVC-NUMB = 0. "no multiple entries for PARAMETERS
TVARVC-NAME = 'Y_DAYS_TO_XMAS_EVE'.
DATUM = SY_DATUM.
DATUM+4(4) = '1224'.
IF SY-DATUM > DATUM. "X-mas eve is over – cu next year
DATUM(4) = DATUM(4) + 1.
ENDIF.
NDAYS = DATUM – SY-DATUM.
TVARVC-LOW = NDAYS.
UPDATE TVARVC.
* Example for Select-Option-Variable
TVARVC-TYPE = 'S'.
TVARVC-NAME = 'Y_SO_AGES_FOR_MONOPOLY'.
TVARVC-NUMB = 1. "first entry
TVARVC-SIGN = 'I'. "(I)nclude, (E)xclude
TVARVC-OPTI = 'BT'. "BT = BETWEEN, …
TVARVC-LOW = 8. "Family-fun from age x…
TVARVC-HIGH = 99. "…to y
UPDATE TVARVC.
ADD 1 TO TVARVC-NUMB. "2nd entry, if necessary
* fill TVARVC-fields according to above example
* …
BAPI-Meldungen ausgeben
Nachfolgend einige Hinweise, wie man elegant Return-Nachrichten von BAPIs ausgeben kann.
Neuere BAPIs geben Ihre Meldungen in der Struktur BAPIRET2 zurück.
Bsp.:
DATA:
* Meldungen des BAPI's
git_return TYPE TABLE OF bapiret2.
*-----------------------------------------------------------------------
* BAPI-Call
*-----------------------------------------------------------------------
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
accountreceivable = git_accountreceivable
currencyamount = git_currencyamount
return = git_return.
Ausgabe:
CALL FUNCTION 'C14ALD_BAPIRET2_SHOW'
TABLES
i_bapiret2_tab = git_return.
Einige ältere BAPIs liefern Ihre Nachrichten noch in der Struktur BAPIRETURN zurück. In diesem Falle kann man diese zuvor in die Struktur BAPIRET2 überführen.
Bsp:
DATA: lt_return TYPE TABLE OF bapireturn,
lt_bapiret2 type table of bapiret2.
CALL FUNCTION 'BAPI_...'
EXPORTING
...
TABLES
return = lt_return
...
Konvertieren:
CALL FUNCTION 'EHSWA_490_BAPIRET_CONVERSION'
TABLES
I_BAPIRETURN_MSG_TAB = lt_return
E_BAPIRET2_MSG_TAB = lt_bapiret2.
Ausgabe:
CALL FUNCTION 'C14ALD_BAPIRET2_SHOW'
TABLES
i_bapiret2_tab = lt_bapiret2.
/image%2F1473637%2F20170207%2Fob_adae32_profilbild.png)










