fi
Workflowbasierte Bearbeitung und Freigabe des Zahlungsvorschlags
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.
Aktivieren Sie den Workflow im entsprechenden zahlenden Buchungskreis und geben Sie die Zahlwege vor, für die der Workflow greifen soll.
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:
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"
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.
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.
Upload-Tool für Hauptbuchbelege (SAPGUI)
Update 13.04.26: Damit das Programm "fiorisiert" werden kann, muss der Zugriff auf die Excel-Datei von OLE auf einen alternativen Zugriff umgestellt werden. OLE ist nur im Kontext der SAP-GUI unterstützt, das Programm in seiner ursprünglich geposteten Form wäre als fiorisierte GUI-App nicht lauffähig. Deshalb wurde der komplette Upload auf die sog. XCO API umgestellt. Das Tool ist nun auch in der FIORI-Welt ausführbar.
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_UPL_DOCUMENTS
*----------------------------------------------------------------------*
* Function : Upload documents from Excel *
*----------------------------------------------------------------------*
* Description : Upload & posting of documents via Excel *
* Author : S.Rohde Consenso Consulting *
* Date/Version : 23.01.2023 1.0
*----------------------------------------------------------------------*
* SRO190723 Enable postings in foreign currency
* SRO030226 Upgrade to S/4 & new Excel Interface
* SRO300326 Ignore negative values in Excel file, sign is determined
* by posting key only
REPORT zfi_upl_documents.
***********************************************************************
******************** GLOBAL DATA **************************************
***********************************************************************
CONSTANTS: gc_delimiter(1) TYPE c VALUE '~'.
SET EXTENDED CHECK OFF.
INCLUDE:
sbal_constants,
<icon>.
SET EXTENDED CHECK ON.
TYPES: gty_currency_amount TYPE TABLE OF bapiaccr09.
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 gty_xl_sheet,
col_a TYPE string,
col_b TYPE string,
col_c TYPE string,
col_d TYPE string,
col_e TYPE string,
col_f TYPE string,
col_g TYPE string,
col_h TYPE string,
col_i TYPE string,
col_j TYPE string,
col_k TYPE string,
col_l TYPE string,
col_m TYPE string,
col_n TYPE string,
col_o TYPE string,
col_p TYPE string,
col_q TYPE string,
col_r TYPE string,
col_s TYPE string,
col_t TYPE string,
col_u TYPE string,
col_v TYPE string,
col_w TYPE string,
col_x TYPE string,
col_y TYPE string,
col_z TYPE string,
END OF gty_xl_sheet.
TYPES: gtt_it_xl TYPE STANDARD TABLE OF gty_xl_sheet WITH DEFAULT KEY.
TYPES: BEGIN OF tax_item,
mwskz TYPE mwskz,
direct_tax TYPE abap_bool,
basis TYPE fwbas,
bashw TYPE hwbas,
steuer TYPE fwste,
steuhw TYPE hwste,
END OF tax_item.
DATA: git_taxitems TYPE TABLE OF tax_item,
gs_taxitem TYPE tax_item.
TYPES: BEGIN OF gty_doc,
doc(20) TYPE c,
bschl TYPE bschl,
umskz TYPE umskz,
bukrs TYPE bukrs,
newko TYPE rf05a-newko,
mwskz TYPE mwskz,
wrbtr(15) TYPE c,
waers TYPE waers,
netto TYPE c,
dmbtr(15) TYPE c,
kostl TYPE kostl,
sgtxt TYPE sgtxt,
blart TYPE blart,
bldat(10) TYPE c,
budat(10) TYPE c,
xblnr TYPE xblnr,
bumon TYPE bumon,
bktxt TYPE bktxt,
zuonr TYPE dzuonr,
netdt(10) TYPE c,
bewar TYPE bseg-bewar,
aufnr TYPE aufnr,
prctr TYPE prctr,
kidno TYPE bseg-kidno,
zterm TYPE bseg-zterm,
END OF gty_doc.
DATA: git_docs TYPE TABLE OF gty_doc,
gs_doc TYPE gty_doc.
DATA: gs_t001 TYPE t001,
g_rc TYPE sy-subrc.
DATA: g_tabix TYPE sytabix.
* Interface data for BAPI
DATA:
* Returnparameters of BAPIs
g_obj_type TYPE bapiache09-obj_type, "Object type
* Object key will be populated with Document number
* NNNNNNNNNNYYYYBBBB N = Doc Number, Y = Fiscal Year, B = Company code
g_obj_key TYPE bapiache09-obj_key, "Object key
g_obj_sys TYPE bapiache09-obj_sys, "log. System
* Document header
gs_documentheader TYPE bapiache09,
* G/L account item
git_accountgl TYPE TABLE OF bapiacgl09,
gs_accountgl TYPE bapiacgl09,
* AR item
git_accountrec TYPE TABLE OF bapiacar09,
gs_accountrec TYPE bapiacar09,
* AP items
git_accountpay TYPE TABLE OF bapiacap09,
gs_accountpay TYPE bapiacap09,
* Tax items
git_accounttax TYPE TABLE OF bapiactx09,
gs_accounttax TYPE bapiactx09,
* Amount information
git_currencyamount TYPE TABLE OF bapiaccr09,
gs_currencyamount TYPE bapiaccr09,
* BAPI mesages
git_return TYPE TABLE OF bapiret2,
gs_return TYPE bapiret2.
DATA:
g_itemno TYPE posnr_acc. "Line item number
*&---------------------------------------------------------------------*
*& SELECTION-SCREEN
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-b01.
PARAMETERS: pa_fnam LIKE rlgrap-filename OBLIGATORY.
" PARAMETERS: pa_shtyp TYPE zde_shtyp DEFAULT '2' NO-DISPLAY.
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.
*-----------------------------------------------------------------------
CLEAR git_return[].
PERFORM init_protocol.
PERFORM upload_data.
PERFORM precheck_data CHANGING g_rc.
IF g_rc = 0.
PERFORM process_data.
ENDIF.
PERFORM add_msg_to_prot.
PERFORM log_display.
*&---------------------------------------------------------------------*
*& 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.
PERFORM msg_add USING probclass_high.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form UPLOAD_DATA
*&---------------------------------------------------------------------*
*& Upload Excel spreadsheet & structurize data
*&---------------------------------------------------------------------*
FORM upload_data .
DATA: lt_bin_data TYPE w3mimetabtype.
DATA: lt_sheet_data TYPE gtt_it_xl.
DATA: l_fnam TYPE string.
l_fnam = pa_fnam.
CALL METHOD cl_gui_frontend_services=>gui_upload
EXPORTING
filename = l_fnam
filetype = 'BIN'
CHANGING
data_tab = lt_bin_data.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* solix -> xstring
DATA(lv_xsts_xlsx) = cl_bcs_convert=>solix_to_xstring( it_solix = lt_bin_data ).
* Excel-Dokument
DATA(o_xl) = xco_cp_xlsx=>document->for_file_content( lv_xsts_xlsx )->read_access( ).
* 1. Sheet
DATA(o_sheet) = o_xl->get_workbook( )->worksheet->at_position( 1 ).
IF abap_true = o_sheet->exists( ).
DATA(o_sel_pattern) = xco_cp_xlsx_selection=>pattern_builder->simple_from_to( )->get_pattern( ).
CLEAR lt_sheet_data[].
DATA(o_result) = o_sheet->select( o_sel_pattern
)->row_stream(
)->operation->write_to( REF #( lt_sheet_data )
)->set_value_transformation( xco_cp_xlsx_read_access=>value_transformation->string_value
)->if_xco_xlsx_ra_operation~execute( ).
IF abap_true = o_result->succeeded.
LOOP AT lt_sheet_data ASSIGNING FIELD-SYMBOL(<ls_sheet>).
CHECK sy-tabix > 1.
gs_doc-doc = <ls_sheet>-col_a.
gs_doc-bschl = <ls_sheet>-col_b.
gs_doc-umskz = <ls_sheet>-col_c.
gs_doc-bukrs = <ls_sheet>-col_d.
gs_doc-newko = <ls_sheet>-col_e.
gs_doc-mwskz = <ls_sheet>-col_f.
gs_doc-wrbtr = <ls_sheet>-col_g.
gs_doc-waers = <ls_sheet>-col_h.
gs_doc-netto = <ls_sheet>-col_i.
gs_doc-dmbtr = <ls_sheet>-col_j.
gs_doc-kostl = <ls_sheet>-col_k.
gs_doc-sgtxt = <ls_sheet>-col_l.
gs_doc-blart = <ls_sheet>-col_m.
gs_doc-bldat = <ls_sheet>-col_n.
gs_doc-budat = <ls_sheet>-col_o.
gs_doc-xblnr = <ls_sheet>-col_p.
gs_doc-bumon = <ls_sheet>-col_q.
gs_doc-bktxt = <ls_sheet>-col_r.
gs_doc-zuonr = <ls_sheet>-col_s.
gs_doc-netdt = <ls_sheet>-col_t.
gs_doc-bewar = <ls_sheet>-col_u.
gs_doc-aufnr = <ls_sheet>-col_v.
gs_doc-prctr = <ls_sheet>-col_w.
gs_doc-kidno = <ls_sheet>-col_x.
gs_doc-zterm = <ls_sheet>-col_y.
APPEND gs_doc TO git_docs.
ENDLOOP.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form INIT_PROTOCOL
*&---------------------------------------------------------------------*
*& Initialize application protocol
*&---------------------------------------------------------------------*
FORM init_protocol .
* create a log
g_s_log-extnumber = 'Document-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
*&---------------------------------------------------------------------*
*& Initialization
*&---------------------------------------------------------------------*
FORM init .
CLEAR: git_accountgl[],
git_accountpay[],
git_accountrec[],
git_accounttax[],
git_currencyamount[],
git_taxitems[].
CLEAR: g_itemno, gs_documentheader.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form POST_DOCUMENT
*&---------------------------------------------------------------------*
*& Post document
*&---------------------------------------------------------------------*
FORM post_document .
DATA: l_error TYPE abap_bool VALUE abap_false.
DATA: lit_return TYPE TABLE OF bapiret2.
*-----------------------------------------------------------------------
* BAPI-Call
*-----------------------------------------------------------------------
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST' "#EC CI_USAGE_OK[2628704]
EXPORTING
documentheader = gs_documentheader "#EC CI_USAGE_OK[2438131]
IMPORTING
obj_type = g_obj_type
obj_key = g_obj_key
obj_sys = g_obj_sys
TABLES
accountgl = git_accountgl
accountreceivable = git_accountrec
accountpayable = git_accountpay
accounttax = git_accounttax
currencyamount = git_currencyamount
return = lit_return.
LOOP AT lit_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.
APPEND LINES OF lit_return TO git_return.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CHECK_DOCUMENT
*&---------------------------------------------------------------------*
*& check document (Test mode)
*&---------------------------------------------------------------------*
FORM check_document .
DATA: lit_return TYPE TABLE OF bapiret2.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK' "#EC CI_USAGE_OK[2438131]
EXPORTING
documentheader = gs_documentheader "#EC CI_USAGE_OK[2628704]
TABLES
accountgl = git_accountgl
accountreceivable = git_accountrec
accountpayable = git_accountpay
accounttax = git_accounttax
currencyamount = git_currencyamount
return = lit_return.
APPEND LINES OF lit_return TO git_return.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form PROCESS_DATA
*&---------------------------------------------------------------------*
*& map excel data to BAPI structure & post / check documents
*&---------------------------------------------------------------------*
FORM process_data .
DATA: l_netto TYPE wrbtr,
l_nethw TYPE dmbtr,
l_brutto TYPE wrbtr,
l_bruthw TYPE dmbtr,
l_steuer TYPE fwste,
l_steuhw TYPE hwste,
l_basis TYPE fwbas,
l_bashw TYPE hwbas.
DATA: l_mwskz TYPE skb1-mwskz,
ls_bsl TYPE tbsl.
*-----------------------------------------------------------------------
* Items
*-----------------------------------------------------------------------
LOOP AT git_docs INTO gs_doc.
AT NEW doc.
PERFORM init.
*-----------------------------------------------------------------------
* document header
*-----------------------------------------------------------------------
READ TABLE git_docs INDEX sy-tabix INTO DATA(ls_doc).
CLEAR gs_documentheader.
gs_documentheader-bus_act = 'RFBU'.
gs_documentheader-username = sy-uname.
gs_documentheader-comp_code = ls_doc-bukrs.
PERFORM _convert_date_xlsx USING ls_doc-bldat.
gs_documentheader-doc_date = ls_doc-bldat.
PERFORM _convert_date_xlsx USING ls_doc-budat.
gs_documentheader-pstng_date = ls_doc-budat.
IF gs_doc-bumon IS NOT INITIAL AND ls_doc-bumon NE space.
gs_documentheader-fis_period = ls_doc-bumon.
ENDIF.
gs_documentheader-ref_doc_no = ls_doc-xblnr.
gs_documentheader-header_txt = ls_doc-bktxt.
gs_documentheader-doc_type = ls_doc-blart.
SELECT SINGLE * FROM t001 INTO gs_t001 WHERE bukrs = ls_doc-bukrs.
ENDAT.
g_tabix = sy-tabix.
ADD 1 TO g_itemno.
"begin of insertion SRO300326
gs_doc-wrbtr = abs( gs_doc-wrbtr ).
gs_doc-dmbtr = abs( gs_doc-dmbtr ).
"end of insertion SRO300326
SELECT SINGLE * FROM tbsl INTO ls_bsl WHERE bschl = gs_doc-bschl.
IF sy-subrc NE 0.
MESSAGE e034(f5) WITH gs_doc-bschl INTO g_dummy.
PERFORM msg_add USING probclass_high.
CONTINUE.
ENDIF.
CASE ls_bsl-koart.
WHEN 'S'.
CLEAR: gs_accountgl, gs_currencyamount.
CLEAR: l_brutto, l_bruthw.
gs_accountgl-itemno_acc = g_itemno.
PERFORM _convert USING gs_doc-newko gs_accountgl-gl_account 'HKONT'.
gs_accountgl-item_text = gs_doc-sgtxt.
IF gs_doc-kostl IS NOT INITIAL.
PERFORM _convert USING gs_doc-kostl gs_accountgl-costcenter 'KOSTL'.
ENDIF.
IF gs_doc-prctr IS NOT INITIAL.
PERFORM _convert USING gs_doc-prctr gs_accountgl-profit_ctr 'PRCTR'.
ENDIF.
IF gs_doc-aufnr IS NOT INITIAL.
PERFORM _convert USING gs_doc-aufnr gs_accountgl-orderid 'AUFNR'.
ENDIF.
gs_accountgl-alloc_nmbr = gs_doc-zuonr.
gs_accountgl-tax_code = gs_doc-mwskz.
gs_accountgl-cshdis_ind = abap_true.
IF gs_doc-wrbtr IS NOT INITIAL.
PERFORM _convert USING gs_doc-wrbtr l_brutto 'WRBTR'.
ENDIF.
IF gs_doc-dmbtr IS NOT INITIAL AND gs_doc-waers NE gs_t001-waers.
PERFORM _convert USING gs_doc-dmbtr l_bruthw 'DMBTR'.
ENDIF.
"Net amounts provided? --> Calculate gross-amounts
IF gs_doc-netto = abap_true.
PERFORM calculate_grossamounts USING gs_documentheader-comp_code gs_doc-waers gs_doc-mwskz
CHANGING l_brutto l_bruthw.
ENDIF.
IF ls_bsl-shkzg = 'H'.
MULTIPLY l_brutto BY -1.
MULTIPLY l_bruthw BY -1.
ENDIF.
* GL account taxable?
CLEAR l_mwskz.
SELECT SINGLE mwskz FROM skb1 INTO l_mwskz
WHERE saknr = gs_accountgl-gl_account
AND bukrs = gs_documentheader-comp_code. "#EC CI_DB_OPERATION_OK[2431747]
IF sy-subrc = 0 AND l_mwskz IS INITIAL.
"no tax allowed? --> clear tax code (same behaviour as FIORI app)
CLEAR: gs_doc-mwskz, gs_accountgl-tax_code.
ENDIF.
CLEAR: l_steuer, l_netto, l_basis, l_steuhw, l_nethw, l_bashw.
* with tax?
IF gs_doc-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_doc-mwskz
i_waers = gs_doc-waers
i_bukrs = gs_documentheader-comp_code
IMPORTING
e_fwbas = l_basis.
l_steuer = l_netto = l_brutto.
IF gs_doc-waers NE gs_t001-waers.
CALL FUNCTION 'RE_CALCULATE_BASE_AMOUNT'
EXPORTING
i_taxam = l_bruthw
i_mwskz = gs_doc-mwskz
i_waers = gs_t001-waers
i_bukrs = gs_documentheader-comp_code
IMPORTING
e_fwbas = l_bashw.
l_steuhw = l_nethw = l_bruthw.
ENDIF.
ELSE.
CALL FUNCTION 'CALCULATE_TAX_FROM_GROSSAMOUNT'
EXPORTING
i_bukrs = gs_documentheader-comp_code
i_mwskz = gs_doc-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.
IF gs_doc-waers NE gs_t001-waers AND gs_doc-dmbtr IS NOT INITIAL.
CALL FUNCTION 'CALCULATE_TAX_FROM_GROSSAMOUNT'
EXPORTING
i_bukrs = gs_documentheader-comp_code
i_mwskz = gs_doc-mwskz
i_waers = gs_t001-waers
i_wrbtr = l_bruthw
IMPORTING
e_fwste = l_steuhw
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_nethw = l_bruthw - l_steuhw.
l_bashw = l_nethw.
ENDIF.
ENDIF.
*-----------------------------------------------------------------------
* collect corresponding tax line for each taxable GL account
*-----------------------------------------------------------------------
CLEAR gs_taxitem.
gs_taxitem-mwskz = gs_doc-mwskz.
gs_taxitem-steuer = l_steuer.
gs_taxitem-steuhw = l_steuhw.
gs_taxitem-basis = l_basis.
gs_taxitem-bashw = l_bashw.
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.
l_nethw = l_bruthw.
ENDIF.
IF NOT ( l_mwskz = '>' OR l_mwskz = '<' ). "Direct Tax
IF gs_doc-waers NE gs_t001-waers AND gs_doc-dmbtr IS NOT INITIAL.
gs_currencyamount-curr_type = '00'. "transaction (foreign) currency
ENDIF.
gs_currencyamount-itemno_acc = gs_accountgl-itemno_acc.
gs_currencyamount-currency = gs_doc-waers.
gs_currencyamount-amt_doccur = l_netto. "#EC CI_FLDEXT_OK[2610650]
APPEND: gs_accountgl TO git_accountgl,
gs_currencyamount TO git_currencyamount.
IF gs_doc-waers NE gs_t001-waers AND gs_doc-dmbtr IS NOT INITIAL.
gs_currencyamount-curr_type = '10'. "local currency
gs_currencyamount-itemno_acc = gs_accountgl-itemno_acc.
gs_currencyamount-currency = gs_t001-waers.
gs_currencyamount-amt_doccur = l_nethw. "#EC CI_FLDEXT_OK[2610650]
APPEND: gs_currencyamount TO git_currencyamount.
ENDIF.
ENDIF.
WHEN 'D'.
CLEAR: gs_accountrec, gs_currencyamount.
gs_accountrec-itemno_acc = g_itemno. "Positionsidentifier
PERFORM _convert USING gs_doc-newko gs_accountrec-customer 'KUNNR'.
gs_accountrec-item_text = gs_doc-sgtxt. "Belegtext
gs_accountrec-alloc_nmbr = gs_doc-zuonr. "Zuordnung
gs_accountrec-sp_gl_ind = gs_doc-umskz. "SHB-KZ
gs_accountrec-paymt_ref = gs_doc-kidno. "Zahlungsreferenz
IF gs_doc-netdt IS NOT INITIAL.
PERFORM _convert_date_xlsx USING gs_doc-netdt.
gs_accountrec-bline_date = gs_doc-netdt.
ENDIF.
IF gs_doc-zterm IS NOT INITIAL.
gs_accountrec-pmnttrms = gs_doc-zterm.
ELSE.
SELECT SINGLE zterm FROM knb1 INTO gs_accountrec-pmnttrms
WHERE kunnr = gs_accountrec-customer
AND bukrs = gs_doc-bukrs.
ENDIF.
IF gs_doc-waers NE gs_t001-waers AND gs_doc-dmbtr IS NOT INITIAL.
gs_currencyamount-curr_type = '00'. "transaction (foreign) currency
ENDIF.
gs_currencyamount-itemno_acc = gs_accountrec-itemno_acc.
gs_currencyamount-currency = gs_doc-waers.
IF gs_doc-wrbtr IS NOT INITIAL.
PERFORM _convert USING gs_doc-wrbtr l_brutto 'WRBTR'.
IF ls_bsl-shkzg = 'H'.
MULTIPLY l_brutto BY -1.
ENDIF.
ENDIF.
gs_currencyamount-amt_doccur = l_brutto. "#EC CI_FLDEXT_OK[2610650]
APPEND: gs_accountrec TO git_accountrec,
gs_currencyamount TO git_currencyamount.
IF gs_doc-waers NE gs_t001-waers AND gs_doc-dmbtr IS NOT INITIAL.
gs_currencyamount-curr_type = '10'. "local currency
gs_currencyamount-itemno_acc = gs_accountrec-itemno_acc.
gs_currencyamount-currency = gs_t001-waers.
IF gs_doc-dmbtr IS NOT INITIAL.
PERFORM _convert USING gs_doc-dmbtr l_bruthw 'DMBTR'.
IF ls_bsl-shkzg = 'H'.
MULTIPLY l_bruthw BY -1.
ENDIF.
ENDIF.
gs_currencyamount-amt_doccur = l_bruthw. "#EC CI_FLDEXT_OK[2610650]
APPEND gs_currencyamount TO git_currencyamount.
ENDIF.
WHEN 'K'.
CLEAR: gs_accountpay, gs_currencyamount.
gs_accountpay-itemno_acc = g_itemno. "Positionsidentifier
PERFORM _convert USING gs_doc-newko gs_accountpay-vendor_no 'LIFNR'.
gs_accountpay-item_text = gs_doc-sgtxt. "Belegtext
gs_accountpay-alloc_nmbr = gs_doc-zuonr. "Zuordnung
gs_accountpay-sp_gl_ind = gs_doc-umskz. "SHB-KZ
gs_accountpay-paymt_ref = gs_doc-kidno. "Zahlungsreferenz
IF gs_doc-netdt IS NOT INITIAL.
PERFORM _convert_date_xlsx USING gs_doc-netdt.
gs_accountpay-bline_date = gs_doc-netdt.
ENDIF.
IF gs_doc-zterm IS NOT INITIAL.
gs_accountpay-pmnttrms = gs_doc-zterm.
ELSE.
SELECT SINGLE zterm FROM lfb1 INTO gs_accountpay-pmnttrms
WHERE lifnr = gs_accountpay-vendor_no
AND bukrs = gs_doc-bukrs.
ENDIF.
IF gs_doc-waers NE gs_t001-waers AND gs_doc-dmbtr IS NOT INITIAL.
gs_currencyamount-curr_type = '00'. "transaction (foreign) currency
ENDIF.
gs_currencyamount-itemno_acc = gs_accountpay-itemno_acc.
gs_currencyamount-currency = gs_doc-waers.
IF gs_doc-wrbtr IS NOT INITIAL.
PERFORM _convert USING gs_doc-wrbtr l_brutto 'WRBTR'.
IF ls_bsl-shkzg = 'H'.
MULTIPLY l_brutto BY -1.
ENDIF.
ENDIF.
gs_currencyamount-amt_doccur = l_brutto. "#EC CI_FLDEXT_OK[2610650]
APPEND: gs_accountpay TO git_accountpay,
gs_currencyamount TO git_currencyamount.
IF gs_doc-waers NE gs_t001-waers AND gs_doc-dmbtr IS NOT INITIAL.
gs_currencyamount-curr_type = '10'. "local currency
gs_currencyamount-itemno_acc = gs_accountpay-itemno_acc.
gs_currencyamount-currency = gs_t001-waers.
IF gs_doc-dmbtr IS NOT INITIAL.
PERFORM _convert USING gs_doc-dmbtr l_bruthw 'DMBTR'.
IF ls_bsl-shkzg = 'H'.
MULTIPLY l_bruthw BY -1.
ENDIF.
ENDIF.
gs_currencyamount-amt_doccur = l_bruthw. "#EC CI_FLDEXT_OK[2610650]
APPEND gs_currencyamount TO git_currencyamount.
ENDIF.
ENDCASE.
AT END OF doc.
READ TABLE git_docs INDEX g_tabix INTO ls_doc.
*-----------------------------------------------------------------------
* Prepare collected tax lines & attach to current document
*-----------------------------------------------------------------------
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.
IF ls_doc-waers NE gs_t001-waers AND ls_doc-dmbtr IS NOT INITIAL.
gs_currencyamount-curr_type = '00'.
ENDIF.
gs_currencyamount-itemno_acc = gs_accounttax-itemno_acc.
gs_currencyamount-currency = ls_doc-waers.
gs_currencyamount-amt_doccur = gs_taxitem-steuer. "#EC CI_FLDEXT_OK[2610650]
gs_currencyamount-amt_base = gs_taxitem-basis. "#EC CI_FLDEXT_OK[2610650]
APPEND: gs_accounttax TO git_accounttax,
gs_currencyamount TO git_currencyamount.
IF ls_doc-waers NE gs_t001-waers AND ls_doc-dmbtr IS NOT INITIAL.
gs_currencyamount-curr_type = '10'.
gs_currencyamount-itemno_acc = gs_accounttax-itemno_acc.
gs_currencyamount-currency = gs_t001-waers.
gs_currencyamount-amt_doccur = gs_taxitem-steuhw. "#EC CI_FLDEXT_OK[2610650]
gs_currencyamount-amt_base = gs_taxitem-bashw. "#EC CI_FLDEXT_OK[2610650]
APPEND: gs_currencyamount TO git_currencyamount.
ENDIF.
ENDLOOP.
PERFORM round_amounts USING g_itemno CHANGING git_currencyamount.
*-----------------------------------------------------------------------
* Post / Check document
*-----------------------------------------------------------------------
IF pa_test IS INITIAL.
PERFORM post_document.
ELSE.
PERFORM check_document.
ENDIF.
ENDAT.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form _CONVERT
*&---------------------------------------------------------------------*
*& Convert excel data to SAP format
*&---------------------------------------------------------------------*
*& --> in/out input / output
*& --> Dtel data element that determines the conversion
*&---------------------------------------------------------------------*
FORM _convert USING in out VALUE(dtel).
DATA: l_btr TYPE wrbtr.
IF dtel = 'WRBTR' OR dtel = 'DMBTR' AND in CO '0123456789 .'.
l_btr = in. "#EC CI_FLDEXT_OK[2610650]
out = l_btr. "#EC CI_FLDEXT_OK[2610650]
EXIT.
ENDIF.
CALL FUNCTION 'RS_CONV_EX_2_IN_DTEL'
EXPORTING
input_external = in "#EC CI_FLDEXT_OK[2610650]
dtel = dtel
IMPORTING
output_internal = out. "#EC CI_FLDEXT_OK[2610650]
IF sy-subrc <> 0.
MESSAGE a600(fr) WITH 'ERROR'(f03) sy-subrc 'at conversion'(f04) 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.
*&---------------------------------------------------------------------*
*& Form PRECHECK_DATA
*&---------------------------------------------------------------------*
* Precheck Data, whether local currency is consistently provided
*----------------------------------------------------------------------*
FORM precheck_data CHANGING p_rc.
DATA: l_mix(2) TYPE c.
LOOP AT git_docs INTO gs_doc.
AT NEW doc.
READ TABLE git_docs INDEX sy-tabix INTO DATA(ls_doc).
SELECT SINGLE * FROM t001 INTO gs_t001 WHERE bukrs = ls_doc-bukrs.
CLEAR l_mix.
ENDAT.
"Doc is given in foreign currency
IF gs_doc-waers NE gs_t001-waers.
IF gs_doc-dmbtr IS NOT INITIAL OR gs_doc-dmbtr CO '0,. '.
l_mix(1) = 'X'.
ELSE.
l_mix+1(1) = 'X'.
ENDIF.
ENDIF.
IF l_mix = 'XX'.
"sometimes amount in LC is provided and sometimes not within same document
"--> ERROR
p_rc = 4.
MESSAGE e800(f5) INTO g_dummy.
PERFORM msg_add USING probclass_high.
EXIT.
ELSE.
p_rc = 0.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form _convert_date_xlsx
*&---------------------------------------------------------------------*
*& Datumsformat Excel in anständiges Datum umwandeln.
*&---------------------------------------------------------------------*
FORM _convert_date_xlsx CHANGING p_date TYPE char10.
DATA: lv_days TYPE i,
lv_date TYPE datum.
CHECK p_date IS NOT INITIAL.
CHECK p_date CO ' 0123456789.'.
lv_days = trunc( p_date ) - 2.
lv_date = '19000101'.
ADD lv_days TO lv_date.
p_date = lv_date.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form calculate_grossamounts
*&---------------------------------------------------------------------*
*& Calculate gross amounts from net amounts
*&---------------------------------------------------------------------*
*& --> p_bukrs
*& --> p_WAERS
*& --> p_MWSKZ
*& <-- p_BRUTTO
*& <-- p_BRUTHW
*&---------------------------------------------------------------------*
FORM calculate_grossamounts USING p_bukrs TYPE bukrs
p_waers TYPE waers
p_mwskz TYPE mwskz
CHANGING p_netto TYPE wrbtr
p_nethw TYPE dmbtr.
DATA: lt_mwdat TYPE TABLE OF rtax1u15,
l_fwste TYPE bset-fwste.
* transaction currency
CALL FUNCTION 'CALCULATE_TAX_FROM_NET_AMOUNT'
EXPORTING
i_bukrs = p_bukrs
i_mwskz = p_mwskz
i_waers = p_waers
i_wrbtr = p_netto
IMPORTING
e_fwste = l_fwste
TABLES
t_mwdat = lt_mwdat
EXCEPTIONS
OTHERS = 15.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
ADD l_fwste TO p_netto.
ENDIF.
CHECK p_nethw NE 0.
* company code currency
CALL FUNCTION 'CALCULATE_TAX_FROM_NET_AMOUNT'
EXPORTING
i_bukrs = p_bukrs
i_mwskz = p_mwskz
i_waers = p_waers
i_wrbtr = p_nethw
IMPORTING
e_fwste = l_fwste
TABLES
t_mwdat = lt_mwdat
EXCEPTIONS
OTHERS = 15.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
ADD l_fwste TO p_nethw.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form round_amounts
*&---------------------------------------------------------------------*
*& elimnate rounding differences
*&---------------------------------------------------------------------*
*& --> p_ITEMNO
*& <-- p_CURRENCY_AMOUNT
*&---------------------------------------------------------------------*
FORM round_amounts USING p_itemno TYPE posnr_acc
CHANGING p_currencyamount TYPE gty_currency_amount.
DATA: diff_00 TYPE bapidoccur,
diff_10 TYPE bapidoccur,
diff TYPE bapidoccur.
DATA: tabix_00 LIKE sy-tabix,
tabix_10 LIKE sy-tabix,
tabix LIKE sy-tabix.
LOOP AT p_currencyamount INTO DATA(ls_curr) WHERE curr_type = '00'.
ADD ls_curr-amt_doccur TO diff_00.
ENDLOOP.
LOOP AT p_currencyamount INTO ls_curr WHERE curr_type = '10'.
ADD ls_curr-amt_doccur TO diff_10.
ENDLOOP.
LOOP AT p_currencyamount INTO ls_curr WHERE curr_type = ' '.
ADD ls_curr-amt_doccur TO diff.
ENDLOOP.
CHECK diff <> 0 OR diff_00 <> 0 OR diff_10 <> 0.
READ TABLE p_currencyamount TRANSPORTING NO FIELDS WITH KEY itemno_acc = p_itemno
curr_type = '00'.
IF sy-subrc = 0.
tabix_00 = sy-tabix.
ENDIF.
READ TABLE p_currencyamount TRANSPORTING NO FIELDS WITH KEY itemno_acc = p_itemno
curr_type = '10'.
IF sy-subrc = 0.
tabix_10 = sy-tabix.
ENDIF.
READ TABLE p_currencyamount TRANSPORTING NO FIELDS WITH KEY itemno_acc = p_itemno
curr_type = ' '.
IF sy-subrc = 0.
tabix = sy-tabix.
ENDIF.
IF diff_00 <> 0.
p_currencyamount[ tabix_00 ]-amt_doccur = p_currencyamount[ tabix_00 ]-amt_doccur - diff_00.
ENDIF.
IF diff_10 <> 0.
p_currencyamount[ tabix_10 ]-amt_doccur = p_currencyamount[ tabix_10 ]-amt_doccur - diff_10.
ENDIF.
IF diff <> 0.
p_currencyamount[ tabix ]-amt_doccur = p_currencyamount[ tabix ]-amt_doccur - diff.
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.
Konfiguration Umsatzsteuermeldung DE
Ich habe aktuell im Netz nur wenig brauchbare Konfigurationsvorschläge für die elektronische Umsatzsteuermeldung gefunden. Dies umfasst einerseits die verwendeten Steuerkennzeichen und zum anderen die Zuordnung zur entsprechenden Gruppennummer im Formular.
Deshalb nachfolgend ein Konfigurationsvorschlag für die USTVA Stand 2018...
Steuerkennzeichen definieren (FTXP)
| St.Kz. | Text | St.Art | EG-Kennz. |
| A0 | Kein Steuervorgang | A | |
| A1 | Ausgangssteuer 19% | A | |
| A2 | Ausgangssteuer Inland 7% | A | |
| A6 | Ausgangssteuer 0% EG-Warenlieferung | A | 1 |
| A8 | Ausgangssteuer Inland steuerbar steuerfrei | A | |
| A9 | Ausgangssteuer Ausland steuerbar steuerfr. | A | |
| AB | Nicht steuerbare sonstige Leistung | A | 1 |
| AC | Übrige nicht steuerbare Umsätze | A | |
| AD | Ausgangssteuer innergemein. Dreiecksgeschäft | A | 1 |
| AR | Übrige steuerpflichtige Umsätze nach $13b USt A. 5 | A | |
| B9 | Steuerfreie Umsätze neue Fahrzeuge an Abnehmer | A | |
| E1 | Erwerbssteuer 19% EG-Warenlieferung | V | 9 |
| E2 | Erwerbssteuer 7% EG-Warenlieferung | V | 9 |
| E3 | Erwerbssteuer 19% EG-Lohnveredelung | V | 9 |
| F1 | Reverse Charge §13b, Abs. 1 UStG | V | 5 |
| F2 | Reverse Charge §13b, Abs. 2, Nr. 1+5 UStG | V | 5 |
| F3 | Reverse Charge §13b, Abs. 2, Nr. 2+3 UStG | V | 5 |
| F4 | Reverse Charge §13b, Abs. 2, Nr. 4, 6ff. UStG | V | 5 |
| U1 | Einfuhrumsatzsteuer 19 % | V | |
| V0 | Kein Steuervorgang | V | |
| V1 | Vorsteuer Inland 19% | V | |
| V2 | Vorsteuer Inland 7% | V | |
| V9 | Vorsteuer Ausland steuerbar steuerfrei | V |
Die blau markieren Einträge sind selbst definierte Steuerkennzeichen, wohingegen die übrigen der SAP-Auslieferung entnommen sind.
Die Zuordnung der Steuerkennzeichen zu den einzelnen Zeilen des USTVA-Formulars stellt sich wie folgt dar:
Nachfolgend werden die entsprechenden Einstellungen im Customizing skizziert, welche oben stehende Zuordnung abbilden.
Zunächst muss eine Steuergruppenversion zum entsprechenden Gültigkeitsdatum angelegt werden.
IMG - Finanzwesen - Hauptbuchhaltung - Periodische Arbeiten - Melden - Umsatzsteuermeldung - Steuergruppenversion zeitabhängig zuordnen...
| Land | Gültig ab | Steuergruppenversion |
|---|---|---|
| DE | 1.1.2018 | EDCL |
In bestehenden Systemen wird die Version EDCL bereits vorhanden sein. In diesem Fall ist eine neue Version anzulegen.
Steuerbasissaldengruppierung
IMG - Finanzwesen - Hauptbuchhaltung - Periodische Arbeiten - Melden - Umsatzsteuermeldung - Steuerbasissalden gruppieren...
| Lnd | Version | St | Vor | Saldo | GrpNr |
| DE | EDCL | A1 | MWS | 81 | |
| DE | EDCL | A2 | MWS | 86 | |
| DE | EDCL | A3 | MWS | 36 | |
| DE | EDCL | A6 | MWS | 41 | |
| DE | EDCL | A8 | MWS | 48 | |
| DE | EDCL | A9 | MWS | 43 | |
| DE | EDCL | AB | MWS | 21 | |
| DE | EDCL | AC | MWS | 45 | |
| DE | EDCL | AD | MWS | 42 | |
| DE | EDCL | AR | MWS | 60 | |
| DE | EDCL | B9 | MWS | 44 | |
| DE | EDCL | E1 | ESA | 89 | |
| DE | EDCL | E2 | ESA | 93 | |
| DE | EDCL | E3 | MWS | 46 | |
| DE | EDCL | F2 | ESA | 67 | |
| DE | EDCL | F2 | ESA | 73 | |
| DE | EDCL | F3 | ESA | 67 | |
| DE | EDCL | F4 | ESA | 84 | |
| DE | EDCL | U1 | MWS | 62 |
Steuersalden gruppieren
IMG - Finanzwesen - Hauptbuchhaltung - Periodische Arbeiten - Melden - Umsatzsteuermeldung - Steuersalden gruppieren...
| Lnd | Version | St | Vor | Saldo | GrpNr |
| DE | EDCL | E1 | ESE | 67 | |
| DE | EDCL | E2 | ESE | 67 | |
| DE | EDCL | V1 | VST | 66 | |
| DE | EDCL | V2 | VST | 66 | |
| DE | EDCL | V3 | VST | 66 |
Hinweis für den Druck der USTVA
In einigen Fällen besteht die Anforderung, die Steuer- und Steuerbasisbeträge zu drucken. Hierfür wird zuweilen der Report RFUVDE00 verwendet (Details zur Konfiguration des Drucks s. Report-Doku). Bitte beachtet dabei, dass dieser Report die Zuordnung von Steuerkennzeichen zu Gruppennummern immer mit der Steuergruppenversion initial nachliest, d.h. hier ist ggf. das Customizing entsprechend anzugleichen.
S/4 HANA F4 Werthilfe u.a. für Debitoren und Kreditoren braucht ewig zum öffnen
Symptom:
Beim Öffnen der Werthilfe (z.B. für Kreditoren in der FB60) hängt das System und erst Minuten später wird einem der Werthilfe-Dialog angezeigt.
Abhilfe schafft hier der Hinweis 2571623 - S/4HANA - F4 Search Help is very slow
In diesem wird als eine Möglichkeit zur Behebung des Problems aufgeführt, die Enterprise Search auf die Initialkonfiguration zurückzusetzen. Hierzu dient die Aufgabenliste SAP_ESH_RESET, die mithilfe der Transaktion STC01 ausgeführt werden kann. Allerdings ist die Transaktion nicht gerade ein Ausbund an Benutzerfreundlichkeit, zumindest habe ich einen Moment gebraucht, um mit dem Ding zurechtzukommen.
Zunächst muss über das Icon (1.) der Parameter "Zurücksetzen des Mandanten bestätigen" gesetzt werden. Anschließend wird der so geänderte Parameter in eine Variante gespeichert (2.) und zum Schluss die Ausführung der Aufgabenliste als Job eingeplant (3.). Eine Ausführung im Dialog schließt das System aus.
Der Job läuft nicht lange und danach ist die Performance der Werthilfe wieder wie gewohnt.
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.
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
Mahnliste RFMAHN21 erweitern
Im Hinweis 590421 ist eine Möglichkeit beschrieben, die Mahnliste RFMAHN21 um eigene Felder zu erweitern. Bei der im Hinweis genannten Lösung handelt es sich jedoch um eine Modifikation, die vermutlich nicht in jedem System verbaut werden kann/soll. Alternativ lässt sich das Ganze auch mit einem impliziten Enhancement bewerkstelligen, was dann im technischen Sinne eben keine Modifikation mehr darstellt...
Hierzu wird einfach an das Ende der Routine APPEND_MHND_EXT2 im RFMAHN21 ein implizites Enhancement eingefügt, welches dann den Beispielcode aus dem o.g. Hinweis beherbergt (in leicht abgewandelter Form).
Siehe auch hier
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)
Gegenkonto - das unbekannte Wesen...
Relevante SAP-Hinweise:
- 112312 - Einzelposten: Anzeige von Gegenkontoinformationen
- 1034354 - FAGLL03: Anzeige von Gegenkontoinformationen
- 1504612 - Einzelposten: Gegenkontoinformationen(BADI FI_ITEMS_CH_DATA)
Grundlagen
Öfter werde ich von Kunden oder auch Kollegen gefragt, wie denn die Gegenkontoinformationen in den Einzelpostenlisten (FBLxN, FAGLL03 usw.) ermittelt werden und wie man dies ggf. nachvollziehen oder gar beeinflussen kann:
Sofern die Hinweise 112312 bzw. 1034354/1504612 eingebaut wurden, lassen sich in den einschlägigen Einzelpostenanzeigen Gegenkontoinformationen einblenden, bestehend aus Gegenkontoart (S = Sachkonto, K = Kreditor, D = Debitor) und der Nummer des Gegenkontos.
Bei zweizeiligen Belegen ist die Auswahl des Gegenkontos ja eindeutig, d.h. bei einer Buchung
Aufwand 100,-- an Kreditor 100,--
ist die Gegenbuchung natürlich die jeweils andere Belegposition.
Bei drei- und mehrzeiligen Belegen muss ggf. eine Auswahl des Gegenkontos (nach Signifikanz) erfolgen:
Aufwand1 100,--
Aufwand2 200,--
Aufwand3 300,--
Vorsteuer 60,-- an Kreditor 660,--
Für die Ermittlung des Gegenkontos steht in der SAP Standardauslieferung der Funktionsbaustein GET_GKONT zur Verfügung. In diesem sind drei verschiedene Verfahren zur Bestimmung des signifikanten Gegenkontos implementiert - die Auswahl des Verfahrens erfolgt durch den Import-Parameter GKNKZ.
GKNKZ | Beschreibung | Ermitteltes Gegenkonto im o.g. Beispielbeleg (aus Sicht des kreditorischen Postens) |
1 | Es wird nur dann ein Gegenkonto zurückgeliefert, wenn es eindeutig ermittelt werden kann. Automatisch erzeugte Belegzeilen (wie bspw. Steuerzeilen) werden dabei ignoriert. | ./. |
2 | Das betragsmäßig höchste Gegenkonto ohne Berücksichtigung automatisch generierter Belegzeilen wird zurückgeliefert. | Aufwand3 |
3 | Das betragsmäßig höchste Gegenkonto mit Berücksichtigung automatisch generierter Belegzeilen wird zurückgeliefert. | Aufwand3 |
Werden zur Gegenkontoermittlung die weiter oben genannten Hinweise ohne Abwandlung implementiert, greift das Verfahren 3.
Erweiterung der bestehenden Verfahren
In vielen Fällen reicht die oben genannte Logik zur Gegenkontoermittlung aus. Im Einzelfall kann jedoch die Anforderung bestehen, den oben beschrieben Verfahren eigene, ausgefeiltere Methoden hinzuzufügen. Hierzu kann dann der Funktionsbaustein GET_GKONT in den Kundennamensraum kopiert (z.B. als Z_GET_GKONT) und anstelle des Standard-Bausteins an den entsprechenden Coding-Stellen in den Hinweisen 112312 bzw. 1034354 und 1504612 gerufen werden. Hierzu sind natürlich gewisse ABAP-Kenntnisse nötig.
Eine mögliche Anforderung könnte z.B. sein, dass als Gegenkonto von Sachkontenpositionen Kontokorrentpositionen grundsätzlich Vorrang haben sollen, auch wenn sie betragsmäßig kleiner sind als andersartige Gegenpositionen.
Beispiel:
Aufwand1 100,--
Aufwand2 200,--
Aufwand3 300,-- an Kreditor 220,--
Vorsteuer 60,-- Kasse 440,--
Die Standard-Gegenkontoermittlung würde bei Abfrage des Gegenkontos aus Sicht eines der Aufwandskonten das Kassenkonto zurückliefern, weil es betragsmäßig signifikanter ist als die kreditorische Gegenposition. Genau hier soll aber ein „Override“ eingebaut werden, dass die Kontokorrentposition trotzdem Vorrang erhält. Das Verfahren erhält in unserem Beispiel die Kennzeichnung ‚4‘.
Hierzu passen wir die Form-Routine GKONT_ERMITTELN in unserer kundeneigenen Funktionsgruppe geeignet an:
…
*---- NEUES VERFAHREN 4 (wie 3, aber Vorfahrt für Kontokorrente)
WHEN '4'.
IF BSEG-SHKZG = 'S'.
* nur dann neu setzen, wenn Betrag höher ODER ein Kontokorrent daherkommt
* UND nicht schon bereits ein Kontokorrent als Gegenkonto gesetzt ist
IF BSEG-DMBTR > GKSUM_S OR BSEG-KOART CA 'DK' AND KOART_S CN 'DK'.
…
(Haben-Seite analog)
Das Beispielcoding aus den weiter oben genannten Hinweisen ist dann entsprechend anzupassen.
Beispiel-Coding aus Hinweis 1504612:
DATA: wa_items TYPE rfposxext.
LOOP AT ct_items INTO wa_items.
CALL FUNCTION 'Z_GET_GKONT'
EXPORTING
belnr = wa_items-belnr
bukrs = wa_items-bukrs
buzei = wa_items-buzei
gjahr = wa_items-gjahr
gknkz = '4'
IMPORTING
gkont = wa_items-gkont
koart = wa_items-gkart
EXCEPTIONS
belnr_not_found = 1
buzei_not_found = 2
gknkz_not_found = 3
OTHERS = 4.
IF sy-subrc = 0.
MODIFY ct_items FROM wa_items.
ENDIF.
ENDLOOP.Eine immer wiederkehrende Anforderung in dem Themenkreis „Gegenkonto“ ist, dass zusätzlich zur Art und Nummer des Gegenkontos auch die entsprechende Bezeichnung anzeigbar gemacht werden soll. Hierzu lässt sich der Feldvorrat der Einzelpostenlisten um das Feld „Bez. Gegenkonto“ erweitern. Details dazu siehe hier, Abschnitt "Hinzufügen eigener Felder".
Es ist nun ein leichtes, nach erfolgreicher Gegenkontoermittlung anhand der Kontoart und der Nummer aus den entsprechenden Stammsatztabellen die Bezeichnung zu lesen und bereitzustellen.
Das obenstehende Beispielcoding kann dazu bspw. wie folgt erweitert werden:
…
CALL FUNCTION 'Z_GET_GKONT'
EXPORTING
belnr = wa_items-belnr
bukrs = wa_items-bukrs
buzei = wa_items-buzei
gjahr = wa_items-gjahr
gknkz = '4'
IMPORTING
gkont = wa_items-gkont
koart = wa_items-gkart
EXCEPTIONS
belnr_not_found = 1
buzei_not_found = 2
gknkz_not_found = 3
OTHERS = 4.
CASE wa_items_gkart. "das neue Feld heisse zzgkbez.
WHEN ‚S‘.
SELECT SINGLE txt50 INTO wa_items-zzgkbez FROM SKAT
WHERE KTOPL = <Kontenplan>
AND SAKNR = wa_items-gkont
AND SPRAS = sy-langu.
WHEN ‘K’.
SELECT SINGLE name1 INTO wa_items-zzgkbez FROM LFA1
WHERE LIFNR = wa_items-gkont.
WHEN ‘D’.
SELECT SINGLE name1 INTO wa_items-zzgkbez FROM KNA1
WHERE KUNNR = wa_items-gkont.
ENDCASE.
…
Im S/4 werden die Gegenkontoinformationen automatisch im Zuge der Buchung in die entsprechenden Felder der ACDOCA abgefüllt, so dass eine Anreicherung der Gegenkontoinformationen wie oben beschrieben nicht nötig ist. Hierzu wird im Customizing unter Finanzwesen - Hauptbuchhaltung - Informationssystem - Gegenkontoermittlungsart definieren die gewünschte Gegenkontoermittlung aktiviert (1, 2 oder 3, s.o.)
In den neuen Einzelpostenbrowsern
| FBL1H | Kreditoreneinzelposten |
| FBL5H | Debitoreneinzelposten |
| FAGLL03H | Sachkonteneinzelposten |
sind im Feldvorrat zudem bereits zahlreiche Texte u.a. zu Stammdatenobjekten verfügbar, z.B. die Bezeichnung des Gegenkontos, Kostenstellentexte und so weiter.
/image%2F1473637%2F20170207%2Fob_adae32_profilbild.png)














