REPORT zexport_progs.

TABLES: trdir.

DATA: BEGIN OF gt_data OCCURS 0,
        name LIKE trdir-name,
        cnam LIKE trdir-cnam,
      END OF gt_data.

RANGES: r_users FOR sy-uname.

****************************************
* SELECTION-SCREEN                     *
****************************************
SELECTION-SCREEN: BEGIN OF BLOCK b0 WITH FRAME TITLE text-000.
SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS s_name FOR trdir-name.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 1.
PARAMETERS p_create AS CHECKBOX DEFAULT 'X' USER-COMMAND mod.
SELECTION-SCREEN COMMENT 2(25) text-011 FOR FIELD p_create.
SELECTION-SCREEN POSITION 28.
SELECT-OPTIONS s_cnam FOR trdir-cnam DEFAULT sy-uname.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 1.
PARAMETERS p_change AS CHECKBOX USER-COMMAND mod.
SELECTION-SCREEN COMMENT 2(25) text-012 FOR FIELD p_change.
SELECTION-SCREEN POSITION 28.
SELECT-OPTIONS s_unam FOR trdir-unam DEFAULT sy-uname.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN: END OF BLOCK b1.
PARAMETERS: p_path LIKE ibipparms-path DEFAULT 'C:\temp\'.
SELECTION-SCREEN: END OF BLOCK b0.

****************************************
* INITIALIZATION                       *
****************************************
INITIALIZATION.
  APPEND 'ICPZ*' TO s_name.
  APPEND 'ICPLZ*' TO s_name.

****************************************
* LOAD-OF-PROGRAM                      *
****************************************
LOAD-OF-PROGRAM.
*--- definition of authorized users ---*
*  r_users-sign = 'I'. r_users-option = 'EQ'.
*  r_users-low = 'PJAROS'. APPEND r_users.

  IF NOT sy-uname IN r_users.
    MESSAGE s999(re) WITH 'You are not authorized to run this program'.
    LEAVE PROGRAM.
  ENDIF.

****************************************
* AT SELECTION-SCREEN                  *
****************************************
AT SELECTION-SCREEN OUTPUT.
  PERFORM sel_screen_processing.

****************************************
* START-OF-SELECTION                   *
****************************************
START-OF-SELECTION.
  PERFORM get_data.
  CHECK NOT gt_data[] IS INITIAL.
  PERFORM export_programs.

*---------------------------------------------------------------------*
*       FORM sel_screen_processing                                    *
*---------------------------------------------------------------------*
FORM sel_screen_processing.
  LOOP AT SCREEN.
    IF screen-name = 'S_CNAM-LOW'
     OR screen-name = 'S_CNAM-HIGH'
     OR screen-name = '%_S_CNAM_%_APP_%-VALU_PUSH'.
      IF p_create = 'X'.
        screen-active = '1'.
      ELSE.
        screen-active = '0'.
      ENDIF.
      MODIFY SCREEN.
    ELSEIF screen-name = 'S_UNAM-LOW'
     OR screen-name = 'S_UNAM-HIGH'
     OR screen-name = '%_S_UNAM_%_APP_%-VALU_PUSH'.
      IF p_change = 'X'.
        screen-active = '1'.
      ELSE.
        screen-active = '0'.
      ENDIF.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.
ENDFORM.

*---------------------------------------------------------------------*
*       FORM get_data                                                 *
*---------------------------------------------------------------------*
FORM get_data.
  IF p_create = 'X' AND p_change = 'X'.
    SELECT * FROM trdir
    INTO CORRESPONDING FIELDS OF TABLE gt_data
    WHERE name IN s_name
    AND ( cnam IN s_cnam OR unam IN s_unam ).
  ELSEIF p_create = 'X'.
    SELECT * FROM trdir
    INTO CORRESPONDING FIELDS OF TABLE gt_data
    WHERE name IN s_name
    AND cnam IN s_cnam.
  ELSEIF p_change = 'X'.
    SELECT * FROM trdir
    INTO CORRESPONDING FIELDS OF TABLE gt_data
    WHERE name IN s_name
    AND unam IN s_unam.
  ENDIF.

  IF gt_data[] IS INITIAL.
    MESSAGE i999(re) WITH 'No program meet selection criteria'.
  ENDIF.
ENDFORM.

*---------------------------------------------------------------------*
*       FORM export_programs                                          *
*---------------------------------------------------------------------*
FORM export_programs.
  TYPES: BEGIN OF t_rep,
           line(72),
         END OF t_rep.
  DATA: ls_rep TYPE t_rep,
        lt_rep LIKE TABLE OF ls_rep,
        l_fname TYPE string,
        l_ptype TYPE char10,
        l_len TYPE i,
        l_cnt TYPE i.

  l_len = strlen( p_path ).
  SUBTRACT 1 FROM l_len.
  IF p_path+l_len(1) <> '\'.
    ADD 1 TO l_len.
    p_path+l_len(1) = '\'.
  ENDIF.

  SORT gt_data BY cnam.

  LOOP AT gt_data.
    FREE lt_rep[].

    IF gt_data-name(1) = 'L'.
      l_ptype = 'FUNC'.
    ELSE.
      l_ptype = 'PROG'.
    ENDIF.

    READ REPORT gt_data-name INTO lt_rep.
    IF sy-subrc = 0.
      CONCATENATE p_path gt_data-cnam '\' l_ptype '\'
       gt_data-name '.abp' INTO l_fname.

      CALL METHOD cl_gui_frontend_services=>gui_download
           EXPORTING
             filename                = l_fname
             filetype                = 'ASC'
             append                  = ' '
           CHANGING
             data_tab                = lt_rep
           EXCEPTIONS
             file_write_error        = 1
             no_batch                = 2
             gui_refuse_filetransfer = 3
             invalid_type            = 4
             no_authority            = 5
             unknown_error           = 6
             header_not_allowed      = 7
             separator_not_allowed   = 8
             filesize_not_allowed    = 9
             header_too_long         = 10
             dp_error_create         = 11
             dp_error_send           = 12
             dp_error_write          = 13
             unknown_dp_error        = 14
             access_denied           = 15
             dp_out_of_memory        = 16
             disk_full               = 17
             dp_timeout              = 18
             file_not_found          = 19
             dataprovider_exception  = 20
             control_flush_error     = 21
             OTHERS                  = 24.

      IF sy-subrc = 0.
        ADD 1 TO l_cnt.
      ENDIF.
    ENDIF.
  ENDLOOP.

  IF l_cnt = 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    MESSAGE s000(xt) WITH l_cnt 'program(s) exported successfully'.
  ENDIF.
ENDFORM.