SAP Help ABAP code for program to manipulate HTML and text files from within SAP to add, delete and even update the contents of the file









ABAP code for program to manipulate HTML and text files

face="Arial monospaced for SAP">*&-------------------------------------------------------------*
*& Report  ZHTMUPDATE
*&
*&-------------------------------------------------------------*
*&
*&
*&-------------------------------------------------------------*
REPORT  Zhtmupdate.


*   Retrieve data file from presentation server(Upload from PC)
types: begin of t_datatab,
*  row(500) type c,
  row type string,
 end of t_datatab.
data:  it_datatab type STANDARD TABLE OF t_datatab,
       wa_datatab like line of it_datatab,
       it_datafind type STANDARD TABLE OF t_datatab,
       wa_datafind like line of it_datatab,
       it_datanew type STANDARD TABLE OF t_datatab,
       wa_datanew like line of it_datatab,
       it_datanewstor type STANDARD TABLE OF t_datatab.

* DATA: WA_FILE_TABLE TYPE FILE_INFO,
*        TAB TYPE STANDARD TABLE OF FILE_INFO.
*  data: len type i.
data:  it_files type STANDARD TABLE OF FILE_INFO,
       it_dirs type STANDARD TABLE OF FILE_INFO,
       wa_files like line of it_files,
       wa_dirs like line of it_dirs,

       gd_insert type string.

DATA: i_input type string,
      i_find  type string,
      i_new type string,
      gd_dir    type string,
      gd_count type i,
      gd_multi type i,
      gd_newtxt type  string,
      gd_head   type i.


*Selecting a File, plus inserting default file extension
selection-screen begin of block group with frame title text-s01.
parameters: p_selfil type c radiobutton group difi.
parameters: p_file like rlgrap-filename LOWER CASE.
parameters: p_seldir type c radiobutton group difi.
parameters: p_dir like rlgrap-filename.

selection-screen end of block group.

selection-screen begin of block find with frame title text-s02.
parameters: p_find like rlgrap-filename LOWER CASE.
parameters: p_new like rlgrap-filename LOWER CASE.
parameters: p_not type string.
parameters: p_check type string.

parameters: p_start type string.
parameters: p_end type string.

selection-screen begin of line.
selection-screen comment 1(79) text-S03.
selection-screen end of line.

selection-screen begin of line.
selection-screen comment 1(39) text-S04.
parameters: p_repfn type string.
selection-screen end of line.

*parameters: p_multi type c.
*parameters: p_repfn type string.
selection-screen end of block find.

selection-screen begin of block insert with frame title text-s01.
parameters: p_above  type c radiobutton group new.
parameters: p_below  type c radiobutton group new.
parameters: p_repl   type c radiobutton group new.
parameters: p_before  type c radiobutton group new.
parameters: p_after  type c radiobutton group new.
selection-screen end of block insert.


at selection-screen OUTPUT.
  gd_dir = p_dir.

at selection-screen on value-request for p_dir.

  CALL METHOD cl_gui_frontend_services=>directory_browse
    EXPORTING
      window_title    = 'File Directory'
      initial_folder  = gd_dir     "'M:\sap\sapdev2005\'
    CHANGING
      selected_folder = gd_dir.

  CALL METHOD cl_gui_cfw=>flush.

  concatenate gd_dir '' into p_dir.

************************************************************************
*AT SELECTION-SCREEN ON VALUE-REQUEST FOR I_FILE.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_filename     = p_file
      mask             = ',*.xls.'
      mode             = 'O'
      title            = 'Upload File'(078)
    IMPORTING
      filename         = p_file
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.

************************************************************************
*AT SELECTION-SCREEN ON VALUE-REQUEST FOR I_FILE.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_find.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_filename     = p_file
      mask             = ',*.xls.'
      mode             = 'O'
      title            = 'Upload File'(078)
    IMPORTING
      filename         = p_find
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.

************************************************************************
*AT SELECTION-SCREEN ON VALUE-REQUEST FOR I_FILE.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_new.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_filename     = p_file
      mask             = ',*.xls.'
      mode             = 'O'
      title            = 'Upload File'(078)
    IMPORTING
      filename         = p_new
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.

**************************************************************************
*start-of-selection.
start-of-selection.


*UPLOAD FILES*******
  case 'X'.
    when p_seldir.
      perform get_directorys_in_directory using p_dir.
      loop at it_dirs into wa_dirs.
        perform get_files_in_directory using wa_dirs-filename.
      endloop.
    when p_selfil.
      wa_files-filename =  p_file.
      append wa_files to it_files.
  endcase.

  PERFORM get_input_files.

  loop at it_files into wa_files.
    it_datanew[] = it_datanewstor[].
    i_input = wa_files-filename.

    if not p_repfn is initial.
      gd_insert = i_input.
      translate gd_insert to upper case.
      replace ALL OCCURRENCES OF p_repfn in gd_insert with ' '.
      shift gd_insert LEFT DELETING LEADING space.
      loop at it_datanew into wa_datanew.
        translate gd_insert to LOWER CASE.
        replace ALL OCCURRENCES OF '' in wa_datanew-row with gd_insert.
        if sy-subrc eq 0.
          replace ALL OCCURRENCES OF '\' in wa_datanew-row with '/'.
          modify it_datanew from wa_datanew index sy-tabix.
        endif.
      endloop.
    endif.

    perform get_date_file.
    PERFORM process_files.
*DOWNLOAD FILE*******
    PERFORM download_result_file.
  endloop.


*&---------------------------------------------------------------------*

*& Form get input files

*&---------------------------------------------------------------------* * text *---------------------------------------------------------------------------------* * --> p1 text * <-- p2 text *---------------------------------------------------------------------------------* FORM get_input_files . i_find = p_find. CALL FUNCTION 'GUI_UPLOAD' EXPORTING filename = i_find filetype = 'ASC' TABLES data_tab = it_datafind "ITBL_IN_RECORD[] EXCEPTIONS file_open_error = 1 OTHERS = 2. i_new = p_new. CALL FUNCTION 'GUI_UPLOAD' EXPORTING filename = i_new filetype = 'ASC' TABLES data_tab = it_datanewstor "ITBL_IN_RECORD[] EXCEPTIONS file_open_error = 1 OTHERS = 2. ENDFORM. " get_input_files *&---------------------------------------------------------------------*

*& Form download result file

*&---------------------------------------------------------------------* * text *---------------------------------------------------------------------------------* * --> p1 text * <-- p2 text *---------------------------------------------------------------------------------* FORM download_result_file . CALL METHOD cl_gui_frontend_services=>GUI_DOWNLOAD EXPORTING filename = i_input CHANGING data_tab = it_datatab[] "ITBL_IN_RECORD[] 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 NOT_SUPPORTED_BY_GUI = 22 ERROR_NO_GUI = 23. if sy-subrc ne 0. write:/ 'download failure for file-', i_input. endif. * CALL * FUNCTION * 'GUI_DOWNLOAD' * file_open_error = 1 * OTHERS = 2. ENDFORM. " download_result_file *&---------------------------------------------------------------------*

*& Form process files

*&---------------------------------------------------------------------* * text *---------------------------------------------------------------------------------* * --> p1 text * <-- p2 text *---------------------------------------------------------------------------------* FORM process_files . data: ld_tabix like sy-tabix, ld_found type i, ld_end type i. READ TABLE it_datafind into wa_datafind index 1. if not p_check is initial. loop at it_datatab into wa_datatab where row cs p_check. endloop. if sy-subrc eq 0. write:/ i_input COLOR COL_NEGATIVE, '-file contains restricted value'. exit. endif. endif. clear: gd_multi, gd_head, ld_found, ld_end. loop at it_datatab into wa_datatab. if wa_datatab-row cs p_start or ld_found ge 1 or p_start is initial. ld_found = 1. if wa_datatab-row cs p_end and not p_start is initial. ld_end = 1. exit. endif. if wa_datatab-row cs wa_datafind-row. if not wa_datatab-row cs p_not or p_not is INITIAL. case 'X'. when p_above. ld_tabix = sy-tabix. perform insert_new_lines using ld_tabix. when p_below. ld_tabix = sy-tabix + 1. perform insert_new_lines using ld_tabix. when p_repl. ld_tabix = sy-tabix. delete it_datatab index ld_tabix. perform insert_new_lines using ld_tabix. when p_after. ld_tabix = sy-tabix. read table it_datanew into wa_datanew index 1. CONCATENATE wa_datafind-row wa_datanew-row into gd_newtxt. perform modify_lines using ld_tabix. when p_before. ld_tabix = sy-tabix. read table it_datanew into wa_datanew index 1. CONCATENATE wa_datanew-row wa_datafind-row into gd_newtxt. perform modify_lines using ld_tabix. * replace ALL OCCURRENCES OF wa_datafind-row in wa_datatab-row with gd_new. * modify it_datatab from wa_datatab index ld_tabix. endcase. else. if gd_head lt 1. write:/ i_input COLOR COL_POSITIVE. gd_head = 1. endif. write:/ wa_datatab-row COLOR COL_HEADING, '-line contains excluded value'. endif. endif. endif. endloop. if gd_multi le 0. write:/ i_input color COL_TOTAL, '-file not updated'. if ld_end ge 1. write: space, ' -end value found'. endif. endif. ENDFORM. " process_files *&---------------------------------------------------------------------*

*& Form get files in directory

*&---------------------------------------------------------------------* * text *---------------------------------------------------------------------------------* * --> p1 text * <-- p2 text *---------------------------------------------------------------------------------* FORM get_files_in_directory using lp_dir. data: ld_dir type string, it_storefiles type STANDARD TABLE OF FILE_INFO, wa_storefiles like line of it_storefiles. ld_dir = lp_dir. CALL METHOD cl_gui_frontend_services=>DIRECTORY_LIST_FILES EXPORTING DIRECTORY = ld_dir files_only = 'X' CHANGING file_table = it_storefiles count = gd_count EXCEPTIONS OTHERS = 1. loop at it_storefiles into wa_storefiles. shift ld_dir right deleting TRAILING '/'. shift ld_dir right deleting TRAILING '\'. shift ld_dir left deleting leading space. concatenate ld_dir '\' wa_storefiles-FILENAME into wa_storefiles-FILENAME. if wa_storefiles-FILENAME cs '.htm' and wa_storefiles-filename cs '.HTM'. append wa_storefiles to it_files. endif. endloop. ENDFORM. " get_files_in_directory *&---------------------------------------------------------------------*

*& Form get date file

*&---------------------------------------------------------------------* * text *---------------------------------------------------------------------------------* * --> p1 text * <-- p2 text *---------------------------------------------------------------------------------* FORM get_date_file . CALL FUNCTION 'GUI_UPLOAD' EXPORTING filename = i_input filetype = 'ASC' TABLES data_tab = it_datatab "ITBL_IN_RECORD[] EXCEPTIONS file_open_error = 1 OTHERS = 2. ENDFORM. " get_date_file *&---------------------------------------------------------------------*

*& Form insert new lines

*&---------------------------------------------------------------------* * text *---------------------------------------------------------------------------------* * --> p1 text * <-- p2 text *---------------------------------------------------------------------------------* FORM insert_new_lines USING ld_tabix. insert LINES OF it_datanew into it_datatab index ld_tabix. gd_multi = gd_multi + 1. if gd_multi = 1. write:/ i_input COLOR COL_POSITIVE, '-File Updated OK'. * if p_multi is initial. * exit. * endif. else. write:/ i_input COLOR COL_NEGATIVE, '-duplicate updated'. endif. ENDFORM. " insert_new_lines *&---------------------------------------------------------------------*

*& Form modify lines

*&---------------------------------------------------------------------* * text *---------------------------------------------------------------------------------* * -->P_LD_TABIX text *---------------------------------------------------------------------------------* FORM modify_lines USING p_TABIX. gd_multi = gd_multi + 1. if gd_head lt 1. write:/ i_input COLOR COL_POSITIVE. gd_head = 1. endif. replace ALL OCCURRENCES OF wa_datafind-row in wa_datatab-row with gd_newtxt. if sy-subrc ne 0. translate wa_datafind-row to UPPER CASE. replace ALL OCCURRENCES OF wa_datafind-row in wa_datatab-row with gd_newtxt. if sy-subrc ne 0. write:/ wa_datatab-row COLOR COL_NEGATIVE, '-String found but no changes made'. endif. endif. modify it_datatab from wa_datatab index p_tabix. write:/ wa_datatab-row. ENDFORM. " modify_lines *&---------------------------------------------------------------------*

*& Form get directorys in directory

*&---------------------------------------------------------------------* * text *---------------------------------------------------------------------------------* * --> p1 text * <-- p2 text *---------------------------------------------------------------------------------* FORM get_directorys_in_directory using lp_dir. data: ld_dir type string, it_storedirs type STANDARD TABLE OF FILE_INFO, wa_storedirs like line of it_storedirs. ld_dir = lp_dir. wa_storedirs-FILENAME = ld_dir. append wa_storedirs to it_dirs. CALL METHOD cl_gui_frontend_services=>DIRECTORY_LIST_FILES EXPORTING DIRECTORY = ld_dir files_only = ' ' CHANGING file_table = it_storedirs count = gd_count EXCEPTIONS OTHERS = 1. loop at it_storedirs into wa_storedirs where isdir = '1'. shift ld_dir right deleting TRAILING '/'. shift ld_dir right deleting TRAILING '\'. shift ld_dir left deleting leading space. concatenate ld_dir '\' wa_storedirs-FILENAME into wa_storedirs-FILENAME. * append wa_storedirs to it_dirs. perform get_directorys_in_directory using wa_storedirs-FILENAME. * modify it_storedirs from wa_storedirs index sy-tabix. * if not wa_files-FILENAME cs '.htm' and * not wa_files-filename cs '.HTM'. * DELETE it_storedirs index sy-tabix. * endif. endloop. ENDFORM. " get_directorys_in_directory