Ö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.