Öfters kam in Kundenprojekten die Anforderung hoch, Informationen aus dem Kontierungshandbuch dem Belegerfasser während des Buchungsvorganges zugänglich zu machen. Eins vorweg: eine 1A-Lösung, die unabhängig vom verwendeten User-Interface funktioniert, habe ich bisher noch nicht gefunden, aber immerhin eine, die modifikationsfrei eingebaut werden kann und zumindest mal bei den gängigen GUI-Transaktionen (FB01, FB50, FB60 etc.) funktioniert. Sie fusst auf dem Business Transaction Event-Framework (BTE) und setzt voraus, dass die Informationen zum Kontierungshandbuch in Form von Standardtexten am Sachkontenstamm vorliegen. Für die Implementierung sind zumindest Grundkenntnisse in der ABAP-Programmierung vonnöten.
Textablage
Im SAP-Standard ist für die Ablage der Kontierungsinformationen zu einem Konto, die Text-ID 0001 (Kontierungsinfo) des Textobjektes SKB1 (Sachkontentexte im Buchungskr.) vorgesehen. Der technische Name des jeweiligen Textbausteins setzt sich aus der 10-stelligen Kontonummer (ggf. mit führenden Nullen) und dem Schlüssel des Buchungskreises (4-stellig) zusammen (Beispiel: Konto 4711, Buchungskreis 0001: 00000047110001). Diese Texte können in der Buchungskreissicht des Sachkontos mithilfe der Sachkontenpflege FS00 hinterlegt werden.
Um sich die so gepflegten Kontierungsinformationen anzeigen zu lassen, kann der Standardreport "Kontierungshandbuch" ausgeführt werden. Der Bericht ist im Infosystem des Hauptbuchs, Bereich "Stammdaten" zu finden (Transaktion S_ALR_87012330 - Kontierungshandbuch).
Unter S/4 wurde diese Transaktion als obsolet gekennzeichnet und ist nicht mehr aufrufbar. Um dies bei Bedarf dennoch zu ermöglichen, bitte gemäß Hinweis 2393666 vorgehen.
Um die Pflege der Kontierungsinformationen zu vereinfachen, habe ich mal in einem Kundenprojekt ein kleines Uploadprogramm geschrieben, welches eine entsprechend aufbereitete Excel-Vorlage hochladen kann.
Excel-Vorlage:
Wenn in der Vorlage buchungskreisspezifische Texte hinterlegt werden sollen, ist der Buchungskreis in der entsprechenden Spalte anzugeben. Ist der Wert in der Spalte "Buchungskreis" leer, wird der Text in allen Buchungskreisen, in denen das Konto vorhanden ist und die den angegebenen Kontenplan verwenden, aktualisiert.
Die Felder Kontenplan, Konto, Sprache und Text sind obligatorisch. Führende Nullen bei der Angabe des Kontos können weggelassen werden. Das Programm füllt dies automatisch auf. Der Buchungskreis ist ggf. mit führenden Nullen einzugeben.
Bei der Ausführung des Upload-Programms ist lediglich die Excel-Datei auszuwählen (sie kann ohne vorherige Umformatierung direkt im XLSX-Format verwendet werden) und ggf. anzukreuzen, ob bereits manuell gepflegte Texte bei diesem Lauf überschrieben werden sollen.
Coding:
REPORT ystxupl1.
*&---------------------------------------------------------------------*
*& Report YSTXUPL1
*&---------------------------------------------------------------------*
*& Upload SAPScript-Texts for accounting manual from Excel
*&---------------------------------------------------------------------*
DATA: data_tab TYPE TABLE OF string.
TYPES: BEGIN OF ty_txt,
ktopl TYPE t001-ktopl,
bukrs TYPE t001-bukrs,
spras(2) TYPE c,
saknr TYPE skb1-saknr,
txt TYPE string,
END OF ty_txt.
TYPES: tty_bukrs TYPE TABLE OF bukrs,
tty_t001 TYPE TABLE OF t001.
DATA: wa_txt TYPE ty_txt.
DATA: it_txt TYPE TABLE OF ty_txt.
*&---------------------------------------------------------------------*
*& SELECTION-SCREEN
*&---------------------------------------------------------------------*
PARAMETERS: pa_fnam LIKE rlgrap-filename OBLIGATORY. "Excelfilename
PARAMETERS: pa_xovr AS CHECKBOX DEFAULT space. "Overwrite y/n
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_fnam.
*&---------------------------------------------------------------------*
PERFORM f4_filename.
START-OF-SELECTION.
PERFORM upload_data.
PERFORM save_texts.
*&---------------------------------------------------------------------*
*& Form UPLOAD_DATA
*&---------------------------------------------------------------------*
*& upload accounting manual template (Excel)
*&---------------------------------------------------------------------*
FORM upload_data .
DATA: l_buf TYPE string,
l_tabix TYPE sy-tabix.
CLEAR data_tab[].
CALL FUNCTION 'FAA_FILE_UPLOAD_EXCEL'
EXPORTING
i_filename = pa_fnam
i_delimiter = '~'
TABLES
et_filecontent = data_tab
EXCEPTIONS
error_accessing_file = 1
OTHERS = 2.
IF sy-subrc <> 0.
WRITE: / 'Fehler', sy-subrc, 'beim Upload der Datei', pa_fnam.
ENDIF.
LOOP AT data_tab INTO l_buf.
CHECK sy-tabix > 1. "Skip Header
SPLIT l_buf AT '~' INTO
wa_txt-ktopl
wa_txt-bukrs
wa_txt-spras
wa_txt-saknr
wa_txt-txt.
* clean up multiple text lines.
IF wa_txt-txt(1) = '"'.
SHIFT wa_txt-txt BY 1 PLACES LEFT.
ENDIF.
DATA(l_lastchar) = strlen( wa_txt-txt ) - 1.
IF wa_txt-txt+l_lastchar(1) = '"'.
wa_txt-txt = wa_txt-txt(l_lastchar).
ENDIF.
APPEND wa_txt TO it_txt.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form F4_FILENAME
*&---------------------------------------------------------------------*
*& F4 help Excel-file
*&---------------------------------------------------------------------*
FORM f4_filename .
CALL FUNCTION 'FAA_FILE_F4'
EXPORTING
i_default_extension = 'XLS'
IMPORTING
e_filename = pa_fnam
EXCEPTIONS
interface_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form save_texts
*&---------------------------------------------------------------------*
*& Process accounting manual texts and save them
*&---------------------------------------------------------------------*
FORM save_texts .
DATA: lt_lines TYPE TABLE OF tline,
l_name TYPE thead-tdname,
l_saknr TYPE skb1-saknr,
lt_t001 TYPE tty_t001,
l_spras TYPE t001-spras,
lt_bukrs TYPE tty_bukrs.
LOOP AT it_txt INTO wa_txt.
* convert external data into SAP format, if necessary
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = wa_txt-saknr
IMPORTING
output = wa_txt-saknr.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
input = wa_txt-spras
IMPORTING
output = l_spras.
* select company codes assigned to chart of acc.
* in case company code isn't specified in excel template
IF lt_t001[] IS INITIAL.
SELECT * FROM t001 INTO TABLE lt_t001 WHERE ktopl = wa_txt-ktopl.
ENDIF.
IF wa_txt-bukrs IS INITIAL.
PERFORM find_company_codes USING wa_txt-ktopl
wa_txt-saknr
lt_t001
CHANGING lt_bukrs.
ELSE.
CLEAR lt_bukrs[].
APPEND wa_txt-bukrs TO lt_bukrs.
ENDIF.
LOOP AT lt_bukrs INTO wa_txt-bukrs.
CONCATENATE wa_txt-saknr wa_txt-bukrs INTO l_name.
IF pa_xovr IS INITIAL.
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = '0001'
language = l_spras
name = l_name
object = 'SKB1'
TABLES
lines = lt_lines
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc <> 0.
PERFORM store_text USING l_spras l_name wa_txt.
ENDIF.
ELSE.
PERFORM store_text USING l_spras l_name wa_txt.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form find_company_codes
*&---------------------------------------------------------------------*
*& Select all company codes with given chart of accounts
*&---------------------------------------------------------------------*
*& --> pi_KTOPL
*& --> pi_SAKNR
*& --> pt_t001
*& <-- pt_BUKRS
*&---------------------------------------------------------------------*
FORM find_company_codes USING pi_ktopl TYPE t001-ktopl
pi_saknr TYPE skb1-saknr
pt_t001 TYPE tty_t001
CHANGING pt_bukrs TYPE tty_bukrs.
CLEAR pt_bukrs[].
LOOP AT pt_t001 ASSIGNING FIELD-SYMBOL(<lfs_t001>).
SELECT SINGLE COUNT(*) FROM skb1
WHERE saknr = pi_saknr
AND bukrs = <lfs_t001>-bukrs.
IF sy-subrc = 0.
APPEND <lfs_t001>-bukrs TO pt_bukrs.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form store_text
*&---------------------------------------------------------------------*
*& Put SAPScript-Tests for accouting mmanual in DB
*&---------------------------------------------------------------------*
*& --> pi_SPRAS Language
*& --> pi_NAME Textname
*& --> pi_TXT Text
*&---------------------------------------------------------------------*
FORM store_text USING pi_spras TYPE t001-spras
pi_name TYPE thead-tdname
pi_txt LIKE wa_txt.
DATA: lt_tline TYPE tline_t.
DATA: ls_header TYPE thead.
DATA(lt_strings) = VALUE string_table( ( pi_txt-txt ) ).
* Stringtabelle -> TLINE-Tabelle
* SAPscript: Konvertieung Textstream nach ITF f¸r TextEditControl
CALL FUNCTION 'CONVERT_STREAM_TO_ITF_TEXT'
EXPORTING
stream_lines = lt_strings
lf = abap_true
TABLES
itf_text = lt_tline.
ls_header-tdobject = 'SKB1'.
ls_header-tdname = pi_name.
ls_header-tdspras = pi_spras.
ls_header-tdid = '0001'.
CALL FUNCTION 'SAVE_TEXT'
EXPORTING
header = ls_header
savemode_direct = 'X'
TABLES
lines = lt_tline.
ENDFORM.
Interaktive Anzeige der Kontierungsinformationen
Um nun die so gepflegten Texte während des Buchens zur Anzeige zu bringen, implementieren wir die Business Transaction Events (BTE) 00001070 bzw. 00001080 (P/S-Schnittstelle). Details zur Implementierung von BTEs finden sich u.a. hier.
Mustercoding zur Implementierung der BTE-Bausteine:
BTE 00001070
FUNCTION y_interface_00001070.
*"--------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" REFERENCE(I_BKPF) TYPE BKPF
*" REFERENCE(I_BSEG) TYPE BSEG
*" REFERENCE(I_AKTYP) TYPE AKTYP
*" REFERENCE(I_DYNCL) TYPE DYNCL
*" EXPORTING
*" REFERENCE(E_XCHNG) LIKE OFIWA-XCHNG
*"--------------------------------------------------------------------
DATA: lv_tdname TYPE stxh-tdname,
lv_tdobject TYPE stxh-tdobject VALUE 'SKB1',
lv_tdid TYPE stxh-tdid VALUE '0001'.
CONCATENATE i_bseg-hkont i_bkpf-bukrs INTO lv_tdname.
CALL FUNCTION 'RECA_GUI_TEXTEDIT_POPUP'
EXPORTING
id_tdobject = lv_tdobject
id_tdname = lv_tdname
id_tdid = lv_tdid
id_activity = '03'
id_title = TEXT-002.
ENDFUNCTION.
TEXT-002 enthält dabei die Überschrift der Dialogbox, in der die Kontierungsinformation angezeigt wird.
BTE 00001080
FUNCTION y_interface_00001080.
*"--------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" REFERENCE(I_SPRAS) LIKE SY-LANGU
*" REFERENCE(I_AKTYP) TYPE AKTYP
*" REFERENCE(I_DYNCL) TYPE DYNCL
*" EXPORTING
*" VALUE(E_FTEXT) LIKE FTEXTS-FTEXT
*"--------------------------------------------------------------------
e_ftext = TEXT-001.
ENDFUNCTION.
TEXT-001 enthält dabei die Aufschrift der Drucktaste, die in den Buchungstransaktionen zusätzlich eingeblendet wird, also z.B. "Kontierungshandbuch".
Im Ergebnis erscheint im Detailbild der Belegerfassung (z.B.in der FB01 oder bei der FB60, wenn ein Doppelklick auf die zu erfassende Belegzeile erfolgt) eine neue Drucktaste. Beim Betätigen der Drucktaste wird die zum aktuellen Konto/Buchungskreis hinterlegte Kontierungsinformation in einer Dialogbox angezeigt.
/image%2F1473637%2F20170207%2Fob_adae32_profilbild.png)
/image%2F1473637%2F20201125%2Fob_ccddc9_screenshot-at-nov-25-13-34-21.png)
/image%2F1473637%2F20201125%2Fob_e2113c_screenshot-at-nov-25-13-42-29.png)
/image%2F1473637%2F20201125%2Fob_827856_screenshot-at-nov-25-14-07-45.png)
/image%2F1473637%2F20201125%2Fob_b54fbb_screenshot-at-nov-25-14-52-39.png)
/image%2F1473637%2F20201125%2Fob_4e2ee2_screenshot-at-nov-25-14-53-29.png)