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.

Wissenswertes zum Thema Substitution / Validierung

Veröffentlicht am 22. Februar 2011 von sapmandoo in FI

Validierungen und Substitutionen sind mächtige Werkzeuge im FI/CO-Umfeld und können so manches Ungemach vom Buchungsstoff abwenden bzw. das Leben der Buchhalter/Controller erleichtern. Typische Anwendungsfälle sind z.B.:

 

- Profitcenter-Substution (s.u.)

- Dummy-Funktionsbereich setzen, wenn die Funktionsbereichsableitung bis dahin kein Ergebnis brachte

- Validierung, ob für bestimmte Konten eine Partnerkontierung abgeleitet werden konnte (s.u.)

- Validierung, dass Investitionsaufträge nur mit bestimmten Kostenarten/Konten bebucht werden dürfen (vgl. link)

- und, und und...

 

Die Validierung greift auch bei der Vorerfassung (Details s. HW 158739), während die Substitution erst beim Buchen wirkt.

 

Interessante SAP-Hinweise

842318 - umfangreiches FAQ zu diesem Themenkomplex

42615  - die Mutter aller Hinweise zum Thema Substitutionen im FI

438076 - (gutes) Beispiel für eine Substitution zum Zeitpunkt 3 (kompletter Beleg)

386896 - Substitution zum Zeitpunkt 3 (RW-Interface SD/MM)

413956 - Validierung kompletter Beleg (Zeitpunkt 3)

48121 - Verwendung von Userexits in Validierungen und Substitutionen

158739 - Validierung bei der Belegvorerfassung im FI

 

 

Generieren von Validierungen und Substitutionen

Unter bestimmen Umständen ist eine Nachgenerierung des Validierungs- bzw. Substitutionscodings erforderlich. Dies erfolgt mithilfe des Reports RGUGBR00.

 

 

Pflege der Tab. GB01

Lt. SAP-Hinweis 42615 sind Änderungen an der Tabelle GB01 Modifikationen, deshalb gibt es auch keinen offiziellen Pflegeview. In neueren Releases gibt es aber einen 'inoffiziellen': VWTYGB01 (Pflege über Transaktion SM30).

 

 

Neuer Substitutions-/Validierungsexit

1. Prüfen, ob in GCX2 bereits zum Arbeitsgebiet GBLS (Substitution) bzw. GBLR (Validierung) ein Z-Programm zugewiesen ist. Falls nicht, die Standardformpools RGGBS000 bzw. RGGBR000 in den Kundennamensraum kopieren und in der GCX2 dem entsprechenden Arbeitsgebiet zuweisen.

2. Exit-Routine gemäß untenstehendem Muster ausprogrammieren. Zusätzliche Infos (u.a. auch zur Verwendung von Parametern) finden sich im SAP Hinweis 48121.

 

FORM GET_EXIT_TITLES

Block einfügen

 exits-name = 'U900'.  "Kd.namensraum: U9xx / Zxxx / Yxxx
 exits-param = c_exit_param_class. "s. HW 48121 
 exits-title = ''. "<---insert appropriate text here
 append exits.
 

Block einfügen

 form u900 using is_booldata type GB002_015.
 * insert your substitution logic here
 * document header: is_booldata-bkpf
 * document lines: is_booldata-bseg
 *!!!!! change only 'allowed' fields according to table GB01 !!!!*
 * ...
 endform.
 

Konkrete Anwendungsbeispiele

 

Profitcenter-Substitution

Mithilfe der Profitcenter-Substitution kann das zu kontierende Profitcenter in Abhängigkeit von bestimmten Informationen aus dem Ursprungsbeleg gefunden werden. Die Implementierung der entsprechenden Ableitungsregeln erfolgt im IMG unter Controlling > Profit-Center-Rechnung > Zuordnungen von Kontierungsobjekten zu Profitcentern > Kundenaufträge > Substitutionen Kundenaufträge bzw. Transaktion 0KEM

 

Pro Substitutionsschritt kann eine Voraussetzung (Bedingung) angegeben und das Profitcenter auf folgende Weise zurückgegeben werden:

  • Konstanter Wert
  • Feld an Feld-Zuweisung (z.B. Profitcenter = Betrieb)
  • Exit

 

Hierbei stehen die Felder der Struktur PCASUB sowie div. Systemfelder (z.B. SY-TCODE = rufender Transaktionscode) zur Verfügung.

 

Beispiel:

Das Profitcenter soll aus der Verkäufergruppe des Vertriebsbelegs abgeleitet und jeweils als ein konstanter Wert zurückgeliefert werden. Hierbei muss für jede auszusteuernde Verkäufergruppe über den ‚Formula Builder’ ein Substitutionsschritt angelegt werden, der als Voraussetzung die jeweilige Abfrage auf die Verkäufergruppe(n) beinhaltet (PCASUB-VKGRP = ‚<Wert>’) und das entsprechende Profitcenter zuordnet (Abschnitt ‚Substitutionen’).

 

Substitutionsexits

Reichen die Funktionen des Formulabuilders nicht aus oder müssen andere Daten hinzu gelesen werden, kann die Substitution mithilfe eines Exits vorgenommen werden. Folgende Schritte sind dazu nötig:

  • Kopieren des SAP-Formpools RGGBS000 in den Kundennamensraum (z.B. ZGGBS000)
  • Anmelden des kundeneigenen Formpools im Arbeitsgebiet GBLS (Transaktion GCX2)

 

ArbGb

Ex.prog.

Arbeitsgebiet

GBLR

RGGBR000

Val/Sub:Exits for Rules

GBLS

ZGGBS000

Val/Sub:Exits for Substitution

GBRU

RGLVU000

Rollup: User-Exits

Transaktion GXC2 - Zuweisung Formpool

  • Implementierung des Substitutionsexits

 

Ein Beispiel zur Implementierung eines Substitutionsexits im Rahmen der Profitcenter-Substitution findet sich in der zugehörigen Korrektur des Beratungshinweises 173798. Zudem sollten folgende Punkte bei der Entwicklung des Substitutionsexits beachtet werden:

  • Die (kundeneigenen) Substitutionsroutinen tragen eine 4stellige Bezeichnung. Diese kann wahlweise mit Z oder Y (z.B. Zxxx) beginnen oder im Bereich U900-U999 angesiedelt sein. Diese Routinen müssen in der Form get_exit_tables am System angemeldet werden (s. Beispielcoding im o.g. Hinweis)
  • Die Rückgabe des ermittelten Profitcenters erfolgt immer im Feld PRCTR der Übergabestruktur PCASUB.
  • Die Felder der Struktur PCASUB werden durch den Ursprungsbeleg so weit wie möglich gefüllt. Zusätzlich benötigte Dateninhalte müssen ggf. von der Datenbank nachgelesen oder mittels ‚Dirty Assign’ aus den rufenden Programmen geholt werden.
  • Beim Szenario ‚Buchungskreisübergreifender Verkauf’ wird die Substitution zweimal durchlaufen, weil einmal das Profitcenter für die Faktura an den Endkunden und einmal für die interne Verrechnung ermittelt wird. Details hierzu finden sich Hinweis 815972.

 

  Zuordnung der Substitution

Abschließend muss die Substitution noch dem Kostenrechnungskreis zugewiesen und aktiviert werden (IMG siehe oben, à …Substitutionsregeln zuordnen), Transaktion 0KEL:

 

Kostenrechnungskreis

Substitution

Aktivkennzeichen

<XXXX>

<Substitution>

Kennzeichen 0,1,2,3,4 (siehe unten)

Customizing – Aktivierung der Substitution im Kostenrechnungskreis

 

Aktivkennzeichen

Kennzeichen

Bedeutung

0

Es werden keine Substitutionen verwendet. Das Profit Center wird aus dem Betriebsegment des Artikelstammes abgeleitet.

1

Die Substitution wird bei ‚Cross Company’ und sonstigen Abwicklungen aufgerufen. Bei ‚Cross-Company-Abwicklungen’ erfolgt der Aufruf nur zum Zeitpunkt ‚Faktura anlegen’.

2

Die Substitutionsregel wird nur im Falle einer ‚Cross Company’ Abwicklung verwendet und der Aufruf erfolgt nur zum Zeitpunkt ‚Faktura anlegen’.

3

Die Substitution wird bei ‚Cross Company’ und sonstigen Abwicklungen aufgerufen. Bei ‚Cross-Company-Abwicklungen’ erfolgt der Aufruf zu den Zeitpunkten ‚Kundenauftrag anlegen’ und ‚Faktura anlegen’.

4

Die Substitutionsregel wird nur im Falle einer ‚Cross Company-Abwicklung’ verwendet, der Aufruf erfolgt zu den Zeitpunkten ‚Kundenauftrag anlegen’ und ‚Faktura anlegen’.

Aktivkennzeichen für Substitutionen

 

Details hierzu finden sich zudem im Hinweis 167912. Programmtechnisch findet der Aufruf im Rahmen des Funktionsbausteins COPCA_SD_PRCTR_GET statt. In ihm wird auch das o.g. Aktivierungskennzeichen abgefragt. Dieser Baustein eignet sich somit als Ausgangspunkt zur Fehleranalyse, wenn die Substitution scheinbar überhaupt nicht durchlaufen wird oder falsche bzw. unverständliche Ergebnisse liefert.

 

Aufruf der PC-Subst. in eigenen Programmen

Bei Bedarf kann die Profitcenter-Substitution auch in eigenen Programmen gerufen werden. Hierzu sind folgende Schritte nötig:

  • Versorgung der benötigten Felder der Struktur PCASUB
  • Aufruf des Funktionsbausteins COPCA_SD_PRCTR_GET

 

Beispiel:

report zmyprog.
* PC-Substitution explizit in eigenem Coding ausführen
data:  ls_pcasub type pcasub,          "Workarea f. PC-Substitution
       l_prctr   type prctr.           „Substituiertes PC

* WorkArea PCASUB (Subst.-Schnittstelle) füllen
ls_pcasub-werks = ‚1234‘.
ls_pcasub-… = …
* Substitution aufrufen
  call function 'COPCA_SD_PRCTR_GET'
    exporting
      i_pcasub = ls_pcasub
      i_bukrs  = ‚1000‘
    importing
      prctr    = l_prctr
    exceptions
      no_bukrs = 1
      others   = 2.
* Fehlerbehandlung …
 

CO-Substitution

 

Details zu den Aufrufzeitpunkten finden sich im Beratungshinweis 392273. Die Substitution wird im IMG unter Controlling > Controlling Allgemein > Kontierungslogik > Substitution definieren bzw. Transaktion OKC9 angelegt bzw. gepflegt.

 

Kostenrechnungs-kreis

Anw. Zeitpunkt

Substitutionsname

Aktivierungs-

grad

1100

1 Belegzeile

DEMO

1

> Umfeld > Substitution

 

Pro Substitutionsschritt kann eine Voraussetzung (Bedingung) angegeben und das CO-Kontierungsobjekt auf folgende Weise zurückgegeben werden:

  • Konstanter Wert
  • Feld an Feld-Zuweisung (z.B. Kostenstelle = Betrieb)
  • Exit

 

Im Rahmen der Substitutionsbearbeitung stehen folgende Datenstrukturen zur Verfügung, wobei nicht alle Strukturen / Felder in jedem Aufrufkontext vollständig gefüllt sind:

 

Struktur


Bezeichnung


AFVC

Auftragsarbeitsvorgang

AUFKV

Generierte Tabelle zum View AUFKV

CAUFV

Generierte Tabelle zum View CAUFV

CBPRV

Geschäftsprozeß: CBPR + CBPT

CKPHV

View für CKPH + Text + Steuerungsdaten...

COBK

CO-Objekt: Belegkopf

COBL

Kontierungsblock

CSKSV

Steuerungskennzeichen aus Kostenstellenstammsatz

PRPS

PSP-Element (Projektstrukturplanelement) Stammdaten

SYST

ABAP-Systemfelder

VBAK

Verkaufsbeleg: Kopfdaten

VBAP

Verkaufsbeleg: Positionsdaten

 

Die Rückgabe des jeweiligen Kontierungsobjektes erfolgt im entsprechenden Feld der Struktur COBL.

 

 

Validierung im Rahmen der Konsolidierungsvorbereitung

Es sollen folgende Sachverhalte validiert werden:

1. Wenn ein Konto bebucht wird, welches im Set ZFI_KONTEN_BWA_RS(Rückstellungen) enthalten ist, soll geprüft werden, ob a) überhaupt eine Bewegungsart kontiert wurde und b) ob es sich dabei um eine für den Rückstellungsspiegel zulässige Bewegungsart handelt. Diese sind wiederum im Set ZFI_BWA_RS aufgeführt.

Vaidierung zum Zeitpunkt 2 (Belegposition):
Voraussetzung:
BSEG-HKONT IN ZFI_KONTEN_BWA_RS
Prüfung:
BSEG-BEWAR <> '' AND BSEG-BEWAR IN ZFI_BWA_RS

2. Wenn ein Konto bebucht wird, welches im Set ZFI_KONTEN_PARTNER enthalten ist, soll geprüft werden, ob es dem System möglich war, eine gültige Partnerkontierung (z.B. aus den Gegenpositionen) abzuleiten.

Validierung zum Zeitpunkt 3 (kompletter Beleg):
(...muss hier gemacht werden, da die 'Vererbung' der Partnerges. in die Gegenpositionen erst zu diesem Zeitpunkt erfolgt)

Voraussetzung:
BKPF-GLVOR <> 'RFBV'
nicht bei Vorerfassung, da die Ableitung der Partnerges. erst im Modus 'Buchen' erfolgt.

Prüfung:
Exit U901

Coding-Auszug U901:

Code:

* RA_HKONT aufbauen (Nachlesen aus Set...)
...
*----------------------------------------------------------------------*
* Abfrage Partnerkontierung für alle Belegzeilen, deren
* Konto im SET enthalten ist
* Die Selektionsrange darf aber nicht leer sein, sonst meckert er
* bei jedem Konto
*----------------------------------------------------------------------*
  check not ra_hkont[] is initial.
  loop at bool_data-bseg into bseg where hkont in ra_hkont.
    if bseg-vbund is initial.
      b_result = b_false.
    endif.
  endloop.

Kommentare

Abgleich Zahlungsbedingungen FI - MM/SD

Veröffentlicht am 21. Februar 2011 von sapmandoo in MM

Bei den Debitoren- und Kreditorenstammdaten existieren die Zahlungsbedingungen sowohl in der FI-Sicht als auch in der jeweiligen Einkaufs- bzw. Vertriebssicht. Bei der Stammdatenanlage ist also ggf. darauf zu achten, dass die Zahlungsbedingungen gleichlautend eingegeben werden. Der nachfolgende, kleine Prüfreport listet Abweichungen auf und vereinfacht somit die Fehlersuche und ggf. Nachbearbeitung der Stammsätze

 

*&---------------------------------------------------------------------*
*& Report  YYZTERM01
*&
*&---------------------------------------------------------------------*
*& Der Report prüft die Zahlungsbedingungen im FI gegen die
*& Zahlungsbedingungen im SD bzw. MM
*&---------------------------------------------------------------------*

REPORT  yyzterm01.

TABLES: knb1, lfb1, lfm1, knvv.
SELECT-OPTIONS: so_bukrs FOR knb1-bukrs OBLIGATORY.
SELECTION-SCREEN SKIP.
PARAMETERS: p_mm RADIOBUTTON GROUP r1 DEFAULT 'X'.
SELECT-OPTIONS: so_lifnr FOR lfb1-lifnr,
                so_ekorg FOR lfm1-ekorg.
SELECTION-SCREEN SKIP.
PARAMETERS: p_sd RADIOBUTTON GROUP r1.
SELECT-OPTIONS: so_kunnr FOR knb1-kunnr,
                so_vkorg FOR knvv-vkorg,
                so_vtweg FOR knvv-vtweg,
                so_spart FOR knvv-spart.

START-OF-SELECTION.
  IF p_mm = 'X'.
    PERFORM zterm_mm.
  ELSE.
    PERFORM zterm_sd.
  ENDIF.

*&---------------------------------------------------------------------*
*&      Form  ZTERM_MM
*&---------------------------------------------------------------------*
*       Ableich Zahlungsbed. FI/MM
*----------------------------------------------------------------------*
FORM zterm_mm .
  SELECT * FROM lfb1 WHERE lifnr IN so_lifnr
                       AND bukrs IN so_bukrs.
    SELECT * FROM lfm1 WHERE lifnr = lfb1-lifnr
                         AND ekorg IN so_ekorg.
      IF lfm1-zterm NE lfb1-zterm.
        WRITE: / 'Lief.', lfb1-lifnr,
                 'Bukrs', lfb1-bukrs,
                 'Z-Bed FI', lfb1-zterm,
                 'EK-Org', lfm1-ekorg,
                 'Z-Bed MM', lfm1-zterm.
      ENDIF.
    ENDSELECT.
  ENDSELECT.

ENDFORM.                    " ZTERM_MM

*&---------------------------------------------------------------------*
*&      Form  ZTERM_SD
*&---------------------------------------------------------------------*
*       Ableich Zahlungsbed. FI/SD
*----------------------------------------------------------------------*

FORM zterm_sd .
  SELECT * FROM knb1 WHERE kunnr IN so_kunnr
                       AND bukrs IN so_bukrs.
    SELECT * FROM knvv WHERE kunnr = knb1-kunnr
                         AND vkorg IN so_vkorg
                         AND vtweg IN so_vtweg
                         AND spart IN so_spart.
      IF knvv-zterm NE knb1-zterm.
        WRITE: / 'Kunde', knb1-kunnr,
                 'Bukrs', knb1-bukrs,
                 'Z-Bed FI', knb1-zterm,
                 'Vetr.bereich', knvv-vkorg, knvv-vtweg, knvv-spart,
                 'Z-Bed SD', knvv-zterm.
      ENDIF.
    ENDSELECT.
  ENDSELECT.
ENDFORM.                    " ZTERM_SD

 

Kommentare

Modifikationsfreie Erweiterung des SAP Referenz-IMG

Veröffentlicht am 17. Februar 2011 von sapmandoo in Basis-Entwicklung allg.

Modifikationsfreie Erweiterung des Standard-IMG’s

 

 

Ruft die Transaktion S_IMG_EXTENSION auf.

 

 image001-Kopie-2.png

 

Wählt als IMG-Struktur SAP Customizing Einführungsleitfaden aus. Fügt diesen am besten in Eure Favoritenliste ein.

 

image003-Kopie-1.png

 

Klappt die Werthilfe zur Erweiterungs-ID auf und wählt entweder ‚Neu’ bzw. wählt unter ‚Originale’ eine vorhandene aus. Die so angelegte Erw.-Id erscheint hinterher in der Werthilfe unter ‚Originale’. Wählt diese aus und klickt auf Struktur erweitern.

 

image005-Kopie-1.png

 

Navigiert an die Stelle, wo Ihr Eure IMG-Aktivität einfügen wollt und fügt eine Aktivität oder einen Knoten ein (Drucktasten image007.png).

 

Hier gibt es natürlich verschiedene Ansätze:

  • Ihr könnt die Aktivität an die Stelle einfügen, wo auch die Standardeinstellungen zum bearbeiteten Themenkreis zu finden sind, z.B. im SD - ‚Steuerung der Preisfindung…’.
  • Ihr könnt am Ende des Standard-IMG’s einen Knoten <Kunde>-Einstellungen einfügen und darunter themenkreisspezifische Ordner anlegen, in denen Ihr letztendlich Eure Customizing-Aktivität einhängt.

Möglicherweise ist der Königsweg eine Mischform nach dem Motto: ‚Wenn es eine Erweiterung des SAP-Standards ist, dann 1., handelt es sich um eine Eigenentwicklung dann 2.’ oder so…

 

image009.png

 

Gebt dem Kind einen Namen und tragt unter ‚Bezeichnung’ den Titel ein, unter dem die Aktivität später im Referenz-IMG erscheinen soll. Sinnvollerweise sollte dieser aus den Standard-Aktivitäten in irgendeiner Form herausstechen, bspw. durch Voranstellen des Kunden-Namens (<KUNDE>: Steuerungsparameter zum Buchungskreis). Gebt einen Dokumentennamen für die IMG-Dokumentation ein (er kann identisch mit dem technischen Namen der IMG-Aktivität selbst sein) und klickt auf ‚Anlegen’.

 

image011.png

 

Pflege eine entsprechende Doku zur IMG-Aktivität ein.

 

Den Reiter ‚Attribute’ könnt Ihr überspringen, es sei denn, Ihr wollt diese Aktivität in die ASAP-Roadmap einhängen oder landesspezifisch ausprägen. Ich weiß es nicht genau, aber es kann sein, dass die Angaben auch für Projekt-IMG’s benötigt werden.

 

image013.png

 

Tragt ggf. im Reiter ‚Attribute’ die entsprechenden Werte ein. Die ASAP-Road-MAP-ID und ‚zugeordn. Anwendungskomponenten’ sind Pflichtangaben. Fürs erstere gibt’s eine Werthilfe, fürs zweite leider nicht. Sucht Euch ggf. die Komponente aus den umliegenden (Standard-)Aktivitäten heraus.

 

image015.png

 

Weist Eurer IMG-Aktivität unter ‚Pflegeobjekte’ abschließend das entsprechende Customizing-Objekt zu (hier: einfache Tabelle mit generiertem Tabellenpflegedialog). Es gehen aber auch Pflegeviews / Viewcluster, Transaktionen und Tod und Teufel was (siehe F4-Hilfe ‚Typ’)…

 

Alles Speichern à fertig!

 

Im Ergebnis sieht’s dann so aus:

 

image018.png

 

Und jetzte kommt das geilste:

 

Ihr könnt in Euren Programm- oder sonst wie gearteten Dokumentationen auf die IMG-Aktivität verweisen.

Syntax: <DS:SIMG.Eure IMG-Aktivität>Text in Doku</>

 

image020.png

 

image023.png

Kommentare

Buchen Beleg per BAPI BAPI_ACC_DOCUMENT_POST

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

Das nachfolgende Coding dient als Hilfestellung, wie der BAPI BAPI_ACC_DOCUMENT_POST mit Daten zu versorgen ist, damit er funzt. Hier haben sich nämlich schon etliche nicht-FI-kundige Entwickler die Ohren gebrochen...

Weiter unten sind 3 Beispielcodings zu diesem Themenkomplex aufgeführt:

  • Einfache Sachkontenbuchung ohne Steuer.
  • Debitorische Buchung mit normaler Ausgangssteuer
  • Kreditorische Buchung mit Reverse Charge-Steuer, also mit zwei Steuerzeilen (Stichwort ESE/ESA).

UPDATE: Im  Beratungshinweis "2083799 - Sammelhinweis: Buchungen mit Rechnungswesen-BAPIs" finden sich über das unten beschriebene hinaus wertvolle Informationen und weitere Beispiele.

 

*&---------------------------------------------------------------------*
*& Report  YTEST_SIMPLE_POST
*&
*&---------------------------------------------------------------------*
*& Demoprogramm zur Erläuterung der Aufrufparameter für das BAPI
*&    BAPI_ACC_DOCUMENT_POST
*&---------------------------------------------------------------------*

REPORT  ytest_simple_post.

* Beispieldaten für Beleginhalte
DATA:   bukrs  TYPE bukrs  VALUE '1000',        "Buchungskreis
        hkonts TYPE hkont  VALUE '0000047011',  "Konto Soll
        hkonth TYPE hkont  VALUE '0000047012',  "Konto Haben
        waers  TYPE waers  VALUE 'EUR',         "Belegwährung
        wrbtr  TYPE wrbtr  VALUE 100,           "Betrag
        sgtxt  TYPE sgtxt  VALUE 'Test',        "Belegpos.text
        kostl  TYPE kostl  VALUE '0000001000',  "Kostenstelle
        zuonr  TYPE dzuonr VALUE '23456',       "Zuordnung
        xblnr  TYPE xblnr  VALUE 'REFERENZ',    "Referenznummer
        blart  type blart  value 'SA',          "Belegart
        docnum TYPE belnr_d.                    "Belegnummer

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

* Belegkopf
  ls_documentheader  TYPE bapiache09,

* Sachkontenpositionen
  lit_accountgl      TYPE TABLE OF bapiacgl09,
  ls_accountgl       TYPE bapiacgl09,

* Steuerzeilen (in vorliegendem Bsp. nicht relevant)
  lit_accounttax     TYPE TABLE OF bapiactx09,
  ls_accounttax      TYPE bapiactx09,

* Betragsinformationen
  lit_currencyamount TYPE TABLE OF bapiaccr09,
  ls_currencyamount  TYPE bapiaccr09,

* Meldungen des BAPI's
  lit_return         TYPE TABLE OF bapiret2,
  ls_return          TYPE bapiret2.

DATA:
  l_itemno           TYPE posnr_acc.           "Postionsnummer (s.u.)

*-----------------------------------------------------------------------
* Initialisierung
*-----------------------------------------------------------------------
CLEAR: lit_accountgl[],
       lit_accounttax[],
       lit_currencyamount[],
       lit_return[].

*-----------------------------------------------------------------------
* Positionsnummer (fängt bei 1 an und wird pro Belegpos. um 1 inkr.)
* Hinweis: Es können auch 10er Schritte verwendet werden, wichtig ist
*          nur eins: Die Einträge der Tabellen l_accountgl und
*          l_currencyamount finden über den jeweiligen Inhalt des Felds
*          itemno_acc 'zueinander', d.h. anders ausgedrückt:
*          Für jede Belegposition muss jeweils ein Eintrag in den
*          genannten Tabellen mit identischer itemno_acc aufgenommen
*          werden.
*-----------------------------------------------------------------------
l_itemno = 1.

*-----------------------------------------------------------------------
* Belegkopf
*-----------------------------------------------------------------------
CLEAR ls_documentheader.
ls_documentheader-bus_act    = 'RFBU'.     "Vorgang (fix)
ls_documentheader-username   = sy-uname.   "Belegerfasser
ls_documentheader-comp_code  = bukrs.      "Buchungskreis
ls_documentheader-doc_date   = sy-datum.   "Belegdatum
ls_documentheader-pstng_date = sy-datum.   "Buchungsdatum
ls_documentheader-ref_doc_no = xblnr.      "Referenznummer
ls_documentheader-doc_type   = blart.      "Belegart

*-----------------------------------------------------------------------
* 1. Belegposition (Soll)
*-----------------------------------------------------------------------
CLEAR: ls_accountgl, ls_currencyamount.
ls_accountgl-itemno_acc      = l_itemno.   "Positionsidentifier
ls_accountgl-gl_account      = hkonts.     "Sachkonto (Soll)
ls_accountgl-item_text       = sgtxt.      "Belegtext
ls_accountgl-costcenter      = kostl.      "Kostenstelle
ls_accountgl-alloc_nmbr      = zuonr.      "Zuordnung

* Betragssegment zur Sachkontenposition 1 mit identischem Identifier:
ls_currencyamount-itemno_acc = ls_accountgl-itemno_acc.
ls_currencyamount-currency   = waers.
ls_currencyamount-amt_doccur = wrbtr.      "positiver Betrag = Soll

APPEND: ls_accountgl      TO lit_accountgl,
        ls_currencyamount TO lit_currencyamount.

*-----------------------------------------------------------------------
* 2. Belegposition (Haben)
*-----------------------------------------------------------------------
ADD 1 TO l_itemno.
CLEAR: ls_accountgl, ls_currencyamount.
ls_accountgl-itemno_acc      = l_itemno.
ls_accountgl-gl_account      = hkonth.
ls_accountgl-item_text       = sgtxt.
ls_accountgl-alloc_nmbr      = zuonr.

* Betragssegment zur Sachkontenposition 2 mit identischem Identifier:
ls_currencyamount-itemno_acc = ls_accountgl-itemno_acc.
ls_currencyamount-currency   = waers.
ls_currencyamount-amt_doccur = wrbtr * -1.   "Haben --> Minus

APPEND: ls_accountgl      TO lit_accountgl,
        ls_currencyamount TO lit_currencyamount.

*-----------------------------------------------------------------------
* BAPI-Aufruf
*-----------------------------------------------------------------------
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
  EXPORTING
    documentheader    = ls_documentheader
  IMPORTING
    obj_type          = l_obj_type
    obj_key           = l_obj_key
    obj_sys           = l_obj_sys
  TABLES
    accountgl         = lit_accountgl
*   ACCOUNTRECEIVABLE =
*   ACCOUNTPAYABLE    =
*   accounttax        =
    currencyamount    = lit_currencyamount
*   CRITERIA          =
*   VALUEFIELD        =
*   EXTENSION1        =
    return            = lit_return
*   PAYMENTCARD       =
*   CONTRACTITEM      =
*   EXTENSION2        =
*   REALESTATE        =
*   ACCOUNTWT         =
  .
COMMIT WORK.

*-----------------------------------------------------------------------
* BAPI Meldungen ausgeben
*-----------------------------------------------------------------------
IF NOT lit_return[] IS INITIAL.
  CALL FUNCTION 'C14ALD_BAPIRET2_SHOW'
    TABLES
      i_bapiret2_tab = lit_return.
ENDIF.

* systemseitig vergebene Belegnummer kommt zurück!
docnum = l_obj_key(10).

...und weil' so schön war, das gleiche nochmal als debitorische Buchung:

per Debitor 119,-- an Sachkonto 100,--, Steuer 19,--

*&---------------------------------------------------------------------*
*& Report  YTEST_SIMPLE_POST
*&
*&---------------------------------------------------------------------*
*& Demoprogramm zur Erläuterung der Aufrufparameter für das BAPI
*&    BAPI_ACC_DOCUMENT_POST
*&---------------------------------------------------------------------*

REPORT  ytest_simple_post.

* Beispieldaten für Beleginhalte
DATA:   bukrs  TYPE bukrs  VALUE '1002',        "Buchungskreis
        kunnr  TYPE kunnr  VALUE '0000064756',  "Debitor Soll
        hkonth TYPE hkont  VALUE '0000331000',  "Konto Haben
        waers  TYPE waers  VALUE 'EUR',         "Belegwährung
        wrbtr  TYPE wrbtr  VALUE 119,           "Betrag
        sgtxt  TYPE sgtxt  VALUE 'Test',        "Belegpos.text
        kostl  TYPE kostl  VALUE '0000102719',  "Kostenstelle
        zuonr  TYPE dzuonr VALUE '23456',       "Zuordnung
        xblnr  TYPE xblnr  VALUE 'REFERENZ',    "Referenznummer
        blart  TYPE blart  VALUE 'DR',          "Belegart
        mwskz  TYPE mwskz  VALUE 'A1',          "Steuerkennzeichen
        docnum TYPE belnr_d.                    "Belegnummer

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

* Belegkopf
  ls_documentheader  TYPE bapiache09,

* Sachkontenpositionen
  lit_accountgl      TYPE TABLE OF bapiacgl09,
  ls_accountgl       TYPE bapiacgl09,

* Debitorenposition
  lit_accountrec     TYPE TABLE OF bapiacar09,
  ls_accountrec      TYPE bapiacar09,

* Steuerzeilen 
  lit_accounttax     TYPE TABLE OF bapiactx09,
  ls_accounttax      TYPE bapiactx09,

* Betragsinformationen
  lit_currencyamount TYPE TABLE OF bapiaccr09,
  ls_currencyamount  TYPE bapiaccr09,

* Meldungen des BAPI's
  lit_return         TYPE TABLE OF bapiret2.

DATA:
  l_itemno           TYPE posnr_acc.           "Postionsnummer (s.u.)

* Steuerdaten
DATA:
  lit_mwdat TYPE TABLE OF rtax1u15,
  ls_mwdat  TYPE rtax1u15.

*-----------------------------------------------------------------------
* Initialisierung
*-----------------------------------------------------------------------
CLEARlit_accountgl[],
       lit_accounttax[],
       lit_accountrec[],
       lit_currencyamount[],
       lit_return[].

*-----------------------------------------------------------------------
* Steuerdaten holen
*-----------------------------------------------------------------------
CALL FUNCTION 'CALCULATE_TAX_FROM_GROSSAMOUNT'
  EXPORTING
    i_bukrs bukrs
    i_mwskz mwskz
    i_waers waers
    i_wrbtr wrbtr
  TABLES
    t_mwdat lit_mwdat
  EXCEPTIONS
    OTHERS  16.

IF sy-subrc NE 0.
*   Fehlerbehandlung
ELSE.
  READ TABLE lit_mwdat INTO ls_mwdat INDEX 1.
ENDIF.

*-----------------------------------------------------------------------
* Positionsnummer (fängt bei 1 an und wird pro Belegpos. um 1 inkr.)
* Hinweis: Es können auch 10er Schritte verwendet werden, wichtig ist
*          nur eins: Die Einträge der Tabellen l_accountgl und
*          l_currencyamount finden über den jeweiligen Inhalt des Felds
*          itemno_acc 'zueinander', d.h. anders ausgedrückt:
*          Für jede Belegposition muss jeweils ein Eintrag in den
*          genannten Tabellen mit identischer itemno_acc aufgenommen
*          werden.
*-----------------------------------------------------------------------
l_itemno 1.

*-----------------------------------------------------------------------
* Belegkopf
*-----------------------------------------------------------------------
CLEAR ls_documentheader.
ls_documentheader-bus_act    'RFBU'.     "Vorgang (fix)
ls_documentheader-username   sy-uname.   "Belegerfasser
ls_documentheader-comp_code  bukrs.      "Buchungskreis
ls_documentheader-doc_date   sy-datum.   "Belegdatum
ls_documentheader-pstng_date sy-datum.   "Buchungsdatum
ls_documentheader-ref_doc_no xblnr.      "Referenznummer
ls_documentheader-doc_type   blart.      "Belegart

*-----------------------------------------------------------------------
* 1. Belegposition (Soll - Debitor)
*-----------------------------------------------------------------------
CLEARls_accountrecls_currencyamount.
ls_accountrec-itemno_acc     l_itemno.   "Positionsidentifier
ls_accountrec-customer       kunnr.      "Debitor (Soll)
ls_accountrec-item_text      sgtxt.      "Belegtext
ls_accountrec-alloc_nmbr     zuonr.      "Zuordnung

* Betragssegment zur Sachkontenposition 1 mit identischem Identifier:
ls_currencyamount-itemno_acc ls_accountrec-itemno_acc.
ls_currencyamount-currency   waers.
ls_currencyamount-amt_doccur wrbtr.      "positiver Betrag = Soll

APPENDls_accountrec     TO lit_accountrec,
        ls_currencyamount TO lit_currencyamount.

*-----------------------------------------------------------------------
* 2. Belegposition (Haben - Sachkonto)
*-----------------------------------------------------------------------
ADD TO l_itemno.
CLEARls_accountglls_currencyamount.
ls_accountgl-itemno_acc      l_itemno.
ls_accountgl-gl_account      hkonth.
ls_accountgl-costcenter      kostl.
ls_accountgl-item_text       sgtxt.
ls_accountgl-tax_code        mwskz.
ls_accountgl-alloc_nmbr      zuonr.

* Betragssegment zur Sachkontenposition 2 mit identischem Identifier:
ls_currencyamount-itemno_acc ls_accountgl-itemno_acc.
ls_currencyamount-currency   waers.
ls_currencyamount-amt_doccur ls_mwdat-kawrt * -1.   "Nettobetrag / Haben --> Minus

APPENDls_accountgl      TO lit_accountgl,
        ls_currencyamount TO lit_currencyamount.

*-----------------------------------------------------------------------
* Steuerzeile (Haben)
*-----------------------------------------------------------------------
ADD TO l_itemno.
CLEARls_accounttaxls_currencyamount.
ls_accounttax-itemno_acc     l_itemno.
ls_accounttax-tax_code       mwskz.

ls_currencyamount-itemno_acc ls_accounttax-itemno_acc.
ls_currencyamount-currency   waers.
ls_currencyamount-amt_doccur ls_mwdat-wmwst * -1.
ls_currencyamount-amt_base   ls_mwdat-kawrt * -1.

APPENDls_accounttax     TO lit_accounttax,
        ls_currencyamount TO lit_currencyamount.

*-----------------------------------------------------------------------
* BAPI-Aufruf
*-----------------------------------------------------------------------
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
  EXPORTING
    documentheader    ls_documentheader
  IMPORTING
    obj_type          l_obj_type
    obj_key           l_obj_key
    obj_sys           l_obj_sys
  TABLES
    accountgl         lit_accountgl
    accountreceivable lit_accountrec
*   ACCOUNTPAYABLE    =
    accounttax        lit_accounttax
    currencyamount    lit_currencyamount
*   CRITERIA          =
*   VALUEFIELD        =
*   EXTENSION1        =
    return            lit_return
*   PAYMENTCARD       =
*   CONTRACTITEM      =
*   EXTENSION2        =
*   REALESTATE        =
*   ACCOUNTWT         =
  .
COMMIT WORK.

*-----------------------------------------------------------------------
* BAPI Meldungen ausgeben
*-----------------------------------------------------------------------
IF NOT lit_return[] IS INITIAL.
  CALL FUNCTION 'C14ALD_BAPIRET2_SHOW'
    TABLES
      i_bapiret2_tab lit_return.
ENDIF.


* systemseitig vergebene Belegnummer kommt zurück!
docnum l_obj_key(10).

*&---------------------------------------------------------------------*
*& Report ZTESTBAPI
*&---------------------------------------------------------------------*
*&  kreditorische Buchung mit E1 (Reverse Charge, ESA/ESE)
*&---------------------------------------------------------------------*
REPORT ztestbapi.

* Beispieldaten für Beleginhalte
DATA: bukrs  TYPE bukrs  VALUE '9000',        "Buchungskreis
      lifnr  TYPE lifnr  VALUE '0000000117',  "Kreditor Haben
      hkonts TYPE hkont  VALUE '0000688000',  "Konto soll
      waers  TYPE waers  VALUE 'EUR',         "Belegwährung
      wrbtr  TYPE wrbtr  VALUE 100,           "Betrag
      sgtxt  TYPE sgtxt  VALUE 'Test',        "Belegpos.text
      kostl  TYPE kostl  VALUE '9000000000',  "Kostenstelle
      zuonr  TYPE dzuonr VALUE '23456',       "Zuordnung
      xblnr  TYPE xblnr  VALUE '4711-001',    "Referenznummer
      blart  TYPE blart  VALUE 'KR',          "Belegart
      mwskz  TYPE mwskz  VALUE 'E1',          "Steuerkennzeichen
      docnum TYPE belnr_d.                    "Belegnummer

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

* Belegkopf
  ls_documentheader  TYPE bapiache09,

* Sachkontenpositionen
  lit_accountgl      TYPE TABLE OF bapiacgl09,
  ls_accountgl       TYPE bapiacgl09,

* Kreditorenposition
  lit_accountpay     TYPE TABLE OF bapiacap09,
  ls_accountpay      TYPE bapiacap09,

* Steuerzeilen
  lit_accounttax     TYPE TABLE OF bapiactx09,
  ls_accounttax      TYPE bapiactx09,

* Betragsinformationen
  lit_currencyamount TYPE TABLE OF bapiaccr09,
  ls_currencyamount  TYPE bapiaccr09,

* Meldungen des BAPI's
  lit_return         TYPE TABLE OF bapiret2.

DATA:
  l_itemno           TYPE posnr_acc.           "Postionsnummer (s.u.)

* Steuerdaten
DATA:
  lit_mwdat TYPE TABLE OF rtax1u15,
  ls_mwdat  TYPE rtax1u15.

*-----------------------------------------------------------------------
* Initialisierung
*-----------------------------------------------------------------------
CLEAR: lit_accountgl[],
       lit_accounttax[],
       lit_accountpay[],
       lit_currencyamount[],
       lit_return[].

*-----------------------------------------------------------------------
* Steuerdaten holen
*-----------------------------------------------------------------------
CALL FUNCTION 'CALCULATE_TAX_FROM_GROSSAMOUNT'
  EXPORTING
    i_bukrs = bukrs
    i_mwskz = mwskz
    i_waers = waers
    i_wrbtr = wrbtr
  TABLES
    t_mwdat = lit_mwdat
  EXCEPTIONS
    OTHERS  = 16.

IF sy-subrc NE 0.
*   Fehlerbehandlung
ELSE.
  break srohde.
ENDIF.

*-----------------------------------------------------------------------
* Positionsnummer (fängt bei 1 an und wird pro Belegpos. um 1 inkr.)
* Hinweis: Es können auch 10er Schritte verwendet werden, wichtig ist
*          nur eins: Die Einträge der Tabellen l_accountgl und
*          l_currencyamount finden über den jeweiligen Inhalt des Felds
*          itemno_acc 'zueinander', d.h. anders ausgedrückt:
*          Für jede Belegposition muss jeweils ein Eintrag in den
*          genannten Tabellen mit identischer itemno_acc aufgenommen
*          werden.
*-----------------------------------------------------------------------
l_itemno = 1.

*-----------------------------------------------------------------------
* Belegkopf
*-----------------------------------------------------------------------
CLEAR ls_documentheader.
ls_documentheader-bus_act    = 'RFBU'.     "Vorgang (fix)
ls_documentheader-username   = sy-uname.   "Belegerfasser
ls_documentheader-comp_code  = bukrs.      "Buchungskreis
ls_documentheader-doc_date   = sy-datum.   "Belegdatum
ls_documentheader-pstng_date = sy-datum.   "Buchungsdatum
ls_documentheader-ref_doc_no = xblnr.      "Referenznummer
ls_documentheader-doc_type   = blart.      "Belegart

*-----------------------------------------------------------------------
* 1. Belegposition (Haben - Kreditor)
*-----------------------------------------------------------------------
CLEAR: ls_accountpay, ls_currencyamount.
ls_accountpay-itemno_acc     = l_itemno.   "Positionsidentifier
ls_accountpay-vendor_no      = lifnr.      "Kreditor
ls_accountpay-item_text      = sgtxt.      "Belegtext
ls_accountpay-alloc_nmbr     = zuonr.      "Zuordnung

* Betragssegment zur Sachkontenposition 1 mit identischem Identifier:
ls_currencyamount-itemno_acc = ls_accountpay-itemno_acc.
ls_currencyamount-currency   = waers.
ls_currencyamount-amt_doccur = wrbtr * -1. "negativer Betrag = Haben

APPEND: ls_accountpay     TO lit_accountpay,
        ls_currencyamount TO lit_currencyamount.

*-----------------------------------------------------------------------
* 2. Belegposition (Soll - Sachkonto)
*-----------------------------------------------------------------------
ADD 1 TO l_itemno.
CLEAR: ls_accountgl, ls_currencyamount.
ls_accountgl-itemno_acc      = l_itemno.
ls_accountgl-gl_account      = hkonts.
ls_accountgl-costcenter      = kostl.
ls_accountgl-item_text       = sgtxt.
ls_accountgl-tax_code        = mwskz.
ls_accountgl-alloc_nmbr      = zuonr.

* Betragssegment zur Sachkontenposition 2 mit identischem Identifier:
ls_currencyamount-itemno_acc = ls_accountgl-itemno_acc.
ls_currencyamount-currency   = waers.
ls_currencyamount-amt_doccur = wrbtr.   "Soll

APPEND: ls_accountgl      TO lit_accountgl,
        ls_currencyamount TO lit_currencyamount.

*-----------------------------------------------------------------------
* Steuerzeile 1 (HABEN) - ESA
*-----------------------------------------------------------------------
ADD 1 TO l_itemno.
CLEAR: ls_accounttax, ls_currencyamount.
ls_accounttax-itemno_acc     = l_itemno.
ls_accounttax-tax_code       = mwskz.
read table lit_mwdat index 1 into ls_mwdat.
ls_accounttax-acct_key       = ls_mwdat-ktosl.

ls_currencyamount-itemno_acc = ls_accounttax-itemno_acc.
ls_currencyamount-currency   = waers.
ls_currencyamount-amt_doccur = ls_mwdat-wmwst.
ls_currencyamount-amt_base   = ls_mwdat-kawrt * -1.  "Steuerbasis VZ drehen

APPEND: ls_accounttax     TO lit_accounttax,
        ls_currencyamount TO lit_currencyamount.

*-----------------------------------------------------------------------
* Steuerzeile 2 (Haben) - ESE
*-----------------------------------------------------------------------
ADD 1 TO l_itemno.
CLEAR: ls_accounttax, ls_currencyamount.
ls_accounttax-itemno_acc     = l_itemno.
ls_accounttax-tax_code       = mwskz.
read table lit_mwdat index 2 into ls_mwdat.
ls_accounttax-acct_key       = ls_mwdat-ktosl.

ls_currencyamount-itemno_acc = ls_accounttax-itemno_acc.
ls_currencyamount-currency   = waers.
ls_currencyamount-amt_doccur = ls_mwdat-wmwst.
ls_currencyamount-amt_base   = ls_mwdat-kawrt * -1.

APPEND: ls_accounttax     TO lit_accounttax,
        ls_currencyamount TO lit_currencyamount.

*-----------------------------------------------------------------------
* BAPI-Aufruf
*-----------------------------------------------------------------------
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
  EXPORTING
    documentheader = ls_documentheader
  IMPORTING
    obj_type       = l_obj_type
    obj_key        = l_obj_key
    obj_sys        = l_obj_sys
  TABLES
    accountgl      = lit_accountgl
    accountpayable = lit_accountpay
    accounttax     = lit_accounttax
    currencyamount = lit_currencyamount
*   CRITERIA       =
*   VALUEFIELD     =
*   EXTENSION1     =
    return         = lit_return
*   PAYMENTCARD    =
*   CONTRACTITEM   =
*   EXTENSION2     =
*   REALESTATE     =
*   ACCOUNTWT      =
  .
COMMIT WORK.

*-----------------------------------------------------------------------
* BAPI Meldungen ausgeben
*-----------------------------------------------------------------------
IF NOT lit_return[] IS INITIAL.
  CALL FUNCTION 'C14ALD_BAPIRET2_SHOW'
    TABLES
      i_bapiret2_tab = lit_return.
ENDIF.

* systemseitig vergebene Belegnummer kommt zurück!
docnum = l_obj_key(10).
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

Die Gebote der guten Programmierung

Veröffentlicht am 17. Februar 2011 von sapmandoo in Basis-Entwicklung allg.

Teile Dein Wissen oder 'tue Gutes und rede darüber...'!

Du hast einen bahnbrechenden Funktionsbaustein oder eine tolle Object-Klasse geschrieben, die zu schön ist, um unbeachtet zu versauern? Teile Deinen Schatz, in dem Du Ihn in die ...Reuse-Library einstellst (Transaktion SLIB bzw. SE83). Vergiss dabei die Dokumentation nicht, aber die hast Du ja sowieso schon erstellt, gelle? Du kannst hier aber auch Texte, Internetlinks oder sonst irgendwelche Dateien einstellen, von denen Du glaubst, dass sie auch andere interessieren könnten. Nimm aktiv an einschlägigen Internetforen teil (z.B. abapforum.com), teile Dein Wissen und profitiere vom Expertenwissen anderer.

 

Sei schlau, nutze ALV...!

Sofern es für die Art der Ausgabe Deines Programmes sinnvoll ist, nutze die ALV-Funktionsbausteine (REUSE_ALV...). In der Reuse-Library findet Du den Punkt 'ALV für Faulpelze', hierunter findest Du umfassendes Vorlage- und Anschauungsmaterial. Für Protokolle und Logs kann es sinnvoll sein, die Standard-Anwendungslog-Funktionalitäten zu nutzen (vgl. Demo Reports SBAL_DEMO*). Auch hierzu findest Du entsprechende Reuse-Komponenten.

 

Sei geschwätzig - Reden bzw. Schreiben ist Gold, Schweigen ist Blech...!

Informiere den Anwender über Dein Tun z.B. mit entsprechenden Fortschrittsmeldungen (FuBa SAPGUI_PROGRESS_INDICATOR) und geize nicht mit Statusmeldungen (Meldungstyp S) auch bei Batch-Programmen. Gib aussagekräftige und differenzierte (Fehler-)Meldungen zurück. Dies gilt auch für Ausnahmen bei Klassen oder Funktionsbausteinen ('AN_ERROR_OCCURED' ist so hilfreich wie 'Schutzverletzung an Adresse A4711783BC5'...).

 

Sei edel, gut und insbesondere hilfreich...!

Gehe nicht davon aus, dass ein Anwender (oder Entwickler) mit einer Fehlermeldung a la 'Fehler beim Lesen der Tab. XYZ' oder ähnlichem Zeug etwas anfangen kann. Hänge hinter Deine Fehlermeldungen eine aussagekräftige Dokumentation (Langtext) und vergiss dabei den Part 'Vorgehen...' nicht.

Hinterlege eine Programmdokumentation an Deinen Programmobjekten (F1-Hilfe). Sei hierbei so detailliert und umfänglich wie nötig, d.h. im Einzelfall kann auch ein Verweis auf ein bestehendes, dem Anwenderkreis zugängliches Word-Dokument völlig ausreichend sein. Sorge dafür, dass hinter allen nicht selbsterklärenden Oberflächenobjekten (Felder, Selektionsparameter, ...) eine F1-Hilfe hängt (durch Referenz auf ein [eigenes] Datenelement mit Doku bzw. durch Ausgestaltung des Zeitpunkts AT SELECTION-SCREEN ON HELP-REQUEST).

Nutze die Gestaltungsmöglichkeiten des Selektionsbildes, die ABAP bietet z.B. Subscreens, TabStrips usw. (vgl. SELECTION-SCREEN...).

Nutze die Verweisfunktion beim Gestalten Deiner Hilfetexte, z.B. aufs Glossar oder die Dokumentation von Datenelementen. Eine Auflistung aller hierbei zur Verfügung stehenden Objekte findest Du in der Reuse-Library oder auf tricktresor.de.

 

Sei hart im Nehmen, aber programmiere weich...!

Hoffe das Beste aber erwarte das Schlimmste. Frage den SY-SUBRC ab. Gehe davon aus, dass DB-Operationen auch mal schief gehen können. Informiere den Anwender in angemessener Form (vgl. Gebot 'Sei geschwätzig...').

'Verdrahte' nichts hart in Deinem Coding (IF KUNNR = '4711'.). Erstelle ggf. eigene Customizingtabellen/-objekte, die Du mit der Transaktion S_IMG_EXTENSION in den IMG an geeigneter Stelle modifikationsfrei hinzufügen und dokumentieren kannst. Hierzu findest Du eine ausführliche Anleitung in der Reuse-Library. Superprofessionell sieht auch ein Viewcluster aus (mehrstufiger Customizing-Dialog). Ein ausführliches Tutorial findest Du auf Tricktresor.de

 

Sei weltmännisch...!

Achte darauf, dass Deine Entwicklungen der Globalisierung standhalten, d.h. ggf. übersetzbar sind. Verwende deshalb keine Textliterale (WRITE: / 'Hallo Du da...'), sondern Textsymbole oder andere geeignete Objekte und achte auf Unicode-Fähigkeit.

Wenn Du eigene Tabellen kreierst, arbeite ggf. mit separaten Texttabellen (analog zum SAP-Standard, z.B. T003/T003T).

...

 

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

Bilanz- und GuV-Struktur von einem System ins andere kopieren (ohne KTW)

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

Bilanz- und GuV-Struktur von einem System ins andere kopieren (ohne KTW)

 

Quellsystem:

Transaktion FSO2 aufrufen. Die jeweilige Bilanzstruktur auswählen. Dann im Kommandofeld (oben links) folgende Zeichen (011Z) eingeben und mit ENTER bestätigen. Dann wird Dir die Bilanzstruktur als Coding angezeigt. Dann kannst Du über Hilfsmittel à Download das Coding in eine Textdatei sichern.

 

 image002.png

 

 

Zielsystem:

Mit Transaktion OB58 die Bezeichnung der Bilanzstruktur anlegen (Neue Einträge). Dann mit Transaktion FSO2 und 011Z im Kommandofeld die Textdatei per Upload importieren. Dann sollte die Bilanzstruktur vorhanden sein.

 

image004.png

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

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

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

Kommentare
1 2 > >>