Archtitektur der RW-Schnittstelle
Sofern ein warenwirtschaftlicher Prozess Niederschlag in den SAP-Rechnungswesenmodulen findet, erfolgt die Integration mithilfe des RW-Interfaces. Im technischen Kern besteht die RW-Schnittstelle aus folgenden Bestandteilen:
- Systemtabelle TRWPR
- Interne Übergabestrukturen und -tabellen ACCHD, ACCIT, ACCTX, …
- Funktionsbaustein AC_DOCUMENT_CREATE
Schematische Darstellung der RW-Schnittstelle
Im Rahmen der Verbuchung der warenwirtschaftlichen Belege werden die Strukturen bzw. Tabellen ACCHD, ACCIT etc. aufgebaut und in einem übergeordneten Hauptspeicherbereich abgelegt. Das RW-Interface in Form des Funktionsbausteins AC_DOCUMENT_CREATE ‚loopt’ über die Tabelle TRWPR und ruft nacheinander die dort zum jeweiligen Rechnungswesenmodul hinterlegten Verbuchungsbausteine auf. Diese bedienen sich der zuvor im Memory abgelegten ACC*-Strukturen und generieren daraus ihre jeweiligen Belege.
Hinweis: Im Rahmen der Verbuchung werden im SAP-Standard die ACC*-Tabellen persistent abgespeichert (DB-Tabellen ACCTHD, ACCTIT usw.). Diese können je nach Durchsatz in der RW-Schnittstelle sehr schnell und umfangreich anwachsen. Diese Ursprungsbeleginformationen werden für den Fall gesichert, dass im Nachgang neue Rechnungswesenmodule aktiviert werden und eine Nachbuchung der Belege erfolgen muss. Detaillierte Informationen hierzu finden sich im Beratungshinweis 48009. Hierin ist auch eine Möglichkeit aufgeführt, die Fortschreibung der genannten Tabellen generell zu unterbinden bzw. die Tabelleninhalte zu archivieren, falls das Wachstum der Tabellen performancekritsche Ausmaße annimmt.
Belegverdichtung
Das Design der RW-Schnittstelle ist im Standard so, dass pro Position im Ursprungsbeleg (z.B. Faktura oder Artikelbeleg) jeweils ein Buchungssatz im FI erzeugt wird. Dies resultiert daraus, dass im FI-Beleg eine Vielzahl der Informationen aus dem Ursprungsbeleg übernommen wird (bspw. die Artikelnummer aus den zugrunde liegenden Artikelbelegen). Bei der Buchung von Belegen über die RW-Schnittstelle (aus SD, MM oder anderen Applikationen) entstehen somit im FI-Beleg Positionen, die in allen oder fast allen Feldern identisch sind. Dies kann auch eine Ursache für die Fehlermeldung F5/727 ('Maximale Anzahl von Positionen im FI erreicht') sein, die dann erscheint, wenn die maximale Anzahl von 999 Positionen[1] im FI-Beleg erreicht wird.
Beispiel:
Preisänderung (Abschrift)
| Artikelbeleg (vereinfacht) |
| FI-Beleg (vereinfacht) |
| Pos. Artikel Betrieb Preis (alt) Preis (neu) |
| Pos. S/H Konto Betrag |
| 001 4711 1000 1,-- 0,50 |
| 001 S Aufw.XYZ 0,50 |
| 002 4712 1000 2,-- 1,-- |
| 002 H Bestand 0,50 |
|
|
| 003 S Aufw.XYZ 1,-- |
|
|
| 004 H Bestand 1,-- |
Belegfortschreibung im FI ohne Belegverdichtung
Über die Funktion Belegverdichtung im SAP kann das System angewiesen werden, bestimmte Feldinhalte eben nicht aus dem Ursprungsbeleg in den FI-Beleg zu übernehmen und damit eine Zusammenfassung von Belegpositionen in der Finanzbuchhaltung zu ermöglichen. Wenn also üblicherweise die Artikelnummer aus dem FI-Beleg entfernt wird, können die im obigen Beispiel vier Belegpositionen zu zweien verdichtet werden:
| Artikelbeleg (vereinfacht) |
| FI-Beleg (vereinfacht) |
| Pos. Artikel Betrieb Preis (alt) Preis (neu) |
| Pos. S/H Konto Betrag |
| 001 4711 1000 1,-- 0,50 |
| 001 S Aufw.XYZ 1,50 |
| 001 4712 1000 2,-- 1,-- |
| 002 H Bestand 1,50 |
Belegfortschreibung im FI mit Belegverdichtung über Artikelnummer
Zwar geht damit die Information ‚Artikel’ im FI-Beleg verloren, jedoch kann diese aus dem zugrunde liegenden Artikelbeleg einfach besorgt werden. Auf die gleiche Weise kann man auch mit anderen Feldern im Beleg verfahren, z. B. ‚Menge’.
Customizing
Über die Transaktion OBCY werden pro Referenzvorgang[2] die Felder definiert, die nicht in den FI-Beleg übernommen werden. Die relevanten Referenzvorgänge, d.h. diejenigen, die das meiste Einsparungspotenzial an Belegzeilen beinhalten, sind:
MKPF Artikelbelege
RMRP Belege aus der log. Rechnungsprüfung
VBRK Faktura
Um bspw. die Übernahme der Artikelnummer beim Referenzvorgang MKPF zu unterbinden, muss das entsprechende Feld im FI-Beleg (Tabelle BSEG) spezifiziert werden:
Referenzvorgang MKPF
Bezeichnung Artikelbeleg
Tabellenname Feldname
BSEG MATNR
Customizing Belegverdichtung (Transaktion OBCY)
Im SAP-Hinweis 36353 sind häufig verwendete Einstellungen für die oben genannten Referenzvorgänge enthalten:
| Applikation | AWTYP | Tabelle | Feldname |
| SD | VBRK | BSEG | MATNR |
| Fakturierung |
|
| MEINS |
|
|
|
| MENGE |
|
|
|
| PAOBJNR |
|
|
|
| POSN2 |
|
|
|
| VBEL2 |
|
|
|
| WERKS |
| MM | MKPF | BSEG | BPMNG |
| Bestandsführung |
|
| BPRME |
|
|
|
| ERFME |
|
|
|
| ERFMG |
|
|
|
| MATNR |
|
|
|
| MEINS |
|
|
|
| MENGE |
|
|
|
| PAOBJNR |
|
|
|
| POSN2 |
|
|
|
| WERKS |
|
|
|
| BWTAR |
| MM | RMRP | BSEG | BPMNG |
| Logistik- |
|
| BPRME |
| Rechnungsprüfung |
|
| ERFME |
|
|
|
| ERFMG |
|
|
|
| MATNR |
|
|
|
| MEINS |
|
|
|
| MENGE |
|
|
|
| PAOBJNR |
|
|
|
| WERKS |
Empfohlene Einstellungen zur Belegverdichtung gem. SAP-Hinweis 36353
Im SAP-Standard kann über die Felder Bestellnummer (EBELN) und Bestellposition (EBELP) NICHT verdichtet werden. Sie werden sowohl bei dem Wareneingang mit Bezug auf die Bestellung (MB01) als auch bei der Rechnungsprüfung im FI-Beleg mitkontiert und verhindern hier die Verdichtung des FI-Belegs. Dies ermöglicht, das WE/RE-Verrechnungskonto auf der Ebene der Bestellposition auszugleichen. Dadurch kann es jedoch bei umfangreichen Wareneingangsbuchungen bzw. Rechnungseingängen zu Problemen, d.h. zur Überschreitung der maximal möglichen Anzahl von Belegpositionen (999) kommen. Im SAP-Hinweis 77161 ist eine Möglichkeit aufgezeigt, wie diese Art von Belegen wenigstens über die Belegposition (EBELP) verdichtet werden können. In neueren Releases können FI-Belege, die bspw. aus Wareneingangsbuchungen herrühren, automatisch gesplittet werden, wenn der Ursprungsbeleg zu groß ist.
Simulation/Analyse
Mithilfe des Analyseprogramms RSUMSIFI kann die Belegverdichtung vor Aktivierung simuliert werden, um bspw. zu evaluieren, ob sich die Einrichtung der Belegverdichtung ‚lohnt’. Details hierzu finden sich im Hinweis 310837. Gewisse ABAP-Kenntnisse vorausgesetzt, eignet sich der Report zudem als Analysetool für Fragestellungen wie: ‚warum wurde der Beleg xxx trotz aktiver Belegverdichtung nicht komprimiert?’. Setzen Sie hierzu einfach einen Break-Point in der Routine ‚COMPRESS_BSEG’ und vergleichen Sie nach Durchlauf im Debugger die Tabellen t_bseg und t_bseg_compr. Sie können hier leicht erkennen, welche nicht-initialen Beleginhalte die Verdichtung verhindern.
Besonderheiten
Beim genannten Szenario reichen die im Hinweis 36353 genannten Felder zum Vorgang VBRK (s.o.) nicht aus, um die FI-Belege aus den internen Fakturen zu verdichten, da hierbei die Bestellnummer und-position der zugrunde liegenden UB in die FI-Belegpositionen übertragen werden. Diese verhindern eine Verdichtung des Beleges im vorgenannten Sinne. In diesem Fall müssen zum Vorgang VBRK in leichter Abwandlung des Hinweises 77161 zusätzlich die Felder BSEG-EBELN und BSEG-EBELP aufgenommen werden. Dies ist ohne weiteres möglich, da bei der Verbuchung der Faktura das WE/RE-Konto nicht berührt wird und somit die Einschränkungen des Hinweises 77161 nicht greifen.
Bei aktivem CO-PA ist unter bestimmten Umständen eine Belegverdichtung über Materialbelege (Referenzvorgang MKPF) nicht möglich. Dies ist z.B. dann der Fall, wenn Abschriften oder Inventurdifferenzen ins CO-PA durchgebucht (man spricht auch von ‚…ins Ergebnis abgerechnet’) werden sollen. Der CO-PA-Beleg wird mit Ausnahme der Faktura ausschließlich aus dem FI-Beleg befüllt. Wenn also mithilfe der Belegverdichtung bspw. die Artikelnummer aus den FI-Belegen entfernt wird, ist eine Fortschreibung der Artikelnummer und den daraus abgeleiteten Merkmalen (Warengruppe etc.) im CO-PA unmöglich. Dem kann zum einen begegnet werden, in dem organisatorisch bzw. technisch dafür gesorgt wird, dass Artikelbelege einen bestimmten Umfang (ca. 450 Pos.) nicht überschreiten (vgl. Hinweis 1411253 - Warenbewegungen aus EWM) oder zum anderen ein automatisierter Belegsplit im FI erfolgt. Letzteres ist jedoch nur in neueren Releases[3] möglich. Eine Vorabkorrektur ist ab Rel. 6.03 verfügbar. Details hierzu finden sich im Hinweis 1353827.
Im Hinweis 1497092 findet sich eine Lösung, wie sich - unter bestimmten Voraussetzungen - ein Belegsplit im Rahmen der log. Rechnungsprüfung implementieren lässt, so dass eine Belegverdichtung des Vorgangs RMRP (s.o.) nicht mehr zwingend erforderlich ist.
[1] Die Einschränkung ist historisch dem numerischen Feld ‚Buchungszeile’ (BUZEI) in der BSEG geschuldet, dessen Domäne mit Typ NUMC der Länge 3 definiert ist.
[2] Der Referenzvorgang ist eine betriebswirtschaftliche Klassifizierung von Belegen im SAP-System. Dieser wird durch eine 4-5stellige, eindeutige Zeichenfolge qualifiziert.
[3] Rel. 6.03 / ab HP 06 bzw. 6.04 / ab HP 04
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.
/image%2F1473637%2F20170207%2Fob_adae32_profilbild.png)










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

