Overblog Alle Blogs
Folge diesem Blog Administration + Create my blog
MENU
Werbung
SAPManDoo - SAP Resource

s4

Anlagen-Migration unter S/4 HANA mithilfe des BAPIs

26. Juni 2018 , Geschrieben von sapmandoo Veröffentlicht in #AA, #Basis-Entwicklung allg., #S4

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

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"

IMG-Pfad "Datenübernahme Anlagen"

Eingabe von Übernahmestatus, -belegart und -datum pro Buchungskreis

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 **************************************
***********************************************************************
TABLESt001.
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.

TYPESBEGIN 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.

DATAit_mig TYPE TABLE OF ty_mig,
      wa_mig TYPE ty_mig.

DATAkey                  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.

DATAcompanycode  LIKE  bapi1022_1-comp_code,
      asset        LIKE  bapi1022_1-assetmaino,
      subnumber    LIKE  bapi1022_1-assetsubno,
      assetcreated LIKE  bapi1022_reference.

DATAdepreciationareas  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.

DATAdata_tab TYPE TABLE OF string.



 

*&---------------------------------------------------------------------*
*& SELECTION-SCREEN
*&---------------------------------------------------------------------*
PARAMETERSpa_test AS CHECKBOX DEFAULT 'X'.
PARAMETERSpa_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(frWITH 'Datei enthält keine' 'verarbeitbaren' 'Datensätze'.
  ENDIF.

*&---------------------------------------------------------------------*
*& Form BAPI_CALL
*&---------------------------------------------------------------------*
*& Anlagen-Migrations-BAPI rufen, Meldungen speichern und f...ing COMMIT
*&---------------------------------------------------------------------*
FORM bapi_call.

  DATAl_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 .

  DATAl_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 .

  CLEARkey,
         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[].

  CLEARdepreciationareas,
         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.

Migrationsprotokoll

Migrationsprotokoll

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). 
Weiterlesen
Werbung

Gegenkonto - das unbekannte Wesen...

19. Januar 2017 , Geschrieben von sapmandoo Veröffentlicht in #FI, #S4

Relevante SAP-Hinweise:

  • 112312 - Einzelposten: Anzeige von Gegenkontoinformationen
  • 1034354 - FAGLL03: Anzeige von Gegenkontoinformationen
  • 1504612 - Einzelposten: Gegenkontoinformationen(BADI FI_ITEMS_CH_DATA)

Grundlagen

Öfter werde ich von Kunden oder auch Kollegen gefragt, wie denn die Gegenkontoinformationen in den Einzelpostenlisten (FBLxN, FAGLL03 usw.) ermittelt werden und wie man dies ggf. nachvollziehen oder gar beeinflussen kann:

 

Gegenkonto - das unbekannte Wesen...

Sofern die Hinweise 112312 bzw. 1034354/1504612 eingebaut wurden, lassen sich in den einschlägigen Einzelpostenanzeigen Gegenkontoinformationen einblenden, bestehend aus Gegenkontoart (S = Sachkonto, K = Kreditor, D = Debitor) und der Nummer des Gegenkontos.

Bei zweizeiligen Belegen ist die Auswahl des Gegenkontos ja eindeutig, d.h. bei einer Buchung

            Aufwand 100,--    an   Kreditor 100,--

ist die Gegenbuchung natürlich die jeweils andere Belegposition.

Bei drei- und mehrzeiligen Belegen muss ggf. eine Auswahl des Gegenkontos (nach Signifikanz) erfolgen:

Aufwand1 100,--

            Aufwand2 200,--

Aufwand3 300,--

Vorsteuer 60,--     an    Kreditor 660,--

 

Für die Ermittlung des Gegenkontos steht in der SAP Standardauslieferung der Funktionsbaustein GET_GKONT zur Verfügung. In diesem sind drei verschiedene Verfahren zur Bestimmung des signifikanten Gegenkontos implementiert - die Auswahl des Verfahrens erfolgt durch den Import-Parameter GKNKZ.

GKNKZ

Beschreibung

Ermitteltes Gegenkonto im o.g. Beispielbeleg (aus Sicht des kreditorischen Postens)

1

Es wird nur dann ein Gegenkonto zurückgeliefert, wenn es eindeutig ermittelt werden kann. Automatisch erzeugte Belegzeilen (wie bspw. Steuerzeilen) werden dabei ignoriert.

./.

2

Das betragsmäßig höchste Gegenkonto ohne Berücksichtigung automatisch generierter Belegzeilen wird zurückgeliefert.

Aufwand3

3

Das betragsmäßig höchste Gegenkonto mit Berücksichtigung automatisch generierter Belegzeilen wird zurückgeliefert.

Aufwand3

 

Werden zur Gegenkontoermittlung die weiter oben genannten Hinweise ohne Abwandlung implementiert, greift das Verfahren 3.

Erweiterung der bestehenden Verfahren

Kundenspezifische Ermittlungslogik

In vielen Fällen reicht die oben genannte Logik zur Gegenkontoermittlung aus. Im Einzelfall kann jedoch die Anforderung bestehen, den oben beschrieben Verfahren eigene, ausgefeiltere Methoden hinzuzufügen. Hierzu kann dann der Funktionsbaustein GET_GKONT in den Kundennamensraum kopiert (z.B. als Z_GET_GKONT) und anstelle des Standard-Bausteins an den entsprechenden Coding-Stellen in den Hinweisen 112312 bzw. 1034354 und 1504612 gerufen werden. Hierzu sind natürlich gewisse ABAP-Kenntnisse nötig.

Eine mögliche Anforderung könnte z.B. sein, dass als Gegenkonto von Sachkontenpositionen Kontokorrentpositionen grundsätzlich Vorrang haben sollen, auch wenn sie betragsmäßig kleiner sind als andersartige Gegenpositionen.

 

Beispiel:

Aufwand1 100,--

            Aufwand2 200,--

Aufwand3 300,--    an Kreditor 220,--

Vorsteuer 60,--            Kasse 440,--

 

Die Standard-Gegenkontoermittlung würde bei Abfrage des Gegenkontos aus Sicht eines der Aufwandskonten das Kassenkonto zurückliefern, weil es betragsmäßig signifikanter ist als die kreditorische Gegenposition. Genau hier soll aber ein „Override“ eingebaut werden, dass die Kontokorrentposition trotzdem Vorrang erhält. Das Verfahren erhält in unserem Beispiel die Kennzeichnung ‚4‘.

Hierzu passen wir die Form-Routine GKONT_ERMITTELN in unserer kundeneigenen Funktionsgruppe geeignet an:

*---- NEUES VERFAHREN 4 (wie 3, aber Vorfahrt für Kontokorrente)
WHEN '4'.
  IF BSEG-SHKZG = 'S'.
*   nur dann neu setzen, wenn Betrag höher ODER ein Kontokorrent daherkommt
*   UND nicht schon bereits ein Kontokorrent als Gegenkonto gesetzt ist
   IF BSEG-DMBTR > GKSUM_S OR BSEG-KOART CA 'DK' AND KOART_S CN 'DK'.

(Haben-Seite analog)

Das Beispielcoding aus den weiter oben genannten Hinweisen ist dann entsprechend anzupassen.

Beispiel-Coding aus Hinweis 1504612:

DATA: wa_items TYPE rfposxext.

LOOP AT ct_items INTO wa_items.

CALL FUNCTION 'Z_GET_GKONT'
  EXPORTING
     belnr = wa_items-belnr
     bukrs = wa_items-bukrs
     buzei = wa_items-buzei
     gjahr = wa_items-gjahr
     gknkz = '4'
  IMPORTING
     gkont = wa_items-gkont
     koart = wa_items-gkart
  EXCEPTIONS
     belnr_not_found = 1
     buzei_not_found = 2
     gknkz_not_found = 3
     OTHERS = 4.

IF sy-subrc = 0.
  MODIFY ct_items FROM wa_items.
ENDIF.

ENDLOOP.
Zusätzliche Gegenkontoinformationen

Eine immer wiederkehrende Anforderung in dem Themenkreis „Gegenkonto“ ist, dass zusätzlich zur Art und Nummer des Gegenkontos auch die entsprechende Bezeichnung anzeigbar gemacht werden soll. Hierzu lässt sich der Feldvorrat der Einzelpostenlisten um das Feld „Bez. Gegenkonto“ erweitern. Details dazu siehe hier, Abschnitt "Hinzufügen eigener Felder".

Es ist nun ein leichtes, nach erfolgreicher Gegenkontoermittlung anhand der Kontoart und der Nummer aus den entsprechenden Stammsatztabellen die Bezeichnung zu lesen und bereitzustellen.

Das obenstehende Beispielcoding kann dazu bspw. wie folgt erweitert werden:

CALL FUNCTION 'Z_GET_GKONT'
  EXPORTING
     belnr = wa_items-belnr
     bukrs = wa_items-bukrs
     buzei = wa_items-buzei
     gjahr = wa_items-gjahr
     gknkz = '4'

  IMPORTING
     gkont = wa_items-gkont
     koart = wa_items-gkart
  EXCEPTIONS
     belnr_not_found = 1
     buzei_not_found = 2
     gknkz_not_found = 3
     OTHERS = 4.

CASE wa_items_gkart. "das neue Feld heisse zzgkbez.

  WHEN ‚S‘.

    SELECT SINGLE txt50 INTO wa_items-zzgkbez FROM SKAT

      WHERE KTOPL = <Kontenplan>

       AND SAKNR = wa_items-gkont

       AND SPRAS = sy-langu.

  WHEN ‘K’.

    SELECT SINGLE name1 INTO wa_items-zzgkbez FROM LFA1

      WHERE LIFNR = wa_items-gkont.

  WHEN ‘D’.

    SELECT SINGLE name1 INTO wa_items-zzgkbez FROM KNA1

     WHERE KUNNR = wa_items-gkont.

ENDCASE.

 

Neuerungen zu S/4:

Im S/4 werden die Gegenkontoinformationen automatisch im Zuge der Buchung in die entsprechenden Felder der ACDOCA abgefüllt, so dass eine Anreicherung der Gegenkontoinformationen wie oben beschrieben nicht nötig ist. Hierzu wird im Customizing unter Finanzwesen - Hauptbuchhaltung - Informationssystem - Gegenkontoermittlungsart definieren die gewünschte Gegenkontoermittlung aktiviert (1, 2 oder 3, s.o.)  

In den neuen Einzelpostenbrowsern

FBL1H Kreditoreneinzelposten
FBL5H Debitoreneinzelposten
FAGLL03H Sachkonteneinzelposten

sind im Feldvorrat zudem bereits zahlreiche Texte u.a. zu Stammdatenobjekten verfügbar, z.B. die Bezeichnung des Gegenkontos, Kostenstellentexte und so weiter. 

 

 

Weiterlesen
<< < 1 2