Assist-Klasse

Vollständiger Code der Klasse ZCL_FI_BILENDO_ASSIST_V2 mit Erklärung.

Übersicht

Die ZCL_FI_BILENDO_ASSIST_V2 ist die zentrale Helferklasse für die Bilendo-Integration in SAP. Sie wird von beiden Hauptberichten (Extractor und Re-Integrate) verwendet und verwaltet die Datenextraktion, -verarbeitung und Stammdatenverwaltung. Version 2.1, Copyright Bilendo GmbH.

Methoden-Übersicht

MethodeSichtbarkeitImportExportÄndernBeschreibung
BSEG_FILE_TO_SERVERpublicif_dataset, it_bsegef_msg-Schreibt BSEG-Daten in eine Textdatei auf den Server
CLEARpublic---Löscht alle internen Tabellen
CONSTRUCTORpublicit_seltab--Initialisiert die Klasse mit Selektionsparametern
CREDIT_LIMIT_CHANGEpublicis_credit_info, is_credit_limit--Aktualisiert Kreditlimit und Rating im Kundenstamm
CUSTOMER_CHANGEpublic---Aktualisiert Kundenstammdaten (Mahnung, Sicherheiten)
DELETE_FILESpublic---Löscht Dateien aus dem Anwendungsverzeichnis
DOC_CHANGEpublicis_journal--Ändert Dokumentfelder (Mahnung, Mahnstufe, Mahnatum)
GET_ADDITIONALpublic--ct_bsegErmittelt zusätzliche Daten zu Buchhaltungssegmenten
GET_BSADpublic---Liest alte Buchhaltungssätze (ausgegebene Rechnungen)
GET_BSEGpublic---Liest kombinierte Buchhaltungssätze (BSAD + BSID)
GET_BSIDpublic---Liest offene Buchhaltungssätze (Debitorenbuchhaltung)
GET_DELTA_RESTRICTIONpublic---Filtert Änderungen basierend auf Zeitstempel
GET_FILESpublic---Liest Dateiliste aus Anwendungsverzeichnis
GET_KNA1public---Liest Kundenstammdaten mit Verkaufsorganisationen
GET_MANSP_CHANGESpublic---Ermittelt Änderungen an Mahnsperrdaten
GET_VKORGpublic--ct_bsegWeist Verkaufsorganisationen zu Kunden zu
KNA1_FILE_TO_SERVERpublic-ef_msg-Schreibt KNA1-Kundendaten in Textdatei
READ_CSVpublic---Liest CSV-Dateien für Kundendaten-Updates
SEND_EMAILpublici_message--Versendet E-Mail bei Fehlern
SET_BUKRSpublicif_bukrs--Setzt den Buchungskreis für Verarbeitung

Klassendefinition

CLASS zcl_fi_bilendo_assist_v2 DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.

    TYPES:
      BEGIN OF ty_s_vkorg,
        bukrs TYPE bukrs,
        kunnr TYPE kunnr,
        vkorg TYPE vkorg,
      END OF  ty_s_vkorg .
    TYPES:
      BEGIN OF  ty_s_credit_info,
        bukrs TYPE bukrs,
        kunnr TYPE kunnr,
        dbrtg TYPE dbrtg_cm,
        date  TYPE sydatum,
      END OF ty_s_credit_info .
    TYPES:
      BEGIN OF  ty_s_credit_limit,
        bukrs TYPE bukrs,
        kunnr TYPE kunnr,
        klimk TYPE klimk,
        ctlpc TYPE ctlpc_cm,
      END OF ty_s_credit_limit .
    TYPES:
      BEGIN OF ty_s_securities,
        bukrs TYPE bukrs,
        kunnr TYPE kunnr,
        vlibb TYPE vlibb,
      END OF ty_s_securities .
    TYPES:
      BEGIN OF ty_s_journal,
        bukrs TYPE bukrs,
        belnr TYPE belnr_d,
        gjahr TYPE gjahr,
        manst TYPE mahns_d,
        mansp TYPE mansp,
        madat TYPE madat,
        buzei TYPE buzei,
      END OF ty_s_journal .
    TYPES:
      BEGIN OF ty_s_customer,
        bukrs TYPE bukrs,
        kunnr TYPE kunnr,
        mahns TYPE mahns_d,
        mansp TYPE mansp,
        madat TYPE madat,
        vlibb TYPE vlibb,
      END OF ty_s_customer .
    TYPES:
      BEGIN OF ty_bkpf,
        bukrs TYPE bkpf-bukrs,
        belnr TYPE bkpf-belnr,
        gjahr TYPE bkpf-gjahr,
        cpudt TYPE bkpf-cpudt,
        cputm TYPE bkpf-cputm,
        aedat TYPE bkpf-aedat,
      END OF ty_bkpf .

    DATA af_dataset_bseg TYPE string .
    DATA af_dataset_kna1 TYPE string .
    DATA at_bseg TYPE zfi_t_bilendo_bseg .
    DATA at_kna1 TYPE zfi_t_bilendo_kna1 .
    DATA at_bsad TYPE zfi_t_bilendo_bseg .
    DATA at_bsid TYPE zfi_t_bilendo_bseg .
    DATA af_dataset_bsid TYPE string .
    DATA af_dataset_bsad TYPE string .
    DATA:
      at_vkorg TYPE TABLE OF ty_s_vkorg .
    DATA:
      at_credit_info TYPE TABLE OF ty_s_credit_info .
    DATA:
      at_credit_limit TYPE TABLE OF ty_s_credit_limit .
    DATA:
      at_securities TYPE TABLE OF ty_s_securities .
    DATA:
      at_journal TYPE TABLE OF ty_s_journal .
    DATA:
      at_customer TYPE TABLE OF ty_s_customer .
    DATA at_adrnr TYPE zfi_adr6 .
    DATA ap_dir TYPE epsdirnam .
    DATA:
      at_dir_list TYPE TABLE OF epsfili .
    DATA at_bseg_final TYPE zfi_t_bilendo_bseg .
    DATA at_bsid_final TYPE zfi_t_bilendo_bseg .
    DATA at_bsad_final TYPE zfi_t_bilendo_bseg .
    DATA at_kna1_final TYPE zfi_t_bilendo_kna1 .
    DATA af_zone TYPE string .
    DATA:
      at_bkpf TYPE STANDARD TABLE OF ty_bkpf .
    DATA ar_cputm TYPE piq_selopt_t .

    METHODS credit_limit_change
      IMPORTING
        !is_credit_info  TYPE ty_s_credit_info OPTIONAL
        !is_credit_limit TYPE ty_s_credit_limit OPTIONAL .
    METHODS customer_change .
    METHODS doc_change
      IMPORTING
        !is_journal TYPE ty_s_journal OPTIONAL .
    METHODS delete_files .
    METHODS read_csv .
    METHODS get_additional
      CHANGING
        !ct_bseg TYPE zfi_t_bilendo_bseg .
    METHODS get_vkorg
      CHANGING
        !ct_bseg TYPE zfi_t_bilendo_bseg .
    METHODS set_bukrs
      IMPORTING
        !if_bukrs TYPE bukrs .
    METHODS get_mansp_changes .
    METHODS bseg_file_to_server
      IMPORTING
        !if_dataset TYPE string
        !it_bseg    TYPE zfi_t_bilendo_bseg
      EXPORTING
        !ef_msg     TYPE string .
    METHODS get_bsad .
    METHODS get_bseg .
    METHODS get_bsid .
    METHODS kna1_file_to_server
      EXPORTING
        !ef_msg TYPE string .
    METHODS get_kna1 .
    METHODS constructor
      IMPORTING
        !it_seltab TYPE figen_t_rsparamsl_255 .
    METHODS clear .
    METHODS get_files .
    METHODS get_delta_restriction .
    METHODS send_email
      IMPORTING
        !i_message TYPE string .
protected section.

  data AF_BUKRS type BUKRS .
  data AF_KKBER type KKBER .
private section.

  data AR_BUKRS type PIQ_SELOPT_T .
  data AR_BLDAT type PIQ_SELOPT_T .
  data AR_AUGDT type PIQ_SELOPT_T .
  data AR_BUDAT type PIQ_SELOPT_T .
  data AR_CPUDT type PIQ_SELOPT_T .
  data AT_SELTAB type FIGEN_T_RSPARAMSL_255 .
  data AP_ALL type XFELD .
  data AP_JOURNAL type STRING .
  data AP_CREDIT_LIMIT type STRING .
  data AP_SECURITIES type STRING .
  data AP_CREDIT_INFO type STRING .
  data AP_CUSTOMERS type STRING .
ENDCLASS.

Implementierung

METHOD BSEG_FILE_TO_SERVER

Konvertiert BSEG-Buchhaltungsdaten in ein durch Pipe-Zeichen separiertes Textformat und schreibt sie auf den Anwendungsserver. Die Methode führt Datenbereinigungen durch, konvertiert numerische Werte, ersetzt Sonderzeichen und berücksichtigt Kontierungsrichtungen bei der Formatierung von Beträgen.

METHOD BSEG_FILE_TO_SERVER.

  DATA: lf_string       TYPE string,
        lt_string       TYPE TABLE OF string,
        ls_bseg         TYPE zfi_s_bilendo_bseg,
        lf_dmbtr(20),
        lf_wrbtr(20),
        lf_zbd1t(20),
        lf_zbd2t(20),
        lf_zbd3t(20),
        lf_xblnr(29),
        lf_madat(8),
        lf_dataset_bseg TYPE string.

  CONCATENATE 'NAME'
              'KUNNR'
              'BELNR'
              'BLDAT'
              'XBLNR'
              'ZUONR'
              'BLART'
              'SGTXT'
              'BUKRS'
              'VKORG'
              'DUEDATE'
              'VKGRP'
              'AUFNR'
              'MANST'
              'MANSP'
              'ZTERM'
              'AUGBL'
              'BKTXT'
              'PENRC'
              'CPUDT'
              'MADAT'
              'BUZEI'
              'BUSAB'
              'AUGGJ'
              'AUGDT'
              'GJAHR'
              'DMSHB'
              'HWAER'
              'WRBTR'
              'WAERS'
              'GSBER'
              'AKONT'
              'UMSKZ'
              'KKBER'
              'SHKZG'
              'BSCHL'
    INTO lf_string SEPARATED BY '|'.
  APPEND lf_string TO lt_string.

  LOOP AT  it_bseg INTO ls_bseg.
    CLEAR: lf_dmbtr,
           lf_wrbtr,
           lf_madat,
           lf_zbd1t,
           lf_zbd2t,
           lf_zbd3t,
           lf_xblnr,
           lf_string.

    lf_dmbtr = ls_bseg-dmbtr.
    CONDENSE lf_dmbtr.
    IF ls_bseg-shkzg = 'H'.
      CONCATENATE '-' lf_dmbtr  INTO lf_dmbtr.
    ENDIF.
    lf_wrbtr = ls_bseg-wrbtr.
    CONDENSE lf_wrbtr.
    IF ls_bseg-shkzg = 'H'.
      CONCATENATE '-' lf_wrbtr  INTO lf_wrbtr.
    ENDIF.
    IF ls_bseg-madat IS INITIAL.
      lf_madat = ''.
    ELSE.
      lf_madat = ls_bseg-madat.
    ENDIF.
    lf_zbd1t = ls_bseg-zbd1t.
    CONDENSE lf_zbd1t.
    lf_zbd2t = ls_bseg-zbd2t.
    CONDENSE lf_zbd2t.
    lf_zbd3t = ls_bseg-zbd3t.
    CONDENSE lf_zbd3t.

    IF ls_bseg-maber IS NOT INITIAL.
      ls_bseg-spezber = ls_bseg-maber.
    ELSE.
      IF ls_bseg-gsber IS NOT INITIAL.
        ls_bseg-spezber = ls_bseg-gsber.
      ENDIF.
    ENDIF.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        input  = ls_bseg-kunnr
      IMPORTING
        output = ls_bseg-kunnr.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        input  = ls_bseg-akont
      IMPORTING
        output = ls_bseg-akont.
    REPLACE ALL OCCURRENCES OF REGEX '[;:",|#]' IN ls_bseg-name1 WITH '_'.
    REPLACE ALL OCCURRENCES OF REGEX '[;:",|#]' IN ls_bseg-sgtxt WITH '_'.
    REPLACE ALL OCCURRENCES OF REGEX '[;:",|#]' IN ls_bseg-xref1 WITH '_'.
    REPLACE ALL OCCURRENCES OF REGEX '[;:",|#]' IN ls_bseg-xref2 WITH '_'.
    REPLACE ALL OCCURRENCES OF REGEX '[;:",|#]' IN ls_bseg-zuonr WITH '_'.

    REPLACE ALL OCCURRENCES OF REGEX '[;:"|#]' IN ls_bseg-xblnr WITH space.
    IF ls_bseg-xblnr IS NOT INITIAL AND ls_bseg-xblnr CA ','.
      CONCATENATE '"' ls_bseg-xblnr '"' INTO lf_xblnr.
    ELSE.
      lf_xblnr = ls_bseg-xblnr.
    ENDIF.

    CONCATENATE ls_bseg-name1
                ls_bseg-kunnr
                ls_bseg-belnr
                ls_bseg-bldat
                lf_xblnr
                ls_bseg-zuonr
                ls_bseg-blart
                ls_bseg-sgtxt
                ls_bseg-bukrs
                ls_bseg-vkorg
                ls_bseg-zfbdt
                ls_bseg-vkgrp
                ls_bseg-aufnr
                ls_bseg-manst
                ls_bseg-mansp
                ls_bseg-zterm
                ls_bseg-augbl
                ls_bseg-bktxt
                ls_bseg-penrc
                ls_bseg-cpudt
                lf_madat
                ls_bseg-buzei
                ls_bseg-busab
                ls_bseg-auggj
                ls_bseg-augdt
                ls_bseg-gjahr
                lf_dmbtr
                ls_bseg-hwaer
                lf_wrbtr
                ls_bseg-waers
                ls_bseg-gsber
                ls_bseg-akont
                ls_bseg-umskz
                ls_bseg-kkber
                ls_bseg-shkzg
                ls_bseg-bschl
      INTO lf_string SEPARATED BY '|'.
    APPEND lf_string TO lt_string.
  ENDLOOP.

  lf_dataset_bseg = if_dataset.
  REPLACE FIRST OCCURRENCE OF 'CC' IN lf_dataset_bseg WITH af_zone.
  OPEN DATASET lf_dataset_bseg FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
  IF sy-subrc = 0.
    LOOP AT lt_string INTO lf_string.
      TRANSFER lf_string TO lf_dataset_bseg.
    ENDLOOP.
    CLOSE DATASET lf_dataset_bseg.
    ef_msg = 'Datei & erfolgreich erzeugt'.
    REPLACE '&' IN ef_msg WITH lf_dataset_bseg.
  ELSE.
    ef_msg = 'Fehler beim Schreiben der Datei &'.
    REPLACE '&' IN ef_msg WITH lf_dataset_bseg.
  ENDIF.

ENDMETHOD.

METHOD CLEAR

Löscht alle Daten aus den internen Tabellen der Klasse. Dies wird typischerweise aufgerufen, wenn eine neue Iteration der Datenverarbeitung beginnt.

METHOD CLEAR.

  REFRESH :
  at_kna1,
  at_bsad,
  at_bsid,
  at_bseg,
  at_vkorg,
  at_bkpf.

ENDMETHOD.

METHOD CONSTRUCTOR

Initialisiert die Klasse und verarbeitet die vom Bericht übergebenen Selektionsparameter. Extrahiert Dateiname, Bukrs, Datumsbereichs und Zonenparameter aus der Selektionstafel.

METHOD constructor.

  DATA: ls_seltab  TYPE rsparamsl_255,
        lr_s_range TYPE selopt.

  at_seltab = it_seltab.

  LOOP AT at_seltab INTO ls_seltab WHERE selname = 'S_BUDAT'.
    IF ls_seltab-sign IS NOT INITIAL.
      CLEAR lr_s_range.
      MOVE-CORRESPONDING ls_seltab TO lr_s_range.
      APPEND lr_s_range TO ar_budat.
    ENDIF.
  ENDLOOP.
  LOOP AT  at_seltab INTO ls_seltab WHERE selname = 'S_BLDAT'.
    IF ls_seltab-sign IS NOT INITIAL.
      CLEAR lr_s_range.
      MOVE-CORRESPONDING ls_seltab TO lr_s_range.
      APPEND lr_s_range TO ar_bldat.
    ENDIF.
  ENDLOOP.
  LOOP AT at_seltab INTO ls_seltab WHERE selname = 'S_CPUDT'.
    IF ls_seltab-sign IS NOT INITIAL.
      CLEAR lr_s_range.
      MOVE-CORRESPONDING ls_seltab TO lr_s_range.
      APPEND lr_s_range TO ar_cpudt.
    ENDIF.
  ENDLOOP.
  IF sy-subrc <> 0.
    ar_cpudt = ar_budat.
  ENDIF.
  LOOP AT at_seltab INTO ls_seltab WHERE selname = 'S_AUGDT'.
    IF ls_seltab-sign IS NOT INITIAL.
      CLEAR lr_s_range.
      MOVE-CORRESPONDING ls_seltab TO lr_s_range.
      APPEND lr_s_range TO ar_augdt.
    ENDIF.
  ENDLOOP.
  LOOP AT at_seltab INTO ls_seltab WHERE selname = 'S_BUKRS'.
    IF ls_seltab-sign IS NOT INITIAL.
      CLEAR lr_s_range.
      MOVE-CORRESPONDING ls_seltab TO lr_s_range.
      APPEND lr_s_range TO ar_bukrs.
    ENDIF.
  ENDLOOP.

  LOOP AT at_seltab INTO ls_seltab WHERE selname = 'S_CPUTM'.
    IF ls_seltab-sign IS NOT INITIAL.
      CLEAR lr_s_range.
      MOVE-CORRESPONDING ls_seltab TO lr_s_range.
      APPEND lr_s_range TO ar_cputm.
    ENDIF.
  ENDLOOP.
  READ TABLE at_seltab INTO ls_seltab WITH KEY selname = 'P_F_KNA1'.
  af_dataset_kna1 = ls_seltab-low.
  READ TABLE at_seltab INTO ls_seltab WITH KEY selname = 'P_F_BSEG'.
  af_dataset_bseg = ls_seltab-low.
  READ TABLE at_seltab INTO ls_seltab WITH KEY selname = 'P_F_BSID'.
  af_dataset_bsid = ls_seltab-low.
  READ TABLE at_seltab INTO ls_seltab WITH KEY selname = 'P_F_BSAD'.
  af_dataset_bsad = ls_seltab-low.
  READ TABLE at_seltab INTO ls_seltab WITH KEY selname = 'P_ALL'.
  ap_all = ls_seltab-low.
  READ TABLE at_seltab INTO ls_seltab WITH KEY selname = 'P_DIR'.
  ap_dir = ls_seltab-low.
  READ TABLE at_seltab INTO ls_seltab WITH KEY selname = 'P_C_INFO'.
  ap_credit_info = ls_seltab-low.
  READ TABLE at_seltab INTO ls_seltab WITH KEY selname = 'P_C_LIM'.
  ap_credit_limit = ls_seltab-low.
  READ TABLE at_seltab INTO ls_seltab WITH KEY selname = 'P_SEC'.
  ap_securities = ls_seltab-low.
  READ TABLE at_seltab INTO ls_seltab WITH KEY selname = 'P_CUST'.
  ap_customers = ls_seltab-low.
  READ TABLE at_seltab INTO ls_seltab WITH KEY selname = 'P_JOURN'.
  ap_journal = ls_seltab-low.

  READ TABLE at_seltab INTO ls_seltab WITH KEY selname = 'P_EURO'
  kind = 'P' low = 'X'.
  IF sy-subrc = 0.
    af_zone = 'EUROPE'.
  ENDIF.
  READ TABLE at_seltab INTO ls_seltab WITH KEY selname = 'P_ASIA'
  kind = 'P' low = 'X'.
  IF sy-subrc = 0.
    af_zone = 'ASIA' .
  ENDIF.
  READ TABLE at_seltab INTO ls_seltab WITH KEY selname = 'P_US'
  kind = 'P' low = 'X'.
  IF sy-subrc = 0.
    af_zone = 'US'.
  ENDIF.
  READ TABLE at_seltab INTO ls_seltab WITH KEY selname = 'P_OTHR'
   kind = 'P' low = 'X'.
  IF sy-subrc = 0.
    af_zone = 'OTHERS'.
  ENDIF.

ENDMETHOD.

METHOD CREDIT_LIMIT_CHANGE

Aktualisiert die Kreditlimit und Bonitätsrating-Daten im Kundenstamm (Tabellen KNKK und KNKA). Die Methode verarbeitet sowohl Kreditlimit-Einträge als auch separate Bonitätsinformationen über die Funktion CREDITLIMIT_CHANGE.

METHOD CREDIT_LIMIT_CHANGE.

  DATA: ls_yknka TYPE knka,
        ls_yknkk TYPE knkk,
        ls_message TYPE string,
        ls_klimk   TYPE string.

  LOOP AT at_credit_limit INTO DATA(ls_credit_limit).

    CLEAR: ls_yknka, ls_yknkk.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = ls_credit_limit-kunnr
      IMPORTING
        output = ls_credit_limit-kunnr.

    SELECT SINGLE * FROM knkk INTO @DATA(ls_knkk)
      WHERE kunnr = @ls_credit_limit-kunnr
        AND kkber = @ls_credit_limit-bukrs.
    SELECT SINGLE * FROM knka INTO @DATA(ls_knka)
      WHERE kunnr = @ls_credit_limit-kunnr.
    IF ls_credit_limit IS NOT INITIAL.
      ls_knkk-klimk = ls_credit_limit-klimk.
    ENDIF.
    READ TABLE at_credit_info INTO DATA(ls_credit_info) WITH KEY
        bukrs = ls_credit_limit-bukrs
        kunnr = ls_credit_limit-kunnr.
    IF sy-subrc = 0.
      ls_knkk-dbrtg = ls_credit_info-dbrtg.
    ENDIF.

    CALL FUNCTION 'CREDITLIMIT_CHANGE'
      EXPORTING
        i_knka   = ls_knka
        i_knkk   = ls_knkk
        upd_knka = ' '
        upd_knkk = 'U'
        yknka    = ls_yknka
        yknkk    = ls_yknkk.

    IF sy-subrc EQ 0.
       COMMIT WORK.
     CONCATENATE 'Customer' ls_credit_limit-kunnr
       ls_credit_limit-bukrs
       'Master Data Updated for : Credit Limit &1,  Rating &2'(003)
       INTO ls_message SEPARATED BY space.
       MOVE ls_knkk-klimk to ls_klimk.
       REPLACE '&1' IN ls_message WITH ls_klimk.
       REPLACE '&2' IN ls_message WITH ls_knkk-dbrtg.
       MESSAGE ls_message TYPE 'S' DISPLAY LIKE 'I'.

   ELSE.
      CONCATENATE 'Error in Customer' ls_credit_limit-kunnr
      ls_credit_limit-bukrs
      'Master Data Updated for : Credit Limit &1,  Rating &2'(003)
       INTO ls_message SEPARATED BY space.
       MOVE ls_knkk-klimk to ls_klimk.
       REPLACE '&1' IN ls_message WITH ls_klimk.
       REPLACE '&2' IN ls_message WITH ls_knkk-dbrtg.
       MESSAGE ls_message TYPE 'I' DISPLAY LIKE 'I'.

       CALL METHOD me->SEND_EMAIL
         EXPORTING
           I_MESSAGE = ls_message
           .
    ENDIF.
  CLEAR : ls_message, ls_klimk.
  ENDLOOP.

  LOOP AT at_credit_info INTO ls_credit_info.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = ls_credit_info-kunnr
      IMPORTING
        output = ls_credit_info-kunnr.

    READ TABLE at_credit_limit INTO ls_credit_limit WITH KEY
        bukrs = ls_credit_info-bukrs
        kunnr = ls_credit_info-kunnr.
    IF sy-subrc <> 0.
      SELECT SINGLE * FROM knkk INTO @ls_knkk
  WHERE kunnr = @ls_credit_info-kunnr
    AND kkber = @ls_credit_info-bukrs.
      SELECT SINGLE * FROM knka INTO @ls_knka
        WHERE kunnr = @ls_credit_info-kunnr.

      ls_knkk-dbrtg = ls_credit_info-dbrtg.

      CALL FUNCTION 'CREDITLIMIT_CHANGE'
        EXPORTING
          i_knka   = ls_knka
          i_knkk   = ls_knkk
          upd_knka = ' '
          upd_knkk = 'U'
          yknka    = ls_yknka
          yknkk    = ls_yknkk.
    IF sy-subrc EQ 0.
       COMMIT WORK.
     CONCATENATE 'Customer' ls_credit_info-kunnr
      ls_credit_info-bukrs
      'Master Data Updated for : Rating &1'(005)
       INTO ls_message  SEPARATED BY space.
       REPLACE '&1' IN ls_message WITH ls_knkk-dbrtg.
    MESSAGE ls_message TYPE 'S' DISPLAY LIKE 'I'.
   ELSE.
      CONCATENATE 'Error in Customer' ls_credit_info-kunnr
       ls_credit_info-bukrs
       'Master Data Updated for : Rating &1'(005)
       INTO ls_message SEPARATED BY space.
      REPLACE '&1' IN ls_message WITH ls_knkk-dbrtg.
      MESSAGE ls_message TYPE 'I' DISPLAY LIKE 'I'.
      CALL METHOD me->SEND_EMAIL
         EXPORTING
           I_MESSAGE = ls_message
           .
    ENDIF.
    CLEAR : ls_message.
    ENDIF.

  ENDLOOP.

ENDMETHOD.

METHOD CUSTOMER_CHANGE

Aktualisiert Kundenstammdaten einschließlich Mahnstufe, Mahnsperr-Status, Mahnatum und Sicherheiten. Nutzt die Funktion SD_CUSTOMER_MAINTAIN_ALL zur Stammdatenverwaltung.

METHOD CUSTOMER_CHANGE.

  DATA: ls_master_data           TYPE cmds_ei_main,
        lt_customer              TYPE cmds_ei_extern_t,
        ls_company_data          TYPE cmds_ei_cmd_company,
        lt_company               TYPE cmds_ei_company_t,
        ls_company               TYPE cmds_ei_company,
        ls_dunning               TYPE cmds_ei_dunning,
        lt_dunning               TYPE cmds_ei_dunning_t,
        ls_master_data_correct   TYPE cmds_ei_main,
        ls_message_correct       TYPE cvis_message,
        ls_master_data_defective TYPE cmds_ei_main,
        ls_message_defective     TYPE cvis_message,
        ls_knb5                  TYPE fknb5,
        lt_yknb5                 TYPE TABLE OF fknb5,
        lt_xknb5                 TYPE TABLE OF fknb5,
        ls_kna1                  TYPE kna1,
        ls_knb1                  TYPE knb1,
        ls_message               TYPE string,
        ls_vlibb                 TYPE string,
        lf_save                  TYPE abap_bool.

  FIELD-SYMBOLS: <ls_customer> TYPE ty_s_customer.

  LOOP AT at_securities INTO DATA(ls_sec).
    UNASSIGN <ls_customer>.
    READ TABLE at_customer ASSIGNING <ls_customer>
      WITH KEY kunnr = ls_sec-kunnr
               bukrs = ls_sec-bukrs.
    IF sy-subrc = 0.
      <ls_customer>-vlibb = ls_sec-vlibb.
    ELSE.
      APPEND INITIAL LINE TO at_customer ASSIGNING <ls_customer>.
      IF <ls_customer> IS ASSIGNED.
        <ls_customer>-kunnr = ls_sec-kunnr.
        <ls_customer>-bukrs = ls_sec-bukrs.
        <ls_customer>-vlibb = ls_sec-vlibb.
      ENDIF.
    ENDIF.
  ENDLOOP.

  LOOP AT at_customer INTO DATA(ls_customer).

    CLEAR : ls_kna1, ls_knb5 , ls_knb1, lf_save.
    REFRESH : lt_xknb5, lt_yknb5.
    SELECT SINGLE * FROM kna1 INTO ls_kna1
      WHERE kunnr = ls_customer-kunnr.
    SELECT SINGLE * FROM knb1 INTO ls_knb1
      WHERE kunnr = ls_customer-kunnr
        AND bukrs = ls_customer-bukrs.
    IF sy-subrc <> 0.
     CONCATENATE 'Error : Customer' ls_customer-kunnr ls_customer-bukrs
    'Master Data Updated for : Dunning level &1, Dunning Block &2 , Last dunned On &3 , Amount Insured &4'(004)
        INTO ls_message SEPARATED BY space.
     REPLACE '&1' IN  ls_message WITH ls_customer-mahns .
     REPLACE '&2' IN  ls_message WITH ls_customer-mansp .
     REPLACE '&3' IN  ls_message WITH ls_customer-madat .
     MOVE   ls_customer-vlibb TO ls_vlibb.
     REPLACE '&4' IN  ls_message WITH ls_vlibb .
      MESSAGE ls_message TYPE 'I' DISPLAY LIKE 'I'.

        CALL METHOD me->SEND_EMAIL
         EXPORTING
           I_MESSAGE = ls_message
           .
      CLEAR : ls_message, ls_vlibb.
      CONTINUE.
    ENDIF.

    IF ls_customer-mahns IS NOT INITIAL
      OR ls_customer-mansp IS NOT INITIAL
      OR ls_customer-madat IS NOT INITIAL.
      lf_save = 'X'.
      SELECT SINGLE * FROM knb5 INTO CORRESPONDING FIELDS OF ls_knb5
        WHERE kunnr = ls_customer-kunnr
          AND bukrs = ls_customer-bukrs.
      IF sy-subrc = 0.
        APPEND ls_knb5 TO lt_yknb5.
        ls_knb5-kz = 'U'.
        ls_knb5-mahns = ls_customer-mahns.
        ls_knb5-mansp = ls_customer-mansp.
        ls_knb5-madat = ls_customer-madat.
        APPEND ls_knb5 TO lt_xknb5.
      ELSE.
        ls_knb5-kunnr = ls_customer-kunnr.
        ls_knb5-bukrs = ls_customer-bukrs.
        ls_knb5-kz = 'I'.
        ls_knb5-mahns = ls_customer-mahns.
        ls_knb5-mansp = ls_customer-mansp.
        ls_knb5-madat = ls_customer-madat.
        APPEND ls_knb5 TO lt_xknb5.
      ENDIF.
    ENDIF.
    IF ls_customer-vlibb IS NOT INITIAL .
      ls_knb1-vlibb = ls_customer-vlibb.
    ENDIF.

    CALL FUNCTION 'SD_CUSTOMER_MAINTAIN_ALL'
      EXPORTING
        i_kna1                  = ls_kna1
        i_knb1                  = ls_knb1
        pi_postflag             = 'X'
      TABLES
        t_xknb5                 = lt_xknb5
        t_yknb5                 = lt_yknb5
      EXCEPTIONS
        client_error            = 1
        kna1_incomplete         = 2
        knb1_incomplete         = 3
        knb5_incomplete         = 4
        knvv_incomplete         = 5
        kunnr_not_unique        = 6
        sales_area_not_unique   = 7
        sales_area_not_valid    = 8
        insert_update_conflict  = 9
        number_assignment_error = 10
        number_not_in_range     = 11
        number_range_not_extern = 12
        number_range_not_intern = 13
        account_group_not_valid = 14
        parnr_invalid           = 15
        bank_address_invalid    = 16
        tax_data_not_valid      = 17
        no_authority            = 18
        company_code_not_unique = 19
        dunning_data_not_valid  = 20
        knb1_reference_invalid  = 21
        cam_error               = 22
        OTHERS                  = 23.
    IF sy-subrc <> 0.
     CONCATENATE 'Error : Customer' ls_customer-kunnr ls_customer-bukrs
    'Master Data Updated for : Dunning level &1, Dunning Block &2 , Last dunned On &3 , Amount Insured &4'(004)
        INTO ls_message SEPARATED BY space.
     REPLACE '&1' IN  ls_message WITH ls_customer-mahns .
     REPLACE '&2' IN  ls_message WITH ls_customer-mansp .
     REPLACE '&3' IN  ls_message WITH ls_customer-madat .
     MOVE   ls_customer-vlibb TO ls_vlibb.
     REPLACE '&4' IN  ls_message WITH ls_vlibb .
      MESSAGE ls_message TYPE 'I' DISPLAY LIKE 'I'.
    CALL METHOD me->SEND_EMAIL
         EXPORTING
           I_MESSAGE = ls_message
           .
      CLEAR : ls_message, ls_vlibb.
    ELSE.
      COMMIT WORK.
      CONCATENATE 'Customer' ls_customer-kunnr ls_customer-bukrs
        'Master Data Updated for : Dunning level &1, Dunning Block &2 , Last dunned On &3 , Amount Insured &4'(004)
        INTO ls_message SEPARATED BY space.
     REPLACE '&1' IN  ls_message WITH ls_customer-mahns .
     REPLACE '&2' IN  ls_message WITH ls_customer-mansp .
     REPLACE '&3' IN  ls_message WITH ls_customer-madat .
     MOVE   ls_customer-vlibb TO ls_vlibb.
     REPLACE '&4' IN  ls_message WITH ls_vlibb .
      MESSAGE ls_message TYPE 'S' DISPLAY LIKE 'I'.
      CLEAR : ls_message, ls_vlibb.
    ENDIF.
  ENDLOOP.

ENDMETHOD.

METHOD DELETE_FILES

Löscht alle Dateien aus dem Anwendungsverzeichnis, die in der Dateiliste (at_dir_list) aufgelistet sind. Dies wird typischerweise am Ende eines Verarbeitungslaufs aufgerufen, um temporäre Dateien zu bereinigen.

METHOD DELETE_FILES.
  DATA: lf_file         TYPE string.

  LOOP AT at_dir_list INTO DATA(ls_dir).
    CONCATENATE ap_dir ls_dir-name INTO lf_file.
    DELETE DATASET lf_file.
  ENDLOOP.

ENDMETHOD.

METHOD DOC_CHANGE

Ändert Belegfelder (Mahnstufe, Mahnsperr-Status und Mahnatum) in offenen Debitorenposten über die Funktion FI_DOCUMENT_CHANGE. Wird verwendet, um Änderungen an Mahndaten auf bestehende Belege anzuwenden.

METHOD doc_change.

  DATA: lt_accchg  TYPE TABLE OF accchg,
        ls_accchg  TYPE accchg,
        ls_message TYPE string,
        ls_bsegc   TYPE bsegc,
        lf_belnr   TYPE belnr_d.

  CHECK at_journal IS NOT INITIAL.

  SORT at_journal BY bukrs belnr gjahr.

  LOOP AT at_journal INTO DATA(ls_journal).
    IF sy-tabix <> 1.
      IF lf_belnr <> ls_journal-belnr.
        COMMIT WORK.
      ENDIF.
    ENDIF.
    lf_belnr = ls_journal-belnr.
    REFRESH : lt_accchg .
    CLEAR  : ls_accchg,ls_message.
    SELECT SINGLE * FROM bsid INTO @DATA(ls_bsid)
      WHERE belnr = @ls_journal-belnr
        AND bukrs = @ls_journal-bukrs
        AND gjahr = @ls_journal-gjahr.
    IF sy-subrc = 0.
      ls_accchg-fdname = 'MANST'.
      ls_accchg-newval = ls_journal-manst.
      ls_accchg-oldval = ls_bsid-manst.
      APPEND ls_accchg TO lt_accchg.
      ls_accchg-fdname = 'MANSP'.
      ls_accchg-newval = ls_journal-mansp.
      ls_accchg-oldval = ls_bsid-mansp.
      APPEND ls_accchg TO lt_accchg.
      ls_accchg-fdname = 'MADAT'.
      ls_accchg-newval = ls_journal-madat.
      ls_accchg-oldval = ls_bsid-madat.
      APPEND ls_accchg TO lt_accchg.

      CALL FUNCTION 'FI_DOCUMENT_CHANGE'
        EXPORTING
          i_buzei              = ls_bsid-buzei
          i_bukrs              = ls_bsid-bukrs
          i_belnr              = ls_bsid-belnr
          i_gjahr              = ls_bsid-gjahr
        TABLES
          t_accchg             = lt_accchg
        EXCEPTIONS
          no_reference         = 1
          no_document          = 2
          many_documents       = 3
          wrong_input          = 4
          overwrite_creditcard = 5
          OTHERS               = 6.
      IF sy-subrc EQ 0.
        CONCATENATE 'Journal Entry' ls_journal-belnr
          ls_journal-bukrs
          'Updated for :  Dunning level &1 , Dunning Block &2, last dunned &3'(006)
          INTO ls_message SEPARATED BY space.
        REPLACE '&1' IN ls_message WITH ls_journal-manst.
        REPLACE '&2' IN ls_message WITH ls_journal-mansp.
        REPLACE '&3' IN ls_message WITH ls_journal-madat.
        MESSAGE ls_message TYPE 'S' DISPLAY LIKE 'I'.

      ELSE.
        CONCATENATE 'Error:' ls_journal-belnr
         ls_journal-bukrs
         'Updated for :  Dunning level &1 , Dunning Block &2, last dunned &3'(006)
         INTO ls_message SEPARATED BY space.
        REPLACE '&1' IN ls_message WITH ls_journal-manst.
        REPLACE '&2' IN ls_message WITH ls_journal-mansp.
        REPLACE '&3' IN ls_message WITH ls_journal-madat.
        MESSAGE ls_message TYPE 'I' DISPLAY LIKE 'I'.
        CALL METHOD me->send_email
          EXPORTING
            i_message = ls_message.
      ENDIF.
    ENDIF.
  ENDLOOP.

ENDMETHOD.

METHOD GET_ADDITIONAL

Erweitert BSEG-Daten mit zusätzlichen Informationen aus KNA1, BKPF, KNVV und VBRK. Bestimmt die Fälligkeitsdaten, fügt Kundennamen, Geschäftsbereich und Verkaufsorganisationsinformationen hinzu.

METHOD get_additional.

  DATA: lt_kna1  TYPE TABLE OF kna1,
        ls_kna1  TYPE kna1,
        ls_faede TYPE faede,
        lt_bkpf  TYPE TABLE OF bkpf,
        ls_bkpf  TYPE bkpf,
        lt_knb1  TYPE TABLE OF knb1,
        ls_knb1  TYPE knb1,
        lt_vbrk  TYPE TABLE OF vbrk,
        ls_vbrk  TYPE vbrk,
        lt_vbrp  TYPE TABLE OF vbrp,
        ls_vbrp  TYPE vbrp,
        lt_vbfa  TYPE TABLE OF vbfa,
        ls_vbfa  TYPE vbfa,
        lt_vbak  TYPE TABLE OF vbak,
        ls_vbak  TYPE vbak.

  IF ct_bseg IS NOT INITIAL.
    SELECT kunnr name1 kukla FROM kna1 INTO CORRESPONDING FIELDS OF TABLE lt_kna1
      FOR ALL ENTRIES IN ct_bseg WHERE kunnr = ct_bseg-kunnr.
    SELECT kunnr bukrs akont busab FROM knb1 INTO CORRESPONDING FIELDS OF TABLE lt_knb1
      FOR ALL ENTRIES IN ct_bseg WHERE kunnr = ct_bseg-kunnr AND bukrs = ct_bseg-bukrs.
    SELECT bukrs belnr gjahr hwaer bktxt penrc FROM bkpf INTO CORRESPONDING FIELDS OF TABLE lt_bkpf
      FOR ALL ENTRIES IN ct_bseg WHERE bukrs = ct_bseg-bukrs AND belnr = ct_bseg-belnr AND gjahr = ct_bseg-gjahr.
    SELECT vbeln vkorg FROM vbrk INTO CORRESPONDING FIELDS OF TABLE lt_vbrk
      FOR ALL ENTRIES IN ct_bseg
        WHERE vbeln = ct_bseg-vbeln.
    SELECT DISTINCT vbeln vkgrp FROM vbrp INTO CORRESPONDING FIELDS OF TABLE lt_vbrp
      FOR ALL ENTRIES IN ct_bseg
        WHERE aubel = ct_bseg-vbeln.
  ENDIF.

  LOOP AT ct_bseg ASSIGNING FIELD-SYMBOL(<ls_bseg>).
    CLEAR : ls_faede, ls_kna1, ls_knb1, ls_bkpf, ls_vbrk, ls_vbrp, ls_vbfa, ls_vbak.

    READ TABLE lt_kna1 INTO ls_kna1 WITH KEY kunnr = <ls_bseg>-kunnr.
    <ls_bseg>-name1 = ls_kna1-name1.
    <ls_bseg>-kukla = ls_kna1-kukla.
    READ TABLE lt_knb1 INTO ls_knb1 WITH KEY kunnr = <ls_bseg>-kunnr bukrs = <ls_bseg>-bukrs.
    <ls_bseg>-busab = ls_knb1-busab.

    ls_faede-rebzg = <ls_bseg>-belnr.
    ls_faede-shkzg = <ls_bseg>-shkzg.
    ls_faede-zbd1t = <ls_bseg>-zbd1t.
    ls_faede-zbd2t = <ls_bseg>-zbd2t.
    ls_faede-zfbdt = <ls_bseg>-zfbdt.
    ls_faede-bldat = <ls_bseg>-bldat.
    ls_faede-koart = 'D'.
    CALL FUNCTION 'DETERMINE_DUE_DATE'
      EXPORTING
        i_faede                    = ls_faede
        i_gl_faede                 = 'X'
      IMPORTING
        e_faede                    = ls_faede
      EXCEPTIONS
        account_type_not_supported = 1
        OTHERS                     = 2.
    IF sy-subrc = 0.
      <ls_bseg>-zfbdt = ls_faede-netdt.
    ENDIF.
    READ TABLE lt_bkpf INTO ls_bkpf
    WITH KEY bukrs = <ls_bseg>-bukrs belnr = <ls_bseg>-belnr gjahr = <ls_bseg>-gjahr.
    IF sy-subrc = 0.
      <ls_bseg>-bktxt = ls_bkpf-bktxt.
      <ls_bseg>-hwaer = ls_bkpf-hwaer.
      <ls_bseg>-penrc = ls_bkpf-penrc.
    ENDIF.
    IF <ls_bseg>-vbeln IS NOT INITIAL.
      READ TABLE lt_vbrk INTO ls_vbrk WITH KEY vbeln = <ls_bseg>-vbeln.
      <ls_bseg>-vkorg = ls_vbrk-vkorg.
      READ TABLE lt_vbrp INTO ls_vbrp WITH KEY vbeln = <ls_bseg>-vbeln.
      <ls_bseg>-vkgrp = ls_vbrp-vkgrp.
    ENDIF.
    APPEND <ls_bseg> TO at_bseg_final.
  ENDLOOP.

ENDMETHOD.

METHOD GET_BSAD

Liest alte/ausgeglichene Buchhaltungssätze aus der Tabelle BSAD (Financial Accounting Document - Reconciliation Line Items - Paid/Cleared). Berücksichtigt Selektionsparameter für Datumsbereichs und Zeitintervalle.

METHOD get_bsad.

  DATA: lf_where TYPE string,
        lt_bkpf  TYPE TABLE OF bkpf.

  IF ap_all = 'X'.
        SELECT bukrs kunnr umskz augdt augbl zuonr gjahr belnr buzei xblnr
               blart auggj sgtxt budat bldat dmbtr waers wrbtr shkzg zterm
               zfbdt cpudt gsber xref1 xref2 rstgr mansp manst madat zbd1t
               zbd2t zbd3t zlsch maber kkber vbeln aufnr bschl hkont AS akont
    FROM bsad
  INTO CORRESPONDING FIELDS OF TABLE at_bsad
      WHERE bukrs = af_bukrs
        AND umskz IN ('B', 'E', 'L', 'G', 'W', '5', '')
        AND xcpdd = ''.
  ELSE.
    IF ar_cpudt IS NOT INITIAL.
      SELECT bukrs belnr gjahr bldat budat cpudt cputm aedat
        FROM bkpf INTO CORRESPONDING FIELDS OF TABLE lt_bkpf
        WHERE bukrs = af_bukrs
          AND ( cpudt IN ar_cpudt AND cputm IN ar_cputm ) OR aedat IN ar_cpudt.
      IF  lt_bkpf IS NOT INITIAL.
        SELECT bukrs kunnr umskz augdt augbl zuonr gjahr belnr buzei xblnr
               blart auggj sgtxt budat bldat dmbtr waers wrbtr shkzg zterm
               zfbdt cpudt gsber xref1 xref2 rstgr mansp manst madat zbd1t
               zbd2t zbd3t zlsch maber kkber vbeln aufnr bschl hkont AS akont
        FROM bsad
      INTO CORRESPONDING FIELDS OF TABLE at_bsad
          FOR ALL ENTRIES IN lt_bkpf
          WHERE bukrs = af_bukrs
            AND auggj = lt_bkpf-gjahr
            AND augbl = lt_bkpf-belnr
            AND umskz IN ('B', 'E', 'L', 'G', 'W', '5', '')
            AND xcpdd = ''.

        SELECT bukrs kunnr umskz augdt augbl zuonr gjahr belnr buzei xblnr
               blart auggj sgtxt budat bldat dmbtr waers wrbtr shkzg zterm
               zfbdt cpudt gsber xref1 xref2 rstgr mansp manst madat zbd1t
               zbd2t zbd3t zlsch maber kkber vbeln aufnr bschl hkont AS akont
        FROM bsad
      APPENDING CORRESPONDING FIELDS OF TABLE at_bsad
          FOR ALL ENTRIES IN lt_bkpf
          WHERE bukrs = af_bukrs
            AND gjahr = lt_bkpf-gjahr
            AND belnr = lt_bkpf-belnr
            AND umskz IN ('B', 'E', 'L', 'G', 'W', '5', '')
            AND xcpdd = ''.
      ENDIF.
    ELSEIF ar_augdt IS NOT INITIAL.
      lf_where = '( a~augdt IN ar_augdt OR k~aedat IN ar_augdt )'.

      SELECT a~bukrs
             a~kunnr
             a~umskz
             a~augdt
             a~augbl
             a~zuonr
             a~gjahr
             a~belnr
             a~buzei
             a~xblnr
             a~blart
             a~auggj
             a~sgtxt
             a~budat
             a~bldat
             a~dmbtr
             a~waers
             a~wrbtr
             a~shkzg
             a~zterm
             a~zfbdt
             a~cpudt
             a~gsber
             a~xref1
             a~xref2
             a~rstgr
             a~mansp
             a~manst
             a~madat
             a~zbd1t
             a~zbd2t
             a~zbd3t
             a~zlsch
             a~maber
             a~kkber
             a~vbeln
             a~aufnr
             a~bschl
             a~hkont AS akont
       FROM bsad AS a
        INNER JOIN bkpf AS k ON a~bukrs = k~bukrs AND a~gjahr = k~gjahr AND a~belnr = k~belnr
    INTO CORRESPONDING FIELDS OF TABLE at_bsad
        WHERE a~bukrs = af_bukrs
          AND a~umskz IN ('B', 'E', 'L', 'G', 'W', '5', '')
          AND (lf_where)
          AND a~xcpdd = ''.
    ENDIF.
  ENDIF.

  SORT at_bsad.
  DELETE ADJACENT DUPLICATES FROM at_bsad COMPARING ALL FIELDS.

ENDMETHOD.

METHOD GET_BSEG

Liest kombinierte Buchhaltungssätze aus BSAD (Ausgegebene Rechnungen) und BSID (Offene Posten). Dies ist die Hauptmethode zur Datenextraktion und wird von Extractor-Reports aufgerufen.

METHOD GET_BSEG.

  CALL METHOD me->get_bsad.

  CALL METHOD me->get_bsid.

  APPEND LINES OF at_bsad TO at_bseg.
  APPEND LINES OF at_bsid TO at_bseg.

ENDMETHOD.

METHOD GET_BSID

Liest offene Debitorenbuchhaltungssätze aus der Tabelle BSID (Financial Accounting Document - Reconciliation Line Items - Open). Berücksichtigt selektive Eingrenzungen nach Buchungskreis, Dokumenttyp und Datumsbereichs.

METHOD get_bsid.

  DATA: lf_where TYPE string.

  IF ap_all = 'X'.
    SELECT bukrs
           kkber
           kunnr
           gjahr
           belnr
           buzei
           xblnr
           zuonr
           blart
           sgtxt
           budat
           bldat
           dmbtr
           wrbtr
           waers
           shkzg
           zfbdt
           cpudt
           gsber
           xref1
           xref2
           rstgr
           aufnr
           mansp
           manst
           maber
           madat
           zterm
           augbl
           auggj
           augdt
           zbd1t
           zbd2t
           zbd3t
           zlsch
           vbeln
           umskz
           bschl
           hkont AS akont
      FROM bsid
      INTO CORRESPONDING FIELDS OF TABLE at_bsid
            WHERE bukrs = af_bukrs
              AND umskz IN ('B', 'E', 'L', 'G', 'W', '5','')
              AND xcpdd = ''.
  ELSE.
    IF ar_cpudt IS NOT INITIAL.
      READ TABLE ar_cpudt INTO DATA(lr_s_cpudt) INDEX 1.
      IF lr_s_cpudt-sign = 'I' AND lr_s_cpudt-option = 'EQ'.
        IF ar_cputm IS NOT INITIAL.
          lf_where = '( ( k~cpudt IN ar_cpudt AND k~cputm IN ar_cputm ) OR k~aedat IN ar_cpudt )'.
        ELSE.
          lf_where = '( k~cpudt IN ar_cpudt OR k~aedat IN ar_cpudt )'.
        ENDIF.
      ELSE.
        lf_where = '( k~cpudt IN ar_cpudt OR k~aedat IN ar_cpudt )'.
      ENDIF.
    ELSEIF ar_budat IS NOT INITIAL.
      lf_where = '( i~budat IN ar_budat OR k~aedat IN ar_budat )'.
    ENDIF.
    SELECT i~bukrs
           i~kkber
           i~kunnr
           i~gjahr
           i~belnr
           i~buzei
           i~xblnr
           i~zuonr
           i~blart
           i~sgtxt
           i~budat
           i~bldat
           i~dmbtr
           i~wrbtr
           i~waers
           i~shkzg
           i~zfbdt
           i~cpudt
           i~gsber
           i~xref1
           i~xref2
           i~rstgr
           i~aufnr
           i~mansp
           i~manst
           i~maber
           i~madat
           i~zterm
           i~augbl
           i~auggj
           i~augdt
           i~zbd1t
           i~zbd2t
           i~zbd3t
           i~zlsch
           i~vbeln
           i~umskz
           i~bschl
           i~hkont AS akont
      FROM bsid AS i
      INNER JOIN bkpf AS k ON i~bukrs = k~bukrs AND i~gjahr = k~gjahr AND i~belnr = k~belnr
      INTO CORRESPONDING FIELDS OF TABLE at_bsid
        WHERE i~bukrs = af_bukrs
          AND i~umskz IN ('B', 'E', 'L', 'G', 'W', '5','')
          AND (lf_where)
          AND i~xcpdd = ''.

    SORT at_bsid BY bukrs kunnr umskz augdt augbl zuonr gjahr belnr buzei.
    DELETE ADJACENT DUPLICATES FROM at_bsid COMPARING ALL FIELDS.

  ENDIF.

ENDMETHOD.

METHOD GET_DELTA_RESTRICTION

Filtert Änderungen in der BKPF-Tabelle basierend auf Zeitstempeln und Datumsbereichen. Wird verwendet, um nur die neuesten Änderungen zur Verarbeitung zu extrahieren.

method GET_DELTA_RESTRICTION.

DATA : creatd_dt  TYPE PIQ_SELOPT_T,
       changd_dt  TYPE PIQ_SELOPT_T,
       creatd_tm  TYPE PIQ_SELOPT_T,
       ls_s_range TYPE selopt,
       lt_date    TYPE sy-datum,
       lt_time    TYPE sy-uzeit,
       ls_flag    TYPE i.


IF ar_budat[] IS NOT INITIAL .
  READ TABLE ar_budat INTO ls_s_range INDEX 1.
    ls_s_range-high = sy-datum.
    ls_s_range-option = 'BT'.
  APPEND ls_s_range TO creatd_dt.
ENDIF.
IF ar_augdt[] IS NOT INITIAL.
    READ TABLE ar_augdt INTO ls_s_range INDEX 1.
    ls_s_range-high = sy-datum.
    ls_s_range-option = 'BT'.
  APPEND ls_s_range TO creatd_dt.
ENDIF.

 ls_flag = sy-uzeit+0(2) MOD 6.

 IF ls_flag = 0.

  SELECT  bukrs belnr gjahr cpudt cputm aedat
  FROM bkpf INTO TABLE at_bkpf
  WHERE ( CPUDT IN  creatd_dt  AND CPUTM IN ar_cputm ) OR
        ( AEDAT IN  creatd_dt ) .
 ELSE.

   SELECT  bukrs belnr gjahr cpudt cputm aedat
  FROM bkpf INTO TABLE at_bkpf
  WHERE ( CPUDT IN  creatd_dt  AND CPUTM IN ar_cputm ) .
ENDIF.

  DELETE at_bkpf WHERE bukrs <> af_bukrs.

endmethod.

METHOD GET_FILES

Liest die Liste der Dateien aus dem Anwendungsverzeichnis, das in ap_dir angegeben ist. Verwendet die Standardfunktion EPS_GET_DIRECTORY_LISTING.

method GET_FILES.
DATA : ls_message TYPE string.
CALL FUNCTION 'EPS_GET_DIRECTORY_LISTING'
  EXPORTING
    dir_name               = ap_dir
  TABLES
    dir_list               = at_dir_list
  EXCEPTIONS
    invalid_eps_subdir     = 1
    sapgparam_failed       = 2
    build_directory_failed = 3
    no_authorization       = 4
    read_directory_failed  = 5
    too_many_read_errors   = 6
    empty_directory_list   = 7
    OTHERS                 = 8.
IF sy-subrc <> 0.
  MESSAGE 'Error in fetching  files from Application server'
  TYPE 'I' DISPLAY LIKE 'I'.
ENDIF.

endmethod.

METHOD GET_KNA1

Liest Kundenstammdaten aus KNA1 und KNB1 mit erweiterten Informationen aus KNVV, TVGRT und KNKK. Berücksichtigt Erstellen- und Änderungsdatum. Generiert auch strukturierte Verkaufsgruppen-Strings.

METHOD get_kna1.

  DATA: ls_seltab TYPE rsparams,
        lt_knvv   TYPE TABLE OF knvv,
        lt_knkk   TYPE TABLE OF knkk.
  DATA: lt_cdhdr   TYPE TABLE OF cdhdr,
        lr_kunnr   TYPE trgr_kunnr,
        lr_s_kunnr TYPE trgs_kunnr.


  READ TABLE at_seltab INTO ls_seltab WITH KEY selname = 'P_ALL'.
  IF ls_seltab-low = 'X'.
    SELECT b~bukrs,
           b~kunnr,
           a~anred,
           a~pstlz,
           a~ort01,
           a~land1,
           a~stras,
           a~name1,
           a~name2,
           a~name3,
           a~name4,
           a~telf1,
           a~telf2,
           a~stceg,
           b~zwels,
           b~zterm,
           b~vrsnr,
           b~vlibb,
           b~akont,
           a~erdat,
           a~adrnr,
           b~intad,
           b~busab
      FROM knb1 AS b
      INNER JOIN kna1 AS a ON  b~kunnr = a~kunnr
      INTO CORRESPONDING FIELDS OF TABLE @at_kna1
        WHERE bukrs = @af_bukrs
          AND a~xcpdk = ''.
  ELSE.
    SELECT DISTINCT b~bukrs,
           b~kunnr,
           a~anred,
           a~pstlz,
           a~ort01,
           a~land1,
           a~stras,
           a~name1,
           a~name2,
           a~name3,
           a~name4,
           a~telf1,
           a~telf2,
           a~stceg,
           b~zwels,
           b~zterm,
           b~vrsnr,
           b~vlibb,
           b~akont,
           a~erdat,
           a~adrnr,
           b~intad,
           b~busab
      FROM knb1 AS b
            INNER JOIN kna1 AS a ON b~kunnr = a~kunnr
      INTO CORRESPONDING FIELDS OF TABLE @at_kna1
       WHERE b~bukrs = @af_bukrs
         AND a~xcpdk = ''
         AND ( a~erdat IN @ar_cpudt OR b~erdat IN @ar_cpudt ).

    SELECT DISTINCT objectid FROM cdhdr INTO CORRESPONDING FIELDS OF TABLE lt_cdhdr
      WHERE objectclas = 'DEBI'
       AND udate IN ar_cpudt
        AND change_ind = 'U'.
    lr_s_kunnr-option = 'EQ'.
    lr_s_kunnr-sign = 'I'.
    LOOP AT lt_cdhdr INTO DATA(ls_cdhdr).
      lr_s_kunnr-low = ls_cdhdr-objectid.
      APPEND lr_s_kunnr TO lr_kunnr.
    ENDLOOP.
    SELECT DISTINCT b~bukrs,
           b~kunnr,
           a~anred,
           a~pstlz,
           a~ort01,
           a~land1,
           a~stras,
           a~name1,
           a~name2,
           a~name3,
           a~name4,
           a~telf1,
           a~telf2,
           a~stceg,
           b~zwels,
           b~zterm,
           b~vrsnr,
           b~vlibb,
           b~akont,
           a~erdat,
           a~adrnr,
           b~intad,
           b~busab
      FROM knb1 AS b
            INNER JOIN kna1 AS a ON b~kunnr = a~kunnr
      APPENDING CORRESPONDING FIELDS OF TABLE @at_kna1
       WHERE b~bukrs = @af_bukrs
         AND a~xcpdk = ''
         AND b~kunnr IN @lr_kunnr.
  ENDIF.

  SORT at_kna1 BY kunnr.
  DELETE ADJACENT DUPLICATES FROM at_kna1 COMPARING ALL FIELDS.

  IF at_kna1 IS NOT INITIAL.
    SELECT * FROM knvv INTO TABLE lt_knvv
      FOR ALL ENTRIES IN at_kna1
      WHERE kunnr = at_kna1-kunnr
        AND vkgrp <> ''.
    IF lt_knvv IS NOT INITIAL.
      SELECT * FROM tvgrt INTO TABLE @DATA(lt_tvgrt)
        FOR ALL ENTRIES IN @lt_knvv WHERE vkgrp = @lt_knvv-vkgrp.
    ENDIF.
    SELECT * FROM knkk INTO TABLE lt_knkk
      FOR ALL ENTRIES IN at_kna1
      WHERE kunnr = at_kna1-kunnr
        AND kkber = af_kkber.
  ENDIF.
  LOOP AT at_kna1 ASSIGNING FIELD-SYMBOL(<ls_kna1>).
    DATA(lt_knvv_kunnr) = lt_knvv.
    DELETE lt_knvv_kunnr WHERE kunnr <> <ls_kna1>-kunnr.
    IF lt_knvv_kunnr IS NOT INITIAL.
      <ls_kna1>-vkgrp_string = '{'.
      DATA(lf_count) = 0.
      DATA(lf_lines) = lines( lt_knvv_kunnr ).
      CLEAR lf_count.
      LOOP AT lt_knvv_kunnr INTO DATA(ls_knvv).
        lf_count = lf_count + 1.
        IF <ls_kna1>-vkgrp IS INITIAL.
          <ls_kna1>-vkgrp = ls_knvv-vkgrp.
        ENDIF.
        READ TABLE lt_tvgrt INTO DATA(ls_tvgrt) WITH KEY vkgrp = ls_knvv-vkgrp.
        <ls_kna1>-vkgrp_string = <ls_kna1>-vkgrp_string && ls_knvv-vkorg && ':' && ls_knvv-vkgrp.
        IF ls_tvgrt IS NOT INITIAL.
          <ls_kna1>-vkgrp_string = <ls_kna1>-vkgrp_string && ':' && ls_tvgrt-bezei.
        ENDIF.
        IF lf_count < lf_lines.
          <ls_kna1>-vkgrp_string = <ls_kna1>-vkgrp_string && ';'.
        ENDIF.
      ENDLOOP.
      IF sy-subrc = 0.
        <ls_kna1>-vkgrp_string = <ls_kna1>-vkgrp_string && '}'.
      ENDIF.
    ENDIF.
    READ TABLE lt_knkk INTO DATA(ls_knkk) WITH KEY kunnr = <ls_kna1>-kunnr.
    IF sy-subrc = 0.
      <ls_kna1>-klimk = ls_knkk-klimk.
      <ls_kna1>-knkli = ls_knkk-knkli.
      <ls_kna1>-ctlpc = ls_knkk-ctlpc.
      <ls_kna1>-dbrtg = ls_knkk-dbrtg.
    ENDIF.

    IF <ls_kna1>-busab IS NOT INITIAL.
      CONCATENATE <ls_kna1>-bukrs '-' <ls_kna1>-busab INTO <ls_kna1>-ccbusab.
      CONDENSE <ls_kna1>-ccbusab.
    ENDIF.

    APPEND <ls_kna1> TO at_kna1_final.
  ENDLOOP.

ENDMETHOD.

METHOD GET_MANSP_CHANGES

Identifiziert Änderungen an Mahnsperr-Daten (MANSP) in Belegen, auch wenn das Belegdatum nicht im Selektionsbereich liegt. Wird verwendet, um retroaktive Änderungen zu erfassen.

method GET_MANSP_CHANGES.

DATA: lt_cdhdr TYPE TABLE OF cdhdr,
      lt_cdpos TYPE TABLE OF cdpos,
      ls_cdpos TYPE cdpos,
      lt_bsid TYPE TABLE OF bsid,
      ls_bsid TYPE bsid,
      lt_bseg TYPE zfi_t_bilendo_bseg,
      lt_bkpf TYPE TABLE OF bkpf,
      lt_kna1 TYPE TABLE OF kna1,
      ls_kna1 TYPE kna1,
      ls_faede TYPE faede.


FIELD-SYMBOLS: <ls_bseg> TYPE zfi_s_bilendo_bseg.

SELECT objectid FROM cdhdr
  INTO CORRESPONDING FIELDS OF TABLE lt_cdhdr
  WHERE objectclas = 'BELEG'
    AND udate IN ar_budat
    AND change_ind = 'U'.

IF sy-subrc = 0.
  SELECT * FROM cdpos INTO TABLE lt_cdpos
    FOR ALL ENTRIES IN lt_cdhdr
      WHERE objectclas = 'BELEG'
        AND objectid = lt_cdhdr-objectid
        AND tabname = 'BSEG'
        AND fname = 'MANSP'.
ENDIF.

LOOP AT lt_cdpos INTO ls_cdpos.
  ls_bsid-bukrs = ls_cdpos-objectid+3(3).
  ls_bsid-belnr = ls_cdpos-objectid+7(10).
  ls_bsid-gjahr = ls_cdpos-objectid+17(4).
  APPEND ls_bsid TO lt_bsid.
ENDLOOP.

IF lt_bsid IS NOT INITIAL.
  SELECT bukrs belnr gjahr bldat budat cpudt FROM bkpf
    INTO CORRESPONDING FIELDS OF TABLE lt_bkpf
      FOR ALL ENTRIES IN lt_bsid
      WHERE bukrs = lt_bsid-bukrs
        AND belnr = lt_bsid-belnr
        AND gjahr = lt_bsid-gjahr
        AND budat NOT IN ar_budat.
ENDIF.

SELECT bukrs kunnr gjahr belnr xblnr zuonr blart augbl gjahr augdt sgtxt budat
       bldat dmbtr shkzg zfbdt cpudt gsber xref1 xref2 rstgr mansp manst
       madat buzei zbd1t zbd2t zbd3t auggj zlsch
  FROM bsid
  INTO CORRESPONDING FIELDS OF TABLE lt_bseg
  FOR ALL ENTRIES IN lt_bkpf
    WHERE bukrs = lt_bkpf-bukrs
      AND belnr = lt_bkpf-belnr
      AND gjahr = lt_bkpf-gjahr.

IF lt_bseg IS NOT INITIAL.
  SELECT kunnr name1 kukla FROM kna1 INTO CORRESPONDING FIELDS OF TABLE lt_kna1
    FOR ALL ENTRIES IN lt_bseg WHERE kunnr = lt_bseg-kunnr.
ENDIF.

LOOP AT lt_bseg ASSIGNING <ls_bseg>.
  READ TABLE lt_kna1 INTO ls_kna1 WITH KEY kunnr = <ls_bseg>-kunnr.
  <ls_bseg>-name1 = ls_kna1-name1.
  <ls_bseg>-kukla = ls_kna1-kukla.
  MOVE-CORRESPONDING <ls_bseg> TO ls_faede.
  ls_faede-koart = 'D'.
  CALL FUNCTION 'DETERMINE_DUE_DATE'
    EXPORTING
      i_faede                    = ls_faede
      i_gl_faede                 = 'X'
    IMPORTING
      e_faede                    = ls_faede
    EXCEPTIONS
      account_type_not_supported = 1
      OTHERS                     = 2.
  IF sy-subrc = 0.
    <ls_bseg>-zfbdt = ls_faede-netdt.
  ENDIF.
ENDLOOP.

APPEND LINES OF lt_bseg TO at_bseg.
endmethod.

METHOD GET_VKORG

Weist Verkaufsorganisationen zu Buchhaltungssätzen zu basierend auf Kundenstammdaten aus KNVV und VBAK. Verwendet Zwischenspeicherung zur Optimierung.

METHOD GET_VKORG.

  DATA: lt_knvv  TYPE TABLE OF knvv,
        lf_count TYPE i,
        lf_tabix TYPE i.

  LOOP AT ct_bseg ASSIGNING FIELD-SYMBOL(<ls_bseg>) WHERE vkorg IS INITIAL.
    CLEAR lf_tabix.
    CLEAR lf_count.
    READ TABLE at_vkorg INTO DATA(ls_vkorg) WITH KEY bukrs = af_bukrs kunnr = <ls_bseg>-kunnr.
    IF sy-subrc = 0.
      <ls_bseg>-vkorg = ls_vkorg-vkorg.
      CONTINUE.
    ENDIF.
    SELECT knvv~vkorg FROM knvv INNER JOIN tvko ON knvv~vkorg = tvko~vkorg INTO CORRESPONDING FIELDS OF TABLE lt_knvv
      WHERE knvv~kunnr = <ls_bseg>-kunnr
        AND tvko~bukrs = af_bukrs.
    IF lines( lt_knvv ) = 1.
      <ls_bseg>-vkorg = lt_knvv[ 1 ]-vkorg.
    ELSEIF lines( lt_knvv ) > 1.
      LOOP AT lt_knvv INTO DATA(ls_knvv).
        SELECT COUNT(*) FROM vbak WHERE kunnr = <ls_bseg>-kunnr AND vkorg = ls_knvv-vkorg.
        IF sy-dbcnt > lf_count.
          lf_tabix = sy-tabix.
          lf_count = sy-dbcnt.
        ENDIF.
      ENDLOOP.
      IF lf_tabix > 0.
        <ls_bseg>-vkorg = lt_knvv[ lf_tabix ]-vkorg.
      ENDIF.
    ENDIF.
    IF <ls_bseg>-vkorg IS NOT INITIAL.
      ls_vkorg-bukrs = af_bukrs.
      ls_vkorg-vkorg = <ls_bseg>-vkorg.
      ls_vkorg-kunnr = <ls_bseg>-kunnr.
      APPEND ls_vkorg TO at_vkorg.
    ENDIF.
  ENDLOOP.

ENDMETHOD.

METHOD KNA1_FILE_TO_SERVER

Konvertiert KNA1-Kundendaten mit erweiterten Informationen in eine Textdatei mit Pipe-Trennzeichen. Bereitet Daten auf für die externe Verarbeitung vor.

METHOD kna1_file_to_server.

  DATA: lf_string       TYPE string,
        lt_string       TYPE TABLE OF string,
        ls_kna1         TYPE zfi_s_bilendo_kna1,
        lf_vlibb        TYPE char30,
        lf_klimk        TYPE char30,
        lf_dataset_kna1 TYPE string.

  CONCATENATE 'BUKRS' 'KUNNR' 'ANRED' 'PSTLZ' 'ORT01' 'LAND1' 'INTAD' 'STRAS'
              'NAME1' 'NAME2' 'NAME3' 'NAME4' 'TELF1' 'TELF2' 'STCEG'
              'ZWELS' 'VRSNR' 'VLIBB' 'KLIMK' 'CTLPC' 'DBRTG' 'AKONT' 'VKGRP'
              'ERDAT' 'KDGRP' 'ZTERM' 'BUSAB' 'CCBUSAB' 'KNKLI' 'VKGRP_STRING'
              INTO lf_string SEPARATED BY '|'.
  APPEND lf_string TO lt_string.

  LOOP AT at_kna1_final INTO ls_kna1.

    CLEAR: lf_string,
           lf_vlibb,
           lf_klimk.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        input  = ls_kna1-kunnr
      IMPORTING
        output = ls_kna1-kunnr.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        input  = ls_kna1-akont
      IMPORTING
        output = ls_kna1-akont.

    REPLACE ALL OCCURRENCES OF REGEX '[;:",|#]' IN ls_kna1-stras WITH '_'.
    REPLACE ALL OCCURRENCES OF REGEX '[;:",|#]' IN ls_kna1-name1 WITH '_'.
    REPLACE ALL OCCURRENCES OF REGEX '[;:",|#]' IN ls_kna1-name2 WITH '_'.
    REPLACE ALL OCCURRENCES OF REGEX '[;:",|#]' IN ls_kna1-name3 WITH '_'.
    REPLACE ALL OCCURRENCES OF REGEX '[;:",|#]' IN ls_kna1-name4 WITH '_'.
    REPLACE ALL OCCURRENCES OF REGEX '[;:",|#]' IN ls_kna1-telf1 WITH '_'.
    REPLACE ALL OCCURRENCES OF REGEX '[;:",|#]' IN ls_kna1-telf2 WITH '_'.
    REPLACE ALL OCCURRENCES OF REGEX '[;:",|#]' IN ls_kna1-intad WITH ''.

    WRITE ls_kna1-vlibb TO lf_vlibb.
    WRITE ls_kna1-klimk TO lf_klimk.
    CONCATENATE ls_kna1-bukrs ls_kna1-kunnr ls_kna1-anred ls_kna1-pstlz ls_kna1-ort01 ls_kna1-land1 ls_kna1-intad ls_kna1-stras
                ls_kna1-name1 ls_kna1-name2 ls_kna1-name3 ls_kna1-name4 ls_kna1-telf1 ls_kna1-telf2 ls_kna1-stceg
                ls_kna1-zwels ls_kna1-vrsnr lf_vlibb lf_klimk ls_kna1-ctlpc ls_kna1-dbrtg ls_kna1-akont
                ls_kna1-vkgrp ls_kna1-erdat ls_kna1-kdgrp ls_kna1-zterm ls_kna1-busab ls_kna1-ccbusab ls_kna1-knkli
                ls_kna1-vkgrp_string "v2"
                  INTO lf_string SEPARATED BY '|'.
    APPEND lf_string TO lt_string.
  ENDLOOP.

  lf_dataset_kna1 = af_dataset_kna1.
  REPLACE FIRST OCCURRENCE OF 'CC' IN lf_dataset_kna1 WITH af_zone.
  OPEN DATASET lf_dataset_kna1 FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
  IF sy-subrc = 0.
    LOOP AT lt_string INTO lf_string.
      TRANSFER lf_string TO lf_dataset_kna1.
    ENDLOOP.
    CLOSE DATASET lf_dataset_kna1.
    ef_msg = 'Datei & erfolgreich erzeugt'(001).
    REPLACE '&' IN ef_msg WITH lf_dataset_kna1.
  ELSE.
    ef_msg = 'Fehler beim Schreiben der Datei &'(002).
    REPLACE '&' IN ef_msg WITH lf_dataset_kna1.
  ENDIF.

ENDMETHOD.

METHOD READ_CSV

Liest CSV-Dateien aus dem Anwendungsverzeichnis und parst diese für verschiedene Kundendaten-Update-Szenarien: Bonitätsinformation, Kreditlimit, Sicherheiten, Journaleinträge und Kundenstamm-Mahnungen.

METHOD read_csv.
  DATA: lt_split        TYPE TABLE OF string,
        lf_bukrs        TYPE bukrs,
        ls_credit_info  TYPE ty_s_credit_info,
        ls_credit_limit TYPE ty_s_credit_limit,
        ls_securities   TYPE ty_s_securities,
        ls_journal      TYPE ty_s_journal,
        ls_customer     TYPE ty_s_customer,
        lt_string       TYPE TABLE OF string,
        lf_file         TYPE string.

  DATA: lf_string TYPE string,
        lf_type   TYPE string.

  LOOP AT at_dir_list INTO DATA(ls_dir).
    CLEAR lt_string.
    CONCATENATE ap_dir ls_dir-name INTO lf_file.
    IF ls_dir-name CS 'bilendo_credit_informations'.
      lf_type = 'CREDIT_INFO'.
    ELSEIF ls_dir-name CS 'bilendo_customers'.
      lf_type = 'CUSTOMER'.
    ELSEIF ls_dir-name CS 'bilendo_journal_entries'.
      lf_type = 'JOURNAL'.
    ELSEIF ls_dir-name CS 'bilendo_securities'.
      lf_type = 'SECURITIES'.
    ELSEIF ls_dir-name CS 'bilendo_credit_limit'.
      lf_type = 'CREDIT_LIMIT'.
    ENDIF.

    OPEN DATASET lf_file FOR INPUT IN TEXT MODE ENCODING DEFAULT.
    IF sy-subrc = 0.
      DO.
        READ DATASET lf_file INTO lf_string.
        IF lf_string CS 'Company' OR lf_string CS 'Buchungskreis'.
          CONTINUE.
        ELSE.
          IF lf_string IS INITIAL.
            EXIT.
          ENDIF.
          APPEND lf_string TO lt_string.
        ENDIF.
      ENDDO.
      CLOSE DATASET lf_file.
    ENDIF.
    CASE lf_type.
      WHEN 'CREDIT_INFO'.
        LOOP AT lt_string INTO lf_string.
          SPLIT lf_string AT ';' INTO TABLE lt_split.
          READ TABLE lt_split INTO DATA(ls_split) INDEX 1.
          ls_credit_info-kunnr = ls_split.
          CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
            EXPORTING
              input  = ls_credit_info-kunnr
            IMPORTING
              output = ls_credit_info-kunnr.
          READ TABLE lt_split INTO ls_split INDEX 2.
          ls_credit_info-bukrs = ls_split.
          READ TABLE lt_split INTO ls_split INDEX 3.
          ls_credit_info-dbrtg = ls_split.
          READ TABLE lt_split INTO ls_split INDEX 4.
          REPLACE ALL OCCURRENCES OF '-' IN ls_split WITH space.
          CONDENSE ls_split.
          ls_credit_info-date = ls_split.
          LOOP AT at_credit_info ASSIGNING FIELD-SYMBOL(<ls_credit_info>)
            WHERE bukrs = ls_credit_info-bukrs
              AND kunnr = ls_credit_info-kunnr
              AND date >= ls_credit_info-date.
            IF sy-subrc = 0.
              CLEAR ls_credit_info-kunnr.
              EXIT.
            ENDIF.
          ENDLOOP.
          IF ls_credit_info-kunnr IS NOT INITIAL.
            APPEND ls_credit_info TO at_credit_info.
          ENDIF.
        ENDLOOP.
        SORT at_credit_info BY bukrs kunnr date DESCENDING.
        DELETE ADJACENT DUPLICATES FROM at_credit_info COMPARING bukrs kunnr.

      WHEN 'CREDIT_LIMIT'.
        LOOP AT lt_string INTO lf_string.
          SPLIT lf_string AT ';' INTO TABLE lt_split.
          READ TABLE lt_split INTO ls_split INDEX 1.
          ls_credit_limit-kunnr = ls_split.
          CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
            EXPORTING
              input  = ls_credit_limit-kunnr
            IMPORTING
              output = ls_credit_limit-kunnr.
          READ TABLE lt_split INTO ls_split INDEX 2.
          ls_credit_limit-klimk = ls_split.
          READ TABLE lt_split INTO ls_split INDEX 2.
          ls_credit_limit-ctlpc = ls_split.
          READ TABLE lt_split INTO ls_split INDEX 3.
          ls_credit_limit-bukrs = ls_split.
          APPEND ls_credit_limit TO at_credit_limit.
        ENDLOOP.
      WHEN 'SECURITIES'.
        LOOP AT lt_string INTO lf_string.
          SPLIT lf_string AT ';' INTO TABLE lt_split.
          READ TABLE lt_split INTO ls_split INDEX 1.
          ls_securities-kunnr = ls_split.
          CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
            EXPORTING
              input  = ls_securities-kunnr
            IMPORTING
              output = ls_securities-kunnr.
          READ TABLE lt_split INTO ls_split INDEX 2.
          ls_securities-bukrs = ls_split.
          CLEAR : ls_split.
          READ TABLE lt_split INTO ls_split INDEX 3.
          IF ls_split IS NOT INITIAL OR ls_split NE space.
            ls_securities-vlibb = ls_split.
          ENDIF.
          APPEND ls_securities TO at_securities.
        ENDLOOP.
      WHEN 'JOURNAL'.
        LOOP AT lt_string INTO lf_string.
          SPLIT lf_string AT ';' INTO TABLE lt_split.
          READ TABLE lt_split INTO ls_split INDEX 1.
          ls_journal-bukrs = ls_split.
          READ TABLE lt_split INTO ls_split INDEX 2.
          ls_journal-belnr = ls_split.
          CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
            EXPORTING
              input  = ls_journal-belnr
            IMPORTING
              output = ls_journal-belnr.
          READ TABLE lt_split INTO ls_split INDEX 4.
          ls_journal-gjahr = ls_split.
          READ TABLE lt_split INTO ls_split INDEX 5.
          ls_journal-manst = ls_split.
          READ TABLE lt_split INTO ls_split INDEX 6.
          IF ls_split = 'Yes' OR ls_split = 'Ja'.
            ls_journal-mansp = 'A'.
          ELSEIF ls_split = 'No' OR ls_split = 'Nein'.
            CLEAR ls_journal-mansp.
          ENDIF.
          READ TABLE lt_split INTO ls_split INDEX 7.
          REPLACE ALL OCCURRENCES OF '-' IN ls_split WITH space.
          CONDENSE ls_split .
          ls_journal-madat = ls_split.
          READ TABLE lt_split INTO ls_split INDEX 8.
          ls_journal-buzei = ls_split.
          APPEND ls_journal TO at_journal.
        ENDLOOP.

      WHEN 'CUSTOMER'.
        LOOP AT lt_string INTO lf_string.
          SPLIT lf_string AT ';' INTO TABLE lt_split.
          READ TABLE lt_split INTO ls_split INDEX 1.
          ls_customer-kunnr = ls_split.
          CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
            EXPORTING
              input  = ls_customer-kunnr
            IMPORTING
              output = ls_customer-kunnr.
          READ TABLE lt_split INTO ls_split INDEX 2.
          ls_customer-bukrs = ls_split.
          READ TABLE lt_split INTO ls_split INDEX 3.
          IF ls_split = 'Yes' OR ls_split = 'true'.
            ls_customer-mansp = 'A'.
          ELSEIF ls_split = 'No' OR ls_split = 'false'.
            CLEAR ls_customer-mansp.
          ENDIF.
          READ TABLE lt_split INTO ls_split INDEX 4.
          REPLACE ALL OCCURRENCES OF '-' IN ls_split WITH space.
          CONDENSE ls_split.
          ls_customer-madat = ls_split.
          READ TABLE lt_split INTO ls_split INDEX 5.
          ls_customer-mahns = ls_split.
          APPEND ls_customer TO at_customer.
        ENDLOOP.
      WHEN OTHERS.
    ENDCASE.
  ENDLOOP.

ENDMETHOD.

METHOD SEND_EMAIL

Versendet E-Mail-Benachrichtigungen bei Fehlern über den SAP-Versand-Framework. Die Empfänger werden aus der benutzerdefinierten Tabelle ZFI_BILENDO_MAIL gelesen.

method SEND_EMAIL.

  TYPES :  BEGIN OF ty_recipient,
             seq_num   TYPE char2,
             smtp_addr TYPE ad_smtpadr,
           END OF ty_recipient.

  data send_request   type ref to cl_bcs.
  data document       type ref to cl_document_bcs.
  data recipient      type ref to if_recipient_bcs.
  data bcs_exception  type ref to cx_bcs.

  data main_text      type bcsy_text.
  data binary_content type solix_tab.
  data size           type so_obj_len.
  data sent_to_all    type os_boolean.
  data mailto         TYPE ad_smtpadr.
  data  : it_recipient TYPE STANDARD TABLE OF ty_recipient,
          wa_rec       TYPE ty_recipient.

try.

    send_request = cl_bcs=>create_persistent( ).

    append i_message to main_text.
    document = cl_document_bcs=>create_document(
      i_type    = 'RAW'
      i_text    = main_text
      i_subject = 'Bilendo Import Error' ).

    send_request->set_document( document ).

  SELECT * FROM ZFI_BILENDO_MAIL INTO CORRESPONDING FIELDS OF TABLE it_recipient .
  loop at it_recipient INTO wa_rec.
      translate wa_rec-smtp_addr to lower case.
      recipient = cl_cam_address_bcs=>create_internet_address( wa_rec-smtp_addr ).
      call method send_request->add_recipient
        exporting
          i_recipient  = recipient
          i_express    = ' '
          i_copy       = ' '
          i_blind_copy = ' '
          i_no_forward = ' '.
    endloop.

    sent_to_all = send_request->send( i_with_error_screen = 'X' ).

    commit work.

    if sent_to_all is initial.
      message i500(sbcoms) with mailto.
    else.
      message s022(so).
    endif.

  catch cx_bcs into bcs_exception.
    message i865(so) with bcs_exception->error_type.
endtry.

endmethod.

METHOD SET_BUKRS

Setzt den Buchungskreis für die Datenverarbeitung und liest den zugehörigen Kreditkontrollbereich aus T001.

METHOD SET_BUKRS.

  af_bukrs = if_bukrs.
  SELECT SINGLE kkber FROM t001 INTO af_kkber WHERE bukrs = af_bukrs.

ENDMETHOD.