Wissenswertes zum Thema Substitution / Validierung
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’).
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.
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. |
Abgleich Zahlungsbedingungen FI - MM/SD
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
Modifikationsfreie Erweiterung des SAP Referenz-IMG
Modifikationsfreie Erweiterung des Standard-IMG’s
Ruft die Transaktion S_IMG_EXTENSION auf.
Wählt als IMG-Struktur SAP Customizing Einführungsleitfaden aus. Fügt diesen am besten in Eure Favoritenliste ein.
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.
Navigiert an die Stelle, wo Ihr Eure IMG-Aktivität einfügen wollt und fügt eine Aktivität oder einen Knoten ein (Drucktasten
).
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…
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’.
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.
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.
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:
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</>
Buchen Beleg per BAPI BAPI_ACC_DOCUMENT_POST
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 4 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).
- Erhaltene Anzahlung (debitorisch) mit Steuer und separater Übergabe in Beleg- und Hauswährung
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
*-----------------------------------------------------------------------
CLEAR: lit_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)
*-----------------------------------------------------------------------
CLEAR: ls_accountrec, ls_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
APPEND: ls_accountrec TO lit_accountrec,
ls_currencyamount TO lit_currencyamount.
*-----------------------------------------------------------------------
* 2. Belegposition (Haben - Sachkonto)
*-----------------------------------------------------------------------
ADD 1 TO l_itemno.
CLEAR: ls_accountgl, ls_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
APPEND: ls_accountgl TO lit_accountgl,
ls_currencyamount TO lit_currencyamount.
*-----------------------------------------------------------------------
* Steuerzeile (Haben)
*-----------------------------------------------------------------------
ADD 1 TO l_itemno.
CLEAR: ls_accounttax, ls_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.
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
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). Mein Kollege Markus hatte mal einen Fall im Rahmen einer Migration, dass erhaltene (debitorische) Anzahlungen (Sonderhauptbuch "A") inkl. Steuerzeile übernommen werden sollten. Zudem wurden hier beispielhaft Beträge sowohl in Transaktions- als auch Hauswährung übergeben. Folgender Beleg wird exemplarisch mit dem weiter unten aufgeführten Coding Snippet gebucht:
*&---------------------------------------------------------------------*
*& Report YTEST_MALA
*&---------------------------------------------------------------------*
*& erhaltene Anzahlungen (SHB-Kz.) und Betragsübergabe in Haus- und Belegwährung
*&---------------------------------------------------------------------*
REPORT ytest_mala.
Sachkontenverzeichnis im ALV mit mehrspachigen Texten
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
Die Gebote der guten Programmierung
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).
...
Programmierer-Merkblatt SAP-Konsolidierung (EC-CS)
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.
Bilanz- und GuV-Struktur von einem System ins andere kopieren (ohne KTW)
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.
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.
Erstellen einer SD-Faktura mithilfe der allg. Fakturaschnittstelle
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
MM-Periodenverschieber für mehrere Buchungskreise/Perioden auf einmal
Aufrufrahmenprogramm f. MM-Periodenverschieber MMPV
Der vorliegende Report ruft den MM-Periodenverschieber (MMPV) für eine vorgegebene Anzahl von Buchungskreisen und Perioden auf.
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).
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
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
/image%2F1473637%2F20170207%2Fob_adae32_profilbild.png)










/image%2F1473637%2F20251029%2Fob_c3febb_screenshot-2025-10-29-084043.png)


