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.

sap reports

GRWTAUTH - erweiterte Berechtigungsprüfung im Report-Writer-Umfeld

Veröffentlicht am 27. Juni 2022 von sapmandoo in S4, SAP Reports, CO

Über die SAP-Erweiterung GRWTAUTH lassen sich kundeneigene Berechtigungsprüfungen für Report-Writer-Berichte implementieren. In der genannten Erweiterung sind Prüfbausteine für Eingaben im Selektionsbild sowie auf Einzelsatzebene enthalten.

Um bspw. bei Berichten der Profitcenterrechnung unter S/4 eine Berechtigungsprüfung nach Buchungskreis zu verbauen, kann der Funktionsexit EXIT_SAPFGRWS_001: Kunden-Exit: Berechtigungsprüfung auf Einzelsatzebene in der Selektion verwendet werden.

Nachfolgend die Dokumentation zum Funktionsexit sowie ein Beispiel-Coding:

Kurztext

Kunden-Exit: Berechtigungsprüfung auf Einzelsatzebene in der Selektion

Funktionalität

Dieser Exit wird während der Datenselektion bei der Neuselektion von der Datenbank (I_DATA_SOURCE = 'S') und beim Lesen vom Archiv (I_DATA_SOURCE = 'A') für jeden einzelnen Datensatz aufgerufen. Der aktuelle Datensatz wird in dem untypisierten Parameter I_S_RECORD an den Exit übergeben, die zugehörige DDIC-Referenzstruktur in dem Parameter I_DB_TABLE.

Eine Standardprüfung wird nicht für alle Report-Writer-Tabellen durchgeführt. Die Standardprüfung, sofern die jeweilige Report-Writer-Tabelle eine solche unterstützt, erfolgt in dem Unterprogramm ( T804A-AUTHR) in dem der Report-Writer-Tabelle zugeordneten Formpool ( T804A-MPOOL).

Existiert eine Standardprüfung, so kann der Exit durch den Parameter E_SKIP_STANDARD_EXIT steuern, ob die Standardprüfung anschließend durchgeführt oder übersprungen werden soll. Wird die Standardprüfung anschließend durchgeführt, so entscheidet sie über die Berechtigung für den aktuellen Datensatz. Wenn der Exit die Ausnahme NO_AUTHORITY auslöst, sollte die Standardprüfung daher immer mit E_SKIP_STANDARD_EXIT = 'X' übersprungen werden.

Parameter

I_REPORTING_TABLE
I_REPORT_GROUP
I_DATA_SOURCE
I_DB_TABLE
I_S_RECORD
E_SKIP_STANDARD_EXIT

Exceptions

NO_AUTHORITY

Funktionsgruppe

XRWA


DATA: LS_ACDOCA TYPE ACDOCA.
IF I_DB_TABLE = ‘ACDOCA’.
  MOVE I_S_RECORD TO LS_ACDOCA.
* in LS_ACDOCA-RBUKRS steht nun der Buchungskreis des aktuell selektierten Datensatzes drin
* Berechtigungsprüfung Buchungskreis (über welches Berechtigungsobjekt das auch immer 
* gesteuert werden soll) z.B. Anzeige-Berechtigung Belege
   AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
           ID 'BUKRS' FIELD LS_ACDOCA-RBUKRS
           ID 'ACTVT' FIELD '03'.
 IF sy-subrc <> 0.  “Keine Berechtigung
   E_SKIP_STANDARD_EXIT = ‚X‘.
     RAISE NO_AUTHORITY.
   ENDIF. 
ENDIF.
Kommentare

Pivot-Browser - eigene Aktionen

Veröffentlicht am 16. August 2019 von sapmandoo in Basis-Entwicklung allg., FI, S4, SAP Reports, Accruals Management, ACE, ACAC

Der Pivot-Browser (PIVB) ist ein neues Ausgabe-Framework der SAP, welches die Anzeige beliebiger (strukturierter) Dateninhalte in Tabellenform ermöglicht. Die Art der Darstellung der Daten ist dabei an das bekannte ALV-Grid angelehnt. Im Unterschied zum ALV geht der Funktionsumfang des Pivot-Browsers jedoch über die reine Aufbereitung und Anzeige der Daten hinaus. Auch die Datenbeschaffung (HANA-optimiert) sowie die Behandlung von Benutzerinteraktionen ist in das Framework integriert. 

Details hierzu finden sich in den PDF-Anhängen zum Hinweis 2100879 - Pivot Browser: Dokumentation

Einige der im Standard ausgelieferten Funktionalitäten, die auf dem Pivot-Browser basieren, sind die Einzelpostenbrowser in der S/4 Finanzbuchhaltung:

Transaktion Funktion / Beschreibung
FAGLL03H Sachkonteneinzelposten-Browser (ledgerspezifisch)
FBL3H Sachkonteneinzelposten-Browser (einfach)
FBL1H Kreditoren-Einzelposten
FBL5H Debitoren-Einzelposten
Beispiel FAGLL03H

Beispiel FAGLL03H

Während der Anzeige-Bereich (links) weitestgehend identisch zum bekannten ALV funktioniert, ist der Interaktionsbereich (rechts) ein neu gestaltetes Element im Pivot-Browser. 

Im Bereich Spalten können die anzuzeigenden Felder ausgewählt werden. Bei den o.g. FI-Einzelpostenbrowsern stehen gegen Ende der Liste auch Stammdatenfelder und Bezeichnungen zur Verfügung. So kann bspw. zur Kostenstelle die entsprechende Kostenstellenbezeichnung in die Anzeige geholt werden, ohne wie bei den klassischen Einzelpostenlisten (FBLxN) den Feldvorrat erweitern und die Inhalte per BTE/BADI nachlesen zu müssen.

Der Bereich Layouts enthält alle verfügbaren Anzeigelayouts und ermöglicht deren Verwaltung wie unter ALV bekannt (entsprechende Berechtigung vorausgesetzt).

Interessant ist der Bereich Aktionen, in dem für den aktuellen Anzeigevorrat verfügbare Benutzeraktionen dargestellt sind. Diese können in einer (max. zweistufigen) Baumstruktur angeordnet werden, um so gewisse Interaktionen zu gruppieren. 

Bereich "Aktionen" in der FAGLL03H

Bereich "Aktionen" in der FAGLL03H

Sie ahnen es wahrscheinlich schon, dieser Bereich lässt sich modifikationsfrei beliebig erweitern und mit kundenspezifischen Aktionen spicken...

Weiter unten möchte ich ein Beispiel für eine solche kundeneigene Aktion zeigen, das die Erzeugung von Abgrenzungsobjekten der Accrual Engine bzw. des Accruals Management (ab S/4 1809) direkt aus den Einzelpostenbrowsern der Finanzbuchhaltung ermöglicht.

Die einzelnen Anwendungen des Pivot-Browsers werden als Erweiterungsimplementierung des Erweiterungsspots PIVB registriert. Für die EP-Browser im FI (s.o.) ist dies die Implementierung FAGL_LIB_PIVB. In ihr wiederum werden die Implementierungen zur BadI-Definition FAGL_LIB gerufen, zu der auch kundeneigene Implementierungen angelegt werden können.

Für die Aktionen sind die beiden Interface-Methoden SIDEBAR_ACTIONS_SET und SIDEBAR_ACTIONS_HANDLE relevant. In ersterer kann der "Aktionsbaum" um kundeneigene Aktionen erweitert werden, in der zweitgenannten Methode wird dann die eigentliche Aktion ausgestaltet.

Fügen wir also zunächst eine Aktion in einem kundeneigenen Ordner hinzu:

METHOD if_fagl_lib~sidebar_actions_set.

*   Kundeneigene Aktionen im Einzelpostenbrowser 

    TYPE-POOLS: icon.

*   Neuer Ordner am Ende anfügen
    APPEND INITIAL LINE TO c_menu-t_folder_level1 ASSIGNING FIELD-SYMBOL(<lf_folder>).
    <lf_folder>-folder_key = 'ZZACE'.
    <lf_folder>-folder_text = 'Abgrenzungsobjekt'.

*   Aktion in den neuen Ordner einfügen
    APPEND INITIAL LINE TO <lf_folder>-t_item_level2 ASSIGNING FIELD-SYMBOL(<lf_menuitem>).
    <lf_menuitem>-item_key = 'ZZACE_CREATE'.
    <lf_menuitem>-text = 'Abgrenzungsobjekt anlegen'.
    <lf_menuitem>-icon = icon_fencing.

  ENDMETHOD.
Kundeneigener Ordner mit Aktion im Pivot-Browser

Kundeneigener Ordner mit Aktion im Pivot-Browser

...und nun kann die Aktion, die mit der ID ZZACE_CREATE angelegt wurde, ausgestaltet werden.

  METHOD if_fagl_lib~sidebar_actions_handle.

*   Kundeneigene Aktionen im Einzelpostenbrowser 

    DATA: l_checker TYPE i.
    DATA: ls_bseg TYPE bseg.
    DATA: ls_bkpf TYPE bkpf.

    l_checker = 0.

    CASE i_navigate_item_key.
      WHEN 'ZZACE_CREATE'.   "Abgrenzungsobjekt anlegen
        IF it_outtab_selected_rows[] IS NOT INITIAL.                                            "Mind. eine Zeile selektiert?
          LOOP AT it_column ASSIGNING FIELD-SYMBOL(<lf_col>) WHERE fieldname = 'BUKRS' OR       "Felder Bukrs, Belnr, Gjahr und Buzei in Liste?
                                                                   fieldname = 'BELNR' OR
                                                                   fieldname = 'GJAHR' OR
                                                                   fieldname = 'BUZEI'.
            IF <lf_col>-is_invisible = abap_false.
              ADD 1 TO l_checker.
            ENDIF.
          ENDLOOP.
          IF l_checker < 4.
            MESSAGE 'Bitte mind. BUKRS BELNR GJAHR BUZEI in Anzeige holen' TYPE 'I'.
            EXIT.
          ELSE.
            "Belegdaten nachlesen
            READ TABLE it_outtab INDEX it_outtab_selected_rows[ 1 ]-row_id ASSIGNING FIELD-SYMBOL(<lf_row>).
            MOVE-CORRESPONDING <lf_row> TO ls_bseg.
            SELECT SINGLE * FROM bkpf INTO ls_bkpf
                    WHERE bukrs = ls_bseg-bukrs
                      AND belnr = ls_bseg-belnr
                      AND gjahr = ls_bseg-gjahr.
            SELECT SINGLE * FROM bseg INTO ls_bseg
                    WHERE bukrs = ls_bkpf-bukrs
                      AND belnr = ls_bkpf-belnr
                      AND gjahr = ls_bkpf-gjahr
                      AND buzei = ls_bseg-buzei.
            IF sy-subrc = 0.
              "Aufruf Generierungsprogramm f. Abgrenzungsobjekte
              ls_bseg-dmbtr = abs( ls_bseg-dmbtr ).         "Abgrenzungsbetrag muss positiv sein
              IF ls_bseg-koart NE 'S'.                      "Kontokorrente (FBL1H)
                SUBMIT zacac_d_trans_s4 AND RETURN VIA SELECTION-SCREEN
                       WITH p_check  = 'X'
                       WITH p_efdate = sy-datum
                       WITH p_powip = 'X'
                       WITH so_acmth = 'LINEAR'
                       WITH so_acpst = ls_bkpf-budat
                       WITH so_belnr = ls_bkpf-belnr
                       WITH so_bukrs = ls_bkpf-bukrs
                       WITH so_gjahr = ls_bkpf-gjahr
                       WITH p_amnt   = ls_bseg-dmbtr
                       WITH p_text   = ls_bseg-sgtxt.
              ELSE.                                          "FAGLL03H, FBL3H
                SUBMIT zacac_d_trans_s4 AND RETURN VIA SELECTION-SCREEN
                        WITH p_check  = 'X'
                        WITH p_efdate = sy-datum
                        WITH p_powoip = 'X'                  "Bei Sachkontenposten - OHNE Eröffnungbuchung als Default
                        WITH p_powip  = space
                        WITH so_acmth = 'LINEAR'
                        WITH so_acpst = ls_bkpf-budat
                        WITH so_belnr = ls_bkpf-belnr
                        WITH so_bukrs = ls_bkpf-bukrs
                        WITH so_buzei = ls_bseg-buzei
                        WITH so_gjahr = ls_bkpf-gjahr
                        WITH p_amnt   = ls_bseg-dmbtr
                        WITH p_text   = ls_bseg-sgtxt.
              ENDIF.
            ENDIF.
          ENDIF.
        ENDIF.
    ENDCASE.
  ENDMETHOD.

Da der Pivot-Browser HANA optimiert ist, werden nur die Spalten gelesen, die auch im aktuellen Layout benötigt werden. Dies ist ein wesentlicher Unterschied zu den klassischen EP-Listen, die immer alle Spalten eines Postens lesen, unabhängig von deren Verwendung in der Anzeige.

D.h., es muss zunächst geprüft werden, ob die für die weitere Verarbeitung benötigten Felder auch zur Verfügung stehen!

Im weiteren Verlauf dieses Beispiels wird eine angepasste Z-Kopie des Demo-Reports ACAC_D_TRANS_EXAMPLE_S4 gerufen, der aus einem vorgegebenen Belegvorrat Abgrenzungsobjekte im Accruals Management generiert. Für die "alte" Accrual Engine (vor S/4 1809) wäre dies der Report ACAC_DATA_TRANSFER_EXAMPLE.

 

Kommentare

CO Umlagen - der sog. "Vorbrenner"

Veröffentlicht am 25. Februar 2019 von sapmandoo in CO, Basis-Entwicklung allg., S4, SAP Reports

Umlagen im CO führen insbesondere im Bereich der Konzernumlage immer dann zu Problemen, wenn als Empfängerbezugsbasis die Gesamtkosten einer Kostenstelle herangezogen werden sollen und dazu ggfls. noch eine sehr differenzierte Funktionsbereichsdefinition mit vielen Empfängerkostenstellen vorliegt. Dies führt in Großkonzernen und Retail Gesellschaften mit vielen Filialen und damit einhergehend vielen Empfängerkostenstellen dazu, das bei Aufbau der Sender-/Empfängerbeziehungen eine interne Tabelle aufgebaut wird, die ggfls. die Speichergrenzen übersteigt und zu einem Short Dump führt.
Folgendes Programm sorgt dafür, dass die gebuchten Kostenarten (echte Buchung) auf eine statistische Kennzahl verdichtet werden. 

Der Effekt bei einem Kunden war bspw., dass eine nicht lauffähige Umlage nach 1300 Sekunden durchgebucht wurde.

In diesem Zusammenhang wurde auch eine Meldung bei SAP aufgemacht und es gab diesbezüglich einen regen Austausch mit dem SAP Development Support. Lt. SAP Entwicklung ist demnach die Nutzung solcher „Vorbrenner“ in diesen Konstellationen wohl nicht unüblich.
 

Das nachfolgende Programm stellt einen solchen "Vorbrenner" dar.

Das Programm startet mit folgendem Selektionsbildschirm:

Selection-Screen des Programms

Selection-Screen des Programms

  • Der Kostenrechnungskreis ist mit 1000 vorbelegt.
  • Im Feld Kostenstellengruppe kann eine Gruppe oder Selektionsvariante angegeben werden. Es werden nur die Kostenstellen für die Fortschreibung der kumulierten Kosten berücksichtigt, die in der Gruppe enthalten sind. Dies entspricht in der Umlage der Empfängerbezugsbasis.
  • Mittels der Kostenartengruppe (Gruppe/Selektionsvariante) kann auf bestimmte Kosten eingeschränkt werden, um z.B. um bereits ausgeführte Umlagen / Abrechnungen nicht als Empfängerbezugsbasis heranzuziehen. Sofern gewünscht kann das Feld leer gelassen werden und das Häkchen Gesamtkosten gesetzt werden. In diesem Fall werden alle Kosten der in der Kostenstellengruppe angegeben Kostenstellen berücksichtigt.
  • Geschäftsjahr und Periode müssen angegeben werden. Unter dieser Periode erfolgt die Selektion und Fortschreibung.
  • Die statistische Kennzahl ISTKOS ist die statistische Kennzahl, unter der die Kosten fortgeschrieben werden.
     

Coding:

*&---------------------------------------------------------------------*
*& Report ZCO_POST_COSTASSKF
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zco_post_costasskf.

* Datendeklaration
INCLUDE zco_post_costasskf_top.
* Selektionsbildschirm
INCLUDE zco_post_costasskf_sel.


START-OF-SELECTION.
  IF gs_selection-kstar IS INITIAL AND p_gesam IS INITIAL.
    "Fehlermeldung
  ENDIF.
*Übernahme der Selektionsparameter in Struktur
  gs_selection-kokrs p_kokrs.
  gs_selection-gjahr p_gjahr.
  gs_selection-perio p_perio.
  gs_selection-gesam p_gesam.
  gs_selection-verto p_verto.
  gs_selection-stagr p_stagr.
  LOOP AT s_verfr REFERENCE INTO DATA(ls_verfr).
    APPEND ls_verfr->TO gs_selection-verfr.
  ENDLOOP.
  IF gs_selection-koset IS INITIALgs_selection-koset '0101' && gs_selection-kokrs && p_1kosetENDIF.
  IF gs_selection-kstar IS NOT INITIAL AND p_gesam IS INITIALgs_selection-kstar '0102' && gs_selection-kokrs && p_1kstarENDIF.

* Start der Verarbeitung
  DATA(lo_instance) = zcl_co_cost2statfig=>get_instance( ).
  lo_instance->startgs_selection ).

 

 

*&---------------------------------------------------------------------*
*& Include          ZCO_POST_COSTASSKF_TOP
*&---------------------------------------------------------------------*

DATAgv_kosetname TYPE c LENGTH 10,
      gv_kstarname TYPE c LENGTH 10.

DATAgs_selection TYPE zcl_co_cost2statfig=>ts_selection.

TABLEScsks.

 

*&---------------------------------------------------------------------*
*& Include          ZCO_POST_COSTASSKF_SEL
*&---------------------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-t01.
PARAMETERSp_kokrs TYPE kokrs MATCHCODE OBJECT csh_tka01 OBLIGATORY DEFAULT 1000.
PARAMETERSp_1koset  LIKE rksb1-ksgru OBLIGATORY.
*PARAMETERS: p_2koset  LIKE rgsbs-setnr MODIF ID in5.
PARAMETERSp_1kstar  LIKE rksb1-kagru.
*PARAMETERS: p_2kstar  LIKE rgsbs-setnr MODIF ID in5.
PARAMETERSp_gesam AS CHECKBOX.
SELECTION-SCREEN SKIP 1.
PARAMETERSp_gjahr TYPE gjahr OBLIGATORY.
PARAMETERSp_perio TYPE periode OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b01.

SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME TITLE TEXT-t02.
PARAMETERSp_stagr TYPE ccss-stagr OBLIGATORY.
PARAMETERSp_verto TYPE csks-kosar.
SELECT-OPTIONSs_verfr FOR csks-kosar NO INTERVALS.
SELECTION-SCREEN END OF BLOCK b02.

INITIALIZATION.
* Defaultwert Datum
  SELECT SINGLE lmona FROM tka01
    
WHERE kokrs EQ @p_kokrs
    
INTO @DATA(gv_periv).
  CALL FUNCTION 'DATE_TO_PERIOD_CONVERT'
    EXPORTING
      i_date         sy-datum
*     I_MONMIT       = 00
      i_periv        gv_periv
    
IMPORTING
      e_buper        p_perio
      e_gjahr        
p_gjahr
    
EXCEPTIONS
      input_false    1
      t009_notfound  2
      t009b_notfound 3
      OTHERS         4.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

* Periodenberechnung
  p_perio p_perio 1.
  IF p_perio EQ 0p_perio 12ENDIF.
  IF p_perio EQ 12p_gjahr p_gjahr 1ENDIF.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_1koset.
  CALL FUNCTION 'K_GROUP_SELECT'
    EXPORTING
      class         '0101'
      field_name    'KOSTL                         '
      table         'CCSS                          '
    IMPORTING
      setid         gs_selection-koset
      set_name      
gv_kosetname
    
EXCEPTIONS
      no_set_picked 02.
  IF sy-subrc 0.
    p_1koset gv_kosetname.
  ENDIF.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_1kstar.
  CALL FUNCTION 'K_GROUP_SELECT'
    EXPORTING
      class         '0102'
      field_name    'KSTAR                         '
      table         'CCSS                          '
    IMPORTING
      setid         gs_selection-kstar
      set_name      
gv_kstarname
    
EXCEPTIONS
      no_set_picked 02.
  IF sy-subrc 0.
    p_1kstar gv_kstarname.
  ENDIF.

AT SELECTION-SCREEN.
  IF p_gesam EQ abap_true.
    CLEARp_1kstargs_selection-kstargv_kstarname.
  ENDIF.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    IF screen-name 'P_1KSTAR'.
      IF p_gesam EQ abap_true.
        CLEAR p_1kstar.
        screen-input '0'.
      ELSE.
        screen-input '1'.
      ENDIF.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.

 

CLASS zcl_co_cost2statfig DEFINITION
  PUBLIC
  FINAL
  
CREATE PUBLIC .

  PUBLIC SECTION.

 

    TYPES:
      tr_kosar TYPE RANGE OF csks-kosar .
    TYPES:
      BEGIN OF ts_selection.
    TYPES kokrs TYPE kokrs.
    TYPES koset TYPE rgsbs-setnr.
    TYPES kstar TYPE rgsbs-setnr.
    TYPES gesam TYPE checkbox.
    TYPES gjahr TYPE gjahr.
    TYPES perio TYPE periode.
    TYPES verto TYPE kosar.
    TYPES verfr TYPE tr_kosar.
    TYPES stagr TYPE stagr.
    TYPES END OF ts_selection .

    TYPES BEGIN OF ts_csks.
    TYPES kokrs TYPE kokrs.
    TYPES kostl TYPE kostl.
    TYPES datbi TYPE datbi.
    TYPES bukrs TYPE bukrs.
    TYPES prctr TYPE prctr.
    TYPES kosar TYPE kosar.
    TYPES END OF ts_csks.

    TYPES tt_csks TYPE STANDARD TABLE OF ts_csks WITH DEFAULT KEY
                                                 WITH UNIQUE HASHED KEY k1 COMPONENTS kokrs kostl datbi
                                                 
WITH NON-UNIQUE SORTED KEY k2 COMPONENTS kosar.

    TYPES tt_cskb TYPE STANDARD TABLE OF cskb WITH DEFAULT KEY.

    TYPES BEGIN OF ts_costs.
    TYPES kokrs TYPE kokrs.
    TYPES kostl TYPE kostl.
    TYPES bukrs TYPE bukrs.
    TYPES prctr TYPE prctr.
    TYPES kosar TYPE kosar.
    TYPES wrttp TYPE co_wrttp.
    TYPES sum   TYPE coep-wkgbtr.
    TYPES END OF ts_costs.

    TYPES tt_costs TYPE STANDARD TABLE OF ts_costs WITH DEFAULT KEY.

    CLASS-METHODS get_instance
      RETURNING
        
VALUE(ro_instanceTYPE REF TO zcl_co_cost2statfig .
    METHODS start
      
IMPORTING
        !is_selection TYPE ts_selection .
protected section.
private section.

  data CV_FAILURE type ABAP_BOOL .
  data GT_COSTS type TT_COSTS .
  data CV_VERTO type KOSAR .
  data GR_KSTAR type REP_EAPS_TAB_KSTAR_RANGE .
  data GT_VERTO type TT_CSKS .
  data RT_VERFR type TR_KOSAR .
  data CV_GESAM type CHECKBOX .
  data CV_DATAB type DATEFROM .
  data CV_DATBI type DATETO .
  data CV_GJAHR type GJAHR .
  data CV_KOKRS type KOKRS .
  data CV_PERIO type PERIODE .
  class-data GO_INSTANCE type ref to ZCL_CO_COST2STATFIG .
  data GT_CSKB type TT_CSKB .
  data GR_KOSTL type HRPP_SEL_KOSTL .
  data CV_STAGR type STAGR .
  data GT_RETURN type BAPIRET2_T .

  methods CALCULATE_COSTS .
  methods DBSEL_CSKB
    
importing
      !IT_KSTAR type REP_EAPS_TAB_KSTAR_RANGE
    returning
      
value(RT_CSKBtype TT_CSKB .
  methods DBSEL_CSKS
    
importing
      !IT_KOSTL type HRPP_SEL_KOSTL
    returning
      
value(RT_CSKStype TT_CSKS .
  methods POST_STATFIG .
  methods REVERSE_STATFIGPOST .
  methods SHOW_LOG .
  methods SET_DATA
    
importing
      !IS_SELECTION type TS_SELECTION .
  methods SET_KOSTENARTEN
    
importing
      !IS_SELECTION type TS_SELECTION .
  methods SET_KOSTENSTELLEN
    
importing
      !IS_SELECTION type TS_SELECTION .
  methods SET_SELMAIN
    
importing
      !IS_SELECTION type TS_SELECTION .
ENDCLASS.



CLASS ZCL_CO_COST2STATFIG IMPLEMENTATION.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_CO_COST2STATFIG->CALCULATE_COSTS
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD calculate_costs.

    DATAlv_tabix     TYPE sy-tabix,
          ls_costverto TYPE ts_costs,
          lt_costverto TYPE tt_costs.

*   Prüfen, ob bereits eine Fehlersituation vorliegt
    CHECK cv_failure IS INITIAL.
*   Select aus COEP, da hier die Daten mit Vorzeichen vorliegen
    SELECT
      a~kokrsa~kostlb~bukrsb~prctrb~kosar,
      a~wrttpSUMa~wkgbtr AS sum "Direkte Summierung möglich, da Werte positiv und negativ vorliegen
      FROM coep AS a
      INNER 
JOIN csks AS b
      
ON a~kokrs EQ b~kokrs AND a~kostl EQ b~kostl
      
WHERE a~kokrs EQ @cv_kokrs
      
AND   a~lednr EQ '00'
      AND   a~gjahr EQ @cv_gjahr
      
AND   a~perio EQ @cv_perio
      
AND   a~kstar IN @gr_kstar
      
AND   a~kostl IN @gr_kostl
      
GROUP BY a~kokrsb~bukrsb~prctra~kostlb~kosara~wrttp
      
INTO CORRESPONDING FIELDS OF TABLE @gt_costs.
*   Buchungskreis 1003 hat Filialkostenstellen, die irrelevant sind, Nullzeilen ignorieren!
    DELETE gt_costs WHERE bukrs '1003' AND kosar EQ cv_verto OR sum IS INITIAL.
    DELETE gt_costs WHERE wrttp NE '04'.
*   Verdichtung
    LOOP AT gt_verto REFERENCE INTO DATA(ls_verto).
      CLEAR ls_costverto.
      MOVE-CORRESPONDING ls_verto->TO ls_costverto.
      LOOP AT gt_costs REFERENCE INTO DATA(ls_costs)
        WHERE bukrs EQ ls_verto->bukrs
        
AND   prctr EQ ls_verto->prctr
        
AND   

* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_CO_COST2STATFIG->DBSEL_CSKB
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_KSTAR                       TYPE        REP_EAPS_TAB_KSTAR_RANGE
* | [<-()] RT_CSKB                        TYPE        TT_CSKB
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD dbsel_cskb.

    IF cv_gesam IS INITIAL AND it_kstar IS NOT INITIAL.
      SELECT kokrskstarkatyp FROM cskb
        
WHERE kokrs EQ @cv_kokrs
        
AND   kstar IN @it_kstar
        
AND   datbi GE @cv_datbi
        
INTO CORRESPONDING FIELDS OF TABLE @rt_cskb.
    ELSE.
      SELECT kokrskstarkatyp FROM cskb
        
WHERE kokrs EQ @cv_kokrs
        
AND   datbi GE @cv_datbi
        
INTO CORRESPONDING FIELDS OF TABLE @rt_cskb.
    ENDIF.

  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_CO_COST2STATFIG->DBSEL_CSKS
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_KOSTL                       TYPE        HRPP_SEL_KOSTL
* | [<-()] RT_CSKS                        TYPE        TT_CSKS
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD dbsel_csks.

    SELECT kokrskostldatbibukrsprctrkosar
      
FROM csks
      
WHERE kokrs EQ @cv_kokrs
      
AND   kostl IN @it_kostl
      
AND   datbi GE @cv_datbi
      
AND   datab LE @cv_datab
      
and   kosar EQ @cv_verto
      
INTO CORRESPONDING FIELDS OF TABLE @rt_csks.


  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_CO_COST2STATFIG=>GET_INSTANCE
* +-------------------------------------------------------------------------------------------------+
* | [<-()] RO_INSTANCE                    TYPE REF TO ZCL_CO_COST2STATFIG
* +--------------------------------------------------------------------------------------</SIGNATURE>
  method GET_INSTANCE.

    IF go_instance IS INITIAL.
      CREATE OBJECT go_instance.
    ENDIF.

    ro_instance go_instance.


  endmethod.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_CO_COST2STATFIG->POST_STATFIG
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD post_statfig.

    DATAlt_item   TYPE STANDARD TABLE OF bapiskfitm WITH DEFAULT KEY,
          lt_return TYPE bapiret2_t,
          ls_return TYPE REF TO bapiret2,
          lv_count  TYPE i.

*   Bei Fehler keine weitere Verarbeitung
    CHECK cv_failure IS INITIAL.
*   Ohne Daten keine Competition
    CHECK gt_costs IS NOT INITIAL.
*   Kopfdaten füllen
    DATA(ls_header) = VALUE bapidochdrpco_area    cv_kokrs
                                         postgdate  
cv_datbi
                                         doc_hdr_tx 
'CUM_COSTS' && ' ' && cv_gjahr && '/' && cv_perio
                                         username   
sy-uname ).
*   Positionsdaten füllen
    LOOP AT gt_costs REFERENCE INTO DATA(ls_costs).
      lv_count lv_count + 1.
      APPEND VALUE bapiskfitmstatkeyfig cv_stagr
                               stat_qty   
CONV smexxxls_costs->sum )
                               seg_text   ' '
                               rec_cctr   ls_costs->kostl TO lt_item.
      IF lv_count 899.
*       Funktionsbaustein aufrufen
        CALL FUNCTION 'BAPI_ACC_STAT_KEY_FIG_POST'
          EXPORTING
            doc_header ls_header
*           IGNORE_WARNINGS       = ' '
*      IMPORTING
*           doc_no     = lv_belnr
          TABLES
            doc_items  lt_item
            
return     lt_return.
*       Rückgabetabelle auswerten
        LOOP AT lt_return REFERENCE INTO ls_return.
          IF ls_return->type CA 'AEX'.
            cv_failure abap_true.
          ENDIF.
          APPEND ls_return->TO gt_return.
        ENDLOOP.
*       Clear
        CLEARlv_countlt_itemlt_return.
      ENDIF.
    ENDLOOP.

*   Letzter Block
    IF lt_item IS NOT INITIAL.
*     Funktionsbaustein aufrufen
      CALL FUNCTION 'BAPI_ACC_STAT_KEY_FIG_POST'
        EXPORTING
          doc_header ls_header
*         IGNORE_WARNINGS       = ' '
*      IMPORTING
*         doc_no     = lv_belnr
        TABLES
          doc_items  lt_item
          
return     lt_return.
*     Rückgabetabelle auswerten
      LOOP AT lt_return REFERENCE INTO ls_return.
        IF ls_return->type CA 'AEX'.
          cv_failure abap_true.
        ENDIF.
        APPEND ls_return->TO gt_return.
      ENDLOOP.
*       Clear
      CLEARlv_countlt_itemlt_return.
    ENDIF.

*   Fehlerprüfung
    IF cv_failure NE abap_true.
*     Auf Datenbank schreiben
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait abap_true.
    ELSE.
*     Nicht auf DB schreiben
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    ENDIF.

  ENDMETHOD.

 

* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_CO_COST2STATFIG->REVERSE_STATFIGPOST
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD reverse_statfigpost.

*   Erst mal kein Storno, sondern nur Fehlermeldung ausgeben
*   Selektion Kopf und Position
    SELECT
      a~kokrsa~belnr,
      SUMb~smebtr AS wert
      
FROM cobk AS a
      INNER 
JOIN coepr AS b
      
ON  a~kokrs EQ b~kokrs
      
AND a~belnr EQ b~belnr
      
WHERE a~kokrs EQ @cv_kokrs
      
AND   a~gjahr EQ @cv_gjahr
*      AND   a~versn EQ 0
      AND   a~vrgng EQ 'RKS'
      AND   a~perab EQ @cv_perio
      
AND   a~stflg NE @abap_true
      
AND   a~stokz NE @abap_true
      
AND   b~stagr EQ @cv_stagr
      
GROUP BY a~kokrsa~belnr
      
INTO TABLE @DATA(lt_cobk).

*   Daten gefunden? Dann Fehler und Returntabelle füllen
    LOOP AT lt_cobk REFERENCE INTO DATA(ls_cobk).
      cv_failure abap_true.
      APPEND VALUE bapiret2id         'ZCO'
                             number     5       "Bitte &1 / &2 in &3 mittels KB34N stornieren (Wert: &4).
                             type       'E'
                             message_v1 ls_cobk->kokrs
                             message_v2 
ls_cobk->belnr
                             message_v3 
cv_gjahr && '/' && cv_perio
                             message_v4 
CONV char13ls_cobk->wert ) ) TO gt_return.
    ENDLOOP.

  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_CO_COST2STATFIG->SET_DATA
* +-------------------------------------------------------------------------------------------------+
* | [--->] IS_SELECTION                   TYPE        TS_SELECTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD set_data.

*   Datum/Kostenrechnungskreis setzen
    set_selmainis_selection ).
*   Kostenstellen festlegen
    set_kostenstellenis_selection ).
*   Kostenarten festlegen
    set_kostenartenis_selection ).

  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_CO_COST2STATFIG->SET_KOSTENARTEN
* +-------------------------------------------------------------------------------------------------+
* | [--->] IS_SELECTION                   TYPE        TS_SELECTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD set_kostenarten.

    DATAlt_setvalues TYPE TABLE OF setvalues,
          lr_kstar     TYPE rep_eaps_tab_kstar_range.

    IF is_selection-kstar IS NOT INITIAL.
*     Werte importieren
      CALL FUNCTION 'G_SET_TREE_IMPORT'
        EXPORTING
          client          sy-mandt
          setid           
is_selection-kstar
*         tabname         = table
*         fieldname       = fieldname
          no_descriptions abap_true
          no_rw_info      
abap_true
          date_from       
cv_datab
          date_to         
cv_datbi
        
TABLES
*         set_hierarchy   =
          set_values      lt_setvalues
        
EXCEPTIONS
          set_not_found   1
          OTHERS          3.
*     Werte in Rangetabelle übernehmen
      LOOP AT lt_setvalues REFERENCE INTO DATA(ls_set).
        APPEND VALUE rep_eaps_str_kstar_rangesign    'I'
                                               option  'BT'
                                               low     ls_set->from
                                               high    ls_set->to TO gr_kstar.
      ENDLOOP.
    ENDIF.
*   Benötigte Daten selektieren und in Attributtabelle stellen
    gt_cskb dbsel_cskbgr_kstar ).

  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_CO_COST2STATFIG->SET_KOSTENSTELLEN
* +-------------------------------------------------------------------------------------------------+
* | [--->] IS_SELECTION                   TYPE        TS_SELECTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD set_kostenstellen.

    DATAlt_setvalues TYPE TABLE OF setvalues.

    CALL FUNCTION 'G_SET_TREE_IMPORT'
      EXPORTING
        client          sy-mandt
        setid           
is_selection-koset
*       tabname         = table
*       fieldname       = fieldname
        no_descriptions abap_true
        no_rw_info      
abap_true
        date_from       
cv_datab
        date_to         
cv_datbi
      
TABLES
*       set_hierarchy   =
        set_values      lt_setvalues
      
EXCEPTIONS
        set_not_found   1
        OTHERS          3.

    LOOP AT lt_setvalues REFERENCE INTO DATA(ls_set).
      APPEND VALUE hrpp_sel_st_kostlsign    'I'
                                      option  'BT'
                                      low     ls_set->from
                                      high    ls_set->to TO gr_kostl.
    ENDLOOP.

    gt_verto dbsel_csksgr_kostl ).


  ENDMETHOD.



 

* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_CO_COST2STATFIG->SET_SELMAIN
* +-------------------------------------------------------------------------------------------------+
* | [--->] IS_SELECTION                   TYPE        TS_SELECTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD set_selmain.

*   Übernahme in globale Attribute
    cv_gjahr is_selection-gjahr.
    cv_perio is_selection-perio.
    cv_kokrs is_selection-kokrs.
    cv_gesam is_selection-gesam.
    rt_verfr is_selection-verfr.
    cv_verto is_selection-verto.
    cv_stagr is_selection-stagr.
*   Datum ermitteln
    SELECT SINGLE lmona FROM tka01
      
WHERE kokrs EQ @cv_kokrs
      
INTO @DATA(lv_periv).
*   Anfangsdatum
    CALL FUNCTION 'FIRST_DAY_IN_PERIOD_GET'
      EXPORTING
        i_gjahr        cv_gjahr
*       I_MONMIT       = 00
        i_periv        lv_periv
        i_poper        
cv_perio
      
IMPORTING
        e_date         cv_datab
      
EXCEPTIONS
        input_false    1
        t009_notfound  2
        t009b_notfound 3
        OTHERS         4.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.
*   Enddatum
    CALL FUNCTION 'LAST_DAY_OF_MONTHS'
      EXPORTING
        day_in            cv_datab
      
IMPORTING
        last_day_of_month cv_datbi
      
EXCEPTIONS
        day_in_no_date    1
        OTHERS            2.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.



  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_CO_COST2STATFIG->SHOW_LOG
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD show_log.

    CALL FUNCTION 'C14ALD_BAPIRET2_SHOW'
      TABLES
        i_bapiret2_tab gt_return.

  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_CO_COST2STATFIG->START
* +-------------------------------------------------------------------------------------------------+
* | [--->] IS_SELECTION                   TYPE        TS_SELECTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD start.

*   Wesentliche Attribute füllen
    set_datais_selection ).
*   Ggfls. bisherige stat. Kennzahl stornieren
    reverse_statfigpost( ).
*   Kosten ermitteln und Verdichten
    calculate_costs( ).
*   Wert buchen
    post_statfig( ).
*   Protokoll ausgeben
    show_log( ).

  ENDMETHOD.
ENDCLASS.

Kommentare

Upload-Tool für Hauptbuchbelege (SAPGUI)

Veröffentlicht am 4. Februar 2019 von sapmandoo in S4, FI, SAP Reports

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_UPLOAD_DOCUMENT
*----------------------------------------------------------------------*
* Funktion       : Upload Belege aus Excel                             *
*----------------------------------------------------------------------*
* Beschreibung   : Upload von Belegen und Verbuchung via Excel         *
*                  (Ausweichtool für Fiori-App)                        *
*----------------------------------------------------------------------*
REPORT zfi_upload_document.

***********************************************************************
******************** GLOBAL DATA **************************************
***********************************************************************

CONSTANTS: gc_delimiter(1) TYPE c VALUE '~'.

SET EXTENDED CHECK OFF.
INCLUDE:
  sbal_constants,
  <icon>.
SET EXTENDED CHECK ON.

DATA:
  g_s_log             TYPE bal_s_log,
  g_log_handle        TYPE balloghndl,
  g_t_log_handle      TYPE bal_t_logh,
  g_s_display_profile TYPE bal_s_prof.

DATA: g_dummy         TYPE c.

DATA: data_tab TYPE TABLE OF string.

TYPES: BEGIN OF tax_item,
         mwskz      TYPE mwskz,
         direct_tax TYPE abap_bool,
         basis      TYPE fwbas,
         steuer     TYPE fwste,
       END OF tax_item.

DATA: git_taxitems TYPE TABLE OF tax_item,
      gs_taxitem   TYPE tax_item.

TYPES: BEGIN OF doc_header,
         bukrs     TYPE bukrs,
         blart     TYPE blart,
         bldat(10) TYPE c,
         budat(10) TYPE c,
         bumon     TYPE bumon,
         bktxt     TYPE bktxt,
         waers     TYPE waers,
         ldgrp     TYPE fagl_ldgrp,
         ukurs(12) TYPE c,
         umdat(10) TYPE c,
         xblnr     TYPE xblnr,
         pargb     TYPE pargb,
       END OF doc_header.

TYPES: BEGIN OF doc_item,
         bukrs     TYPE bukrs,
         hkont     TYPE hkont,
         sgtxt     TYPE sgtxt,
         wrsol(15) TYPE c,
         wrhab(15) TYPE c,
         dmbtr(15) TYPE c,
         dmbe2(15) TYPE c,
         mwskz     TYPE mwskz,
         txjcd     TYPE txjcd,
         kostl     TYPE kostl,
         prctr     TYPE prctr,
         aufnr     TYPE aufnr,
         ps_posid  TYPE ps_posid,
         valut(10) TYPE c,
         hbkid     TYPE hbkid,
         hktid     TYPE hktid,
         zuonr     TYPE dzuonr,
         vbund     TYPE vbund,
       END OF doc_item.

DATA: gs_doc    TYPE doc_header,
      gs_item   TYPE doc_item,
      git_items TYPE TABLE OF doc_item.


* Schnittstellendaten für Verbuchungs-BAPI
DATA:
* Returnparameter des BAPIs
  g_obj_type         TYPE bapiache09-obj_type,  "Objekttyp
* Objejktschlüssel erhält vom BAPI die Belegidentifikation:
* NNNNNNNNNNYYYYBBBB  N = Belegnummer, Y = GJahr, B = Buchungskreis
  g_obj_key          TYPE bapiache09-obj_key,   "Objektschlüssel
  g_obj_sys          TYPE bapiache09-obj_sys,   "log. System

* Belegkopf
  gs_documentheader  TYPE bapiache09,

* Sachkontenpositionen
  git_accountgl      TYPE TABLE OF bapiacgl09,
  gs_accountgl       TYPE bapiacgl09,

* Steuerzeilen
  git_accounttax     TYPE TABLE OF bapiactx09,
  gs_accounttax      TYPE bapiactx09,

* Betragsinformationen
  git_currencyamount TYPE TABLE OF bapiaccr09,
  gs_currencyamount  TYPE bapiaccr09,

* Meldungen des BAPI's
  git_return         TYPE TABLE OF bapiret2,
  gs_return          TYPE bapiret2.

DATA:
  g_itemno           TYPE posnr_acc.           "Postionsnummer 


*&---------------------------------------------------------------------*
*& SELECTION-SCREEN
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-b01.
PARAMETERS: pa_fnam LIKE rlgrap-filename OBLIGATORY.
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.
*-----------------------------------------------------------------------

  PERFORM init.
  PERFORM upload_data.
  PERFORM map_data.
  IF pa_test IS INITIAL.
    PERFORM post_document.
  ELSE.
    PERFORM check_document.
  ENDIF.
  PERFORM add_msg_to_prot.
  PERFORM log_display.

*&---------------------------------------------------------------------*
*& Form F4_FILENAME
*&---------------------------------------------------------------------*
*& F4 Hilfe Excel-Datei
*&---------------------------------------------------------------------*
FORM f4_filename .

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

ENDFORM.
*&---------------------------------------------------------------------*
*& Form UPLOAD_DATA
*&---------------------------------------------------------------------*
*& Upload der Excel-Tabelle mit den Belegdaten
*&---------------------------------------------------------------------*
FORM upload_data .

  DATA: l_buf      TYPE string,
        l_tabix    TYPE sy-tabix,
        l_msg(200) TYPE c.

  CLEAR data_tab[].

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

  IF sy-subrc <> 0.
    MESSAGE i600(fr) WITH 'Fehler' sy-subrc 'beim Upload'.
  ELSE.
    CONCATENATE TEXT-001 pa_fnam INTO l_msg SEPARATED BY space.
    PERFORM msg_add_free_text USING l_msg.
  ENDIF.

  LOOP AT data_tab INTO l_buf.
    IF sy-tabix = 5.
      SPLIT l_buf AT gc_delimiter INTO
            gs_doc-bukrs
            gs_doc-blart
            gs_doc-bldat
            gs_doc-budat
            gs_doc-bumon
            gs_doc-bktxt
            gs_doc-waers
            gs_doc-ldgrp
            gs_doc-ukurs
            gs_doc-umdat
            gs_doc-xblnr
            gs_doc-pargb.
    ENDIF.
    IF sy-tabix GE 9.
      SPLIT l_buf AT gc_delimiter INTO
            gs_item-bukrs
            gs_item-hkont
            gs_item-sgtxt
            gs_item-wrsol
            gs_item-wrhab
            gs_item-dmbtr
            gs_item-dmbe2
            gs_item-mwskz
            gs_item-txjcd
            gs_item-kostl
            gs_item-prctr
            gs_item-aufnr
            gs_item-ps_posid
            gs_item-valut
            gs_item-hbkid
            gs_item-hktid
            gs_item-zuonr
            gs_item-vbund.
      APPEND gs_item TO git_items.
    ENDIF.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form INIT_PROTOCOL
*&---------------------------------------------------------------------*
*& Anwendungsprotokoll aufbauen
*&---------------------------------------------------------------------*
FORM init_protocol .

* create a log
  g_s_log-extnumber = 'Beleg-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
*&---------------------------------------------------------------------*
*& Initialisierung
*&---------------------------------------------------------------------*
FORM init .
  CLEAR: git_accountgl[],
         git_accounttax[],
         git_currencyamount[],
         git_return[].
  CLEAR g_itemno.
  PERFORM init_protocol.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form POST_DOCUMENT
*&---------------------------------------------------------------------*
*& Beleg buchen
*&---------------------------------------------------------------------*
FORM post_document .

  DATA: l_error TYPE abap_bool VALUE abap_false.

*-----------------------------------------------------------------------
* BAPI-Aufruf
*-----------------------------------------------------------------------
  CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
    EXPORTING
      documentheader = gs_documentheader
    IMPORTING
      obj_type       = g_obj_type
      obj_key        = g_obj_key
      obj_sys        = g_obj_sys
    TABLES
      accountgl      = git_accountgl
      accounttax     = git_accounttax
      currencyamount = git_currencyamount
      return         = git_return.

  LOOP AT git_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.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form CHECK_DOCUMENT
*&---------------------------------------------------------------------*
*& Beleg prüfen
*&---------------------------------------------------------------------*
FORM check_document .
  CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
    EXPORTING
      documentheader = gs_documentheader
    TABLES
      accountgl      = git_accountgl
      accounttax     = git_accounttax
      currencyamount = git_currencyamount
      return         = git_return.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form MAP_DATA
*&---------------------------------------------------------------------*
*& Mapping der Excel-Daten auf BAPI-Strukturen
*&---------------------------------------------------------------------*
FORM map_data .

  DATA: l_netto  TYPE wrbtr,
        l_brutto TYPE wrbtr,
        l_steuer TYPE fwste,
        l_basis  TYPE fwbas.

  DATA: l_mwskz  TYPE skb1-mwskz.
*-----------------------------------------------------------------------
* Belegkopf
*-----------------------------------------------------------------------
  CLEAR gs_documentheader.
  gs_documentheader-bus_act    = 'RFBU'.
  gs_documentheader-username   = sy-uname.
  gs_documentheader-comp_code  = gs_doc-bukrs.
  PERFORM _convert USING gs_doc-bldat gs_documentheader-doc_date   'BLDAT'.
  PERFORM _convert USING gs_doc-budat gs_documentheader-pstng_date 'BUDAT'.
  IF gs_doc-bumon IS NOT INITIAL AND gs_doc-bumon NE space.
    gs_documentheader-fis_period = gs_doc-bumon.
  ENDIF.
  gs_documentheader-ref_doc_no = gs_doc-xblnr.
  gs_documentheader-header_txt = gs_doc-bktxt.
  gs_documentheader-doc_type   = gs_doc-blart.

*-----------------------------------------------------------------------
* Belegpositionen
*-----------------------------------------------------------------------
  LOOP AT git_items INTO gs_item.

    ADD 1 TO g_itemno.
    CLEAR: gs_accountgl, gs_currencyamount.

    gs_accountgl-itemno_acc      = g_itemno.
    PERFORM _convert USING gs_item-hkont gs_accountgl-gl_account 'HKONT'.
    gs_accountgl-item_text       = gs_item-sgtxt.
    IF gs_item-kostl IS NOT INITIAL.
      PERFORM _convert USING gs_item-kostl gs_accountgl-costcenter 'KOSTL'.
    ENDIF.
    IF gs_item-prctr IS NOT INITIAL.
      PERFORM _convert USING gs_item-prctr gs_accountgl-profit_ctr 'PRCTR'.
    ENDIF.
    IF gs_item-aufnr IS NOT INITIAL.
      PERFORM _convert USING gs_item-aufnr gs_accountgl-orderid 'AUFNR'.
    ENDIF.
    IF gs_item-ps_posid IS NOT INITIAL.
      PERFORM _convert USING gs_item-ps_posid gs_accountgl-wbs_element 'PS_POSID'.
    ENDIF.
    gs_accountgl-alloc_nmbr      = gs_item-zuonr.
    gs_accountgl-trade_id        = gs_item-vbund.
    gs_accountgl-tax_code        = gs_item-mwskz.
    IF gs_item-valut IS NOT INITIAL.
      PERFORM _convert USING gs_item-valut gs_accountgl-value_date 'VALUT'.
    ENDIF.

    IF gs_item-wrsol IS NOT INITIAL.
      PERFORM _convert USING gs_item-wrsol l_brutto 'WRBTR'.
    ENDIF.
    IF gs_item-wrhab IS NOT INITIAL.
      PERFORM _convert USING gs_item-wrhab l_brutto 'WRBTR'.
      MULTIPLY l_brutto BY -1.
    ENDIF.

*   Sachkonto mit Steuer zu bebuchen
    CLEAR l_mwskz.
    SELECT SINGLE mwskz FROM skb1 INTO l_mwskz
            WHERE saknr = gs_accountgl-gl_account
              AND bukrs = gs_documentheader-comp_code.
    IF sy-subrc = 0 AND l_mwskz IS INITIAL.
      "keine Steuer erlaubt --> St. KZ. löschen (Verhalten analog FIORI-App)
      CLEAR: gs_item-mwskz, gs_accountgl-tax_code.
    ENDIF.

    CLEAR: l_steuer, l_netto, l_basis.
*   Mit Steuer?
    IF gs_item-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_item-mwskz
            i_waers = gs_doc-waers
            i_bukrs = gs_documentheader-comp_code
          IMPORTING
            e_fwbas = l_basis.
        l_steuer = l_netto = l_brutto.
      ELSE.
        CALL FUNCTION 'CALCULATE_TAX_FROM_GROSSAMOUNT'
          EXPORTING
            i_bukrs = gs_documentheader-comp_code
            i_mwskz = gs_item-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.
      ENDIF.

*-----------------------------------------------------------------------
*     korrespondierende Steuerzeile sammeln
*-----------------------------------------------------------------------
      CLEAR gs_taxitem.
      gs_taxitem-mwskz  = gs_item-mwskz.
      gs_taxitem-steuer = l_steuer.
      gs_taxitem-basis  = l_basis.
      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.
    ENDIF.

    IF NOT ( l_mwskz = '>' OR l_mwskz = '<' ).  "Direct Tax
      gs_currencyamount-itemno_acc = gs_accountgl-itemno_acc.
      gs_currencyamount-currency   = gs_doc-waers.
      gs_currencyamount-amt_doccur = l_netto.

      APPEND: gs_accountgl      TO git_accountgl,
              gs_currencyamount TO git_currencyamount.
    ENDIF.

  ENDLOOP.

*-----------------------------------------------------------------------
*     gesammelte Steuerzeilen aufbereiten und anhängen
*-----------------------------------------------------------------------
  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.
    gs_currencyamount-itemno_acc = gs_accounttax-itemno_acc.
    gs_currencyamount-currency   = gs_doc-waers.
    gs_currencyamount-amt_doccur = gs_taxitem-steuer.
    gs_currencyamount-amt_base   = gs_taxitem-basis.

    APPEND: gs_accounttax     TO git_accounttax,
            gs_currencyamount TO git_currencyamount.
  ENDLOOP.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form _CONVERT
*&---------------------------------------------------------------------*
*& Daten ins SAP-Format konvertieren
*&---------------------------------------------------------------------*
*&      --> in/out Ein/Ausgabe
*&      --> Dtel   Datenelement
*&---------------------------------------------------------------------*
FORM _convert  USING    in out VALUE(dtel).

  CALL FUNCTION 'RS_CONV_EX_2_IN_DTEL'
    EXPORTING
      input_external  = in
      dtel            = dtel
    IMPORTING
      output_internal = out.

  IF sy-subrc <> 0.
    MESSAGE a600(fr) WITH 'Fehler' sy-subrc 'bei der Konvertierung' 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.

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.

Excel-Template

Excel-Template

Kommentare

Kostenartentexte und Sachkontentexte in andere Sprache kopieren

Veröffentlicht am 4. Dezember 2017 von sapmandoo in SAP Reports, FI, CO, Basis-Entwicklung allg.

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
Kommentare

Standardtexte in andere Sprachen kopieren

Veröffentlicht am 4. Dezember 2017 von sapmandoo in Basis-Entwicklung allg., SAP Reports

Anbei ein kleines Hilfstool, mit dem Standardtexte (SO10) in anderen Sprachen angelegt werden können. Es versteht sich wohl von selbst, dass die Texte nur kopiert und nicht übersetzt werden. Das Verfahren eignet sich z.B. für die Vervielfältigung von Adress-Textbausteinen in andere Sprachen...

Beispiel: "Kopiere alle Texte ZADR*, Text-ID ADRS von DE nach IT"

* Standardtexte (SO10) von einer Sprache in eine
* andere kopieren (nur kopieren[!] nicht übersetzen[!])
* Wer möchte, kann natürlich gerne einen Übersetzungsroboter
* dazubauen!!!

REPORT yytxcopy
       NO STANDARD PAGE HEADING LINE-SIZE 255.
TABLES: rssce, stxh.
INCLUDE bdcrecx1.
SELECTION-SCREEN ULINE.
SELECT-OPTIONS: so_txnam FOR rssce-tdname OBLIGATORY.  "Text-name
PARAMETERS:     pa_tdid LIKE rssce-tdid OBLIGATORY, "Text-ID
                pa_slang LIKE sy-langu OBLIGATORY   "Source language
                         DEFAULT sy-langu,
                p_tlang  LIKE sy-langu OBLIGATORY.  "Target language


START-OF-SELECTION.

  PERFORM open_group.

  SELECT        * FROM  stxh
         WHERE  tdobject  = 'TEXT'
         AND    tdname   IN so_txnam
         AND    tdid      = pa_tdid
         AND    tdspras   = pa_slang.
    PERFORM so10.
  ENDSELECT.
  PERFORM close_group.

*&---------------------------------------------------------------------*
*&      Form  so10
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM so10.
  PERFORM bdc_dynpro      USING 'SAPMSSCE' '1100'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'RSSCE-TDSPRAS'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=EDIT'.
  PERFORM bdc_field       USING 'RSSCE-TDNAME'
                                stxh-tdname.
  PERFORM bdc_field       USING 'RSSCE-TDID'
                                stxh-tdid.
  PERFORM bdc_field       USING 'RSSCE-TDSPRAS'
                                stxh-tdspras.
  PERFORM bdc_dynpro      USING 'SAPLSTXX' '1100'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'RSTXT-TXLINE(02)'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=TXNA'.
  PERFORM bdc_dynpro      USING 'SAPLSTXX' '1111'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'RSTXT-TDSPRAS'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=PPUP'.
  PERFORM bdc_field       USING 'RSTXT-TDNAME'
                                stxh-tdname.
  PERFORM bdc_field       USING 'RSTXT-TDID'
                                stxh-tdid.
  PERFORM bdc_field       USING 'RSTXT-TDSPRAS'
                                p_tlang.
  PERFORM bdc_dynpro      USING 'SAPLSTXX' '1100'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'RSTXT-TXLINE(02)'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=TXBA'.
  PERFORM bdc_dynpro      USING 'SAPMSSCE' '1100'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'RSSCE-TDNAME'.
  PERFORM bdc_dynpro      USING 'SAPMSSCE' '1100'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'RSSCE-TDSPRAS'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=TXBA'.
  PERFORM bdc_field       USING 'RSSCE-TDNAME'
                                stxh-tdname.
  PERFORM bdc_field       USING 'RSSCE-TDID'
                                stxh-tdid.
  PERFORM bdc_field       USING 'RSSCE-TDSPRAS'
                                stxh-tdspras.
  PERFORM bdc_transaction USING 'SO10'.
  REFRESH bdcdata.
ENDFORM.                                                    "so10
Kommentare

Erweiterung von Report Painter / -Writer Berichten

Veröffentlicht am 21. Februar 2012 von sapmandoo in SAP Reports

Bei der Erstellung von Report Painter bzw. Report-Writer-Berichten wird eine sog. Berichtstabelle verwendet, die je nach Arbeitsgebiet variiert. Häufig verwendete Berichtstabellen sind bspw.:

  • CCSS - Gemeinkostencontrolling
  • GLPCT - Profitcenter-Rechnung
  • RWCOOM - Berichtstabelle Gemeinkostencontrolling (Spez. Auswertungen)
  • V_GLFLEXT - Flexibles Hauptbuch

In diesen Tabellen bzw. Strukturen sind von SAP vordefinierte Merkmale und Basiskennzahlen enthalten, die aber bei Bedarf erweitert werden können. Hierzu sind ein gewisses Verständnis der zugrundeliegenden Datenstrukturen sowie ABAP/4-Programmierkenntnisse erforderlich.

 

Die Definition der Berichtstabellen sowie der entsprechenden Datenversorungsroutinen sind in den Tabellen T804* hinterlegt, die Pflege erfolgt über die Transaktion GRCT.

 

gctr 

 

Es werden die ausgelieferten Berichtstabellen angezeigt. Im Detailbild der ersten Pflegeebene ist u.a. eine sog. Zusatzstruktur angegeben, in der wiederum ein Customer-Include enthalten ist, in dem bei Bedarf eigene Felder hinzugefügt werden können.

 

Folgendes Beispiel soll dies veranschaulichen:

 

In der Berichtstabelle CCSS soll das Merkmal "Kostenstellenverantwortlicher" eingefügt werden. Das Feld ist im Kostenstellenstamm enthalten (CSKS-VERAK) und wird bei der Datenselektion des Berichts aus dem Kostenstellenstammsatz nachgelesen.

 

 

Feld in Zusatzstruktur ergänzen

 

Zur Berichtstabelle CCSS ist die Zusatzstruktur CCR1S zugeordnet. In ihr ist der Customer-Include CI_CC1S enthalten. In diesen fügen wir unser neues Feld hinzu (SE11). Dies sollte idealerweise im Kundennamensraum erfolgen, da ja nicht auszuschließen ist, dass SAP in kommenden Releases die Berichtstabellen um neue Felder erweitert. Für das Beispiel verwenden wir ZZ_VERAK des Typs VERAK.

 

 

Füllroutine implementieren und zuweisen 

 

Die Füllroutine wird in dem zur Berichtstabelle zugeordneten Formpool hinterlegt.

 

GRCT-Detail

 

Zur Tabelle CCSS ist dies SAPFK21R. Dieses Programm enthält bereits Includes für kundeneigene Routinen (u.a. FK21REZZ). Da es sich trotzdem um einen Teil des SAP-Standard handelt, muss das kundeneigene Coding entweder im Rahmen eines Enhancements implementiert werden oder man benötigt den entsprechenden SSCR-Schlüssel für das Objekt und verwendet den Modifikationsassistenten.

 

Die Füllroutine wird unter "spezielle Merkmale" dem System bekannt gemacht.

 

GRCT-spzMerkmale-Detail

Die Füllroutinen haben folgende Übergabeparameter:

 

--> TAB Aktuelle Tabelle aus der gelesen wird
--> DEF_FLD Wert des bestimmendes Feld (optional)
--> CNV_FLD1 Wert des 1. Konvertierungsparameters (optional)
--> CNV_FLD2 Wert des 2. Konvertierungsparameters (optional)
--> CNV_FLD3 Wert des 3. Konvertierungsparameters (optional)
<-- FLD Wert des zu füllenden Feldes

 

 

Beispiel-Coding für Füllroutine

 

 

FORM Z21_FILL_VERAK  USING TABLE LIKE T804E-TAB
                           KOKRS LIKE CCR1S-KOKRS
                           VERAK LIKE CCR1S-ZZ_VERAK.


 

  DATA: L_KOSTL LIKE CSKS-KOSTL.

 

  CASE TABLE.
    WHEN 'COSP'.
      IF COSP-OBJNR(2) = 'KS'. L_KOSTL = COSP-OBJNR+6(10). ENDIF.

    WHEN 'COSS'.
      IF COSS-OBJNR(2) = 'KS'. L_KOSTL = COSS-OBJNR+6(10). ENDIF.

    WHEN 'COEP'.
      IF COEP-OBJNR(2) = 'KS'. L_KOSTL = COEP-OBJNR+6(10). ENDIF.

    WHEN 'COEJ'.
      IF COEJ-OBJNR(2) = 'KS'. L_KOSTL = COEJ-OBJNR+6(10). ENDIF.

    WHEN OTHERS.
      CLEAR L_KOSTL.
      EXIT.
  ENDCASE.

  Check l_kostl ne space.

  Select single verak from csks into verak

         Where kokrs =  kokrs

           And kostl =  l_kostl

           And datbi >= O_SEL_DATE.   ”BerichtsVARIABLE

  If sy-subrc ne 0.

    Clear verak.

  Endif.
ENDFORM.

 

 

Im Ergebnis steht nun das Merkmal "Kostenstellenverantwortlicher" wie gewohnt im Kontext des CO-Reportings zur Verfügung und kann nun im Report Painter bzw. Report Writer Umfeld verwendet werden.

Kommentare

Sachkontenverzeichnis im ALV mit mehrspachigen Texten

Veröffentlicht am 17. Februar 2011 von sapmandoo in SAP Reports, FI

Der nachfolgende Report erstellt ein Sachkontenverzeichnis im ALV-Grid, wobei ggf. auch Texte in verschiedenen Spachen nebeneinander ausgegeben werden können. Dies erleichtert z.B. das Übersetzen bzw. die Kontrolle der verschiedenen Texte in internationalen SAP-Installationen/Projekten. Zudem ist die ALV-Liste doppelklick-sensitiv, d.h. es kann vor hier direkt in die Sachkontenpflege zentral (FS00) angesprungen werden.

 

Quelltext:

 

 

**********************************************************************
** REPORT  Z_GL_LIST
*--------------------------------------------------------------------*
** AUTHOR:             
** LAST UPDATE:        
** DEVELOPMENT REQUEST:   
**
**********************************************************************
** CONTENT DESCRIPTION
*--------------------------------------------------------------------*
*  List of accounts with texts in different languages
*                   :
*
**********************************************************************
** CHANGE HISTORY
*--------------------------------------------------------------------*
* DATE     | USER        | DESCRIPTION
* -------------------------------------------------------------------*
* <DATE>   | <USERNAME>  | <short description of change>
* <DATE>   | <USERNAME>  | <short description of change>
*    :     |     :       |                 :
*
**********************************************************************

REPORT  z_gl_list.

**********************************************************************
** DECLARATIONS
**********************************************************************

* TYPE DECLARATIONS
*--------------------------------------------------------------------*
TYPES: BEGIN OF gt_acclist,
         ktopl TYPE ska1-ktopl,
         saknr TYPE ska1-saknr,
         bilkt TYPE ska1-bilkt,
         bukrs TYPE skb1-bukrs,
         altkt TYPE skb1-altkt,
         txt20_e TYPE skat-txt20,
         txt50_e TYPE skat-txt50,
         txt20_d TYPE skat-txt20,
         txt50_d TYPE skat-txt50,
         txt20_f TYPE skat-txt20,
         txt50_f TYPE skat-txt50,

 * add textfields for addt'l languages here...
         ktoks TYPE ska1-ktoks,
         xbilk TYPE ska1-xbilk,
         mwskz TYPE skb1-mwskz,
         mitkz TYPE skb1-mitkz,
         xopvw TYPE skb1-xopvw,
         xmwno TYPE skb1-xmwno,
         fstag TYPE skb1-fstag,

*             add addt'l fields here...
       END OF gt_acclist.

* CONSTANTS
*--------------------------------------------------------------------*

* INTERNAL TABLES
*--------------------------------------------------------------------*
DATA: git_acclist TYPE TABLE OF gt_acclist.

* STRUCTURES
*--------------------------------------------------------------------*
DATA: gs_ska1 TYPE ska1,
      gs_skb1 TYPE skb1,
      gs_skat TYPE skat.
DATA: gs_acclist TYPE gt_acclist.

* VARIABLES
*--------------------------------------------------------------------*
TYPE-POOLS: slis.
DATA:   g_repid   LIKE   sy-repid.
DATA:    git_fieldcat   TYPE   slis_t_fieldcat_alv,
  wa_feldkatalog     TYPE   LINE OF slis_t_fieldcat_alv,
  gs_layout    TYPE   slis_layout_alv,
  wa_aktuelle_zeile  LIKE LINE OF git_acclist
  .


* SELECTION CRITERIA (PARAMETERS AND SELECT-OPTIONS)
*--------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE text-b01.
SELECT-OPTIONS: so_ktopl FOR gs_ska1-ktopl OBLIGATORY MEMORY ID kpl,
                so_saknr FOR gs_ska1-saknr,
                so_bukrs FOR gs_skb1-bukrs MEMORY ID buk.
SELECTION-SCREEN END OF BLOCK b01.


**********************************************************************
** EVENTS
**********************************************************************

* START-OF-SELECTION
*--------------------------------------------------------------------*
START-OF-SELECTION.

  SET PARAMETER ID 'BUK' FIELD so_bukrs-low.
  SET PARAMETER ID 'KPL' FIELD so_ktopl-low.

  PERFORM read_glmaster_records.

  IF git_acclist[] IS INITIAL.
*   No list generated
    CALL FUNCTION 'POPUP_NO_LIST'.
  ELSE.
*   ALV-Ouput
    PERFORM display_alv.
  ENDIF.

**********************************************************************
** FORMS
**********************************************************************

*&---------------------------------------------------------------------*
*&      Form  READ_GLMASTER_RECORDS
*&---------------------------------------------------------------------*
*       Selection of GL master records and filling of internal table
*----------------------------------------------------------------------*
FORM read_glmaster_records .

  DATA: ls_skat TYPE skat.

  SELECT * FROM ska1 INTO CORRESPONDING FIELDS OF gs_acclist
         WHERE ktopl IN so_ktopl
           AND saknr IN so_saknr.
    SELECT * FROM skb1 INTO CORRESPONDING FIELDS OF gs_acclist
         WHERE saknr = gs_acclist-saknr
           AND bukrs IN so_bukrs.
      SELECT SINGLE * FROM skat INTO ls_skat
             WHERE ktopl = gs_acclist-ktopl
               AND saknr = gs_acclist-saknr
               AND spras = 'EN'.
      IF sy-subrc = 0.
        gs_acclist-txt20_e = ls_skat-txt20.
        gs_acclist-txt50_e = ls_skat-txt50.
      ELSE.
        gs_acclist-txt20_e = gs_acclist-txt50_e = 'No English text'.
      ENDIF.
      SELECT SINGLE * FROM skat INTO ls_skat
             WHERE ktopl = gs_acclist-ktopl
               AND saknr = gs_acclist-saknr
               AND spras = 'DE'.
      IF sy-subrc = 0.
        gs_acclist-txt20_d = ls_skat-txt20.
        gs_acclist-txt50_d = ls_skat-txt50.
      ELSE.
        gs_acclist-txt20_d = gs_acclist-txt50_d = 'K. deutscher Text'.
      ENDIF.
      SELECT SINGLE * FROM skat INTO ls_skat
             WHERE ktopl = gs_acclist-ktopl
               AND saknr = gs_acclist-saknr
               AND spras = 'FR'.
      IF sy-subrc = 0.
        gs_acclist-txt20_f = ls_skat-txt20.
        gs_acclist-txt50_f = ls_skat-txt50.
      ELSE.
        gs_acclist-txt20_f = gs_acclist-txt50_f = 'No french text'.
      ENDIF.

 *   Repeat for addt'l languages...
      APPEND gs_acclist TO git_acclist.
    ENDSELECT.
  ENDSELECT.

ENDFORM.                    " READ_GLMASTER_RECORDS

*&---------------------------------------------------------------------*
*&      Form  DISPLAY_ALV
*&---------------------------------------------------------------------*
*       Give internal table as ALV
*----------------------------------------------------------------------*
FORM display_alv .

* Feldkatalog fuellen.
  PERFORM feldkatalog_fuellen.
* Layout bestimmen.
  PERFORM layout_allg_build USING gs_layout.

  g_repid = sy-repid.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program      = g_repid
      i_callback_user_command = 'HANDLE_DOUBLE_CLICK'
*     i_grid_title            = sy-title
      i_save                  = 'U'
      it_fieldcat             = git_fieldcat
      is_layout               = gs_layout
    TABLES
      t_outtab                = git_acclist.
  IF sy-subrc <> 0.
    MESSAGE e600(fr) WITH 'Error in ALV generation'.
  ENDIF.


ENDFORM.                    " DISPLAY_ALV

*---------------------------------------------------------------------
* Unterprogramm fuer Reaktion auf Doppelklick
*---------------------------------------------------------------------
FORM handle_double_click USING i_ucomm
    i_selfield TYPE slis_selfield.

  CASE i_ucomm.
    WHEN '&IC1'. "bei Doppelklick
      READ TABLE git_acclist INTO wa_aktuelle_zeile
        INDEX i_selfield-tabindex.
      PERFORM maintain_glaccount USING wa_aktuelle_zeile-bukrs
                                       wa_aktuelle_zeile-saknr.
  ENDCASE.
ENDFORM.  "REAKTION_AUF_DOPPELKLICK

*---------------------------------------------------------------------
* Unterprogramm fuer Layoutangaben
*---------------------------------------------------------------------
FORM layout_allg_build USING ls_layout TYPE slis_layout_alv.
  ls_layout-zebra  = 'X'.
  ls_layout-colwidth_optimize = 'X'.
ENDFORM.  "layout_allg_build.


*---------------------------------------------------------------------
*  Unterprogramm fuer das Fuellen des Feldkatalogs
*---------------------------------------------------------------------
FORM feldkatalog_fuellen.

  DATA: ls_dfies TYPE dfies.

  CLEAR git_fieldcat.

  DEFINE add_field_2_cat.
    clear wa_feldkatalog.
    wa_feldkatalog-fieldname  = &1.
    wa_feldkatalog-ref_fieldname  = &3.
    wa_feldkatalog-ref_tabname  = &2.
    append wa_feldkatalog to git_fieldcat.
  END-OF-DEFINITION.

  add_field_2_cat:
    'KTOPL' 'SKA1' 'KTOPL',
    'SAKNR' 'SKA1' 'SAKNR',
    'BILKT' 'SKA1' 'BILKT',
    'BUKRS' 'SKB1' 'BUKRS',
    'ALTKT' 'SKB1' 'ALTKT',
    'TXT20_E' 'SKAT' 'TXT20',
    'TXT50_E' 'SKAT' 'TXT50',
    'TXT20_D' 'SKAT' 'TXT20',
    'TXT50_D' 'SKAT' 'TXT50',
    'TXT20_F' 'SKAT' 'TXT20',
    'TXT50_F' 'SKAT' 'TXT50',

 *     add your addt'l text fields here
    'KTOKS' 'SKA1' 'KTOKS',
    'XBILK' 'SKA1' 'XBILK',
    'MWSKZ' 'SKB1' 'MWSKZ',
    'MITKZ' 'SKB1' 'MITKZ',
    'XOPVW' 'SKB1' 'XOPVW',
    'XMWNO' 'SKB1' 'XMWNO',
    'FSTAG' 'SKB1' 'FSTAG'.

* add your addt'l field here...

ENDFORM.  "feldkatalog_fuellen.

*&---------------------------------------------------------------------*
*&      Form  MAINTAIN_GLACCOUNT
*&---------------------------------------------------------------------*
*       Maintain GL Acct (CALL TRANSACTION)
*----------------------------------------------------------------------*
*      -->P_BUKRS  Company Code
*      -->P_SAKNR  G/L AccountNo
*----------------------------------------------------------------------*
FORM maintain_glaccount  USING    p_bukrs TYPE bukrs
                                  p_saknr TYPE saknr.

* NOTE: doesn't work when tree-display is activated

  SET PARAMETER ID 'BUK' FIELD p_bukrs.
  SET PARAMETER ID 'SAK' FIELD p_saknr.
  CALL TRANSACTION 'FS00' AND SKIP FIRST SCREEN.

ENDFORM.                    " MAINTAIN_GLACCOUNT

Kommentare

Programmierer-Merkblatt SAP-Konsolidierung (EC-CS)

Veröffentlicht am 17. Februar 2011 von sapmandoo in EC-CS, SAP Reports

Programmierer-Merkblatt SAP-Konsolidierung (EC-CS).

 

 

 

Häufig benötigte Tabellen:

Name

Beschreibung

ECMCT

Summensätze

ECMCA

Einzelposten

TF100

TF101

Stammdaten Konsolidierungspositionen + Texte

TF115

TF116

Unterpositionen + Texte

TF160

TF161

TF16*

Konsolidierungseinheiten + Texte

Jahres- und versionsabhängige Daten

TF180

TF181 ff.

Konsolidierungskreise+ Texte

TF189

Zuordnung Konsolidierungseinheiten zu Kons.Kreisen

TF200 ff

Versionen

TFIN010

Integrationstabelle FI « EC-CS (Buchungskreis – Gesellschaft FI – Kons.Einheit EC-CS)

GLT3

Konsolidierungsvorbereitungsledger (Fortschreibung aus FI)

 

 

 

 

 

 

 

 

 

 

 

 

 

Nützliche Funktionsbausteine:

Name

Beschreibung

FC_GLOBAL_PARAMETERS_IMPORT

Einlesen der globalen Parameter in eigene Felder

FC_CONGR_DISMANTLE

Konsolidierungskreis in die enthaltenen Konsolidierungseinheiten auflösen (Aufruf siehe Musterprogramm)

FC_GET_ITEM_HRCHY

Positionshierarchie flach auflösen (siehe Musterprogramm)

FC_TOTALS_SELECT

Nachlesen der Summensätze (ECMCT) in eine bel. Interne Tabelle unter Verwendung von bel. Selektionskriterien

FC_AUTHORITY_CHECK

Berechtigungsprüfungen aller relevanten Konsol.Objekte

FC_ITCLG_IMPORT

Einlesen Positionshierarchie (z.B. für ALV Tree Control)

 

 

 

 

 

 

 

Typgruppen (Type-Pools):

Name

Beschreibung

FC01

Strukturen und Tabellentypen für die EC-CS Tabellen

FC02

Typen für Status, Versionen, Abschlußarten

 

 

 

Nachrichtenklassen:

Name

Beschreibung

G0, G00, G01, GK

Nachrichten der SAP-Konsolidierung

 

 

 

 

 

Programmvorlagen

Name

Beschreibung

ZDEMOECCS

Musterprogramm für häufig verwendete EC-CS Tabellen, FuBa’s etc.

 

 
   
   

 

Quelltext ZDEMOECCS

 

*&---------------------------------------------------------------------*
*& Report  ZDEMOECCS                                                   *
*&                                                                     *
*&---------------------------------------------------------------------*
*& Demoprogramm für häufig benötigte Tabellen und FuBas im EC-CS       *
*&                                                                     *
*&---------------------------------------------------------------------*

REPORT  zdemoeccs.


*&---------------------------------------------------------------------*
TABLES: ecmct,                         "Summensätze EC-CS
        tf100,                         "Stammdaten Position
        tf101,                         "Positionstexte
        tf181.                         "Texte Kons.Kreise

*&---------------------------------------------------------------------*
TYPE-POOLS: fc01.

*&---------------------------------------------------------------------*
DATA ld_dimen TYPE  fc_dimen.
DATA ld_congr TYPE  fc_congr.
DATA ld_bunit TYPE  fc_bunit.
DATA ld_itclg TYPE  fc_itclg.
DATA ld_rldnr TYPE  fc_rldnr.
DATA ld_rvers TYPE  fc_rvers.
DATA ld_ryear TYPE  fc_ryear.
DATA ld_perid TYPE  fc_perid.

DATA: i_tf160 TYPE fc01_t_tf160.
DATA: i_tf161 TYPE fc01_t_tf161.

DATA: wa_tf160 TYPE fc01_s_tf160.
DATA: wa_tf161 TYPE fc01_s_tf161.

DATA: lt_item_hrchy LIKE fc03itab03 OCCURS 0 WITH HEADER LINE.

DATA: ecmct_saldo LIKE ecmct-kslvt.

*&---------------------------------------------------------------------*
PARAMETERS: pa_congr LIKE tf180-congr, "Konsolidierungskreis
            pa_itclg LIKE tf100-itclg, "Positionskatalog
            pa_sitem LIKE tf100-item,  "Summenposition
            pa_rvers LIKE tf200-rvers, "Version
            pa_ryear TYPE fc_ryear,    "Geschäftsjahr
            pa_perid TYPE fc_perid.    "Periode

*&---------------------------------------------------------------------*
INITIALIZATION.
*&---------------------------------------------------------------------*

* Selektionsbild mit globalen Parametern vorbelegen - immer cool!

  CALL FUNCTION 'FC_GLOBAL_PARAMETERS_IMPORT'
    IMPORTING
      i_dimen = ld_dimen
      i_itclg = ld_itclg
      i_rldnr = ld_rldnr
      i_rvers = ld_rvers
      i_ryear = ld_ryear
      i_perid = ld_perid.

  pa_itclg = ld_itclg.
  pa_rvers = ld_rvers.
  pa_ryear = ld_ryear.
  pa_perid = ld_perid.


*&---------------------------------------------------------------------*
AT SELECTION-SCREEN.
*&---------------------------------------------------------------------*

* Prüfen, ob im Parameter "Summenposition" auch wirklich eine
* gültige Summenposition eingegeben wurde...

  IF NOT pa_sitem IS INITIAL.
    SELECT SINGLE * FROM  tf100        "Stammdaten zur Pos. lesen
           WHERE  itclg  = pa_itclg
           AND    item   = pa_sitem.
    IF sy-subrc NE 0.
      MESSAGE e111(gk) WITH pa_sitem.  "Position gibt's nicht
    ELSE.
*     TF100-ITCGY = Positionsart  1 = Wertpos., 2 = Summenpos.
      IF tf100-itcgy NE '2'.           "Keine Summenpos.
        MESSAGE e195(g00) WITH pa_sitem pa_itclg.
      ENDIF.
    ENDIF.

  ENDIF.


* Berechtigungsprüfung - hier können alle möglichen Felder
* abgefragt werden

* Bspw. Positionsplan
  CALL FUNCTION 'FC_AUTHORITY_CHECK'
    EXPORTING
      e_id                    = 'ITCLG'
*     E_DIMEN                 = ''
*     E_CONGR                 = ''
*     E_BUNIT                 = ''
*     E_RVERS                 = ''
*     E_CACTT                 = ''
*     E_CACTI                 = ''
*     E_ACTVT                 = '03'   "Anzeigeberechtigung
      e_itclg                 = pa_itclg
*     E_FIELD                 = ''
*     ET_BUNIT                =
*     ET_RA_BUNIT             =
*   IMPORTING
*     I_RETURNCODE            =
*   EXCEPTIONS
*     EXC_NO_PERMISSION       = 1
*     EXC_WRONG_USAGE         = 2
*     OTHERS                  = 3
            .
  IF sy-subrc <> 0.
*   Keine Berechtigung für ...
    MESSAGE e051(gk) WITH 'Anzeigen' 'Positionsplan' pa_itclg.
  ENDIF.


*&---------------------------------------------------------------------*
START-OF-SELECTION.
*&---------------------------------------------------------------------*

* Konsolidierungskreis in seine Bestandteile (sprich: Kons.Einheiten)
* zerlegen.

  CALL FUNCTION 'FC_CONGR_DISMANTLE'
    EXPORTING
      e_dimen  = ld_dimen
      e_congr  = pa_congr
      e_rvers  = ld_rvers
      e_ryear  = ld_ryear
      e_perid  = ld_perid
      e_tf160  = 'X'
      e_tf161  = 'X'
    IMPORTING
      it_tf160 = i_tf160               "Tabelle mit den Kons.Einheiten
      it_tf161 = i_tf161.              " + Texte gleich dazu !!


* Positionshierarchie erstmal komplett einlesen

  CALL FUNCTION 'FC_GET_ITEM_HRCHY'
    EXPORTING
      e_itclg            = pa_itclg
      e_complete         = 'X'         "X = alles auflösen,
                                       "space = nur bis zur nächsten
                                       "Hierarchiestufe
    TABLES
      t_item_hrchy       = lt_item_hrchy.

* Dann Nur die Positionen übrig lassen, die zur eingegebenen
* Summenposition gehören
  DELETE lt_item_hrchy WHERE sumitem NE pa_sitem.

* Ausgabe Konsolidierungseinheiten

  SELECT SINGLE * FROM  tf181          "Text zum Kons.Kreis holen
         WHERE  langu  = sy-langu      "Hätte man sich auch vom FB
         AND    dimen  = ld_dimen      "FC_CONGR_DISMANTLE
         AND    congr  = pa_congr.     "besorgen lassen können

  WRITE: / 'Zum Konsolidierungskreis',
           pa_congr,
           tf181-txtmi,
           'gehören folgende Einheiten:'.

  LOOP AT i_tf161 INTO wa_tf161.
    WRITE: / wa_tf161-bunit,
             wa_tf161-txtmi.           "Mitteltext
  ENDLOOP.


  SKIP 2.


* Ausgabe Positionen

  SELECT SINGLE * FROM  tf101
         WHERE  langu  = sy-langu
         AND    itclg  = pa_itclg
         AND    item   = pa_sitem.

  WRITE: / 'Zur Summenposition',
           pa_sitem,
           tf101-txtmi,
           'gehören folgende Wertpositionen:'.

  LOOP AT lt_item_hrchy.
    SELECT SINGLE * FROM  tf101
       WHERE  langu  = sy-langu
       AND    itclg  = pa_itclg
       AND    item   = lt_item_hrchy-item.
    WRITE: / lt_item_hrchy-item,
             tf101-txtmi.
  ENDLOOP.


* Nachlesen und Ausgabe Saldo

  NEW-PAGE.
  WRITE: / 'Zu den selektierten Kons.Einheiten und Positionen',
         / 'sind folgende Summensätze vorhanden:'.
  SKIP 3.

* Geht auch mit FuBa FC_TOTALS_SELECT
* Aufrufbeispiel siehe FB-Doku und Report FICLST00
* Hier mal eine händische Selektion...

  SELECT * FROM  ecmct
    FOR ALL ENTRIES IN lt_item_hrchy
             WHERE ritem = lt_item_hrchy-item
               AND rldnr   = ld_rldnr
               AND rrcty   = '0'
               AND rvers   = pa_rvers
               AND ryear   = pa_ryear
               AND rdimen  = ld_dimen
               AND ritclg  = pa_itclg.

*   Nachgucken, ob die Kons.Einheit angefordert wurde...
    READ TABLE i_tf160 WITH KEY bunit = ecmct-rbunit
         TRANSPORTING NO FIELDS.
    CHECK sy-subrc = 0.

*   Addition der Werte in Konzernwährung (KSLxx)
    ADD ecmct-ksl01 FROM 1 TO pa_perid GIVING ecmct_saldo.

    WRITE: / ecmct-rldnr,
             ecmct-rvers,
             ecmct-ryear,
             ecmct-rdimen,
             ecmct-rbunit,
             ecmct-ritclg,
             ecmct-ritem,
             ecmct-plevl,
             ecmct_saldo.


  ENDSELECT.

Kommentare

Erstellen einer SD-Faktura mithilfe der allg. Fakturaschnittstelle

Veröffentlicht am 17. Februar 2011 von sapmandoo in SAP Reports

Das nachfolgende Coding ist ein Aufruf der allg. Fakturaschnittstelle. Hieraus lassen sich alle Felder entnehmen, die zur Erzeugung einer SD-Faktura über den FuBa GN_INVOICE_CREATE erforderlich sind.

 

*&---------------------------------------------------------------------*
*& Report  YTESTINVOICE
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

report  ytestinvoice message-id vf.
tables: komfkgn, komv, vbsk, rv50s, tvsa.

parameters: e_vbeln like likp-vbeln obligatory.
type-pools: slis.

constants:  gc_probclass  type char01 value '4', "Problem class
            gc_info       type char01 value 'I'. "Message : Information

data: gs_display_profile type bal_s_prof,"Application Log: Log Output
                                         "Format Profile
      gs_log_handle type balloghndl,"Application Log: Log handle
      gs_log        type bal_s_log. "Application Log: Log header data
data: gv_free_text             type text132,  "Report title
      gv_count(4) type c.

* ----------  Tabellen der GN_INVOICE_CREATE-Schnittstelle,  -------
* ------------- die an die Schnittstelle übergeben werden ----------
data: begin of xkomfkgn occurs 2.
        include structure komfkgn.
data: end of xkomfkgn.

data: begin of xkomfkko occurs 2.
        include structure komv.
data: end of xkomfkko.

data: begin of xkomfktx occurs 50.
        include structure komfktx.
data: end   of xkomfktx.


* ----------  Tabellen der GN_INVOICE_CREATE-Schnittstelle,  -------
* ------------- die von der Schnittstelle gefüllt werden -----------
data: begin of xkomfk occurs 2.
        include structure komfk.
data: end of xkomfk.

data: begin of xkomv occurs 50.
        include structure komv.
data: end   of xkomv.

data: begin of xthead occurs 50.    "aktueller Tabellenstand
        include structure thead.
data:  txpfl  like ttxern-txpfl.
data:  tdtext like ttxit-tdtext.
data:  lfdtx  like ttxern-lfdtx.
data:  updkz.
data: end of xthead.

data: begin of xvbfs occurs 20.
        include structure vbfs.
data: end of xvbfs.

data: begin of xvbpa occurs 5.
        include structure vbpavb.
data: end of xvbpa.

data: begin of xvbrk occurs 10.
        include structure vbrkvb.
data: end of xvbrk.

data: begin of xvbrp occurs 100.
        include structure vbrpvb.
data: end of xvbrp.

data: begin of xvbss occurs 10.
        include structure vbss.
data: end of xvbss.
* ---------------------------------------------------------------------

* Tabelle der Belegunvollständigkeiten: neuer Stand
data:    begin of xvbuv occurs 9.
        include structure vbuv.
data:      updkz(1) type c.
data:    end of xvbuv.
* Aktueller Tabellenstand

data:    begin of xvbadr occurs 5.
        include structure sadrvb.
data:    end of xvbadr.

data: xvbfs_count(2) type p.
data: xvbss_count(2) type p.

data:    sammelgangsart      type c value 'F'.   "Sammelgangstyp

refresh xkomfkgn.
clear xkomfkgn.


* --- Muß-Felder der Fakturaschnittstellenstruktur XKOMFKGN füllen ----
* --------- Kundenstamm und Materialstamm wird gelesen ----------------
* 1. Satz
xkomfkgn-mandt   =  sy-mandt.            "Mandant
xkomfkgn-auart   =  'TA'.                "Verkaufsbelegart
xkomfkgn-vkorg   =  '1102'.              "Verkaufsorganisation
xkomfkgn-vtweg   =  '50'.                "Vertriebsweg
xkomfkgn-spart   =  '00'.                "Sparte
xkomfkgn-fkdat   =  sy-datum.            "Fakturadatum
xkomfkgn-kunag   =  '0080001101'.        "Auftraggeber
xkomfkgn-matnr   =  '000000000000000103'.            "Materialnummer
xkomfkgn-pstyv   =  'DLN'.               "Positionstyp Vertr.beleg
xkomfkgn-kwmeng  =  1.                 "Auftragsmenge
xkomfkgn-land1   =  'CH'.              "Werk
xkomfkgn-vgbel   =  e_vbeln.             "Bel.nummer des Vorg.belegs
xkomfkgn-vgpos   =  10.                  "Vertriebsbelegtyp
xkomfkgn-fkara   =  'FX'.                "Vorschlag Fakturaart
* nur Muß-Felder wenn kein Kundenstamm lesen
* XKOMFKGN-NO_KNA1 =  'X'.                 "kein Kundenstamm lesen
* XKOMFKGN-land1   =  'DE'.                "Land Warenempfänger
* XKOMFKGN-TAXK1   =  '1'.                 "St.klassifikation 1 Kunde
* nur Muß-Felder wenn kein Materialstamm lesen
xkomfkgn-no_mara =  'X'.                 "kein Materialstamm lesen
xkomfkgn-taxm1   =  '1'.                 "St.klassifikation 1 Material
xkomfkgn-arktx   =  'Testmaterial 1'.    "Kurztext Material
xkomfkgn-vrkme   =  'ST'.                "Verk.mengeneinheit
xkomfkgn-waerk   =  'CHF' .              "Währung
xkomfkgn-ktgrm   = '55'.
append xkomfkgn.



clear xkomfkko.
xkomfkko-mandt   =  sy-mandt.            "Mandant
xkomfkko-knumv   =  xkomfkgn-vgbel.      "Bel.nummer des Vorg.belegs
xkomfkko-kposn   =  xkomfkgn-vgpos.      "Vertriebsbelegtyp
xkomfkko-kschl   =  'PR00'.           "Konditionsart
xkomfkko-kbetr   =  400.                 "Betrag
append xkomfkko.

* Positionstexte
clear xkomfktx.
xkomfktx-mandt      =  sy-mandt.
xkomfktx-vgbel      =  xkomfkgn-vgbel.
xkomfktx-vgpos      =  xkomfkgn-vgpos.
xkomfktx-tdobject   =  'VBBP'.
xkomfktx-tdid       =  '0001'.
xkomfktx-tdspras    =  sy-langu.
xkomfktx-tdformat   =  '*'.
xkomfktx-tdline     =  'Das ist ein Pos.Text'.
append xkomfktx.


* --- Muß-Felder der Fakturaschnittstellenstruktur XKOMFKGN füllen ----
* ----- Kundenstamm und Materialstamm wird nicht gelesen --------------
** 2. Satz
*CLEAR xkomfkgn.
*xkomfkgn-mandt   =  sy-mandt.            "Mandant
*xkomfkgn-auart   =  'TA'.                "Verkaufsbelegart
*xkomfkgn-vkorg   =  '1102'.              "Verkaufsorganisation
*xkomfkgn-vtweg   =  '50'.                "Vertriebsweg
*xkomfkgn-spart   =  '00'.                "Sparte
*xkomfkgn-fkdat   =  sy-datum.            "Fakturadatum
*xkomfkgn-kunag   =  '0080001101'.        "Auftraggeber
*xkomfkgn-matnr   =  '000000000000000103'.            "Materialnummer
*xkomfkgn-pstyv   =  'DLN'.               "Positionstyp Vertr.beleg
*xkomfkgn-kwmeng  =  1.                 "Auftragsmenge
*xkomfkgn-land1   =  'DE'.              "Werk
*xkomfkgn-vgbel   =  e_vbeln.             "Bel.nummer des Vorg.belegs
*xkomfkgn-vgpos   =  20.                  "Vertriebsbelegtyp
*xkomfkgn-fkara   =  'FX'.                "Vorschlag Fakturaart
*
**xkomfkgn-no_kna1 =  'X'.                 "kein Kundenstamm lesen
**xkomfkgn-kunwe   =  '0000000119'.        "Warenempfänger
**xkomfkgn-kunrg   =  '0000000119'.        "Regulierer
**xkomfkgn-land1   =  'DE'.                "Empfangsland des WE
**xkomfkgn-taxk1   =  '1'.                 "St.klassifikation 1 Kunde
**
*xkomfkgn-no_mara =  'X'.                 "kein Materialstamm lesen
*xkomfkgn-taxm1   =  '1'.                 "St.klassifikation 1 Material
*xkomfkgn-arktx   =  'Testmaterial 2'.    "Kurztext Material
*xkomfkgn-vrkme   =  'ST'.                "Verk.mengeneinheit
*xkomfkgn-waerk   =  'EUR'  .             "Währung
*xkomfkgn-ktgrm   = '55'.
*APPEND xkomfkgn.
*

*CLEAR xkomfkko.
*xkomfkko-mandt = sy-mandt.               "Mandant
*xkomfkko-knumv = xkomfkgn-vgbel.         "Bel.nummer des Vorg.belegs
*xkomfkko-kposn = xkomfkgn-vgpos.         "Vertriebsbelegtyp
*xkomfkko-kschl = 'PR00'.              "Konditionsart
*xkomfkko-kbetr = 200.                   "Betrag
*APPEND xkomfkko.

* Füllen Sammelgangsverwaltungssatz
clear vbsk.
vbsk-mandt = sy-mandt.                   "Mandant
vbsk-ernam = sy-uname.                   "Name des Sachbearbeiters
vbsk-erdat = sy-datum.                   "Datum des Hinzufügens
vbsk-uzeit = sy-uzeit.                   "Uhrzeit -"-
vbsk-smart = 'F'.                        "Gruppenart
vbsk-sammg = space.                      "Gruppennummer

*---------------------------------------------------------------------*
*       Ermitteln Sammelgangsnummer                                   *
*---------------------------------------------------------------------*
* Sammelgangsnummer, unter der das Protokoll für den Fakturalauf      *
* abgespeichert ist                                                   *
*---------------------------------------------------------------------*
check rv50s-sammg is initial.
select single * from tvsa where smart = 'F'.
if sy-subrc = 0.
  call function 'NUMBER_GET_NEXT'
    exporting
      nr_range_nr = tvsa-numki
      object      = 'RV_SAMMG'
    importing
      number      = rv50s-sammg.
else.
  message e417 with sammelgangsart.
endif.
*
vbsk-sammg = rv50s-sammg.
*

* Kopftext
clear xkomfktx.
xkomfktx-mandt      =  sy-mandt.
xkomfktx-vgbel      =  xkomfkgn-vgbel.
xkomfktx-tdobject   =  'VBBK'.
xkomfktx-tdid       =  '0002'.
xkomfktx-tdspras    =  sy-langu.
xkomfktx-tdformat   =  '*'.
xkomfktx-tdline     =  'Das ist ein Kopftext'.
append xkomfktx.

*break xrohde.
* ----------- Aufruf der Faktura über allg. Fakturaschnittstelle ------
call function 'GN_INVOICE_CREATE'
     exporting
*         DELIVERY_DATE = SY-DATUM
*         INVOICE_DATE  = SY-DATUM
*         INVOICE_TYPE  = LIKP-FKARV
*         PRICING_DATE  = SY-DATUM
          vbsk_i        = vbsk
          with_posting  = 'B'
          id_no_dialog  = 'X'
     importing
          vbsk_e   = vbsk
     tables
          xkomfkgn = xkomfkgn
          xkomfkko = xkomfkko
          xkomfktx = xkomfktx
          xkomfk   = xkomfk
          xkomv    = xkomv
          xthead   = xthead
          xvbfs    = xvbfs
          xvbpa    = xvbpa
          xvbrk    = xvbrk
          xvbrp    = xvbrp
          xvbss    = xvbss.
*

describe table xvbfs lines xvbfs_count.
describe table xvbss lines xvbss_count.

perform create_log using gs_log
                   changing gs_log_handle.
concatenate text-001 vbsk-sammg into gv_free_text separated by space.
perform add_free_text_message using gv_free_text.

write xvbfs_count to gv_count.
concatenate text-002  gv_count into gv_free_text separated by space.
perform add_free_text_message using gv_free_text.

write xvbss_count to gv_count.
concatenate text-003  gv_count into gv_free_text separated by space.
perform add_free_text_message using gv_free_text.

perform log_create_profile changing gs_display_profile.
perform log_show           using gs_display_profile.

*&---------------------------------------------------------------------*
*&      Form  create_log
*&---------------------------------------------------------------------*
*       create Handle for Log
*----------------------------------------------------------------------*
*        -->us_log                 Log header data
*        <--xs_log_handle          Log Output Format Profile
*----------------------------------------------------------------------*
form create_log using      is_log         type bal_s_log
                changing   xs_log_handle  type balloghndl.

  call function 'BAL_LOG_CREATE'
    exporting
      i_s_log                 = is_log
    importing
      e_log_handle            = xs_log_handle
    exceptions
      log_header_inconsistent = 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.                    " log_create
*&---------------------------------------------------------------------*
*&      Form  add_free_text_message
*&---------------------------------------------------------------------*
*       this subroutine adds Free text to the log using
*       FM 'BAL_LOG_MSG_ADD_FREE_TEXT'
*----------------------------------------------------------------------*
*      -->IV_TEXT  message text
*----------------------------------------------------------------------*
form add_free_text_message  using    iv_text.               "#EC *
  call function 'BAL_LOG_MSG_ADD_FREE_TEXT'
    exporting
      i_log_handle     = gs_log_handle
      i_msgty          = gc_info
      i_probclass      = gc_probclass
      i_text           = iv_text
    exceptions
      log_not_found    = 1
      msg_inconsistent = 2
      log_is_full      = 3
      others           = 4.
  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.                    " add_free_text_message
*&---------------------------------------------------------------------*
*&      Form  log_create_profile
*&---------------------------------------------------------------------*
*       create a self defined profile
*----------------------------------------------------------------------*
*       <-->XS_DISPLAY_PROFILE  Log Output Format Profile
*----------------------------------------------------------------------*
form log_create_profile changing xs_display_profile type bal_s_prof.

  call function 'BAL_DSP_PROFILE_NO_TREE_GET'
    importing
      e_s_display_profile = xs_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.

* use grid for display if wanted
  xs_display_profile-use_grid = 'X'.
*  xs_display_profile-no_toolbar = 'X'.

endform.                    " log_create_profile
*&---------------------------------------------------------------------*
*&      Form  log_show
*&---------------------------------------------------------------------*
*       display the LOG messages
*----------------------------------------------------------------------*
*      -->is_display_profile  Profile structure
*----------------------------------------------------------------------*
form log_show using is_display_profile type bal_s_prof.

  data: lv_log_handle  type  bal_t_logh.

* Handle
  append gs_log_handle to lv_log_handle.

  if sy-batch ne 'X'.
* call display function module
    call function 'BAL_DSP_LOG_DISPLAY'
      exporting
        i_s_display_profile = is_display_profile
        i_t_log_handle      = lv_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.
  else.
* call print function module
    call function 'BAL_DSP_LOG_PRINT'
      exporting
        i_s_display_profile  = is_display_profile
        i_t_log_handle       = lv_log_handle
      exceptions
        profile_inconsistent = 1
        internal_error       = 2
        no_data_available    = 3
        no_authority         = 4
        others               = 5.
    if sy-subrc <> 0.                                       "#EC *
      message id sy-msgid type sy-msgty number sy-msgno
               with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    endif.
  endif.
endform.                    " log_show

Kommentare
1 2 > >>