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
Automatische Generierung von CO-Vorschlagskontierungen (OKB9)
Kurztext
Einträge f. Transaktion OKB9 generieren
Verwendung
Der Report generiert automatisch CO-Vorschlagskontierungen (OKB9) und stellt die Einträge auf Wunsch in einen Transportauftrag.
Funktionsumfang
Ab einer bestimmten Anzahl von Werken (bzw. Betrieben im IS-Retail) und Kostenarten, gestaltet sich die Pflege von werksabhängigen Vorschlagskontierungen in der Standardtransaktion OKB9 mitunter recht aufwändig, zumindest die 'Erstpflege'. Das vorliegende Programm erzeugt für eine vorgegebene Menge von Kostenarten und Werken automatisch Einträge in den entsprechenden Anwendungstabellen und erzeugt auf Wunsch auch gleich einen Transportauftrag, so dass die so generierten Einträge in die Folgesysteme transportiert werden können. Alternativ können Sie den Report auch in QS- bzw. Produktivsystemen laufen lassen, jedoch ist die Nutzung des Transportanschlusses die empfohlene Vorgehensweise.
Selektion
Objektabgrenzungen
Geben Sie die zu berücksichtigenden Kostenarten, Werke und ggf. Buchungskreise vor, für die Vorschlagskontierungen generiert werden sollen.
Kreuzen Sie bei Bedarf die Option 'Kostenarten aus MM-Kontenfindung' an. Es werden in diesem Fall alle Kostenarten hinzugelesen, die in der MM-Kontenfindung zum Kontenplan des ausgewählten Kostenrechnungskreises hinterlegt sind.
Tipp: um nur diese MM-Kostenarten zu selektieren, geben Sie einfach im Selektionsparameter Kostenart einen nicht existenten Wert ein (z.B. XXXXXXXXX).
Steuerung der Kostenstellenfindung
Vielfach gilt in Unternehmen: Werk = Bewertungskreis = Kostenstelle. Wählen Sie in diesem Fall die Option 'Kostenstelle = Bewertungskreis' aus.
Andernfalls können Sie eine zweispaltige Umsetztabelle in Excel anlegen, die folgendem Aufbau genügen muss:
| Werk | Kostenstelle |
| 4711 | KST4711 |
| 4712 | 6969 |
| ... | ... |
Hinweis: Die Tabelle kann dabei unkonvertiert verwendet werden, d.h. ein vorheriges Abspeichern im .txt-Format o.ä. ist nicht erforderlich.
Sofern die Option 'nur Werke in Excel-Tab. berücksichtigen' ausgewählt wurde, werden nur die Werke betrachtet, zu denen entsprechende Einträge in der vorliegenden Excel-Tabelle hinterlegt sind, ungeachtet der Vorgaben im Bereich 'Objektabgrenzungen'.
Verarbeitungssteuerung
Hier können Sie u.a. festlegen, ob bereits vorhandene Einträge in der OKB9 ggf. überschrieben werden sollen. Verwenden Sie diese Option mit Vorsicht, da hierbei u.U. Tabellenschiefstände erzeugt werden können, insbesondere, wenn z.B. schon Geschäftsbereich- und/oder Profitcenterabhängige Einträge vorhanden sind.
Deaktivieren Sie die Option 'Testlauf', um die generierten Vorschlagskontierungen in die Tabellen zu schreiben. Jedoch sollten Sie zuvor einen Testlauf durchführen, um anhand des Protokolls die korrekte Arbeitsweise des Programms im Sinne der Anforderung zu überprüfen.
Wenn Sie den Transportanschluss nutzen möchten, aktivieren Sie im 'Echtlauf' zudem die Option 'Transportauftrag anlegen'. Sie werden in diesem Fall dazu aufgefordert, einen Customizingauftrag anzulegen bzw. einen bereits vorhandenen Auftrag auszuwählen.
Ausgabe
Die generierten (bzw. im Testlauf: zu generierenden) Einträge werden in übersichtlicher Form aufgelistet. Die Ausgabeliste ist dabei in bestimmten Grenzen konfigurierbar, d.h. es können bspw. Felder aus der Anzeige entfernt oder die Sortierung geändert werden. Zuvor werden etwaig aufgetretene Fehlersituationen in Form eines Fehlerprotokolls ausgegeben.
Selektionsbild:
Texte:
Quelltext:
*&---------------------------------------------------------------------*
*& Report YYOKB9
*&
*&---------------------------------------------------------------------*
*& Der Report generiert für eine Menge von Kostenarten und Werken/Betr.
*& Einträge zur automatisierten Kostenstellenfindung (TA OKB9)
*& Details s. Reportdokumentation
*&---------------------------------------------------------------------*
report yyokb9.
type-pools: slis.
tables: t001w, cskb, tka3a, tka3c, tka02, t001k.
tables: t030.
ranges: gr_mmkoa for cskb-kstar.
data: begin of gt_xl occurs 0,
werks type t001w-werks,
kostl type kostl,
end of gt_xl,
gt_tka3a type table of tka3a,
gt_tka3c type table of tka3c,
gv_dummy,
gv_message_occured,
gv_repid type sy-repid value sy-repid.
selection-screen begin of block bl1 with frame title text-bl1.
parameters: pa_kokrs type cskb-kokrs obligatory memory id cac.
select-options: so_bukrs for tka3a-bukrs.
select-options: so_kstar for cskb-kstar,
so_katyp for cskb-katyp,
so_werks for t001w-werks.
selection-screen skip.
parameters: pa_mmkoa as checkbox default 'X'.
selection-screen end of block bl1.
selection-screen begin of block bl2 with frame title text-bl2.
parameters:
* Kostenstelle = Bewertungskreis = Werk
pa_xequa radiobutton group r1 default 'X'
user-command r1,
* Excel-Umsetztabelle verwenden
pa_xexcl radiobutton group r1.
selection-screen begin of block bu2 with frame title text-bu2.
parameters: pa_xhead as checkbox default 'X',
pa_fnam like rlgrap-filename.
parameters: pa_xonly as checkbox default space.
selection-screen end of block bu2.
selection-screen end of block bl2.
selection-screen begin of block bl3 with frame title text-bl3.
parameters: pa_xovwr as checkbox.
parameters: pa_test as checkbox default 'X'
user-command t1.
parameters: pa_xtran as checkbox default ' '.
selection-screen end of block bl3.
* PBO Selection Screen
*&---------------------------------------------------------------------*
at selection-screen output.
*&---------------------------------------------------------------------*
loop at screen.
if screen-name = 'PA_XHEAD' or screen-name = 'PA_FNAM' or
screen-name = 'PA_XONLY'.
if pa_xexcl = 'X'.
screen-input = '1'.
else.
screen-input = '0'.
endif.
modify screen.
endif.
endloop.
*&---------------------------------------------------------------------*
at selection-screen on value-request for pa_fnam.
*&---------------------------------------------------------------------*
perform f4_excelfile.
*
*&---------------------------------------------------------------------*
start-of-selection.
*&---------------------------------------------------------------------*
perform check_parameters.
perform init_log.
if pa_xexcl = 'X'.
perform upload_table.
endif.
if pa_mmkoa = 'X'.
perform read_mm_costelements.
endif.
perform generate_okb9_entries.
if pa_test is initial.
perform update_tables.
if pa_xtran = 'X'.
perform create_transport.
endif.
endif.
perform generation_log.
*&---------------------------------------------------------------------*
*& Form F4_EXCELFILE
*&---------------------------------------------------------------------*
* Werthilfe Excel-Datei
*----------------------------------------------------------------------*
form f4_excelfile .
call function 'FAA_FILE_F4'
exporting
i_default_extension = 'XLS'
importing
e_filename = pa_fnam
exceptions
interface_error = 1
others = 2.
if sy-subrc <> 0.
message id sy-msgid type sy-msgty number sy-msgno
with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
endif.
endform. " F4_EXCELFILE
*&---------------------------------------------------------------------*
*& Form CHECK_PARAMETERS
*&---------------------------------------------------------------------*
* Selektionsparameter auf Plausibilität prüfen
*----------------------------------------------------------------------*
form check_parameters .
if pa_xexcl = 'X' and pa_fnam is initial.
message e600(fr) with 'Bitte Namen der Excel-Datei angeben'.
endif.
call function 'K_KOKRS_READ'
exporting
kokrs = pa_kokrs
exceptions
not_found = 1
not_found_gjahr = 2
others = 3.
if sy-subrc <> 0.
message e600(fr) with 'Kostenrechnungskreis' pa_kokrs 'fehlerhaft'.
endif.
endform. " CHECK_PARAMETERS
*&---------------------------------------------------------------------*
*& Form UPLOAD_TABLE
*&---------------------------------------------------------------------*
* Excel-Umsetztabelle laden
*----------------------------------------------------------------------*
form upload_table .
* Daten in internes SAP-Format konvertieren
define konvertiere.
call function 'RS_CONV_EX_2_IN_DTEL'
exporting
input_external = &1
dtel = '&2'
importing
output_internal = &1.
end-of-definition.
data: lt_buf type table of string,
l_buf type string.
* Upload der Excel-Datei
call function 'FAA_FILE_UPLOAD_EXCEL'
exporting
i_filename = pa_fnam
tables
et_filecontent = lt_buf
exceptions
error_accessing_file = 1
others = 2.
if sy-subrc <> 0.
message id sy-msgid type sy-msgty number sy-msgno
with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
endif.
* Strukturiert ablegen
loop at lt_buf into l_buf.
if pa_xhead = 'X'. "ggf. Überschrift überlesen
check sy-tabix gt 1.
endif.
split l_buf at ',' into gt_xl-werks gt_xl-kostl.
konvertiere gt_xl-werks werks_d.
konvertiere gt_xl-kostl kostl.
append gt_xl.
endloop.
sort gt_xl by werks. "Für BINARY SEARCH
endform. " UPLOAD_TABLE
*&---------------------------------------------------------------------*
*& Form GENERATE_OKB9_ENTRIES
*&---------------------------------------------------------------------*
* OKB9-Einträge generieren
*----------------------------------------------------------------------*
form generate_okb9_entries .
* Kostenarten selektieren
select * from cskb
where kokrs = pa_kokrs
and katyp in so_katyp
and datbi ge sy-datum.
if pa_mmkoa = 'X'.
if cskb-kstar in gr_mmkoa.
else.
check cskb-kstar in so_kstar.
endif.
else.
check cskb-kstar in so_kstar.
endif.
* Buchungskreise
select * from tka02 where kokrs = pa_kokrs.
check tka02-bukrs in so_bukrs.
select single * from tka3a
where bukrs = tka02-bukrs
and kstar = cskb-kstar.
if sy-subrc = 0.
perform entry_kstar_exists.
endif.
if pa_xovwr = 'X' or sy-subrc ne 0.
perform generate_tka3a_entry.
endif.
* Werk / Bewertungskreis lesen
select * from t001w where werks in so_werks.
select single * from t001k where bwkey = t001w-bwkey.
check sy-subrc = 0.
check t001k-bukrs = tka02-bukrs.
if pa_xexcl = 'X' and pa_xonly = 'X'.
read table gt_xl with key werks = t001w-werks
binary search.
check sy-subrc = 0.
endif.
select single * from tka3c
where bukrs = t001k-bukrs
and kstar = cskb-kstar
and bwkey = t001k-bwkey.
if sy-subrc = 0.
perform entry_werks_exists.
endif.
if pa_xovwr = 'X' or sy-subrc ne 0.
perform generate_tka3c_entry.
endif.
endselect.
endselect.
endselect.
perform remove_redundant_entries.
endform. " GENERATE_OKB9_ENTRIES
*&---------------------------------------------------------------------*
*& Form CREATE_TRANSPORT
*&---------------------------------------------------------------------*
* Zuvor generierte OKB9-Einträge in Transportauftrag aufnehmen
*----------------------------------------------------------------------*
form create_transport .
data: lit_e071 type tr_objects,
lwa_e071 like line of lit_e071,
lit_e071k type tr_keys,
lwa_e071k like line of lit_e071k.
data: lv_order type e070-trkorr,
lv_task type e070-trkorr.
* Arbeitstabellen f. Transportanschluss füllen
clear lwa_e071.
lwa_e071-pgmid = 'R3TR'.
lwa_e071-object = 'CDAT'.
lwa_e071-obj_name = 'V_TKA3'.
lwa_e071-objfunc = 'K'.
lwa_e071-as4pos = 1.
append lwa_e071 to lit_e071.
loop at gt_tka3a into tka3a.
clear lwa_e071k.
lwa_e071k-pgmid = 'R3TR'.
lwa_e071k-object = 'TABU'.
lwa_e071k-objname = 'TKA3A'.
lwa_e071k-as4pos = 1.
lwa_e071k-mastertype = 'CDAT'.
lwa_e071k-mastername = 'V_TKA3'.
lwa_e071k-viewname = 'V_TKA3A'.
lwa_e071k-tabkey(3) = tka3a-mandt.
lwa_e071k-tabkey+3(4) = tka3a-bukrs.
lwa_e071k-tabkey+7(10) = tka3a-kstar.
lwa_e071k-sortflag = '2'.
append lwa_e071k to lit_e071k.
endloop.
loop at gt_tka3c into tka3c.
clear lwa_e071k.
lwa_e071k-pgmid = 'R3TR'.
lwa_e071k-object = 'TABU'.
lwa_e071k-objname = 'TKA3C'.
lwa_e071k-as4pos = 1.
lwa_e071k-mastertype = 'CDAT'.
lwa_e071k-mastername = 'V_TKA3'.
lwa_e071k-viewname = 'V_TKA3C'.
lwa_e071k-tabkey(3) = tka3c-mandt.
lwa_e071k-tabkey+3(4) = tka3c-bukrs.
lwa_e071k-tabkey+7(10) = tka3c-kstar.
lwa_e071k-tabkey+17(4) = tka3c-bwkey.
lwa_e071k-sortflag = '2'.
append lwa_e071k to lit_e071k.
endloop.
* Transportauftrag / Aufgabe anfordern
call function 'TR_ORDER_CHOICE_CORRECTION'
* EXPORTING
* IV_CATEGORY = 'CUST'
* IV_CLI_DEP = 'X'
importing
ev_order = lv_order
ev_task = lv_task
exceptions
invalid_category = 1
no_correction_selected = 2
others = 3
.
if sy-subrc <> 0.
message id sy-msgid type sy-msgty number sy-msgno
with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
exit.
endif.
* Transporteinträge schreiben
call function 'TR_APPEND_TO_COMM_OBJS_KEYS'
exporting
* WI_SIMULATION = ' '
* WI_SUPPRESS_KEY_CHECK = ' '
wi_trkorr = lv_task
tables
wt_e071 = lit_e071
wt_e071k = lit_e071k
exceptions
key_char_in_non_char_field = 1
key_check_keysyntax_error = 2
key_inttab_table = 3
key_longer_field_but_no_generc = 4
key_missing_key_master_fields = 5
key_missing_key_tablekey = 6
key_non_char_but_no_generic = 7
key_no_key_fields = 8
key_string_longer_char_key = 9
key_table_has_no_fields = 10
key_table_not_activ = 11
key_unallowed_key_function = 12
key_unallowed_key_object = 13
key_unallowed_key_objname = 14
key_unallowed_key_pgmid = 15
key_without_header = 16
ob_check_obj_error = 17
ob_devclass_no_exist = 18
ob_empty_key = 19
ob_generic_objectname = 20
ob_ill_delivery_transport = 21
ob_ill_lock = 22
ob_ill_parts_transport = 23
ob_ill_source_system = 24
ob_ill_system_object = 25
ob_ill_target = 26
ob_inttab_table = 27
ob_local_object = 28
ob_locked_by_other = 29
ob_modif_only_in_modif_order = 30
ob_name_too_long = 31
ob_no_append_of_corr_entry = 32
ob_no_append_of_c_member = 33
ob_no_consolidation_transport = 34
ob_no_original = 35
ob_no_shared_repairs = 36
ob_no_systemname = 37
ob_no_systemtype = 38
ob_no_tadir = 39
ob_no_tadir_not_lockable = 40
ob_privat_object = 41
ob_repair_only_in_repair_order = 42
ob_reserved_name = 43
ob_syntax_error = 44
ob_table_has_no_fields = 45
ob_table_not_activ = 46
tr_enqueue_failed = 47
tr_errors_in_error_table = 48
tr_ill_korrnum = 49
tr_lockmod_failed = 50
tr_lock_enqueue_failed = 51
tr_not_owner = 52
tr_no_systemname = 53
tr_no_systemtype = 54
tr_order_not_exist = 55
tr_order_released = 56
tr_order_update_error = 57
tr_wrong_order_type = 58
ob_invalid_target_system = 59
tr_no_authorization = 60
ob_wrong_tabletyp = 61
ob_wrong_category = 62
ob_system_error = 63
ob_unlocal_objekt_in_local_ord = 64
tr_wrong_client = 65
ob_wrong_client = 66
key_wrong_client = 67
others = 68
.
if sy-subrc <> 0.
message id sy-msgid type sy-msgty number sy-msgno
with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
else.
message i600(fr) with
'Generierte Einträge in Transport'
lv_order
'aufgenommen'.
endif.
endform. " CREATE_TRANSPORT
*&---------------------------------------------------------------------*
*& Form ENTRY_KSTAR_EXISTS
*&---------------------------------------------------------------------*
* Eintrag in TKA3A für Kostenart gibt's schon!
*----------------------------------------------------------------------*
form entry_kstar_exists .
message w600(fr) with
'Eintrag für Kostenart schon vorhanden:'
cskb-kstar
'Buchungskreis'
tka02-bukrs into gv_dummy.
perform msg_log.
endform. " ENTRY_KSTAR_EXISTS
*&---------------------------------------------------------------------*
*& Form GENERATE_TKA3A_ENTRY
*&---------------------------------------------------------------------*
* Eintrag TKA3A generieren und merken
*----------------------------------------------------------------------*
form generate_tka3a_entry .
clear tka3a.
tka3a-mandt = sy-mandt.
tka3a-bukrs = tka02-bukrs.
tka3a-kstar = cskb-kstar.
tka3a-kokrs = pa_kokrs.
tka3a-regel = '1'.
append tka3a to gt_tka3a.
endform. " GENERATE_TKA3A_ENTRY
*&---------------------------------------------------------------------*
*& Form ENTRY_WERKS_EXISTS
*&---------------------------------------------------------------------*
* Eintrag in TKA3C für Werk x gibts schon
*----------------------------------------------------------------------*
form entry_werks_exists .
message w600(fr) with
'Eintrag für Werk'
t001w-werks
'schon vorhanden:'
tka3c-kostl into gv_dummy.
perform msg_log.
endform. " ENTRY_WERKS_EXISTS
*&---------------------------------------------------------------------*
*& Form GENERATE_TKA3C_ENTRY
*&---------------------------------------------------------------------*
* Eintrag TKA3C generieren und merken
*----------------------------------------------------------------------*
form generate_tka3c_entry .
clear tka3c.
tka3c-mandt = sy-mandt.
tka3c-bukrs = tka02-bukrs.
tka3c-kstar = cskb-kstar.
tka3c-bwkey = t001w-bwkey.
tka3c-kokrs = pa_kokrs.
* Werk = Bewertungskreis = Kostenstelle
if pa_xequa = 'X'.
call function 'RS_CONV_EX_2_IN_DTEL'
exporting
input_external = t001w-bwkey
dtel = 'KOSTL'
importing
output_internal = tka3c-kostl.
else.
* Kostenstelle anhand Excel-Tab. umsetzen
read table gt_xl with key werks = t001w-bwkey
binary search.
if sy-subrc = 0.
tka3c-kostl = gt_xl-kostl.
else.
message e600(fr) with 'Fehler: zu Werk' t001w-bwkey
'konnte keine KoSt.' 'ermittelt werden'
into gv_dummy.
perform msg_log.
exit.
endif.
endif.
* Ermittelte Kostenstelle prüfen
call function 'RK_KOSTL_READ'
exporting
datum = sy-datum
kokrs = pa_kokrs
kostl = tka3c-kostl
exceptions
* KOSTL_NOT_COMPLETE = 1
kostl_not_found = 2
* TEXT_NOT_FOUND = 3
kokrs_missing = 4
others = 5.
if sy-subrc <> 0.
message e600(fr) with 'Ermittelte Kostenstelle'
tka3c-kostl 'ungültig'
into gv_dummy.
perform msg_log.
else.
append tka3c to gt_tka3c.
endif.
endform. " GENERATE_TKA3C_ENTRY
*&---------------------------------------------------------------------*
*& Form GENERATION_LOG
*&---------------------------------------------------------------------*
* Generierte Einträge ausgeben
*----------------------------------------------------------------------*
form generation_log .
data: ls_keyinfo type slis_keyinfo_alv.
clear ls_keyinfo.
ls_keyinfo-header01 = ls_keyinfo-item01 = 'BUKRS'.
ls_keyinfo-header02 = ls_keyinfo-item02 = 'KSTAR'.
ls_keyinfo-header03 = ls_keyinfo-item03 = 'KOKRS'.
if gv_message_occured = 'X'.
call function 'MESSAGES_SHOW'.
endif.
call function 'REUSE_ALV_HIERSEQ_LIST_DISPLAY'
exporting
i_callback_program = gv_repid
i_tabname_header = 'GT_TKA3A'
i_tabname_item = 'GT_TKA3C'
i_structure_name_header = 'TKA3A'
i_structure_name_item = 'TKA3C'
is_keyinfo = ls_keyinfo
tables
t_outtab_header = gt_tka3a
t_outtab_item = gt_tka3c.
endform. " GENERATION_LOG
*&---------------------------------------------------------------------*
*& Form UPDATE_TABLES
*&---------------------------------------------------------------------*
* Sichern der generierten Einträge in die Datenbank
*----------------------------------------------------------------------*
form update_tables .
modify tka3a from table gt_tka3a.
if sy-subrc ne 0.
rollback work.
message a600(fr) with 'Fehler beim Update auf TKA3A'.
else.
modify tka3c from table gt_tka3c.
if sy-subrc ne 0.
rollback work.
message a600(fr) with 'Fehler beim Update auf TKA3C'.
else.
commit work.
message i600(fr) with 'Update OKB9 ausgeführt'.
endif.
endif.
endform. " UPDATE_TABLES
*&---------------------------------------------------------------------*
*& Form REMOVE_REDUNDANT_ENTRIES
*&---------------------------------------------------------------------*
* Wenn keine Einträge in der untergeordneten Tab. TKA3C
* enthalten sind, ist der korrespondierende, übergeordnete
* Eintrag in der TKA3A natürlich obsolet
*----------------------------------------------------------------------*
form remove_redundant_entries .
data: lv_tabix type sy-tabix.
loop at gt_tka3a into tka3a.
lv_tabix = sy-tabix.
read table gt_tka3c into tka3c
with key bukrs = tka3a-bukrs
kstar = tka3a-kstar
kokrs = tka3a-kokrs.
if sy-subrc ne 0.
delete gt_tka3a index lv_tabix.
endif.
endloop.
endform. " REMOVE_REDUNDANT_ENTRIES
*&---------------------------------------------------------------------*
*& Form INIT_LOG
*&---------------------------------------------------------------------*
* Message-Handler anfordern und initialisieren
*----------------------------------------------------------------------*
form init_log .
call function 'MESSAGES_INITIALIZE'.
endform. " INIT_LOG
*&---------------------------------------------------------------------*
*& Form MSG_LOG
*&---------------------------------------------------------------------*
* Fehlermeldung ins Log eintragen
*----------------------------------------------------------------------*
form msg_log .
gv_message_occured = 'X'.
call function 'MESSAGE_STORE'
exporting
arbgb = sy-msgid
msgty = sy-msgty
msgv1 = sy-msgv1
msgv2 = sy-msgv2
msgv3 = sy-msgv3
msgv4 = sy-msgv4
txtnr = sy-msgno.
endform. " MSG_LOG
*&---------------------------------------------------------------------*
*& Form READ_MM_COSTELEMENTS
*&---------------------------------------------------------------------*
* Kostenarten aus MM-Kontenfindung lesen
*----------------------------------------------------------------------*
form read_mm_costelements .
data: lv_ktopl type tka01-ktopl,
lv_cskb type cskbv.
* Kontenplan des Kostenrechnungskreises besorgen
select single ktopl from tka01 into lv_ktopl where kokrs = pa_kokrs.
check sy-subrc = 0 and not lv_ktopl is initial.
* MM-Kofi auslesen
select * from t030 where ktopl = lv_ktopl.
* Ist Soll-Konto gültige Kostenart
call function 'RK_KSTAR_CHECK'
exporting
datum = sy-datum
kokrs = pa_kokrs
kstar = t030-konts
importing
v_cskb = lv_cskb
exceptions
kstar_not_allowed = 1
kstar_not_found = 2
kstar_not_primary = 3
kokrs_not_valid = 4
others = 5.
* Wenn ja: hinzufügen
if sy-subrc = 0 and lv_cskb-katyp = '01'.
gr_mmkoa-sign = 'I'.
gr_mmkoa-option = 'EQ'.
gr_mmkoa-low = t030-konts.
collect gr_mmkoa.
endif.
* Dito f. Haben-Konto
call function 'RK_KSTAR_CHECK'
exporting
datum = sy-datum
kokrs = pa_kokrs
kstar = t030-konth
importing
v_cskb = lv_cskb
exceptions
kstar_not_allowed = 1
kstar_not_found = 2
kstar_not_primary = 3
kokrs_not_valid = 4
others = 5.
if sy-subrc = 0 and lv_cskb-katyp = '01'.
gr_mmkoa-sign = 'I'.
gr_mmkoa-option = 'EQ'.
gr_mmkoa-low = t030-konth.
collect gr_mmkoa.
endif.
endselect.
endform. " READ_MM_COSTELEMENTS
/image%2F1473637%2F20170207%2Fob_adae32_profilbild.png)



