Загрузка данных


*---------------------------------------------------------------------*
* Main include
*---------------------------------------------------------------------*

TYPE-POOLS: slis.

*---------------------------------------------------------------------*
* TYPES
*---------------------------------------------------------------------*

TYPES:
  BEGIN OF ty_excel,
    stcd1 TYPE stcd1,
    stcd3 TYPE stcd3,
  END OF ty_excel.

TYPES:
  BEGIN OF ty_result,
    stcd1    TYPE stcd1,
    stcd3    TYPE stcd3,
    name1    TYPE kna1-name1,
    sortl    TYPE kna1-sortl,
    kunnr    TYPE kunnr,
    status   TYPE char10,
    message  TYPE char255,
  END OF ty_result.

TYPES:
  BEGIN OF ty_config,
    begru     TYPE begru,
    vkbur     TYPE vkbur,
    vwerk     TYPE werks_d,
    zf_ktonr  TYPE kunnr,
  END OF ty_config.

*---------------------------------------------------------------------*
* DATA - EXCEL
*---------------------------------------------------------------------*

DATA:
  gt_excel TYPE STANDARD TABLE OF ty_excel,
  gs_excel TYPE ty_excel.

DATA:
  gt_excel_raw TYPE STANDARD TABLE OF alsmex_tabline,
  gs_excel_raw TYPE alsmex_tabline.

*---------------------------------------------------------------------*
* DATA - RESULT
*---------------------------------------------------------------------*

DATA:
  gt_result TYPE STANDARD TABLE OF ty_result,
  gs_result TYPE ty_result.

*---------------------------------------------------------------------*
* DATA - CONFIG
*---------------------------------------------------------------------*

DATA:
  gs_config TYPE ty_config.

*---------------------------------------------------------------------*
* DATA - BAPI
*---------------------------------------------------------------------*

DATA:
  gs_personaldata     TYPE bapikna101_1,
  gs_opt_personaldata TYPE bapikna105,
  gs_companydata      TYPE bapikna106,
  gs_opt_companydata  TYPE bapikna105,
  gs_copyreference    TYPE bapikna102,

  gv_consumeren       TYPE bapikna107-consumer_flag,
  gv_credit_control   TYPE bapikna108-x_flag,

  gv_customer         TYPE kunnr,
  gs_bapi_return      TYPE bapireturn1.

*---------------------------------------------------------------------*
* DATA - CUSTOMER MASTER
*---------------------------------------------------------------------*

DATA:
  gs_kna1 TYPE kna1,
  gs_knb1 TYPE knb1,
  gs_knvv TYPE knvv.

*---------------------------------------------------------------------*
* DATA - TAX / PARTNERS
*---------------------------------------------------------------------*

DATA:
  gs_xknvi TYPE fknvi,
  gs_xknvp TYPE fknvp,

  gt_xknvi TYPE STANDARD TABLE OF fknvi,
  gt_xknvp TYPE STANDARD TABLE OF fknvp.

*---------------------------------------------------------------------*
* DATA - NAME / SORT
*---------------------------------------------------------------------*

DATA:
  gv_name1 TYPE kna1-name1,
  gv_sortl TYPE kna1-sortl,
  gv_ok    TYPE c,
  gv_msg   TYPE char255.

*---------------------------------------------------------------------*
* ALV
*---------------------------------------------------------------------*

DATA:
  gt_fieldcat TYPE slis_t_fieldcat_alv,
  gs_fieldcat TYPE slis_fieldcat_alv.

*---------------------------------------------------------------------*
* CONSTANTS
*---------------------------------------------------------------------*

CONSTANTS:

  gc_ktokd        TYPE ktokd VALUE 'DMCU',
  gc_land1        TYPE land1 VALUE 'RU',
  gc_spras        TYPE spras VALUE 'R',

  gc_lzone        TYPE lzone VALUE 'ZSD019',
  gc_akont        TYPE akont VALUE '62.01.192',
  gc_fdgrv        TYPE fdgrv VALUE 'ZZZTECH602',
  gc_zterm        TYPE dzterm VALUE 'N000',

  gc_waers        TYPE waers VALUE 'RUB',
  gc_kalks        TYPE kalks VALUE '1',
  gc_versg        TYPE versg VALUE '1',
  gc_kzazu        TYPE kzazu VALUE 'X',

  gc_vsbed        TYPE vsbed VALUE '23',
  gc_vtweg        TYPE vtweg VALUE '45',
  gc_spart        TYPE spart VALUE '00',
  gc_antlf        TYPE antlf VALUE '9',

  gc_ktgrd        TYPE ktgrd VALUE '45',
  gc_taxkd        TYPE taxkd VALUE '1',

  gc_kvgr1        TYPE kvgr1 VALUE 'NEV',
  gc_katr1        TYPE katr1 VALUE 'MX',

  gc_parvw_zp     TYPE parvw VALUE 'ZP',
  gc_parvw_zf     TYPE parvw VALUE 'ZF',

  gc_ref_customer TYPE kunnr VALUE '0000000001'.

*---------------------------------------------------------------------*
* EVENTS
*---------------------------------------------------------------------*

AT SELECTION-SCREEN.

  PERFORM validate_selection.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.

  PERFORM get_file_name.

START-OF-SELECTION.

  PERFORM get_configuration.
  PERFORM upload_excel.
  PERFORM process_excel.
  PERFORM display_result.

*---------------------------------------------------------------------*
* FORM VALIDATE_SELECTION
*---------------------------------------------------------------------*

FORM validate_selection.

  IF p_bukrs IS INITIAL.
    MESSAGE 'Введите BUKRS' TYPE 'E'.
  ENDIF.

  IF p_vkorg IS INITIAL.
    MESSAGE 'Введите VKORG' TYPE 'E'.
  ENDIF.

  IF p_ktonr IS INITIAL.
    MESSAGE 'Введите KTONR' TYPE 'E'.
  ENDIF.

  IF p_vkgrp IS INITIAL.
    MESSAGE 'Введите VKGRP' TYPE 'E'.
  ENDIF.

  IF p_file IS INITIAL.
    MESSAGE 'Выберите Excel-файл' TYPE 'E'.
  ENDIF.

ENDFORM.

*---------------------------------------------------------------------*
* FORM GET_FILE_NAME
*---------------------------------------------------------------------*

FORM get_file_name.

  CALL FUNCTION 'F4_FILENAME'
    EXPORTING
      program_name  = sy-cprog
      dynpro_number = sy-dynnr
    IMPORTING
      file_name     = p_file.

ENDFORM.

*---------------------------------------------------------------------*
* FORM GET_CONFIGURATION
*---------------------------------------------------------------------*

FORM get_configuration.

  CLEAR gs_config.

  CASE p_bukrs.

    WHEN '1000'.

      IF p_vkorg = '1000'.

        gs_config-begru    = '1MCU'.
        gs_config-vkbur    = '0002'.
        gs_config-vwerk   = '1000'.
        gs_config-zf_ktonr = 'BEZANT-1'.

      ELSE.

        MESSAGE 'Для BUKRS 1000 допустим VKORG 1000' TYPE 'E'.

      ENDIF.

    WHEN '4000'.

      IF p_vkorg = '4000'.

        gs_config-begru    = '4MCU'.
        gs_config-vkbur    = '0003'.
        gs_config-vwerk    = '4000'.
        gs_config-zf_ktonr = 'BEZANT-SIB'.

      ELSE.

        MESSAGE 'Для BUKRS 4000 допустим VKORG 4000' TYPE 'E'.

      ENDIF.

    WHEN OTHERS.

      MESSAGE 'Недопустимый BUKRS' TYPE 'E'.

  ENDCASE.

ENDFORM.

*---------------------------------------------------------------------*
* FORM UPLOAD_EXCEL
*---------------------------------------------------------------------*

FORM upload_excel.

  DATA:
    lv_row      TYPE i,
    lv_max_row  TYPE i,
    lv_inn      TYPE char50,
    lv_kpp      TYPE char50.

  CLEAR:
    gt_excel,
    gt_excel_raw.

  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_file
      i_begin_col             = 1
      i_begin_row             = 1
      i_end_col               = 2
      i_end_row               = 65536
    TABLES
      intern                  = gt_excel_raw
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.

  IF sy-subrc <> 0.

    MESSAGE 'Ошибка загрузки Excel' TYPE 'E'.

  ENDIF.

  IF gt_excel_raw IS INITIAL.

    MESSAGE 'Excel-файл пустой' TYPE 'E'.

  ENDIF.

  SORT gt_excel_raw BY row col.

  CLEAR lv_max_row.

  LOOP AT gt_excel_raw INTO gs_excel_raw.

    IF gs_excel_raw-row > lv_max_row.
      lv_max_row = gs_excel_raw-row.
    ENDIF.

  ENDLOOP.

  DO lv_max_row TIMES.

    lv_row = sy-index.

    " Первая строка - заголовки
    IF lv_row = 1.
      CONTINUE.
    ENDIF.

    CLEAR:
      gs_excel,
      lv_inn,
      lv_kpp.

    READ TABLE gt_excel_raw INTO gs_excel_raw
      WITH KEY
        row = lv_row
        col = 1.

    IF sy-subrc = 0.
      lv_inn = gs_excel_raw-value.
    ENDIF.

    READ TABLE gt_excel_raw INTO gs_excel_raw
      WITH KEY
        row = lv_row
        col = 2.

    IF sy-subrc = 0.
      lv_kpp = gs_excel_raw-value.
    ENDIF.

    CONDENSE lv_inn NO-GAPS.
    CONDENSE lv_kpp NO-GAPS.

    IF lv_inn IS INITIAL
       AND lv_kpp IS INITIAL.

      CONTINUE.

    ENDIF.

    gs_excel-stcd1 = lv_inn.
    gs_excel-stcd3 = lv_kpp.

    APPEND gs_excel TO gt_excel.

  ENDDO.

  IF gt_excel IS INITIAL.

    MESSAGE 'В Excel нет данных для обработки' TYPE 'E'.

  ENDIF.

ENDFORM.

*---------------------------------------------------------------------*
* FORM PROCESS_EXCEL
*---------------------------------------------------------------------*

FORM process_excel.

  CLEAR gt_result.

  LOOP AT gt_excel INTO gs_excel.

    CLEAR:
      gs_result,
      gv_name1,
      gv_sortl,
      gv_ok,
      gv_msg,
      gv_customer.

    gs_result-stcd1 = gs_excel-stcd1.
    gs_result-stcd3 = gs_excel-stcd3.

    "---------------------------------------------------------------*
    " Получаем NAME1 / SORTL по ИНН / КПП
    "---------------------------------------------------------------*

    PERFORM get_name_sortl
      USING
        gs_excel-stcd1
        gs_excel-stcd3
      CHANGING
        gv_name1
        gv_sortl
        gv_ok
        gv_msg.

    IF gv_ok IS INITIAL.

      gs_result-status  = 'ERROR'.
      gs_result-message = gv_msg.

      APPEND gs_result TO gt_result.

      CONTINUE.

    ENDIF.

    gs_result-name1 = gv_name1.
    gs_result-sortl = gv_sortl.

    "---------------------------------------------------------------*
    " Создание клиента
    "---------------------------------------------------------------*

    PERFORM create_customer
      USING
        gs_excel-stcd1
        gs_excel-stcd3
        gv_name1
        gv_sortl
      CHANGING
        gv_customer
        gv_ok
        gv_msg.

    IF gv_ok IS INITIAL.

      gs_result-status  = 'ERROR'.
      gs_result-message = gv_msg.

    ELSE.

      gs_result-kunnr    = gv_customer.
      gs_result-status   = 'OK'.
      gs_result-message  = 'Клиент создан'.

    ENDIF.

    APPEND gs_result TO gt_result.

  ENDLOOP.

ENDFORM.

*---------------------------------------------------------------------*
* FORM GET_NAME_SORTL
*---------------------------------------------------------------------*
* Здесь будет вызов твоего API по ИНН/КПП.
*---------------------------------------------------------------------*

FORM get_name_sortl
  USING
    iv_inn   TYPE stcd1
    iv_kpp   TYPE stcd3
  CHANGING
    cv_name1 TYPE kna1-name1
    cv_sortl TYPE kna1-sortl
    cv_ok    TYPE c
    cv_msg   TYPE char255.

  CLEAR:
    cv_name1,
    cv_sortl,
    cv_ok,
    cv_msg.

  "===============================================================*
  " TODO:
  " Здесь вставляется твой отдельный вызов API.
  "
  " Пример:
  "
  " CALL FUNCTION 'Z_GET_ORG_DATA'
  "   EXPORTING
  "     iv_inn   = iv_inn
  "     iv_kpp   = iv_kpp
  "   IMPORTING
  "     ev_name1 = cv_name1
  "     ev_sortl = cv_sortl.
  "
  "===============================================================*

  cv_msg = 'Не реализовано получение NAME1/SORTL'.

ENDFORM.

*---------------------------------------------------------------------*
* FORM CREATE_CUSTOMER
*---------------------------------------------------------------------*

FORM create_customer
  USING
    iv_stcd1   TYPE stcd1
    iv_stcd3   TYPE stcd3
    iv_name1   TYPE kna1-name1
    iv_sortl   TYPE kna1-sortl
  CHANGING
    cv_customer TYPE kunnr
    cv_ok       TYPE c
    cv_msg      TYPE char255.

  CLEAR:
    cv_customer,
    cv_ok,
    cv_msg.

*---------------------------------------------------------------------*
* CLEAR BAPI
*---------------------------------------------------------------------*

  CLEAR:
    gs_personaldata,
    gs_opt_personaldata,
    gs_companydata,
    gs_opt_companydata,
    gs_copyreference,
    gs_bapi_return.

  CLEAR:
    gv_consumeren,
    gv_credit_control.

*---------------------------------------------------------------------*
* BAPI PERSONAL DATA
*---------------------------------------------------------------------*

  gs_personaldata-country      = gc_land1.
  gs_personaldata-countryiso   = 'RU'.

  gs_personaldata-langu_p      = gc_spras.
  gs_personaldata-langup_iso   = 'RU'.

  gs_personaldata-currency     = gc_waers.
  gs_personaldata-currency_iso = 'RUB'.

*---------------------------------------------------------------------*
* BAPI OPTIONAL PERSONAL DATA
*---------------------------------------------------------------------*

  gs_opt_personaldata-transpzone      = gc_lzone.
  gs_opt_personaldata-control_account  = gc_akont.
  gs_opt_personaldata-pmnttrms        = gc_zterm.
  gs_opt_personaldata-ship_cond       = gc_vsbed.
  gs_opt_personaldata-delyg_plnt      = gs_config-vwerk.

*---------------------------------------------------------------------*
* BAPI COMPANY DATA
*---------------------------------------------------------------------*

  gs_companydata-country      = gc_land1.
  gs_companydata-countryiso   = 'RU'.

  gs_companydata-langu        = gc_spras.
  gs_companydata-langu_iso   = 'RU'.

  gs_companydata-currency     = gc_waers.
  gs_companydata-currency_iso = 'RUB'.

*---------------------------------------------------------------------*
* REFERENCE CUSTOMER
*---------------------------------------------------------------------*

  gs_copyreference-salesorg   = p_vkorg.
  gs_copyreference-distr_chan = gc_vtweg.
  gs_copyreference-division   = gc_spart.
  gs_copyreference-ref_custmr = gc_ref_customer.

  gv_consumeren     = space.
  gv_credit_control = space.

*---------------------------------------------------------------------*
* CREATE BASE CUSTOMER
*---------------------------------------------------------------------*

  CALL FUNCTION 'BAPI_CUSTOMER_CREATEFROMDATA1'
    EXPORTING
      pi_personaldata        = gs_personaldata
      pi_opt_personaldata    = gs_opt_personaldata
      pi_companydata         = gs_companydata
      pi_opt_companydata     = gs_opt_companydata
      pi_consumeren          = gv_consumeren
      pi_copyreference       = gs_copyreference
      pi_credit_control_flag = gv_credit_control
    IMPORTING
      customerno             = cv_customer
      return                 = gs_bapi_return.

  IF gs_bapi_return-type = 'E'
     OR gs_bapi_return-type = 'A'.

    cv_msg = gs_bapi_return-message.

    ROLLBACK WORK.

    CLEAR cv_customer.

    RETURN.

  ENDIF.

  IF cv_customer IS INITIAL.

    cv_msg = 'BAPI не вернул номер клиента'.

    ROLLBACK WORK.

    RETURN.

  ENDIF.

*---------------------------------------------------------------------*
* KNA1
*---------------------------------------------------------------------*

  CLEAR gs_kna1.

  gs_kna1-kunnr = cv_customer.
  gs_kna1-ktokd = gc_ktokd.

  gs_kna1-name1 = iv_name1.
  gs_kna1-sortl = iv_sortl.

  gs_kna1-land1 = gc_land1.
  gs_kna1-spras = gc_spras.

  gs_kna1-stcd1 = iv_stcd1.
  gs_kna1-stcd3 = iv_stcd3.

  gs_kna1-lzone = gc_lzone.
  gs_kna1-katr1 = gc_katr1.

*---------------------------------------------------------------------*
* KNB1
*---------------------------------------------------------------------*

  CLEAR gs_knb1.

  gs_knb1-kunnr = cv_customer.
  gs_knb1-bukrs = p_bukrs.

  gs_knb1-akont = gc_akont.
  gs_knb1-begru = gs_config-begru.
  gs_knb1-fdgrv = gc_fdgrv.
  gs_knb1-zterm = gc_zterm.
  gs_knb1-kverm = iv_name1.

*---------------------------------------------------------------------*
* KNVV
*---------------------------------------------------------------------*

  CLEAR gs_knvv.

  gs_knvv-kunnr = cv_customer.
  gs_knvv-vkorg = p_vkorg.
  gs_knvv-vtweg = gc_vtweg.
  gs_knvv-spart = gc_spart.

  gs_knvv-vkbur = gs_config-vkbur.
  gs_knvv-vkgrp = p_vkgrp.

  gs_knvv-waers = gc_waers.
  gs_knvv-kalks = gc_kalks.
  gs_knvv-versg = gc_versg.

  gs_knvv-kzazu = gc_kzazu.
  gs_knvv-vsbed = gc_vsbed.
  gs_knvv-vwerk = gs_config-vwerk.

  gs_knvv-antlf = gc_antlf.
  gs_knvv-zterm = gc_zterm.
  gs_knvv-ktgrd = gc_ktgrd.

  gs_knvv-kvgr1 = gc_kvgr1.

*---------------------------------------------------------------------*
* KNVI
*---------------------------------------------------------------------*

  CLEAR:
    gs_xknvi,
    gt_xknvi.

  gs_xknvi-kunnr = cv_customer.
  gs_xknvi-aland = gc_land1.
  gs_xknvi-taxkd = gc_taxkd.

  APPEND gs_xknvi TO gt_xknvi.

*---------------------------------------------------------------------*
* KNVP - ZP
*---------------------------------------------------------------------*

  CLEAR:
    gs_xknvp,
    gt_xknvp.

  gs_xknvp-kunnr = cv_customer.
  gs_xknvp-vkorg = p_vkorg.
  gs_xknvp-vtweg = gc_vtweg.
  gs_xknvp-spart = gc_spart.

  gs_xknvp-parvw = gc_parvw_zp.
  gs_xknvp-kunn2 = p_ktonr.

  APPEND gs_xknvp TO gt_xknvp.

*---------------------------------------------------------------------*
* KNVP - ZF
*---------------------------------------------------------------------*

  CLEAR gs_xknvp.

  gs_xknvp-kunnr = cv_customer.
  gs_xknvp-vkorg = p_vkorg.
  gs_xknvp-vtweg = gc_vtweg.
  gs_xknvp-spart = gc_spart.

  gs_xknvp-parvw = gc_parvw_zf.
  gs_xknvp-kunn2 = gs_config-zf_ktonr.

  APPEND gs_xknvp TO gt_xknvp.

*---------------------------------------------------------------------*
* UPDATE CUSTOMER MASTER
*---------------------------------------------------------------------*

  CALL FUNCTION 'SD_CUSTOMER_MAINTAIN_ALL'
    EXPORTING
      i_kna1                      = gs_kna1
      i_knb1                      = gs_knb1
      i_knvv                      = gs_knvv
      i_maintain_address_by_kna1  = 'X'
      pi_postflag                 = 'X'
    IMPORTING
      e_kunnr                     = cv_customer
      o_kna1                      = gs_kna1
    TABLES
      t_xknvi                     = gt_xknvi
      t_xknvp                     = gt_xknvp
    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.

    CASE sy-subrc.

      WHEN 1.
        cv_msg = 'CLIENT_ERROR'.

      WHEN 2.
        cv_msg = 'KNA1_INCOMPLETE'.

      WHEN 3.
        cv_msg = 'KNB1_INCOMPLETE'.

      WHEN 4.
        cv_msg = 'KNB5_INCOMPLETE'.

      WHEN 5.
        cv_msg = 'KNVV_INCOMPLETE'.

      WHEN 6.
        cv_msg = 'KUNNR_NOT_UNIQUE'.

      WHEN 7.
        cv_msg = 'SALES_AREA_NOT_UNIQUE'.

      WHEN 8.
        cv_msg = 'SALES_AREA_NOT_VALID'.

      WHEN 9.
        cv_msg = 'INSERT_UPDATE_CONFLICT'.

      WHEN 10.
        cv_msg = 'NUMBER_ASSIGNMENT_ERROR'.

      WHEN 11.
        cv_msg = 'NUMBER_NOT_IN_RANGE'.

      WHEN 12.
        cv_msg = 'NUMBER_RANGE_NOT_EXTERN'.

      WHEN 13.
        cv_msg = 'NUMBER_RANGE_NOT_INTERN'.

      WHEN 14.
        cv_msg = 'ACCOUNT_GROUP_NOT_VALID'.

      WHEN 15.
        cv_msg = 'PARNR_INVALID'.

      WHEN 16.
        cv_msg = 'BANK_ADDRESS_INVALID'.

      WHEN 17.
        cv_msg = 'TAX_DATA_NOT_VALID'.

      WHEN 18.
        cv_msg = 'NO_AUTHORITY'.

      WHEN 19.
        cv_msg = 'COMPANY_CODE_NOT_UNIQUE'.

      WHEN 20.
        cv_msg = 'DUNNING_DATA_NOT_VALID'.

      WHEN 21.
        cv_msg = 'KNB1_REFERENCE_INVALID'.

      WHEN 22.
        cv_msg = 'CAM_ERROR'.

      WHEN OTHERS.
        cv_msg = 'Ошибка SD_CUSTOMER_MAINTAIN_ALL'.

    ENDCASE.

    ROLLBACK WORK.

    CLEAR cv_customer.

    RETURN.

  ENDIF.

*---------------------------------------------------------------------*
* COMMIT
*---------------------------------------------------------------------*

  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait = 'X'.

  cv_ok = 'X'.

ENDFORM.

*---------------------------------------------------------------------*
* FORM DISPLAY_RESULT
*---------------------------------------------------------------------*

FORM display_result.

  CLEAR gt_fieldcat.

  PERFORM add_fieldcat USING 'STCD1'   'ИНН'.
  PERFORM add_fieldcat USING 'STCD3'   'КПП'.
  PERFORM add_fieldcat USING 'NAME1'   'Наименование'.
  PERFORM add_fieldcat USING 'SORTL'   'Поиск'.
  PERFORM add_fieldcat USING 'KUNNR'   'Клиент'.
  PERFORM add_fieldcat USING 'STATUS'  'Статус'.
  PERFORM add_fieldcat USING 'MESSAGE' 'Сообщение'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = sy-repid
      it_fieldcat        = gt_fieldcat
    TABLES
      t_outtab           = gt_result
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.

ENDFORM.

*---------------------------------------------------------------------*
* FORM ADD_FIELDCAT
*---------------------------------------------------------------------*

FORM add_fieldcat
  USING
    iv_fieldname TYPE slis_fieldname
    iv_text      TYPE char40.

  CLEAR gs_fieldcat.

  gs_fieldcat-fieldname = iv_fieldname.
  gs_fieldcat-seltext_m = iv_text.

  APPEND gs_fieldcat TO gt_fieldcat.

ENDFORM.