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

Posts mit #sap reports tag

Erweiterung von Report Painter / -Writer Berichten

21. Februar 2012 , Geschrieben von sapmandoo Veröffentlicht 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.

Weiterlesen

Sachkontenverzeichnis im ALV mit mehrspachigen Texten

17. Februar 2011 , Geschrieben von sapmandoo Veröffentlicht 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

Weiterlesen

Programmierer-Merkblatt SAP-Konsolidierung (EC-CS)

17. Februar 2011 , Geschrieben von sapmandoo Veröffentlicht 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.

Weiterlesen

Erstellen einer SD-Faktura mithilfe der allg. Fakturaschnittstelle

17. Februar 2011 , Geschrieben von sapmandoo Veröffentlicht 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

Weiterlesen

MM-Periodenverschieber für mehrere Buchungskreise/Perioden auf einmal

17. Februar 2011 , Geschrieben von sapmandoo Veröffentlicht in #SAP Reports

Kurztext

Aufrufrahmenprogramm f. MM-Periodenverschieber MMPV

Verwendung

Der vorliegende Report ruft den MM-Periodenverschieber (MMPV) für eine vorgegebene Anzahl von Buchungskreisen und Perioden auf.

Funktionsumfang

Die zu verschiebenden Perioden werden dabei dynamisch aus dem vorgegebenen, gewünschten Buchungsdatum und der aktuell laufenden MM-Periode des jeweiligen Buchungskreises ermittelt (Tab. MARV).

Selektion

Die Eingaben des Reports sind dabei weitestgehehd identisch mit denen des Reports RMMMPERI (Transaktion MMPV). Zusätzlich kann der Parameter 'Testlauf' gesetzt werden. Hierbei wird keine Periodenverschiebung vorgenommen, sondern lediglich eine Liste der betreffenden Buchungskreise mit den jeweiligen aktuellen MM-Perioden und der gewünschten Periode ausgegeben.

 

 

Selektionsbild

 

image001-Kopie-1.png

 

Textelemente:

 

Selektionstexte:

I_BBUKR       Bis Buchungskreis

I_DATUM       gewünschtes Buchungsdatum

I_LFGJA        gewünschte Periode (Jahr)

I_LFMON       gewünschte Periode (Monat)

I_VBUKR       Von Buchungskreis

I_XCOMP      Prüfen und verschieben

I_XINCO        Nur prüfen/nicht versch.

I_XMOVE      Verschieben ohne prüfen

I_XNEGQ      Negative Mengen in Vorperiode

I_XNEGV       Negative Werte in Vorperiode e

PA_TEST      Testlauf

 

 

Spaltenüberschrift

Bukr Name                      akt.Per LETZTER VERSCHIEBER     gewün.

                               Jahr MM Benutzer     am         Periode

 

Quelltext:

 

*&---------------------------------------------------------------------*

*& Report  YYMMPV

*&

*&---------------------------------------------------------------------*

*& Periodenverschieber MM für mehrere Perioden und Buchungskreise

*& aufrufen

*&---------------------------------------------------------------------*

 

report  yymmpv.

tables: marv, t001.

data: list_tab type table of abaplist.    "MMPV-Protokoll

 

* Tabelle mit Buchungskreisen und zu verschiebenden Perioden

data: begin of buktab occurs 0,

        bukrs type bukrs,

        lfmon type rm03q-nperi,

        lfgja type rm03q-lfgja,

        bimon type rm03q-nperi,

        bigja type rm03q-lfgja,

      end of buktab.

 

*&---------------------------------------------------------------------*

* S E L E C T I O N _ S C R E E N

*&---------------------------------------------------------------------*

parameters: i_vbukr like rm03q-vbukr obligatory,

            i_bbukr like rm03q-bbukr.

selection-screen skip 1.

parameters: i_datum like rm03q-datum obligatory.

selection-screen skip 1.

data:     : i_kzinv like rm03q-kzinv value space.           "ch zu 4.0

 

* Ab 3.0F kann der Periodenverschieber ohne Ermittlung der Schiefstände

* oder nur zum ermitteln der Schiefstände ausgeführt werden    /ch

selection-screen skip 1.

parameters: i_xcomp like rm03q-xcomp radiobutton group rg1

                                     default 'X',

            i_xinco like rm03q-xinco radiobutton group rg1,

            i_xmove like rm03q-xmove radiobutton group rg1.

selection-screen skip 1.

parameters: i_xnegq like rm03q-xnegq.

parameters: i_xnegv like rm03q-xnegv.

selection-screen skip 1.

parameters: pa_test as checkbox default 'X'.

*&---------------------------------------------------------------------*

 

 

* Initialisierung

perform pruefen_initialisierung.

if pa_test = 'X'. exit. endif.

perform buktab_aufbauen.

 

* Verschiebung durchführen

loop at buktab.

  perform submit_mmpv.

endloop.

 

 

*&---------------------------------------------------------------------*

*&      Form  PRUEFEN_INITIALISIERUNG

*&---------------------------------------------------------------------*

*       Buchungskreise prüfen und Verarb.tabellen initialisieren

*----------------------------------------------------------------------*

form pruefen_initialisierung .

 

  data:  begin of int_pper occurs 2.        "Buchhaltungsperioden

          include structure pper.

  data:  end of int_pper.

 

* Kein Bis-Bukreis angegeben: dann von = bis

  if i_bbukr is initial.

    i_bbukr = i_vbukr.

  endif.

 

  select * from t001 where bukrs between i_vbukr and i_bbukr.

*   Periode aus gewünschtem Buchungsdatum holen

    call function 'PROGNOSEPERIODEN_ERMITTELN'

      exporting

        eanzpr              = 1

        edatum              = i_datum

        eperiv              = t001-periv

      tables

        pperx               = int_pper

      exceptions

        t009b_fehlerhaft    = 01

        t009_nicht_gefunden = 02.

    if sy-subrc = 0.

      read table int_pper index 1.

      move int_pper-prper(4) to buktab-bigja.

      move int_pper-prper+4(2) to buktab-bimon.

    else.

      format color col_negative intensified off.

      write: / 'Für Buchungskreis', t001-bukrs,

               'konnte keine Periode ermittelt werden'.

 

    endif.

*   Laufende Periode (MM) besorgen und pro Buchungskreis

*   abspeichern

    select single * from marv where bukrs = t001-bukrs.

    if sy-subrc = 0.

      format color col_normal intensified off.

      write: / marv-bukrs,

               t001-butxt,

               marv-lfgja,

               marv-lfmon,

               marv-aenam,

               marv-laeda,

               buktab-bimon,

               buktab-bigja,

               marv-kzinv.

      move-corresponding marv to buktab.

      append buktab.

    else.

      format color col_negative intensified off.

      write: / 'Kein MARV-Satz für Buchungskreis', t001-bukrs,

               'vorhanden'.

    endif.

  endselect.

 

* In Buktab steht jetzt pro Buchungskreis die laufende MM-Periode

* und in Abhängigkeit der Geschäftjahresvariante die gewünschte

* Periode drin.

 

endform.                    " PRUEFEN_INITIALISIERUNG

 

*&---------------------------------------------------------------------*

*&      Form  BUKTAB_AUFBAUEN

*&---------------------------------------------------------------------*

*       Tab. m. Buchungskreisen und zu verschiebenden Perioden aufb.

*----------------------------------------------------------------------*

form buktab_aufbauen .

 

* lokale Kopie ziehen

  data: l_buktab like buktab occurs 0 with header line.

  l_buktab[] = buktab[].

  refresh buktab.

 

* BUKTAB um alle zu verschiebenen Perioden erweitern, die zwischen der

* laufenden MM-Periode und der gewünschten Periode liegen

  loop at l_buktab.

    do.

      if l_buktab-lfmon >= l_buktab-bimon and

         l_buktab-lfgja >= l_buktab-bigja.

        exit.

      endif.

      add 1 to l_buktab-lfmon.

      if l_buktab-lfmon gt 12.

        l_buktab-lfmon = 1.

        add 1 to l_buktab-lfgja.

      endif.

      append l_buktab to buktab.

    enddo.

  endloop.

 

endform.                    " BUKTAB_AUFBAUEN

 

*&---------------------------------------------------------------------*

*&      Form  submit_mmpv

*&---------------------------------------------------------------------*

*       Periodenverschieberreport aufrufen + Protokolle sammeln

*----------------------------------------------------------------------*

form submit_mmpv.

  submit rmmmperi and return exporting list to memory

          with i_bbukr = buktab-bukrs

      "   WITH i_datum = i_datum

          with i_lfgja = buktab-lfgja

          with i_lfmon = buktab-lfmon

          with i_vbukr = buktab-bukrs

          with i_xcomp = i_xcomp

          with i_xinco = i_xinco

          with i_xmove = i_xmove

          with i_xnegq = i_xnegq

          with i_xnegv = i_xnegv.

 

* Protokoll aus Memory holen

  call function 'LIST_FROM_MEMORY'

    tables

      listobject = list_tab

    exceptions

      not_found  = 1

      others     = 2.

 

*Ausgabe MMPV-Protokoll

  if sy-subrc = 0.

    call function 'WRITE_LIST'

      tables

        listobject = list_tab.

  endif.

 

endform.                    "submit_mmpv

Weiterlesen

Automatische Generierung von CO-Vorschlagskontierungen (OKB9)

17. Februar 2011 , Geschrieben von sapmandoo Veröffentlicht in #SAP Reports

Kurztext

Einträge f. Transaktion OKB9 generieren

Verwendung

Der Report generiert automatisch CO-Vorschlagskontierungen (OKB9) und stellt die Einträge auf Wunsch in einen Transportauftrag.

Funktionsumfang

Ab einer bestimmten Anzahl von Werken (bzw. Betrieben im IS-Retail) und Kostenarten, gestaltet sich die Pflege von werksabhängigen Vorschlagskontierungen in der Standardtransaktion OKB9 mitunter recht aufwändig, zumindest die 'Erstpflege'. Das vorliegende Programm erzeugt für eine vorgegebene Menge von Kostenarten und Werken automatisch Einträge in den entsprechenden Anwendungstabellen und erzeugt auf Wunsch auch gleich einen Transportauftrag, so dass die so generierten Einträge in die Folgesysteme transportiert werden können. Alternativ können Sie den Report auch in QS- bzw. Produktivsystemen laufen lassen, jedoch ist die Nutzung des Transportanschlusses die empfohlene Vorgehensweise.

Selektion

Objektabgrenzungen

Geben Sie die zu berücksichtigenden Kostenarten, Werke und ggf. Buchungskreise vor, für die Vorschlagskontierungen generiert werden sollen.

Kreuzen Sie bei Bedarf die Option 'Kostenarten aus MM-Kontenfindung'  an. Es werden in diesem Fall alle Kostenarten hinzugelesen, die in der MM-Kontenfindung zum Kontenplan des ausgewählten Kostenrechnungskreises hinterlegt sind.
Tipp: um nur diese MM-Kostenarten zu selektieren, geben Sie einfach im Selektionsparameter Kostenart einen nicht existenten Wert ein (z.B. XXXXXXXXX).

Steuerung der Kostenstellenfindung

Vielfach gilt in Unternehmen: Werk = Bewertungskreis = Kostenstelle. Wählen Sie in diesem Fall die Option 'Kostenstelle = Bewertungskreis' aus.

Andernfalls können Sie eine zweispaltige Umsetztabelle in Excel anlegen, die folgendem Aufbau genügen muss:

Werk 

Kostenstelle

4711

KST4711

4712

6969

...

...

Hinweis: Die Tabelle kann dabei unkonvertiert verwendet werden, d.h. ein vorheriges Abspeichern im .txt-Format o.ä. ist nicht erforderlich.

Sofern die Option 'nur Werke in Excel-Tab. berücksichtigen' ausgewählt wurde, werden nur die Werke betrachtet, zu denen entsprechende Einträge in der vorliegenden Excel-Tabelle hinterlegt sind, ungeachtet der Vorgaben im Bereich 'Objektabgrenzungen'.

Verarbeitungssteuerung

Hier können Sie u.a. festlegen, ob bereits vorhandene Einträge in der OKB9 ggf. überschrieben werden sollen. Verwenden Sie diese Option mit Vorsicht, da hierbei u.U. Tabellenschiefstände erzeugt werden können, insbesondere, wenn z.B. schon Geschäftsbereich- und/oder Profitcenterabhängige Einträge vorhanden sind.

Deaktivieren Sie die Option 'Testlauf', um die generierten Vorschlagskontierungen in die Tabellen zu schreiben. Jedoch sollten Sie zuvor einen Testlauf durchführen, um anhand des Protokolls die korrekte Arbeitsweise des Programms im Sinne der Anforderung zu überprüfen.

Wenn Sie den Transportanschluss nutzen möchten, aktivieren Sie im 'Echtlauf' zudem die Option 'Transportauftrag anlegen'. Sie werden in diesem Fall dazu aufgefordert, einen Customizingauftrag anzulegen bzw. einen bereits vorhandenen Auftrag auszuwählen.

Ausgabe

Die generierten (bzw. im Testlauf: zu generierenden) Einträge werden in übersichtlicher Form aufgelistet. Die Ausgabeliste ist dabei in bestimmten Grenzen konfigurierbar, d.h. es können bspw. Felder aus der Anzeige entfernt oder die Sortierung geändert werden. Zuvor werden etwaig aufgetretene Fehlersituationen in Form eines Fehlerprotokolls ausgegeben.

 

 

Selektionsbild:

image001

 

Texte:

image003.png

 

image005.png

   

Quelltext:

 

*&---------------------------------------------------------------------*
*& Report  YYOKB9
*&
*&---------------------------------------------------------------------*
*& Der Report generiert für eine Menge von Kostenarten und Werken/Betr.
*& Einträge zur automatisierten Kostenstellenfindung (TA OKB9)
*& Details s. Reportdokumentation
*&---------------------------------------------------------------------*

report  yyokb9.

type-pools: slis.

tables: t001w, cskb, tka3a, tka3c, tka02, t001k.
tables: t030.

ranges: gr_mmkoa for cskb-kstar.

data: begin of gt_xl occurs 0,
        werks type t001w-werks,
        kostl type kostl,
      end of gt_xl,

      gt_tka3a type table of tka3a,
      gt_tka3c type table of tka3c,
      gv_dummy,
      gv_message_occured,
      gv_repid type sy-repid value sy-repid.

selection-screen begin of block bl1 with frame title text-bl1.
parameters:     pa_kokrs type cskb-kokrs obligatory memory id cac.
select-options: so_bukrs for tka3a-bukrs.
select-options: so_kstar for cskb-kstar,
                so_katyp for cskb-katyp,
                so_werks for t001w-werks.
selection-screen skip.
parameters:     pa_mmkoa as checkbox default 'X'.
selection-screen end of block bl1.
selection-screen begin of block bl2 with frame title text-bl2.
parameters:
*               Kostenstelle = Bewertungskreis = Werk
                pa_xequa radiobutton group r1 default 'X'
                                     user-command r1,
*               Excel-Umsetztabelle verwenden
                pa_xexcl radiobutton group r1.
selection-screen begin of block bu2 with frame title text-bu2.
parameters:     pa_xhead as checkbox default 'X',
                pa_fnam  like rlgrap-filename.
parameters:     pa_xonly as checkbox default space.
selection-screen end of block bu2.
selection-screen end of block bl2.
selection-screen begin of block bl3 with frame title text-bl3.
parameters:     pa_xovwr as checkbox.
parameters:     pa_test  as checkbox default 'X'
                         user-command t1.
parameters:     pa_xtran as checkbox default ' '.
selection-screen end of block bl3.

* PBO Selection Screen
*&---------------------------------------------------------------------*
at selection-screen output.
*&---------------------------------------------------------------------*
  loop at screen.
    if screen-name = 'PA_XHEAD' or screen-name = 'PA_FNAM' or
       screen-name = 'PA_XONLY'.
      if pa_xexcl = 'X'.
        screen-input = '1'.
      else.
        screen-input = '0'.
      endif.
      modify screen.
    endif.
  endloop.

*&---------------------------------------------------------------------*
at selection-screen on value-request for pa_fnam.
*&---------------------------------------------------------------------*
  perform f4_excelfile.

*
*&---------------------------------------------------------------------*
start-of-selection.
*&---------------------------------------------------------------------*
  perform check_parameters.
  perform init_log.
  if pa_xexcl = 'X'.
    perform upload_table.
  endif.
  if pa_mmkoa = 'X'.
    perform read_mm_costelements.
  endif.

  perform generate_okb9_entries.

  if pa_test is initial.
    perform update_tables.
    if pa_xtran = 'X'.
      perform create_transport.
    endif.
  endif.

  perform generation_log.

*&---------------------------------------------------------------------*
*&      Form  F4_EXCELFILE
*&---------------------------------------------------------------------*
*       Werthilfe Excel-Datei
*----------------------------------------------------------------------*
form f4_excelfile .

  call function 'FAA_FILE_F4'
    exporting
      i_default_extension = 'XLS'
    importing
      e_filename          = pa_fnam
    exceptions
      interface_error     = 1
      others              = 2.
  if sy-subrc <> 0.
    message id sy-msgid type sy-msgty number sy-msgno
            with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  endif.

endform.                    " F4_EXCELFILE

*&---------------------------------------------------------------------*
*&      Form  CHECK_PARAMETERS
*&---------------------------------------------------------------------*
*       Selektionsparameter auf Plausibilität prüfen
*----------------------------------------------------------------------*
form check_parameters .

  if pa_xexcl = 'X' and pa_fnam is initial.
    message e600(fr) with 'Bitte Namen der Excel-Datei angeben'.
  endif.
  call function 'K_KOKRS_READ'
    exporting
      kokrs           = pa_kokrs
    exceptions
      not_found       = 1
      not_found_gjahr = 2
      others          = 3.
  if sy-subrc <> 0.
    message e600(fr) with 'Kostenrechnungskreis' pa_kokrs 'fehlerhaft'.
  endif.

endform.                    " CHECK_PARAMETERS

*&---------------------------------------------------------------------*
*&      Form  UPLOAD_TABLE
*&---------------------------------------------------------------------*
*       Excel-Umsetztabelle laden
*----------------------------------------------------------------------*
form upload_table .

* Daten in internes SAP-Format konvertieren
  define konvertiere.
    call function 'RS_CONV_EX_2_IN_DTEL'
      exporting
        input_external  = &1
        dtel            = '&2'
      importing
        output_internal = &1.
  end-of-definition.

  data: lt_buf type table of string,
        l_buf type string.

* Upload der Excel-Datei
  call function 'FAA_FILE_UPLOAD_EXCEL'
    exporting
      i_filename           = pa_fnam
    tables
      et_filecontent       = lt_buf
    exceptions
      error_accessing_file = 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.

* Strukturiert ablegen
  loop at lt_buf into l_buf.
    if pa_xhead = 'X'.       "ggf. Überschrift überlesen
      check sy-tabix gt 1.
    endif.
    split l_buf at ',' into gt_xl-werks gt_xl-kostl.
    konvertiere gt_xl-werks werks_d.
    konvertiere gt_xl-kostl kostl.
    append gt_xl.
  endloop.

  sort gt_xl by werks.      "Für BINARY SEARCH

endform.                    " UPLOAD_TABLE

*&---------------------------------------------------------------------*
*&      Form  GENERATE_OKB9_ENTRIES
*&---------------------------------------------------------------------*
*       OKB9-Einträge generieren
*----------------------------------------------------------------------*
form generate_okb9_entries .

* Kostenarten selektieren
  select * from  cskb
         where  kokrs  = pa_kokrs
         and    katyp in so_katyp
         and    datbi ge sy-datum.
    if pa_mmkoa = 'X'.
      if cskb-kstar in gr_mmkoa.
      else.
        check cskb-kstar in so_kstar.
      endif.
    else.
      check cskb-kstar in so_kstar.
    endif.

*   Buchungskreise
    select * from tka02 where kokrs = pa_kokrs.
      check tka02-bukrs in so_bukrs.
      select single * from  tka3a
             where  bukrs  = tka02-bukrs
             and    kstar  = cskb-kstar.
      if sy-subrc = 0.
        perform entry_kstar_exists.
      endif.
      if pa_xovwr = 'X' or sy-subrc ne 0.
        perform generate_tka3a_entry.
      endif.
*     Werk / Bewertungskreis lesen
      select * from t001w where werks in so_werks.
        select single * from t001k where bwkey = t001w-bwkey.
        check sy-subrc = 0.
        check t001k-bukrs = tka02-bukrs.
        if pa_xexcl  = 'X' and pa_xonly = 'X'.
          read table gt_xl with key werks = t001w-werks
               binary search.
          check sy-subrc = 0.
        endif.
        select single * from  tka3c
               where  bukrs  = t001k-bukrs
               and    kstar  = cskb-kstar
               and    bwkey  = t001k-bwkey.
        if sy-subrc = 0.
          perform entry_werks_exists.
        endif.
        if pa_xovwr = 'X' or sy-subrc ne 0.
          perform generate_tka3c_entry.
        endif.
      endselect.
    endselect.
  endselect.

  perform remove_redundant_entries.

endform.                    " GENERATE_OKB9_ENTRIES

*&---------------------------------------------------------------------*
*&      Form  CREATE_TRANSPORT
*&---------------------------------------------------------------------*
*       Zuvor generierte OKB9-Einträge in Transportauftrag aufnehmen
*----------------------------------------------------------------------*
form create_transport .

  data: lit_e071  type tr_objects,
        lwa_e071  like line of lit_e071,
        lit_e071k type tr_keys,
        lwa_e071k like line of lit_e071k.

  data: lv_order  type e070-trkorr,
        lv_task   type e070-trkorr.

* Arbeitstabellen f. Transportanschluss füllen
  clear lwa_e071.
  lwa_e071-pgmid = 'R3TR'.
  lwa_e071-object = 'CDAT'.
  lwa_e071-obj_name = 'V_TKA3'.
  lwa_e071-objfunc = 'K'.
  lwa_e071-as4pos = 1.
  append lwa_e071 to lit_e071.

  loop at gt_tka3a into tka3a.
    clear lwa_e071k.
    lwa_e071k-pgmid        = 'R3TR'.
    lwa_e071k-object       = 'TABU'.
    lwa_e071k-objname      = 'TKA3A'.
    lwa_e071k-as4pos       = 1.
    lwa_e071k-mastertype   = 'CDAT'.
    lwa_e071k-mastername   = 'V_TKA3'.
    lwa_e071k-viewname     = 'V_TKA3A'.
    lwa_e071k-tabkey(3)    = tka3a-mandt.
    lwa_e071k-tabkey+3(4)  = tka3a-bukrs.
    lwa_e071k-tabkey+7(10) = tka3a-kstar.
    lwa_e071k-sortflag     = '2'.
    append lwa_e071k to lit_e071k.
  endloop.

  loop at gt_tka3c into tka3c.
    clear lwa_e071k.
    lwa_e071k-pgmid        = 'R3TR'.
    lwa_e071k-object       = 'TABU'.
    lwa_e071k-objname      = 'TKA3C'.
    lwa_e071k-as4pos       = 1.
    lwa_e071k-mastertype   = 'CDAT'.
    lwa_e071k-mastername   = 'V_TKA3'.
    lwa_e071k-viewname     = 'V_TKA3C'.
    lwa_e071k-tabkey(3)    = tka3c-mandt.
    lwa_e071k-tabkey+3(4)  = tka3c-bukrs.
    lwa_e071k-tabkey+7(10) = tka3c-kstar.
    lwa_e071k-tabkey+17(4) = tka3c-bwkey.
    lwa_e071k-sortflag     = '2'.
    append lwa_e071k to lit_e071k.
  endloop.

* Transportauftrag / Aufgabe anfordern
  call function 'TR_ORDER_CHOICE_CORRECTION'
*   EXPORTING
*     IV_CATEGORY                  = 'CUST'
*     IV_CLI_DEP                   = 'X'
    importing
      ev_order                     = lv_order
      ev_task                      = lv_task
    exceptions
      invalid_category             = 1
      no_correction_selected       = 2
      others                       = 3
            .
  if sy-subrc <> 0.
    message id sy-msgid type sy-msgty number sy-msgno
            with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    exit.
  endif.

* Transporteinträge schreiben
  call function 'TR_APPEND_TO_COMM_OBJS_KEYS'
    exporting
*      WI_SIMULATION                        = ' '
*      WI_SUPPRESS_KEY_CHECK                = ' '
      wi_trkorr                            = lv_task
    tables
      wt_e071                              = lit_e071
      wt_e071k                             = lit_e071k
    exceptions
      key_char_in_non_char_field           = 1
      key_check_keysyntax_error            = 2
      key_inttab_table                     = 3
      key_longer_field_but_no_generc       = 4
      key_missing_key_master_fields        = 5
      key_missing_key_tablekey             = 6
      key_non_char_but_no_generic          = 7
      key_no_key_fields                    = 8
      key_string_longer_char_key           = 9
      key_table_has_no_fields              = 10
      key_table_not_activ                  = 11
      key_unallowed_key_function           = 12
      key_unallowed_key_object             = 13
      key_unallowed_key_objname            = 14
      key_unallowed_key_pgmid              = 15
      key_without_header                   = 16
      ob_check_obj_error                   = 17
      ob_devclass_no_exist                 = 18
      ob_empty_key                         = 19
      ob_generic_objectname                = 20
      ob_ill_delivery_transport            = 21
      ob_ill_lock                          = 22
      ob_ill_parts_transport               = 23
      ob_ill_source_system                 = 24
      ob_ill_system_object                 = 25
      ob_ill_target                        = 26
      ob_inttab_table                      = 27
      ob_local_object                      = 28
      ob_locked_by_other                   = 29
      ob_modif_only_in_modif_order         = 30
      ob_name_too_long                     = 31
      ob_no_append_of_corr_entry           = 32
      ob_no_append_of_c_member             = 33
      ob_no_consolidation_transport        = 34
      ob_no_original                       = 35
      ob_no_shared_repairs                 = 36
      ob_no_systemname                     = 37
      ob_no_systemtype                     = 38
      ob_no_tadir                          = 39
      ob_no_tadir_not_lockable             = 40
      ob_privat_object                     = 41
      ob_repair_only_in_repair_order       = 42
      ob_reserved_name                     = 43
      ob_syntax_error                      = 44
      ob_table_has_no_fields               = 45
      ob_table_not_activ                   = 46
      tr_enqueue_failed                    = 47
      tr_errors_in_error_table             = 48
      tr_ill_korrnum                       = 49
      tr_lockmod_failed                    = 50
      tr_lock_enqueue_failed               = 51
      tr_not_owner                         = 52
      tr_no_systemname                     = 53
      tr_no_systemtype                     = 54
      tr_order_not_exist                   = 55
      tr_order_released                    = 56
      tr_order_update_error                = 57
      tr_wrong_order_type                  = 58
      ob_invalid_target_system             = 59
      tr_no_authorization                  = 60
      ob_wrong_tabletyp                    = 61
      ob_wrong_category                    = 62
      ob_system_error                      = 63
      ob_unlocal_objekt_in_local_ord       = 64
      tr_wrong_client                      = 65
      ob_wrong_client                      = 66
      key_wrong_client                     = 67
      others                               = 68
            .
  if sy-subrc <> 0.
    message id sy-msgid type sy-msgty number sy-msgno
            with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  else.
    message i600(fr) with
         'Generierte Einträge in Transport'
         lv_order
         'aufgenommen'.
  endif.

endform.                    " CREATE_TRANSPORT

*&---------------------------------------------------------------------*
*&      Form  ENTRY_KSTAR_EXISTS
*&---------------------------------------------------------------------*
*       Eintrag in TKA3A für Kostenart gibt's schon!
*----------------------------------------------------------------------*
form entry_kstar_exists .

  message w600(fr) with
         'Eintrag für Kostenart schon vorhanden:'
          cskb-kstar
          'Buchungskreis'
          tka02-bukrs into gv_dummy.
  perform msg_log.


endform.                    " ENTRY_KSTAR_EXISTS

*&---------------------------------------------------------------------*
*&      Form  GENERATE_TKA3A_ENTRY
*&---------------------------------------------------------------------*
*       Eintrag TKA3A generieren und merken
*----------------------------------------------------------------------*
form generate_tka3a_entry .

  clear tka3a.
  tka3a-mandt = sy-mandt.
  tka3a-bukrs = tka02-bukrs.
  tka3a-kstar = cskb-kstar.
  tka3a-kokrs = pa_kokrs.
  tka3a-regel = '1'.
  append tka3a to gt_tka3a.

endform.                    " GENERATE_TKA3A_ENTRY

*&---------------------------------------------------------------------*
*&      Form  ENTRY_WERKS_EXISTS
*&---------------------------------------------------------------------*
*       Eintrag in TKA3C für Werk x gibts schon
*----------------------------------------------------------------------*
form entry_werks_exists .

  message w600(fr) with
           'Eintrag für Werk'
           t001w-werks
           'schon vorhanden:'
           tka3c-kostl into gv_dummy.
  perform msg_log.

endform.                    " ENTRY_WERKS_EXISTS

*&---------------------------------------------------------------------*
*&      Form  GENERATE_TKA3C_ENTRY
*&---------------------------------------------------------------------*
*       Eintrag TKA3C generieren und merken
*----------------------------------------------------------------------*
form generate_tka3c_entry .

  clear tka3c.
  tka3c-mandt = sy-mandt.
  tka3c-bukrs = tka02-bukrs.
  tka3c-kstar = cskb-kstar.
  tka3c-bwkey = t001w-bwkey.
  tka3c-kokrs = pa_kokrs.

* Werk = Bewertungskreis = Kostenstelle
  if pa_xequa = 'X'.
    call function 'RS_CONV_EX_2_IN_DTEL'
      exporting
        input_external  = t001w-bwkey
        dtel            = 'KOSTL'
      importing
        output_internal = tka3c-kostl.
  else.
* Kostenstelle anhand Excel-Tab. umsetzen
    read table gt_xl with key werks = t001w-bwkey
         binary search.
    if sy-subrc = 0.
      tka3c-kostl = gt_xl-kostl.
    else.
      message e600(fr) with 'Fehler: zu Werk' t001w-bwkey
               'konnte keine KoSt.' 'ermittelt werden'
               into gv_dummy.
      perform msg_log.
      exit.
    endif.
  endif.

* Ermittelte Kostenstelle prüfen
  call function 'RK_KOSTL_READ'
    exporting
      datum                    = sy-datum
      kokrs                    = pa_kokrs
      kostl                    = tka3c-kostl
    exceptions
*     KOSTL_NOT_COMPLETE       = 1
      kostl_not_found          = 2
*     TEXT_NOT_FOUND           = 3
      kokrs_missing            = 4
      others                   = 5.
  if sy-subrc <> 0.
    message e600(fr) with 'Ermittelte Kostenstelle'
                          tka3c-kostl 'ungültig'
                     into gv_dummy.
    perform msg_log.
  else.
    append tka3c to gt_tka3c.
  endif.

endform.                    " GENERATE_TKA3C_ENTRY

*&---------------------------------------------------------------------*
*&      Form  GENERATION_LOG
*&---------------------------------------------------------------------*
*       Generierte Einträge ausgeben
*----------------------------------------------------------------------*
form generation_log .

  data: ls_keyinfo type slis_keyinfo_alv.

  clear ls_keyinfo.
  ls_keyinfo-header01 = ls_keyinfo-item01 = 'BUKRS'.
  ls_keyinfo-header02 = ls_keyinfo-item02 = 'KSTAR'.
  ls_keyinfo-header03 = ls_keyinfo-item03 = 'KOKRS'.

  if gv_message_occured = 'X'.
    call function 'MESSAGES_SHOW'.
  endif.

  call function 'REUSE_ALV_HIERSEQ_LIST_DISPLAY'
    exporting
      i_callback_program      = gv_repid
      i_tabname_header        = 'GT_TKA3A'
      i_tabname_item          = 'GT_TKA3C'
      i_structure_name_header = 'TKA3A'
      i_structure_name_item   = 'TKA3C'
      is_keyinfo              = ls_keyinfo
    tables
      t_outtab_header         = gt_tka3a
      t_outtab_item           = gt_tka3c.

endform.                    " GENERATION_LOG

*&---------------------------------------------------------------------*
*&      Form  UPDATE_TABLES
*&---------------------------------------------------------------------*
*       Sichern der generierten Einträge in die Datenbank
*----------------------------------------------------------------------*
form update_tables .

  modify tka3a from table gt_tka3a.
  if sy-subrc ne 0.
    rollback work.
    message a600(fr) with 'Fehler beim Update auf TKA3A'.
  else.
    modify tka3c from table gt_tka3c.
    if sy-subrc ne 0.
      rollback work.
      message a600(fr) with 'Fehler beim Update auf TKA3C'.
    else.
      commit work.
      message i600(fr) with 'Update OKB9 ausgeführt'.
    endif.
  endif.

endform.                    " UPDATE_TABLES
*&---------------------------------------------------------------------*
*&      Form  REMOVE_REDUNDANT_ENTRIES
*&---------------------------------------------------------------------*
*       Wenn keine Einträge in der untergeordneten Tab. TKA3C
*       enthalten sind, ist der korrespondierende, übergeordnete
*       Eintrag in der TKA3A natürlich obsolet
*----------------------------------------------------------------------*
form remove_redundant_entries .

  data: lv_tabix type sy-tabix.

  loop at gt_tka3a into tka3a.
    lv_tabix = sy-tabix.
    read table gt_tka3c into tka3c
                        with key bukrs = tka3a-bukrs
                                 kstar = tka3a-kstar
                                 kokrs = tka3a-kokrs.
    if sy-subrc ne 0.
      delete gt_tka3a index lv_tabix.
    endif.
  endloop.

endform.                    " REMOVE_REDUNDANT_ENTRIES
*&---------------------------------------------------------------------*
*&      Form  INIT_LOG
*&---------------------------------------------------------------------*
*       Message-Handler anfordern und initialisieren
*----------------------------------------------------------------------*
form init_log .

  call function 'MESSAGES_INITIALIZE'.

endform.                    " INIT_LOG

*&---------------------------------------------------------------------*
*&      Form  MSG_LOG
*&---------------------------------------------------------------------*
*       Fehlermeldung ins Log eintragen
*----------------------------------------------------------------------*
form msg_log .

  gv_message_occured = 'X'.

  call function 'MESSAGE_STORE'
    exporting
      arbgb = sy-msgid
      msgty = sy-msgty
      msgv1 = sy-msgv1
      msgv2 = sy-msgv2
      msgv3 = sy-msgv3
      msgv4 = sy-msgv4
      txtnr = sy-msgno.

endform.                    " MSG_LOG

*&---------------------------------------------------------------------*
*&      Form  READ_MM_COSTELEMENTS
*&---------------------------------------------------------------------*
*       Kostenarten aus MM-Kontenfindung lesen
*----------------------------------------------------------------------*
form read_mm_costelements .

  data: lv_ktopl type tka01-ktopl,
        lv_cskb type cskbv.

* Kontenplan des Kostenrechnungskreises besorgen
  select single ktopl from tka01 into lv_ktopl where kokrs = pa_kokrs.
  check sy-subrc = 0 and not lv_ktopl is initial.

* MM-Kofi auslesen
  select * from t030 where ktopl = lv_ktopl.
*   Ist Soll-Konto gültige Kostenart
    call function 'RK_KSTAR_CHECK'
      exporting
        datum             = sy-datum
        kokrs             = pa_kokrs
        kstar             = t030-konts
      importing
        v_cskb            = lv_cskb
      exceptions
        kstar_not_allowed = 1
        kstar_not_found   = 2
        kstar_not_primary = 3
        kokrs_not_valid   = 4
        others            = 5.
*   Wenn ja: hinzufügen
    if sy-subrc = 0 and lv_cskb-katyp = '01'.
      gr_mmkoa-sign = 'I'.
      gr_mmkoa-option = 'EQ'.
      gr_mmkoa-low = t030-konts.
      collect gr_mmkoa.
    endif.
*  Dito f. Haben-Konto
    call function 'RK_KSTAR_CHECK'
      exporting
        datum             = sy-datum
        kokrs             = pa_kokrs
        kstar             = t030-konth
      importing
        v_cskb            = lv_cskb
      exceptions
        kstar_not_allowed = 1
        kstar_not_found   = 2
        kstar_not_primary = 3
        kokrs_not_valid   = 4
        others            = 5.
    if sy-subrc = 0 and lv_cskb-katyp = '01'.
      gr_mmkoa-sign = 'I'.
      gr_mmkoa-option = 'EQ'.
      gr_mmkoa-low = t030-konth.
      collect gr_mmkoa.
    endif.

  endselect.

endform.                    " READ_MM_COSTELEMENTS

Weiterlesen