Overblog
Folge diesem Blog Administration + Create my blog
SAPManDoo - SAP Resource

Der vorliegende Blog enthält von mir im Laufe meiner beruflichen Tätigkeit als SAP-Berater zusammengetragene Informationen / Beispiel-Codings zum Themenkreis SAP, speziell FI/CO.

Anzeige von Kontierungsinformationen bei der Buchung

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

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

Textablage

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

Sachkontenstammpflege FS00 - Kontierungsinfo

Sachkontenstammpflege FS00 - Kontierungsinfo

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

Transaktion S_ALR_87012330 - Kontierungshandbuch

Transaktion S_ALR_87012330 - Kontierungshandbuch

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

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

Excel-Vorlage:

Excel-Vorlage für Upload Kontierungshandbuch

Excel-Vorlage für Upload Kontierungshandbuch

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

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

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

Coding:

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

DATA: data_tab TYPE TABLE OF string.

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

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

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

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

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

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

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

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

  CLEAR data_tab[].

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

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

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

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

    APPEND wa_txt TO it_txt.
  ENDLOOP.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form F4_FILENAME
*&---------------------------------------------------------------------*
*& F4 help Excel-file
*&---------------------------------------------------------------------*
FORM f4_filename .

  CALL FUNCTION 'FAA_FILE_F4'
    EXPORTING
      i_default_extension = 'XLS'
    IMPORTING
      e_filename          = pa_fnam
    EXCEPTIONS
      interface_error     = 1
      OTHERS              = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

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

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

  LOOP AT it_txt INTO wa_txt.

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

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

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

    LOOP AT lt_bukrs INTO wa_txt-bukrs.

      CONCATENATE wa_txt-saknr wa_txt-bukrs INTO l_name.

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

    ENDLOOP.

  ENDLOOP.

ENDFORM.

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

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

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

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

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

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

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

ENDFORM.

Interaktive Anzeige der Kontierungsinformationen

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

Mustercoding zur Implementierung der BTE-Bausteine:

BTE 00001070

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

  CONCATENATE i_bseg-hkont i_bkpf-bukrs INTO lv_tdname.

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

ENDFUNCTION.

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

BTE 00001080

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

  e_ftext TEXT-001.

ENDFUNCTION.

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

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

Neue Drucktaste bei der Erfassung einer Belegposition

Neue Drucktaste bei der Erfassung einer Belegposition

Dialogbox zur Anzeige der hinterlegten Kontierungsinformation

Dialogbox zur Anzeige der hinterlegten Kontierungsinformation

Kommentare