SAPфорум.RU https://sapboard.ru/forum/ |
|
Addon к ФМ для выгрузки данных в WORD, EXCEL https://sapboard.ru/forum/viewtopic.php?f=13&t=50605 |
Страница 1 из 1 |
Автор: | DKiyanov [ Пт, июн 26 2009, 15:49 ] |
Заголовок сообщения: | Addon к ФМ для выгрузки данных в WORD, EXCEL |
Для интерфейса славной разработки Parazit ФМ для выгрузки данных в WORD, EXCEL сделал ещё два вариант формирования файлов, отличие состоит в том что файлы полностью формируются на сервере SAP а затем готовые файлы выгружаются на машину клиента и там открываются 1. RTF - можно использовать шаблоны сделанные для word-а только сохранить как RTF затем загружаем его в SAP SMW0... всё точно также Проблемы RTF - для того чтоб побороть индивидуальное форматирование отдельных символов подставляемых параметров хорошо помогает след. трюк - копируем параметр в notepad затем копируем из notepad назад в файл, также рекомендую выполнить следующую операцию в word-е выделить весь текст а затем сервис\язык\выбрать язык\русский Преимущества - заполненный шаблон открываются практически мгновенно 2. Excel - можно использовать шаблоны сделанные для excel только сохранить как "Веб-страница *.htm..." затем загружаем его в SAP SMW0... всё точно также Принцип работы: файл преобразуется на сервере затем сохраняется на машину клиента, там он с помощю OLE открывается Excel-ем и помощью OLE делается сохранить как в формате XLS - в результате имеем полноценный excel файл LZWWWFORMTOP Code: DATA: str TYPE string. DATA: build_mode TYPE c. DATA: BEGIN OF itdoc OCCURS 0, name TYPE string, content TYPE string, END OF itdoc. Инклюд для выгрузки в RTF + некоторые общие подпрограммы с выгрузкой в Excel Code: *----------------------------------------------------------------------* ***INCLUDE LZWWWFORMF02 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form OPEN_RTF *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_IT_VALUES text * -->P_OPENFORM text *----------------------------------------------------------------------* FORM rtf_open_form TABLES itvals TYPE zwww_values_tab USING rtfform afilename. DATA: filename TYPE string. filename = afilename. PERFORM read_form_to_str USING '4110' rtfform. PERFORM rtf_split_doc. CASE build_mode. WHEN '1' OR ' '. PERFORM rtf_build_form TABLES itvals. WHEN '2'. PERFORM rtf_build_form2 TABLES itvals. ENDCASE. PERFORM save_str_to_file USING '4110' filename. CALL METHOD cl_gui_frontend_services=>execute EXPORTING document = filename * application = * parameter = * default_directory = * maximized = * minimized = * synchronous = * operation = 'OPEN' EXCEPTIONS cntl_error = 1 error_no_gui = 2 bad_parameter = 3 file_not_found = 4 path_not_found = 5 file_extension_unknown = 6 error_execute_failed = 7 synchronous_failed = 8 not_supported_by_gui = 9 OTHERS = 10. ENDFORM. " OPEN_RTF *&---------------------------------------------------------------------* *& Form rtf_build_form *&---------------------------------------------------------------------* * Построение документа на основе документа *----------------------------------------------------------------------* FORM rtf_build_form TABLES itvals TYPE zwww_values_tab. DATA: rtf_find_text TYPE string. DATA: rtf_var_name TYPE string. DATA: rtf_value TYPE string. DATA: content TYPE string. DATA: tabix TYPE sy-tabix. * BREAK-POINT. CLEAR str. SORT itvals BY var_name var_num find_text. LOOP AT itdoc. content = itdoc-content. LOOP AT itvals. AT NEW var_name. PERFORM rtf_convert USING itvals-var_name rtf_var_name. ENDAT. IF rtf_var_name = itdoc-name. PERFORM rtf_convert USING itvals-find_text rtf_find_text. PERFORM rtf_convert USING itvals-value rtf_value. REPLACE ALL OCCURRENCES OF rtf_find_text IN content WITH rtf_value. ENDIF. AT END OF var_num. IF rtf_var_name = itdoc-name. CONCATENATE str content INTO str. content = itdoc-content. ENDIF. ENDAT. ENDLOOP. ENDLOOP. ENDFORM. "rtf_build_form *&---------------------------------------------------------------------* *& Form rtf_build_form2 *&---------------------------------------------------------------------* * Построение документа на основании последовательности параметров *----------------------------------------------------------------------* * -->ITVALS text *----------------------------------------------------------------------* FORM rtf_build_form2 TABLES itvals TYPE zwww_values_tab. DATA: rtf_find_text TYPE string. DATA: rtf_var_name TYPE string. DATA: rtf_value TYPE string. DATA: content TYPE string. DATA: ename_num TYPE i. DATA: ename_numx TYPE i. * BREAK-POINT. CLEAR str. LOOP AT itvals. AT NEW var_num. CLEAR content. IF NOT itvals-var_name IS INITIAL. PERFORM rtf_convert USING itvals-var_name rtf_var_name. READ TABLE itdoc WITH KEY name = rtf_var_name. IF sy-subrc = 0. content = itdoc-content. ENDIF. ELSE. ADD 1 TO ename_num. ename_numx = ename_num. LOOP AT itdoc WHERE name IS INITIAL. SUBTRACT 1 FROM ename_numx. IF ename_numx IS INITIAL. content = itdoc-content. EXIT. ENDIF. ENDLOOP. ENDIF. ENDAT. PERFORM rtf_convert USING itvals-find_text rtf_find_text. PERFORM rtf_convert USING itvals-value rtf_value. REPLACE ALL OCCURRENCES OF rtf_find_text IN content WITH rtf_value. AT END OF var_num. CONCATENATE str content INTO str. ENDAT. ENDLOOP. ENDFORM. "rtf_build_form *&---------------------------------------------------------------------* *& Form rtf_split_doc *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM rtf_split_doc. DATA: len TYPE i. DATA: fdpos TYPE match_result. DATA: xfdpos TYPE i. DATA: xlen TYPE i. DATA: tstr TYPE string. DATA: tlen TYPE i. DATA: d TYPE i. REFRESH itdoc. DO. IF str CS '{\*\bkmkstart'. IF sy-fdpos > 0. itdoc-name = space. itdoc-content = str(sy-fdpos). APPEND itdoc. SHIFT str BY sy-fdpos PLACES. ENDIF. IF str CS '{\*\bkmkend '. xfdpos = sy-fdpos. FIND '}' IN SECTION OFFSET sy-fdpos OF str RESULTS fdpos. xlen = fdpos-offset - sy-fdpos + 1. ADD 12 TO sy-fdpos. len = fdpos-offset - sy-fdpos. itdoc-name = str+sy-fdpos(len). ADD 1 TO fdpos-offset. itdoc-content = str(fdpos-offset). IF itdoc-content+13 CS '{\*\bkmkstart'. * надо проверить а не находится ли найденое начало bookmark перед концом нашего.. * если это так надо их развязать поменяв местами ADD 13 TO sy-fdpos. FIND '}' IN SECTION OFFSET sy-fdpos OF str RESULTS fdpos. d = xfdpos - fdpos-offset. IF d = 1. tlen = fdpos-offset - sy-fdpos + 1. fdpos-offset = xfdpos + xlen. CONCATENATE str(sy-fdpos) str+xfdpos(xlen) str+sy-fdpos(tlen) str+fdpos-offset INTO str. fdpos-offset = sy-fdpos + xlen. itdoc-content = str(fdpos-offset). ELSE. MESSAGE x398(00) WITH 'не найдено начало bookmark внутри bookmark'. ENDIF. ENDIF. SHIFT str BY fdpos-offset PLACES. APPEND itdoc. ELSE. MESSAGE x398(00) WITH 'не найдено окончание bookmark'. ENDIF. ELSE. itdoc-name = space. itdoc-content = str. APPEND itdoc. EXIT. ENDIF. ENDDO. ENDFORM. "split_doc *&---------------------------------------------------------------------* *& Form rtf_convert *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->IN text * -->OUT text *----------------------------------------------------------------------* FORM rtf_convert USING in out. STATICS: BEGIN OF itconv OCCURS 0, char TYPE c, rtf(15) TYPE c, END OF itconv. DATA itch(15) TYPE c OCCURS 0 WITH HEADER LINE. DATA: str(100) TYPE c. DATA: rtf(300) TYPE c. DATA: len TYPE i. DATA: index TYPE i. DATA: char TYPE c. DATA: space_translate TYPE c. IF itconv[] IS INITIAL. " Готовим таблицу перекодировки * Пробел в начале str нужен чтоб sy-tabix правильно пошол * У первой буквы в RTF нет \ это чтоб split правильно отработал str = ' абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ«»№”|{}‘"'. CONCATENATE '"e0\"e1\"e2\"e3\"e4\"e5\"b8\"e6\"e7\"e8\"e9\"ea\"eb\"ec\"ed\"ee\"ef\"f0\"f1\"f2' '\"f3\"f4\"f5\"f6\"f7\"f8\"f9\"fa\"fb\"fc\"fd\"fe\"ff\"c0\"c1\"c2\"c3\"c4\"c5\"a8' '\"c6\"c7\"c8\"c9\"ca\"cb\"cc\"cd\"ce\"cf\"d0\"d1\"d2\"d3\"d4\"d5\"d6\"d7\"d8\"d9' '\"da\"db\"dc\"dd\"de\"df\"ab\"bb\"b9\"94\|\{\}\lquote' INTO rtf. TRANSLATE str USING '"'''. TRANSLATE rtf USING '"'''. SPLIT rtf AT '\' INTO TABLE itch. LOOP AT itch. itconv-char = str+sy-tabix(1). CONCATENATE '\' itch INTO itconv-rtf. APPEND itconv. ENDLOOP. SORT itconv BY char. ENDIF. CLEAR out. len = STRLEN( in ). DO len TIMES. char = in+index(1). IF char = space. CONCATENATE out '#' INTO out. space_translate = 'X'. ELSE. READ TABLE itconv WITH KEY char = char BINARY SEARCH. IF sy-subrc = 0. CONCATENATE out itconv-rtf INTO out. ELSE. CONCATENATE out char INTO out. ENDIF. ENDIF. ADD 1 TO index. ENDDO. IF space_translate = 'X'. TRANSLATE out USING '# '. ENDIF. ENDFORM. "rtf_convert *&---------------------------------------------------------------------* *& Form rtf_read_form *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->OBJID text *----------------------------------------------------------------------* FORM read_form_to_str USING page objid. DATA: key TYPE wwwdatatab. DATA: itmime TYPE w3mime OCCURS 0 WITH HEADER LINE. DATA: cfilesize(11) TYPE c. DATA: filesize TYPE i. DATA: converter TYPE REF TO cl_abap_conv_obj. DATA: xstr TYPE xstring. CLEAR: str. key-relid = 'MI'. key-objid = objid. CALL FUNCTION 'WWWDATA_IMPORT' EXPORTING key = key TABLES mime = itmime EXCEPTIONS wrong_object_type = 1 import_error = 2 OTHERS = 3. CALL FUNCTION 'WWWPARAMS_READ' EXPORTING relid = key-relid objid = key-objid name = 'filesize' IMPORTING value = cfilesize. filesize = cfilesize. CREATE OBJECT converter EXPORTING incode = page * incode = '1504' " ANSI (1251) * incode = '4110' " utf-8 miss = 'S' " prc_miss broken = 'M' " prc_broken use_f1 = 'X' substc = '00035' " prc_sapno EXCEPTIONS invalid_codepage = 1 internal_error = 2. CALL METHOD cl_umc_ostream=>tab2xstr EXPORTING it_data = itmime[] i_length = filesize IMPORTING e_xstr = xstr. CALL METHOD converter->convert EXPORTING inbuff = xstr inbufflg = 0 outbufflg = 0 IMPORTING outbuff = str EXCEPTIONS internal_error = 1 OTHERS = 2. REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN str WITH ''. ENDFORM. "rtf_read_form *&---------------------------------------------------------------------* *& Form rtf_save_file *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->FIELNAME text *----------------------------------------------------------------------* FORM save_str_to_file USING page fielname. DATA: converter TYPE REF TO cl_abap_conv_obj. DATA: xstr TYPE xstring. DATA: BEGIN OF itblob OCCURS 0, data(255) TYPE x, END OF itblob. DATA: blob_length TYPE i. CREATE OBJECT converter EXPORTING outcode = page * outcode = '1504' " ANSI (1251) * outcode = '4110' " UTF-8 EXCEPTIONS invalid_codepage = 1 internal_error = 2 OTHERS = 3. CALL METHOD converter->convert EXPORTING inbuff = str inbufflg = 0 outbufflg = 0 IMPORTING outbuff = xstr EXCEPTIONS internal_error = 1 OTHERS = 2. CALL METHOD cl_umc_ostream=>xstr2tab EXPORTING i_xstr = xstr IMPORTING et_data = itblob[] e_length = blob_length. CALL FUNCTION 'GUI_DOWNLOAD' EXPORTING bin_filesize = blob_length filename = fielname filetype = 'BIN' TABLES data_tab = itblob 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. ENDFORM. "rtf_save_file Инклюд для выгрузки в Excel Code: *----------------------------------------------------------------------* ***INCLUDE LZWWWFORMF03 . *----------------------------------------------------------------------* FORM html_excel_open_form TABLES itvals TYPE zwww_values_tab USING rtfform afilename. DATA: filename TYPE string. DATA: xlsfname TYPE string. DATA: ext TYPE string. filename = afilename. SPLIT filename AT '.' INTO xlsfname ext. CONCATENATE xlsfname '.xls' INTO xlsfname. PERFORM read_form_to_str USING '1504' rtfform. PERFORM html_excel_split_doc. CASE build_mode. WHEN '1' OR ' '. PERFORM html_excel_build_form TABLES itvals. WHEN '2'. PERFORM html_excel_build_form2 TABLES itvals. ENDCASE. PERFORM save_str_to_file USING '1504' filename. PERFORM html_excel_run USING filename xlsfname. ENDFORM. " HTML_EXCEL_OPEN_FORM *&---------------------------------------------------------------------* *& Form html_excel_build_form *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->ITVALS text *----------------------------------------------------------------------* FORM html_excel_build_form TABLES itvals TYPE zwww_values_tab. DATA: var_name TYPE string. DATA: content TYPE string. DATA: tabix TYPE sy-tabix. * BREAK-POINT. CLEAR str. SORT itvals BY var_name var_num find_text. LOOP AT itdoc. content = itdoc-content. LOOP AT itvals. AT NEW var_name. var_name = itvals-var_name. ENDAT. IF var_name = itdoc-name. REPLACE ALL OCCURRENCES OF itvals-find_text IN content WITH itvals-value. ENDIF. AT END OF var_num. IF var_name = itdoc-name. CONCATENATE str content INTO str. content = itdoc-content. ENDIF. ENDAT. ENDLOOP. ENDLOOP. ENDFORM. "rtf_build_form *&---------------------------------------------------------------------* *& Form html_excel_build_form2 *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->ITVALS text *----------------------------------------------------------------------* FORM html_excel_build_form2 TABLES itvals TYPE zwww_values_tab. DATA: content TYPE string. DATA: ename_num TYPE i. DATA: ename_numx TYPE i. * BREAK-POINT. CLEAR str. LOOP AT itvals. AT NEW var_num. CLEAR content. IF NOT itvals-var_name IS INITIAL. READ TABLE itdoc WITH KEY name = itvals-var_name. IF sy-subrc = 0. content = itdoc-content. ENDIF. ELSE. ADD 1 TO ename_num. ename_numx = ename_num. LOOP AT itdoc WHERE name IS INITIAL. SUBTRACT 1 FROM ename_numx. IF ename_numx IS INITIAL. content = itdoc-content. EXIT. ENDIF. ENDLOOP. ENDIF. ENDAT. REPLACE ALL OCCURRENCES OF itvals-find_text IN content WITH itvals-value. AT END OF var_num. CONCATENATE str content INTO str. ENDAT. ENDLOOP. ENDFORM. "rtf_build_form *&---------------------------------------------------------------------* *& Form html_excel_split_doc *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM html_excel_split_doc. DATA: itfind TYPE match_result_tab WITH HEADER LINE. DATA: find1 TYPE match_result. DATA: find2 TYPE match_result. DATA: pos TYPE i. DATA: len TYPE i. DATA: wstr1 TYPE string. DATA: wstr2 TYPE string. DATA: wstr3 TYPE string. DATA: tr_index TYPE string. DATA: cur_name TYPE string. DATA: prev_name TYPE string. DATA: BEGIN OF itrows OCCURS 0, name TYPE string, brow TYPE i, erow TYPE i, END OF itrows. REFRESH itdoc. * 1 Ищим именованые диапазоны (собственно нас интересует только диапазон строк) * Наверно с помощью регулярных выражений это можно сделать как то проще - но я к своему стыду их не знаю FIND ALL OCCURRENCES OF '<x:ExcelName>' IN str IGNORING CASE RESULTS itfind[]. LOOP AT itfind. FIND '<x:Name>' IN SECTION OFFSET itfind-offset OF str IGNORING CASE RESULTS find1. FIND '</x:Name>' IN SECTION OFFSET find1-offset OF str IGNORING CASE RESULTS find2. pos = find1-offset + 8. len = find2-offset - pos. itrows-name = str+pos(len). FIND '<x:Formula>=' IN SECTION OFFSET find2-offset OF str IGNORING CASE RESULTS find1. FIND '</x:Formula>' IN SECTION OFFSET find1-offset OF str IGNORING CASE RESULTS find2. pos = find1-offset + 12. len = find2-offset - pos. wstr1 = str+pos(len). SPLIT wstr1 AT '$' INTO wstr1 wstr2 wstr3. TRANSLATE wstr2 USING ': '. itrows-brow = wstr2. itrows-erow = wstr3. APPEND itrows. ENDLOOP. * BREAK-POINT. * 2 проходим по тегам <tr и разбиваем документ в соответствии с именоваными диапазонами FIND ALL OCCURRENCES OF '<tr ' IN str IGNORING CASE RESULTS itfind[]. CLEAR pos. LOOP AT itfind. tr_index = sy-tabix. CLEAR cur_name. LOOP AT itrows. IF tr_index >= itrows-brow AND tr_index <= itrows-brow. cur_name = itrows-name. EXIT. ENDIF. ENDLOOP. IF prev_name <> cur_name. itdoc-name = prev_name. len = itfind-offset - pos. IF len > 0. itdoc-content = str+pos(len). APPEND itdoc. ENDIF. pos = itfind-offset. prev_name = cur_name. ENDIF. ENDLOOP. itdoc-name = prev_name. itdoc-content = str+pos. APPEND itdoc. ENDFORM. "html_excel_split_doc *&---------------------------------------------------------------------* *& Form html_excel_run *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->HTMLFILE text * -->XLSFILE text *----------------------------------------------------------------------* FORM html_excel_run USING htmlfile xlsfile. DATA: h_appl TYPE ole2_object. DATA: h_books TYPE ole2_object. DATA: h_work TYPE ole2_object. DATA: rc TYPE i. CALL METHOD cl_gui_frontend_services=>file_delete EXPORTING filename = xlsfile CHANGING rc = rc EXCEPTIONS file_delete_failed = 1 cntl_error = 2 error_no_gui = 3 file_not_found = 4 access_denied = 5 unknown_error = 6 not_supported_by_gui = 7 wrong_parameter = 8 OTHERS = 9. CREATE OBJECT h_appl 'EXCEL.APPLICATION'. CHECK sy-subrc = 0. CALL METHOD OF h_appl 'WORKBOOKS' = h_books. CHECK sy-subrc = 0. CALL METHOD OF h_books 'OPEN' EXPORTING #1 = htmlfile. CHECK sy-subrc = 0. CALL METHOD OF h_appl 'ACTIVEWORKBOOK' = h_work. IF sy-subrc <> 0. EXIT. ENDIF. CALL METHOD OF h_work 'SAVEAS' EXPORTING #1 = xlsfile #2 = -4143. " xlNormal CHECK sy-subrc = 0. SET PROPERTY OF h_appl 'VISIBLE' = 1. ENDFORM. "RUN_EXCEL изменения сделаные в ZWWW* для подключения инклюдов Code: FUNCTION zwww_openform. ----------------------------------- IF filetype = 'RTF'. PERFORM rtf_open_form TABLES it_values USING form_name file_name. ELSEIF filetype = 'HTML_EXCEL'. PERFORM html_excel_open_form TABLES it_values USING form_name file_name. ELSE. PERFORM openform USING file_name filetype it_values[] optimize protect printdialog only_save xdebug_mode decimal_separator return_code. CASE return_code. WHEN 1. RAISE printcancel. ENDCASE. ENDIF. ------------------------------- ENDFUNCTION. FORM downloadwwwtemplate --------------------------------- CASE ext. WHEN '.XLS'. filetype = 'EXCEL'. WHEN '.DOC'. filetype = 'WORD'. WHEN '.RTF'. filetype = 'RTF'. EXIT. WHEN '.HTM'. filetype = 'HTML_EXCEL'. EXIT. WHEN OTHERS. EXIT. ENDCASE. -------------------------------- ENDFORM. ФМ для выбора режима сборки файла Режим сборки по умолчанию 1 - обычный режим режим сборки 2 - в этом случае файл собирается из кусков в соответствии с порядком заполнения таблицы параметров Code: FUNCTION zwww_set_build_mode. *"---------------------------------------------------------------------- *"*"Локальный интерфейс: *" IMPORTING *" REFERENCE(MODE) TYPE C *"---------------------------------------------------------------------- build_mode = mode. ENDFUNCTION. ЗЫ В виду того что это addon к уже существующему интерфейсу, и кроме того идею мне подсказали - авторских прав не заявляю, распространение и доработка совершенно свободая |
Автор: | ArmAnn [ Пн, июн 29 2009, 08:30 ] |
Заголовок сообщения: | Re: Addon к ФМ для выгрузки данных в WORD, EXCEL |
Добавил в тему 'Разработки участников форума' |
Автор: | Parazit [ Пн, июн 29 2009, 11:12 ] |
Заголовок сообщения: | Re: Addon к ФМ для выгрузки данных в WORD, EXCEL |
DKiyanov написал: 1. RTF - можно использовать шаблоны сделанные для word-а только сохранить как RTF затем загружаем его в SAP SMW0... всё точно также Проблемы RTF - для того чтоб побороть индивидуальное форматирование отдельных символов подставляемых параметров хорошо помогает след. трюк - копируем параметр в notepad затем копируем из notepad назад в файл, также рекомендую выполнить следующую операцию в word-е выделить весь текст а затем сервис\язык\выбрать язык\русский Я пытался подобраться к RTF, но именно эти проблемы меня и остановили, из-за которых корректный вывод не гарантирован, и поиск проблемных закладок и меток весьма затруднителен. Видимо нужно писать какой то оптимизатор шаблонов, который хотя бы будет склеивать куски разодранных слов с одинаковыми форматами. И прогонять шаблон через него перед загрузкой, или перед выгрузкой. |
Автор: | DKiyanov [ Вт, июн 30 2009, 12:39 ] |
Заголовок сообщения: | Re: Addon к ФМ для выгрузки данных в WORD, EXCEL |
2 Parazit ну собственно выше описанные манипуляции 100% решают эти проблемы, муторно конечно немного но вполне выполнимо |
Автор: | DKiyanov [ Вт, сен 08 2009, 02:13 ] |
Заголовок сообщения: | Re: Addon к ФМ для выгрузки данных в WORD, EXCEL |
Для заполнения таблицы значений написал свой ФМ ZWWW_FILL_VALUES Для связывания переменных программы и текстовых "меток"шаблона я сделал настоечную таблицу ZWWW_FASSIGN и ФМ ZWWW_FILL_VALUES для сбора значений из программы которая его вызвала и заполнения таблицы значений на основе настроечной таблицы Структура таблицы: zwww_fassign Code: OBJID W3OBJID ключь Имя объекта NUM NUMC3 ключь Номер по порядку (практического смысла не имеет, просто чтоб размножить записи) FGROUP ZWWW_FGROUP Группа полей используется в подпрограммах заполнения шаблона VAR_NAME ZWWW_VAR_NAME Имя закладки FIND_TEXT ZWWW_FIND_TEXT текстовая метка из шаблона например «[ИМЯ_КЛИЕНТА]» FNAMES TEXT255 макрос для формирования строки которой будет заменена метка. поле FNAMES – предназначен для упрощения формирования строки для замены метки Пример заполнения: «[ADRC-POST_CODE1] [ADRC-REGION] {г. [ADRC-CITY1],} [ADRC-STREET],} [ADRC-HOUSE_NUM1]» В квадратных скобках указаны имена полей заполняющей программы из которых должно быть взято значение, перед и после квадратных скобок могут быть указаны соотв. фигурные скобки значение которое указано между фигурной и квадратной скобкой будет внесено в текст если значение поля в квадратных скобках не пустое т.е. в нашем примере если поле программы ADRC-CITY1 (город) заполнено (не пустое) то перед ним будет выведено «г.» а после него «,». внутри квадратных скобок перед именем поля программы может быть указана подпрограмма преобразования через разделитель «|» например [D1|VEDA-VBEGDAT] – в данном случае «D1» -это имя стандартной подпрограммы преобразования подпрограммы начинающиеся на «Z» должны быть закодированы в программе формирующей формуляр. У таких подпрограмм два параметра – входящая переменная и исходящая строка. поле FGROUP – это поле является одним из параметров ФМ ZWWW_FILL_VALUES и служит для единовременного заполнение строк значений для нескольких текстовых меток шаблона. Code: FUNCTION zwww_fill_values. *"---------------------------------------------------------------------- *"*"Локальный интерфейс: *" IMPORTING *" VALUE(PROGRAM) TYPE SY-REPID OPTIONAL *" REFERENCE(OBJID) TYPE ZWWW_FASSIGN-OBJID *" REFERENCE(FGROUP) TYPE ZWWW_FASSIGN-FGROUP DEFAULT '*' *" REFERENCE(VAR_NUM) TYPE ZWWW_VAR_NUM OPTIONAL *" TABLES *" IT_VALUES *"---------------------------------------------------------------------- DATA: index TYPE sy-index. DATA: field(100) TYPE c. DATA: wa_values TYPE zwww_values. DATA: tail(50) TYPE c. DATA: len TYPE i. DATA: ch TYPE c. DATA: tabix TYPE sy-tabix. DATA: prg(20) TYPE c. DATA: str TYPE string. DATA: BEGIN OF itw OCCURS 0, pch TYPE c, nch TYPE c, str TYPE string, END OF itw. DATA: wx LIKE LINE OF itw. DATA: ftabix TYPE sy-tabix. FIELD-SYMBOLS <fs>. READ TABLE itfassign WITH KEY objid = objid. IF sy-subrc <> 0. SELECT * APPENDING TABLE itfassign FROM zwww_fassign WHERE objid = objid. IF sy-subrc <> 0. MESSAGE x398(00) WITH 'Данные для объекта' objid 'не найдены'. ENDIF. ENDIF. IF program IS INITIAL. CALL 'AB_GET_CALLER' ID 'PROGRAM' FIELD program. ENDIF. LOOP AT itfassign WHERE objid = objid AND fgroup CP fgroup AND outmode <> 'T'. len = STRLEN( itfassign-fnames ). IF len = 0. " Ищем последнее значение с такимже текстом для замены IF NOT itfassign-find_text IS INITIAL. CLEAR ftabix. LOOP AT it_values INTO wa_values. IF wa_values-find_text = itfassign-find_text. ftabix = sy-tabix. ENDIF. ENDLOOP. IF NOT ftabix IS INITIAL. READ TABLE it_values INTO wa_values INDEX ftabix. wa_values-var_name = itfassign-var_name. wa_values-var_num = var_num. APPEND wa_values TO it_values. ENDIF. ELSE. CLEAR wa_values. wa_values-var_name = itfassign-var_name. wa_values-var_num = var_num. APPEND wa_values TO it_values. ENDIF. CONTINUE. ENDIF. ASSIGN itfassign-fnames(len) TO <fs>. TRANSLATE <fs> USING ' #'. CLEAR: itw[], itw, index. DO len TIMES. ch = itfassign-fnames+index(1). IF ch CA '{}[]'. itw-nch = ch. APPEND itw. CLEAR itw. itw-pch = ch. ELSE. CONCATENATE itw-str ch INTO itw-str. ENDIF. ADD 1 TO index. ENDDO. LOOP AT itw WHERE nch = ']'. tabix = sy-tabix. TRANSLATE itw-str TO UPPER CASE. IF itw-str CA '|'. SPLIT itw-str AT '|' INTO prg itw-str. ELSE. CLEAR prg. ENDIF. CONCATENATE '(' program ')' itw-str INTO field. ASSIGN (field) TO <fs>. CLEAR str. IF NOT <fs> IS INITIAL. IF prg IS INITIAL. PERFORM write_val USING <fs> str. ELSE. IF prg(1) = 'Z'. PERFORM (prg) IN PROGRAM (program) IF FOUND USING <fs> str. ELSE. CONCATENATE 'CONVERT_' prg INTO prg. PERFORM (prg) IN PROGRAM (sy-repid) IF FOUND USING <fs> str. ENDIF. IF str IS INITIAL. PERFORM write_val USING <fs> str. ENDIF. ENDIF. ADD 1 TO tabix. READ TABLE itw INDEX tabix INTO wx. IF wx-nch = '}'. CONCATENATE str wx-str INTO str. ENDIF. SUBTRACT 2 FROM tabix. IF tabix > 0. READ TABLE itw INDEX tabix INTO wx. IF wx-pch = '{'. CONCATENATE wx-str str INTO str. ENDIF. ENDIF. ADD 1 TO tabix. ENDIF. itw-str = str. MODIFY itw INDEX tabix TRANSPORTING str. ENDLOOP. CLEAR wa_values. LOOP AT itw WHERE NOT str IS INITIAL. IF itw-pch = '{' AND itw-nch = '[' OR itw-pch = ']' AND itw-nch = '}'. CONTINUE. ENDIF. CONCATENATE wa_values-value itw-str INTO wa_values-value. ENDLOOP. TRANSLATE wa_values-value USING '# '. wa_values-var_name = itfassign-var_name. wa_values-var_num = var_num. wa_values-find_text = itfassign-find_text. * wa_values-val_type = . APPEND wa_values TO it_values. ENDLOOP. ENDFUNCTION. *&---------------------------------------------------------------------* *& Form write_val *&---------------------------------------------------------------------* * Нужна из за того что write to string не возможен *----------------------------------------------------------------------* * -->VAL text * -->STR text *----------------------------------------------------------------------* FORM write_val USING val str. DATA: typ TYPE c. DATA: len TYPE i. DATA: val_str(256) TYPE c. DESCRIBE FIELD val TYPE typ. IF typ = 'g'. " String str = val. ELSEIF typ = 'C'. " Бывает тип C но с coversion_exit len = STRLEN( val ). IF len < 256. WRITE val TO val_str LEFT-JUSTIFIED. str = val_str. ELSE. str = val. ENDIF. ELSE. WRITE val TO val_str LEFT-JUSTIFIED. str = val_str. ENDIF. ENDFORM. "write_val *&---------------------------------------------------------------------* *& Form CONVERT_d1 *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->D text * -->STR text *----------------------------------------------------------------------* FORM convert_d1 USING ad str. DATA: d TYPE d. DATA: month(15) TYPE c. d = ad. CASE d+4(2). WHEN '01'. month = 'января'. WHEN '02'. month = 'февраля'. WHEN '03'. month = 'марта'. WHEN '04'. month = 'апреля'. WHEN '05'. month = 'майя'. WHEN '06'. month = 'июня'. WHEN '07'. month = 'июля'. WHEN '08'. month = 'августа'. WHEN '09'. month = 'сентября'. WHEN '10'. month = 'октября'. WHEN '11'. month = 'ноября'. WHEN '12'. month = 'декабря'. ENDCASE. CONCATENATE '«' d+6(2) '»#' month '#' d(4) INTO str. TRANSLATE str USING '# '. ENDFORM. "CONVERT_d1 *&---------------------------------------------------------------------* *& Form menge *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->VAL text * -->RET text *----------------------------------------------------------------------* FORM convert_menge USING val ret. DATA: xret(20) TYPE c. WRITE val TO xret LEFT-JUSTIFIED. SHIFT xret RIGHT DELETING TRAILING space. SHIFT xret RIGHT DELETING TRAILING '0'. SHIFT xret RIGHT DELETING TRAILING ','. SHIFT xret LEFT DELETING LEADING space. ret = xret. ENDFORM. "menge *&---------------------------------------------------------------------* *& Form convert_spell *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->VAL text * -->RET text *----------------------------------------------------------------------* FORM convert_spell USING val ret. DATA: spell TYPE spell. CALL FUNCTION 'SPELL_AMOUNT' EXPORTING amount = val currency = 'RUB' filler = ' ' language = sy-langu IMPORTING in_words = spell EXCEPTIONS not_found = 1 too_large = 2 OTHERS = 3. CONCATENATE spell-word spell-decword INTO ret SEPARATED BY space. ENDFORM. "convert_spell *&---------------------------------------------------------------------* *& Form convert_region *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->VAL text * -->RET text *----------------------------------------------------------------------* FORM convert_region USING val ret. DATA: bezei TYPE t005u-bezei. SELECT SINGLE bezei INTO bezei FROM t005u WHERE spras = sy-langu AND land1 = 'RU' AND bland = val. ret = bezei. ENDFORM. "convert_region *&---------------------------------------------------------------------* *& Form convert_land *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->VAL text * -->RET text *----------------------------------------------------------------------* FORM convert_land USING val ret. DATA: landx TYPE t005t-landx. SELECT SINGLE landx INTO landx FROM t005t WHERE spras = sy-langu AND land1 = val. ret = landx. ENDFORM. "convert_land Данный ФМ позволяет упростить программу формирования шаблона, сделать её более наглядной и настраиваемой, отделяет названия текстовых меток шаблона от программы формирования шаблона |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |