Gerade erfolgreich unter S/4 1709 on premise getestet, deshalb hier druckfrisch meine gewonnen Erkenntnisse...
Es soll eine Excel-Datei mit Altanlagen und -werten in SAP-Anlagen migriert werden. Die Übernahme erfolgt zum Jahresende, d.h., es findet keine Übernahme von unterjährigen Bewegungen statt. Es werden zwei Bewertungsbereiche (HGB & IFRS) berücksichtigt.
Die Migrationsdatei hat folgenden Aufbau:
Excel-Datei mit den zu migrierenden Anlagen
Die Excel-Datei kann unkonvertiert verwendet werden, d.h. ein vorheriges Abspeichern im TXT-Format oder ähnliches ist nicht erforderlich. Die Nummer der Altanlage ist in der Spalte "Inventarnummer" hinterlegt. Die SAP-Anlagennummern werden in diesem Fall neu intern vergeben.
Die Übernahme erfolgt mit eigenem Programm unter Zuhilfenahme des BAPIs BAPI_FIXEDASSET_OVRTAKE_CREATE. Der genannte BAPI erzeugt in einem Arbeitsgang sowohl den Stammsatz als auch die unter S/4 zwingend erforderliche Übernahmebuchung (ABLDT). Der gute alte Button "Übernahmewerte" in der AS91 und die anschließende Einbuchung der Salden (OASV) ist ja passé...
Vorbereitungen
Im Grunde sind die Einstellungen zur Anlagenmigration weitestgehend identisch mit denen unter ECC/ERP. Hinzu kommt die Angabe der Belegart (für die Übernahmebuchung) und in der Fixkontentabelle muss noch ein Übernahmekonto für die Anlagenmigration hinterlegt werden, gegen dass die jeweiligen AHKs und die kumulierte Abschreibung gebucht werden. Hier hat's mich im Q-System zerlegt, weil es ein Problem mit dem Transportanschluss für eben diese Kontenfindung gibt/gab. Hinweise 2376485 und 2289443 schaffen Abhilfe...
Zuvor muss zudem die neue Anlagenbuchhaltung aktiviert werden (IMG: Finanzwesen - Anlagenbuchhaltung - Produktionsvorbereitung - Produktivstart - neue Anlagenbuchhaltung aktivieren (Neukunden)).
Die Übernahmeparameter haben keinen Transportanschluß, d.h. sie müssen ggf. in jedem System/Mandanten eingetragen werden.
IMG-Pfad "Datenübernahme Anlagen"
Eingabe von Übernahmestatus, -belegart und -datum pro Buchungskreis
Die obenstehende Excel-Datei kann mit dem untenstehenden Programm eingelesen und verarbeitet werden. Das meiste Coding ging dabei für die Protokollausgabe drauf. Inhaltlich Interessant ist eigentlich nur die Routine "MAP_DATA".
Im ersten Versuch hatte ich die kum. Abschreibungen mit positivem Vorzeichen (also so wie sie in der Excel-Tabelle stehen) an das BAPI übergeben - sah nicht gut aus... Einmal mit -1 multiplizieren reduziert die blutroten Meldungen drastisch...
Zudem hatte ich zuerst den klassischen Anfängerfehler gemacht und das COMMIT nach dem BAPI-Aufruf vergessen.
*&---------------------------------------------------------------------*
*& Report ZFI_MIG_ANLAGEN
*&---------------------------------------------------------------------*
*& Anlagenstamm-Migration (Stammdaten & Werte)
*&---------------------------------------------------------------------*
REPORT zfi_mig_anlagen.
***********************************************************************
******************** GLOBAL DATA **************************************
***********************************************************************
TABLES: t001.
SET EXTENDED CHECK OFF.
INCLUDE:
sbal_constants,
<icon>.
SET EXTENDED CHECK ON.
DATA:
g_s_log TYPE bal_s_log,
g_log_handle TYPE balloghndl,
g_t_log_handle TYPE bal_t_logh,
g_s_display_profile TYPE bal_s_prof.
TYPES: BEGIN OF ty_mig, "Spaltenstruktur Excel Datei
bukr LIKE anla-bukrs,
anlagenklasse LIKE anla-anlkl,
anlage LIKE anla-anln1,
anlagenbezeichnung1 LIKE anla-txt50,
anlagenbezeichnung2 LIKE anla-txa50,
inventarnummer LIKE anla-invnr,
aktivdatum(10),
kostenst LIKE anlz-kostl,
standort LIKE anlz-stort,
seriennummer LIKE anla-sernr,
filiale LIKE anlz-werks,
innenauftrag_kost2 LIKE anlz-caufn,
hgb_afaschl(20),
hgb_ntz LIKE anlb-ndjar,
hgb_per LIKE anlb-ndper,
hgb_nafabeg(10),
hbg_kumanschwert(15),
hgb_kumnormalafa(15),
ifrs_afaschl(20),
ifrs_ntz LIKE anlb-ndjar,
ifrs_per LIKE anlb-ndper,
ifrs_nafabeg(10),
ifrs_kumanschwert(15),
ifrs_kumnormalafa(15),
END OF ty_mig.
DATA: it_mig TYPE TABLE OF ty_mig,
wa_mig TYPE ty_mig.
DATA: key TYPE bapi1022_key,
reference LIKE bapi1022_reference,
createsubnumber LIKE bapi1022_misc-xsubno,
creategroupasset LIKE bapi1022_misc-xanlgr,
testrun LIKE bapi1022_misc-testrun,
generaldata LIKE bapi1022_feglg001,
generaldatax LIKE bapi1022_feglg001x,
inventory LIKE bapi1022_feglg011,
inventoryx LIKE bapi1022_feglg011x,
postinginformation LIKE bapi1022_feglg002,
postinginformationx LIKE bapi1022_feglg002x,
timedependentdata LIKE bapi1022_feglg003,
timedependentdatax LIKE bapi1022_feglg003x,
allocations LIKE bapi1022_feglg004,
allocationsx LIKE bapi1022_feglg004x,
origin LIKE bapi1022_feglg009,
originx LIKE bapi1022_feglg009x,
investacctassignmnt LIKE bapi1022_feglg010,
investacctassignmntx LIKE bapi1022_feglg010x,
networthvaluation LIKE bapi1022_feglg006,
networthvaluationx LIKE bapi1022_feglg006x,
realestate LIKE bapi1022_feglg007,
realestatex LIKE bapi1022_feglg007x,
insurance LIKE bapi1022_feglg008,
insurancex LIKE bapi1022_feglg008x,
leasing LIKE bapi1022_feglg005,
leasingx LIKE bapi1022_feglg005x.
DATA: companycode LIKE bapi1022_1-comp_code,
asset LIKE bapi1022_1-assetmaino,
subnumber LIKE bapi1022_1-assetsubno,
assetcreated LIKE bapi1022_reference.
DATA: depreciationareas LIKE TABLE OF bapi1022_dep_areas WITH HEADER LINE,
depreciationareasx LIKE TABLE OF bapi1022_dep_areasx WITH HEADER LINE,
investment_support LIKE TABLE OF bapi1022_inv_support WITH HEADER LINE,
extensionin LIKE TABLE OF bapiparex WITH HEADER LINE,
cumulatedvalues LIKE TABLE OF bapi1022_cumval WITH HEADER LINE,
postedvalues LIKE TABLE OF bapi1022_postval WITH HEADER LINE,
transactions LIKE TABLE OF bapi1022_trtype WITH HEADER LINE,
proportionalvalues LIKE TABLE OF bapi1022_propval WITH HEADER LINE,
return LIKE TABLE OF bapiret2 WITH HEADER LINE,
postingheaders LIKE TABLE OF bapi1022_postingheader WITH HEADER LINE.
DATA: data_tab TYPE TABLE OF string.
*&---------------------------------------------------------------------*
*& SELECTION-SCREEN
*&---------------------------------------------------------------------*
PARAMETERS: pa_test AS CHECKBOX DEFAULT 'X'.
PARAMETERS: pa_fnam LIKE rlgrap-filename OBLIGATORY.
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_fnam.
*&---------------------------------------------------------------------*
PERFORM f4_filename.
*&---------------------------------------------------------------------*
START-OF-SELECTION.
*&---------------------------------------------------------------------*
PERFORM upload_data.
IF it_mig[] IS NOT INITIAL.
PERFORM init_protocol.
LOOP AT it_mig INTO wa_mig.
PERFORM map_data.
PERFORM bapi_call.
ENDLOOP.
PERFORM protocol.
ELSE.
MESSAGE i600(fr) WITH 'Datei enthält keine' 'verarbeitbaren' 'Datensätze'.
ENDIF.
*&---------------------------------------------------------------------*
*& Form BAPI_CALL
*&---------------------------------------------------------------------*
*& Anlagen-Migrations-BAPI rufen, Meldungen speichern und f...ing COMMIT
*&---------------------------------------------------------------------*
FORM bapi_call.
DATA: l_error TYPE abap_bool VALUE abap_false.
CALL FUNCTION 'BAPI_FIXEDASSET_OVRTAKE_CREATE'
EXPORTING
key = key
* REFERENCE =
* CREATESUBNUMBER =
* CREATEGROUPASSET =
testrun = pa_test
generaldata = generaldata
generaldatax = generaldatax
inventory = inventory
inventoryx = inventoryx
postinginformation = postinginformation
postinginformationx = postinginformationx
timedependentdata = timedependentdata
timedependentdatax = timedependentdatax
allocations = allocations
allocationsx = allocationsx
origin = origin
originx = originx
* INVESTACCTASSIGNMNT =
* INVESTACCTASSIGNMNTX =
* NETWORTHVALUATION =
* NETWORTHVALUATIONX =
* REALESTATE =
* REALESTATEX =
* INSURANCE =
* INSURANCEX =
* LEASING =
* LEASINGX =
IMPORTING
companycode = companycode
asset = asset
subnumber = subnumber
assetcreated = assetcreated
TABLES
depreciationareas = depreciationareas
depreciationareasx = depreciationareasx
* INVESTMENT_SUPPORT =
* EXTENSIONIN =
cumulatedvalues = cumulatedvalues
* POSTEDVALUES =
* TRANSACTIONS =
* PROPORTIONALVALUES =
return = return
postingheaders = postingheaders.
LOOP AT return WHERE type = 'A' OR type = 'E'.
l_error = abap_true.
ENDLOOP.
IF l_error = abap_false.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
PERFORM add_msg_to_prot.
ENDFORM.
Wichtig: bitte beachten Sie, dass in Ihrem Migrationsprogramm auch im Testlauf ein Rollback gemacht wird, bspw. mithilfe des BAPI_TRANSACTION_ROLLBACK. Andernfalls bauen sich bei vielen zu migrierenden/testenden Anlagen Puffer- und Arbeitstabellen so auf, dass die Performance rapide in den Keller geht und die Laufzeit exponentiell ansteigt.
(Quelle: Hinweis 2554160 - SAP-S/4HANA-Migrationscockpit: Anlage: Schlechtere Performance beim Simulationslauf)
*&---------------------------------------------------------------------*
*& Form UPLOAD_DATA
*&---------------------------------------------------------------------*
*& Anlagendatei uploaden
*&---------------------------------------------------------------------*
FORM upload_data .
DATA: l_buf TYPE string,
l_tabix TYPE sy-tabix.
CLEAR data_tab[].
CALL FUNCTION 'FAA_FILE_UPLOAD_EXCEL'
EXPORTING
i_filename = pa_fnam
i_delimiter = '~'
TABLES
et_filecontent = data_tab
EXCEPTIONS
error_accessing_file = 1
OTHERS = 2.
IF sy-subrc <> 0.
WRITE: / 'Fehler', sy-subrc, 'beim Upload der Datei', pa_fnam.
ENDIF.
LOOP AT data_tab INTO l_buf.
SPLIT l_buf AT '~' INTO
wa_mig-bukr
wa_mig-anlagenklasse
wa_mig-anlage
wa_mig-anlagenbezeichnung1
wa_mig-anlagenbezeichnung2
wa_mig-inventarnummer
wa_mig-aktivdatum
wa_mig-kostenst
wa_mig-standort
wa_mig-seriennummer
wa_mig-filiale
wa_mig-innenauftrag_kost2
wa_mig-hgb_afaschl
wa_mig-hgb_ntz
wa_mig-hgb_per
wa_mig-hgb_nafabeg
wa_mig-hbg_kumanschwert
wa_mig-hgb_kumnormalafa
wa_mig-ifrs_afaschl
wa_mig-ifrs_ntz
wa_mig-ifrs_per
wa_mig-ifrs_nafabeg
wa_mig-ifrs_kumanschwert
wa_mig-ifrs_kumnormalafa.
APPEND wa_mig TO it_mig.
ENDLOOP.
* Irrelevante Zeilen (Überschriften etc.) ausfiltern
LOOP AT it_mig INTO wa_mig.
l_tabix = sy-tabix.
"ist die erste Spalte ein gültiger Buchungskreis?
"dann gehen wir davon aus, dass es sich um eine Anlagenzeile handelt
SELECT SINGLE COUNT(*) FROM t001 WHERE bukrs = wa_mig-bukr.
IF sy-subrc NE 0.
DELETE it_mig INDEX l_tabix.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form MAP_DATA
*&---------------------------------------------------------------------*
*& Upload daten in SAP BAPI-Strukturen überführen
*&---------------------------------------------------------------------*
FORM map_data .
PERFORM init.
"Buchungskreisdaten lesen
SELECT SINGLE * FROM t001 WHERE bukrs = wa_mig-bukr.
*&---------------------------------------------------------------------*
* Schlüssel (mit Altanlagennummer füllen)
*&---------------------------------------------------------------------*
key-companycode = wa_mig-bukr.
key-asset = wa_mig-inventarnummer.
key-subnumber = 0.
*&---------------------------------------------------------------------*
* Allg. Daten
*&---------------------------------------------------------------------*
PERFORM _convert USING wa_mig-anlagenklasse generaldata-assetclass 'ANLKL'.
generaldata-descript = wa_mig-anlagenbezeichnung1.
generaldata-descript2 = wa_mig-anlagenbezeichnung2.
generaldata-serial_no = wa_mig-seriennummer.
generaldata-invent_no = wa_mig-inventarnummer.
generaldatax-assetclass = abap_true.
generaldatax-descript = abap_true.
generaldatax-descript2 = abap_true.
generaldatax-serial_no = abap_true.
generaldatax-invent_no = abap_true.
*&---------------------------------------------------------------------*
* Buchungsinfos
*&---------------------------------------------------------------------*
PERFORM _convert USING wa_mig-aktivdatum postinginformation-cap_date 'AKTIVD'.
postinginformationx-cap_date = abap_true.
*&---------------------------------------------------------------------*
* Zeitabhängige Daten
*&---------------------------------------------------------------------*
timedependentdata-location = wa_mig-standort.
timedependentdatax-location = abap_true.
PERFORM _convert USING wa_mig-kostenst timedependentdata-costcenter 'KOSTL'.
timedependentdatax-costcenter = abap_true.
"INTERN_ORD
"PLANT
*&---------------------------------------------------------------------*
* Bewertungsbereichsdaten
*&---------------------------------------------------------------------*
* 01 HGB / local GAAP
IF generaldata-assetclass <> '00013000'. "IFRS Leasingobjekte
depreciationareasx-area = depreciationareas-area = '01'.
TRANSLATE wa_mig-hgb_afaschl TO UPPER CASE.
CASE wa_mig-hgb_afaschl.
WHEN 'LINEAR'. depreciationareas-dep_key = 'LINI'.
WHEN 'KEINE'. depreciationareas-dep_key = '0000'.
WHEN 'MANUELL'. depreciationareas-dep_key = 'MANU'.
ENDCASE.
depreciationareas-ulife_yrs = wa_mig-hgb_ntz.
depreciationareas-ulife_prds = wa_mig-hgb_per.
PERFORM _convert USING wa_mig-hgb_nafabeg depreciationareas-odep_start_date 'BF_AFABG'.
APPEND depreciationareas.
depreciationareasx-dep_key = abap_true.
depreciationareasx-ulife_yrs = abap_true.
depreciationareasx-ulife_prds = abap_true.
depreciationareasx-odep_start_date = abap_true.
APPEND depreciationareasx.
ENDIF.
* 02 IFRS
depreciationareasx-area = depreciationareas-area = '30'.
TRANSLATE wa_mig-ifrs_afaschl TO UPPER CASE.
CASE wa_mig-ifrs_afaschl.
WHEN 'LINEAR'. depreciationareas-dep_key = 'LINI'.
WHEN 'KEINE'. depreciationareas-dep_key = '0000'.
WHEN 'MANUELL'. depreciationareas-dep_key = 'MANU'.
ENDCASE.
depreciationareas-ulife_yrs = wa_mig-ifrs_ntz.
depreciationareas-ulife_prds = wa_mig-ifrs_per.
PERFORM _convert USING wa_mig-ifrs_nafabeg depreciationareas-odep_start_date 'BF_AFABG'.
APPEND depreciationareas.
depreciationareasx-dep_key = abap_true.
depreciationareasx-ulife_yrs = abap_true.
depreciationareasx-ulife_prds = abap_true.
depreciationareasx-odep_start_date = abap_true.
APPEND depreciationareasx.
*&---------------------------------------------------------------------*
* Kumulierte Anlagenwerte
*&---------------------------------------------------------------------*
* 01 HGB
IF generaldata-assetclass <> '00013000'. "IFRS Leasingobjekte
cumulatedvalues-fisc_year = '2018'.
cumulatedvalues-area = '01'.
PERFORM _convert USING wa_mig-hbg_kumanschwert cumulatedvalues-acq_value 'BF_KANSW'.
PERFORM _convert USING wa_mig-hgb_kumnormalafa cumulatedvalues-ord_dep 'BF_KNAFA'.
* Achtung: kum.AfA muss negativ vorgegeben werden
MULTIPLY cumulatedvalues-ord_dep BY -1.
cumulatedvalues-currency = t001-waers.
APPEND cumulatedvalues.
ENDIF.
* 02 IFRS
cumulatedvalues-fisc_year = '2018'.
cumulatedvalues-area = '30'.
PERFORM _convert USING wa_mig-ifrs_kumanschwert cumulatedvalues-acq_value 'BF_KANSW'.
PERFORM _convert USING wa_mig-ifrs_kumnormalafa cumulatedvalues-ord_dep 'BF_KNAFA'.
* Achtung: kum.AfA muss negativ vorgegeben werden
MULTIPLY cumulatedvalues-ord_dep BY -1.
cumulatedvalues-currency = t001-waers.
APPEND cumulatedvalues.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form PROTOCOL
*&---------------------------------------------------------------------*
*& Return-Tabelle ausgeben
*&---------------------------------------------------------------------*
FORM protocol .
* define how message should be displayed
PERFORM create_display_profile
CHANGING
g_s_display_profile.
* display log
INSERT g_log_handle INTO TABLE g_t_log_handle.
CALL FUNCTION 'BAL_DSP_LOG_DISPLAY'
EXPORTING
i_s_display_profile = g_s_display_profile
i_t_log_handle = g_t_log_handle
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form F4_FILENAME
*&---------------------------------------------------------------------*
*& F4 Hilfe Excel-Datei
*&---------------------------------------------------------------------*
FORM f4_filename .
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.
*&---------------------------------------------------------------------*
*& Form INIT
*&---------------------------------------------------------------------*
*& BAPI-Strukturen und -tabellen initialisieren
*&---------------------------------------------------------------------*
FORM init .
CLEAR: key,
reference,
createsubnumber,
creategroupasset,
testrun,
generaldata,
generaldatax,
inventory,
inventoryx,
postinginformation,
postinginformationx,
timedependentdata,
timedependentdatax,
allocations,
allocationsx,
origin,
originx,
investacctassignmnt,
investacctassignmntx,
networthvaluation,
networthvaluationx,
realestate,
realestatex,
insurance,
insurancex ,
leasing,
leasingx,
companycode,
asset,
subnumber,
assetcreated,
depreciationareas[],
depreciationareasx[],
investment_support[],
extensionin[],
cumulatedvalues[],
postedvalues[],
transactions[],
proportionalvalues[],
return[],
postingheaders[].
CLEAR: depreciationareas,
depreciationareasx,
investment_support,
extensionin,
cumulatedvalues,
postedvalues,
transactions,
proportionalvalues,
return,
postingheaders.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form _CONVERT
*&---------------------------------------------------------------------*
*& Daten ins SAP-Format konvertieren
*&---------------------------------------------------------------------*
*& --> in/out Ein/Ausgabe
*& --> Dtel Datenelement
*&---------------------------------------------------------------------*
FORM _convert USING in out VALUE(dtel).
CALL FUNCTION 'RS_CONV_EX_2_IN_DTEL'
EXPORTING
input_external = in
dtel = dtel
IMPORTING
output_internal = out.
IF sy-subrc <> 0.
WRITE: / 'Fehler', sy-subrc, 'bei der Konvertierung von', in, 'Datenelement', dtel.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form INIT_PROTOCOL
*&---------------------------------------------------------------------*
*& Anwendungsprotokoll aufbauen
*&---------------------------------------------------------------------*
FORM init_protocol .
DATA:
l_s_message_defaults TYPE bal_s_mdef.
* create a log
g_s_log-extnumber = 'Anlagenmigration'(ext).
CALL FUNCTION 'BAL_LOG_CREATE'
EXPORTING
i_s_log = g_s_log
IMPORTING
e_log_handle = g_log_handle
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* set default log for all following messages
l_s_message_defaults-log_handle = g_log_handle.
CALL FUNCTION 'BAL_GLB_MSG_DEFAULTS_SET'
EXPORTING
i_s_msg_defaults = l_s_message_defaults
EXCEPTIONS
OTHERS = 0.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CREATE_DISPLAY_PROFILE
*&---------------------------------------------------------------------*
*& Protokollausgabe individualisieren
*&---------------------------------------------------------------------*
*& <-- C_S_DISPLAY_PROFILE
*&---------------------------------------------------------------------*
FORM create_display_profile
CHANGING
c_s_display_profile TYPE bal_s_prof.
DATA:
l_s_fcat TYPE bal_s_fcat,
l_s_sort TYPE bal_s_sort.
* set title of dynpro
c_s_display_profile-title = 'Migrationsprotokoll Anlagen'(set).
* set header of tree
c_s_display_profile-head_text = 'Alte AnlagenNr'(raf).
c_s_display_profile-head_size = 35.
* set size of tree
c_s_display_profile-tree_size = 22.
* set report for display variants
c_s_display_profile-disvariant-report = sy-repid.
* when you use also other ALV lists in your report,
* please specify a handle to distinguish between the display
* variants of these different lists, e.g:
c_s_display_profile-disvariant-handle = 'LOG'.
* all messages should be displayed immediately
c_s_display_profile-show_all = 'X'.
************* define structure of message table
* message text
CLEAR l_s_fcat.
l_s_fcat-ref_table = 'BAL_S_SHOW'.
l_s_fcat-ref_field = 'T_MSG'.
l_s_fcat-outputlen = 50.
l_s_fcat-col_pos = 1.
APPEND l_s_fcat TO c_s_display_profile-mess_fcat.
* alte Anlagen Nummer
CLEAR l_s_fcat.
l_s_fcat-ref_table = 'BAL_S_EX03'.
l_s_fcat-ref_field = 'INVOICE'.
l_s_fcat-coltext = 'ALTANLAGE'(c01).
l_s_fcat-col_pos = 2.
APPEND l_s_fcat TO c_s_display_profile-mess_fcat.
************* define structure of level 1 in tree
* external number
CLEAR l_s_fcat.
l_s_fcat-ref_table = 'BAL_S_SHOW'.
l_s_fcat-ref_field = 'EXTNUMBER'.
l_s_fcat-outputlen = 40.
APPEND l_s_fcat TO c_s_display_profile-lev1_fcat.
************* define structure of level 2 in tree
CLEAR l_s_fcat.
l_s_fcat-ref_table = 'BAL_S_EX04'.
l_s_fcat-ref_field = 'TXT_CARRID'.
l_s_fcat-is_extern = 'X'.
l_s_fcat-col_pos = 1.
APPEND l_s_fcat TO c_s_display_profile-lev2_fcat.
* define callback routine which derives the external fields
c_s_display_profile-clbk_read-userexitt = const_callback_form.
c_s_display_profile-clbk_read-userexitp = sy-repid.
c_s_display_profile-clbk_read-userexitf = 'CALLBACK_READ'.
* define if grid is to be used for display
c_s_display_profile-use_grid = abap_true.
* define up to which level the tree should be expanded
c_s_display_profile-exp_level = 1.
ENDFORM.
*--------------------------------------------------------------------
* FORM callback_read
*--------------------------------------------------------------------
FORM callback_read "#EC CALLED
USING "#EC CALLED
i_s_info TYPE bal_s_cbrd "#EC CALLED #EC NEEDED
CHANGING "#EC CALLED
c_display_data TYPE bal_s_show "#EC NEEDED
c_context_header TYPE bal_s_cont "#EC NEEDED
c_context_message TYPE bal_s_cont "#EC NEEDED
c_field TYPE any. "#EC NEEDED
STATICS:
l_s_context TYPE bal_s_ex03.
IF i_s_info-ref_table = 'BAL_S_EX04' AND
i_s_info-ref_field = 'TXT_CARRID'.
* give back DATEV-Anlagennummer
l_s_context = c_context_message-value.
c_field = l_s_context-invoice.
ENDIF.
ENDFORM.
*--------------------------------------------------------------------
* FORM ADD_MSG_TO_PROT
*--------------------------------------------------------------------
FORM add_msg_to_prot.
DATA:
l_s_msg TYPE bal_s_msg,
l_s_context TYPE bal_s_ex03.
DATA:
l_s_return LIKE LINE OF return.
LOOP AT return INTO l_s_return.
* define data of message for Application Log
l_s_msg-msgty = l_s_return-type.
l_s_msg-msgid = l_s_return-id.
l_s_msg-msgno = l_s_return-number.
l_s_msg-msgv1 = l_s_return-message_v1.
l_s_msg-msgv2 = l_s_return-message_v2.
l_s_msg-msgv3 = l_s_return-message_v3.
l_s_msg-msgv4 = l_s_return-message_v4.
l_s_context-invoice = wa_mig-inventarnummer. "DATEV-Nummer
l_s_msg-context-tabname = 'BAL_S_EX03'.
l_s_msg-context-value = l_s_context.
* add this message to log file
* we do not specify I_LOG_HANDLE since we want to add this message
* to the default log. If it does not exist we do not care
* (EXCEPTIONS log_not_found = 0).
CALL FUNCTION 'BAL_LOG_MSG_ADD'
EXPORTING
* I_LOG_HANDLE =
i_s_msg = l_s_msg
EXCEPTIONS
log_not_found = 0
OTHERS = 1.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDLOOP.
ENDFORM.
Die Ergebnisse werden in einem Anwendungsprotokoll ausgegeben, wobei zur leichteren Fehlersuche die Meldungen unter der Nummer der Altanlage referenziert werden.
Über den Selektionsparameter "Testlauf" kann die Migration zunächst getestet werden, um vor der Übernahme etwaige Fehler zu eliminieren.
Folgendes ist bei der Übernahme noch zu beachten:
- Gegeben seien folgende Rahmenbedingungen:
- Geschäftsjahr = Kalenderjahr
- Die Übernahme erfolge zum 31.12.2017
- Bei der Übernahme muss das Geschäftsjahr 2017 in der Anlagenbuchhaltung abgeschlossen sein (AJAB).
- Die Übernahme muss zum letzten Buchungstag des letzten geschlossenen Geschäftsjahres erfolgen (31.12.17)
- Das Übernahmejahr ist kurioserweise das Folgejahr (also 2018 im vorliegenden Fall).
- Es muss bereits das Übernahmejahr (2018) per Saldovortrag in der AnBu geöffnet worden sein (FAGLGVTR).