************************************************************************ * Program name: ZZJF_WORD_46UP * * Author : HR Expert author * * Date : April 2005 * * Description : This demo program will work for version 4.6 onward. * * It will get SAP data and mail merge it to a MS word * * document. * *======================================================================* * M O D I F I C A T I O N H I S T O R Y * *======================================================================* * ************************************************************************ report zzjf_word_46up no standard page heading message-id zh line-count 65 line-size 132. tables: pernr. infotypes: 0000, 0001, 0002. *----------------------------------------------------------------------* * parameters and selection options. *----------------------------------------------------------------------* selection-screen begin of block blk0 with frame title text-l02. parameters: p_year(2) type n default '15'. selection-screen end of block blk0. type-pools: abap. data: begin of empinfo occurs 0, first_name(30) type c, last_name(30) type c, years(2) type c, end of empinfo. data: ee_selected(1) type c. ********************* OLE Defines ********************************** include ole2incl. data: h_word type ole2_object, wordapp type ole2_object, worddoc type ole2_object, wordobj type ole2_object. data: txt_work_file like rlgrap-filename value 'C:\Program Files\SAP\SAP_DATA_FILE.txt'. data: doc_work_file like rlgrap-filename value 'C:\Program Files\SAP\MS_WORD_DOC.doc'. data: begin of fieldnames occurs 5, field(60) type c, end of fieldnames. ********************* end OLE Defines ***************************** *----------------------------------------------------------------------* initialization. *----------------------------------------------------------------------* perform init_parameters. *----------------------------------------------------------------------* start-of-selection. *----------------------------------------------------------------------* *----------------------------------------------------------------------* get pernr. *----------------------------------------------------------------------* clear: empinfo, ee_selected. perform gather_infotype_data. check ee_selected ne space. append empinfo. *----------------------------------------------------------------------* end-of-selection. *----------------------------------------------------------------------* if not empinfo[] is initial. perform mail_merge_data_to_ms_word. else. write: / 'NO DATA AVAILABLE FOR THIS SELECTION!'. endif. *----------------------------------------------------------------------* top-of-page. *----------------------------------------------------------------------* perform print_report_header. *&---------------------------------------------------------------------* *& Form GATHER_INFOTYPE_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* form gather_infotype_data. data: begin of phifi occurs 5. include structure phifi. data: end of phifi. data: hire_date type d. data: fire_date type d. data: cutoff_date type d. data: years(2) type n. call function 'RP_HIRE_FIRE' exporting beg = '18000101' end = '99991231' importing hire_date = hire_date fire_date = fire_date tables pp0000 = p0000 "input pp0001 = p0001 "input pphifi = phifi. "output check fire_date eq '99991231'. cutoff_date = sy-datum. check not hire_date is initial. check hire_date < cutoff_date. call function 'COMPUTE_YEARS_BETWEEN_DATES' exporting first_date = hire_date second_date = cutoff_date importing years_between_dates = years. check years >= p_year. write years to empinfo-years no-zero. rp-provide-from-last p0002 space pn-begda pn-endda. if pnp-sw-found eq '1'. empinfo-last_name = p0002-nachn. empinfo-first_name = p0002-vorna. endif. ee_selected = 'X'. endform. " GATHER_INFOTYPE_DATA *&---------------------------------------------------------------------* *& Form INIT_PARAMETERS *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* form init_parameters. pnptimed = 'D'. "set to today radio button endform. " INIT_PARAMETERS *&---------------------------------------------------------------------* *& Form PRINT_REPORT_HEADER *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* form print_report_header. endform. " PRINT_REPORT_HEADER *&---------------------------------------------------------------------* *& Form MAIL_MERGE_DATA_TO_MS_WORD *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* form mail_merge_data_to_ms_word . perform clear_existing_data_file. perform download_employee_data_to_pc. perform start_ms_word. perform fill_ms_word_with_data. endform. " MAIL_MERGE_DATA_TO_MS_WORD *&---------------------------------------------------------------------* *& Form CLEAR_EXISTING_DATA_FILE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* form clear_existing_data_file . data: file_name type string. data: result type abap_bool. data: rc type i. file_name = txt_work_file. call method cl_gui_frontend_services=>file_exist exporting file = file_name receiving result = result exceptions cntl_error = 1 error_no_gui = 2 wrong_parameter = 3 others = 4. call method cl_gui_cfw=>flush. if result eq abap_true. call method cl_gui_frontend_services=>file_delete exporting filename = file_name changing rc = rc exceptions others = 0. * flush to execute the deletion call method cl_gui_cfw=>flush. endif. endform. " CLEAR_EXISTING_DATA_FILE *&---------------------------------------------------------------------* *& Form DOWNLAOD_EMPLOYEE_DATA_TO_PC *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* form download_employee_data_to_pc. data: file_name type string. data: cnt type i. data: lt_download type standard table of string, lv_download type string, lv_hstr(1024) type c. class cl_abap_char_utilities definition load. constants: lc_tab type string value cl_abap_char_utilities=>horizontal_tab. field-symbols: type any, type any. perform get_all_field_names. clear lv_download. loop at fieldnames. write fieldnames to lv_hstr left-justified. if sy-tabix > 1. concatenate lv_download lc_tab lv_hstr into lv_download. else. concatenate lv_download lv_hstr into lv_download. endif. endloop. append lv_download to lt_download. * then the data table loop at empinfo assigning . cnt = 0. clear lv_download. sy-subrc = 0. while sy-subrc = 0. cnt = cnt + 1. assign component cnt of structure to . check sy-subrc = 0. write to lv_hstr left-justified. if cnt > 1. concatenate lv_download lc_tab lv_hstr into lv_download. else. concatenate lv_download lv_hstr into lv_download. endif. endwhile. append lv_download to lt_download. endloop. file_name = txt_work_file. call function 'GUI_DOWNLOAD' exporting * BIN_FILESIZE = filename = file_name * FILETYPE = 'ASC' * APPEND = ' ' write_field_separator = 'X' * HEADER = '00' trunc_trailing_blanks = 'X' * col_select = * col_select_mask = * IMPORTING * FILELENGTH = tables data_tab = lt_download 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 = 22. if sy-subrc <> 0. case sy-subrc. when 1. raise file_write_error. when 2. raise no_batch. when 3. raise gui_refuse_filetransfer. when 4. raise invalid_type . when 5. raise no_authority. when 6. raise unknown_error. when 7. raise header_not_allowed. when 8. raise separator_not_allowed. when 9. raise filesize_not_allowed. when 10. raise header_too_long. when 11. raise dp_error_create. when 12. raise dp_error_send. when 13. raise dp_error_write. when 14. raise unknown_dp_error. when 15. raise access_denied. when 16. raise dp_out_of_memory. when 17. raise disk_full. when 18. raise dp_timeout. when 19. raise file_not_found. when 20. raise dataprovider_exception. when 21. raise control_flush_error. when others. raise unknown_error. endcase. endif. endform. " DOWNLAOD_EMPLOYEE_DATA_TO_PC *&---------------------------------------------------------------------* *& Form GET_ALL_FIELD_NAMES *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* form get_all_field_names. type-pools: sydes. type-pools slis. data: td type sydes_desc. data: name_header type sydes_nameinfo. data: name like name_header. data: types_header type sydes_typeinfo. data: type like types_header. data: prev_tabix like sy-tabix. data: continue_field(1) type c. data: search_str(40) type c. data: s_length(5) type p. data: begin of stru_tab occurs 0, name(30) type c, fldname(30) type c, index like sy-tabix, length(3) type n, type(1) type c, decimals(2) type n, end of stru_tab. clear: td. describe field empinfo into td. clear: stru_tab[], stru_tab. do 1000 times. read table td-types into types_header index sy-index. if sy-subrc ne 0. exit. endif. type = types_header. stru_tab-index = type-idx_name. stru_tab-type = type-type. stru_tab-length = type-length. stru_tab-decimals = type-decimals. check stru_tab-index ne 0. append stru_tab. enddo. do 1000 times. read table td-names into name_header index sy-index. if sy-subrc ne 0. exit. endif. name = name_header. if continue_field ne space. read table stru_tab index prev_tabix. if sy-subrc eq 0. concatenate stru_tab-fldname name-name into stru_tab-fldname. modify stru_tab index prev_tabix. clear: prev_tabix, continue_field. endif. else. loop at stru_tab where index eq sy-index. stru_tab-fldname = name-name. prev_tabix = sy-tabix. modify stru_tab. endloop. endif. if name-continue eq '*'. continue_field = 'X'. else. continue_field = space. endif. enddo. * now build fieldnames loop at stru_tab. fieldnames-field = stru_tab-fldname. append fieldnames. endloop. endform. " GET_ALL_FIELD_NAMES *&---------------------------------------------------------------------* *& Form OPEN_MS_WORD *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* form start_ms_word . data: xcode like sy-xcode, ok_code like sy-xcode, rc type i, platform type i, registry_entry(255) type c, reg_value type string, temp_dir type string. data: version_str(80) type c, word_version type i. data: documents type ole2_object. * Start with OLE automation call method cl_gui_frontend_services=>registry_get_value exporting root = cl_gui_frontend_services=>hkey_classes_root key = 'Word.Basic\CurVer' value = '' importing reg_value = reg_value exceptions get_regvalue_failed = 1 cntl_error = 2 error_no_gui = 3 others = 4. if sy-subrc <> 0. raise download_problem. endif. call method cl_gui_cfw=>flush. version_str = reg_value. shift version_str left by 11 places. move version_str to word_version. if word_version < 8. create object wordobj 'Word.Basic'. else. create object worddoc 'Word.Document'. get property of worddoc 'Application' = wordapp. set property of wordapp 'Visible' = 1. get property of wordapp 'WordBasic' = wordobj. call method of wordobj 'FileClose'. endif. call method of wordobj 'AppShow'. * Serienbriefdatei öffnen if word_version > 8. get property of wordapp 'Documents' = documents. call method of documents 'Open' exporting #01 = doc_work_file "file name #02 = 0. "confirm conversion * #03 = 1 "ReadOnly * #04 = 1 "AddToRecentFile * #05 = '' "PasswordDocument * #06 = '' "PasswordTemplat * #07 = 0 "Revert * #08 = '' "WritePasswordDocume * #09 = ''. "WritePasswordTemplate * #10 = 4. "Format 4=plain text * #11 = 1255. "Encoding: e.g. hebrew=1255 else. call method of wordobj 'FileOpen' exporting #01 = doc_work_file #02 = 0. endif. endform. " OPEN_MS_WORD *&---------------------------------------------------------------------* *& Form FILL_MS_WORD_WITH_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* form fill_ms_word_with_data . data: passwort(15). call method of wordobj 'MailMergeMainDocumentType' exporting #01 = 0. call method of wordobj 'MailMergeOpenDataSource' exporting #01 = txt_work_file #02 = 0 #03 = 1 #04 = 0 #05 = 0 #06 = passwort. call method of wordobj 'MailMergeEditMainDocument' . call method of wordobj 'MailMergeToDoc'. endform. " FILL_MS_WORD_WITH_DATA