Overblog
Edit post Folge diesem Blog Administration + Create my blog
SAPManDoo - SAP Resource

Der vorliegende Blog enthält von mir im Laufe meiner beruflichen Tätigkeit als SAP-Berater zusammengetragene Informationen / Beispiel-Codings zum Themenkreis SAP, speziell FI/CO.

Automatische Generierung von CO-Vorschlagskontierungen (OKB9)

Veröffentlicht am 17. Februar 2011 von sapmandoo in SAP Reports

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:

image001

 

Texte:

image003.png

 

image005.png

   

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

Kommentiere diesen Post