Текущее время: Сб, июл 19 2025, 00:27

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: ФМ выгрузки данных в MS Excel через OLE и OAER
СообщениеДобавлено: Ср, авг 28 2013, 15:01 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Ср, май 23 2012, 14:38
Сообщения: 30
Пол: Мужской
Добрый день!

Мной был написан ФМ для выгрузки данных из ABAP в Excel. На вход ФМ подается ID файла из OAER и несколько таблиц, которые обрабатываются в макросе. Также есть чекбокс, который отвечает за создание экрана для Excel (если он чекнут, то Excel выводится на 100 экране, если нет, то Excel выводится сам по себе).

В общем все шикарно, все работает, но есть одна проблема. В случае, когда ФМ вызывается прямиком с 1000 экрана, Excel открывается и тут же исчезает. Причем такая проблема только на windows 7, на XP такой проблемы нет.

Надеюсь здесь есть знатоки OLE, потому что подозреваю, что есть в нем какая-то хитрая особенность.

Пока вижу только один вариант обхода этого бага - выгрузить файл на диск и открыть, чтобы он не был связан с ABAPом. Но такой вариант мне очень не нравится.

Буду признателен за помощь!

Code:

INCLUDE officeintegrationinclude.

TYPE-POOLS: SBDST.
TYPE-POOLS: SYDES.

DATA: doc_classname TYPE sbdst_classname VALUE 'SOFFICEINTEGRATION',
      doc_classtype TYPE sbdst_classtype VALUE 'OT',
      doc_object_key TYPE sbdst_object_key. " VALUE 'lutin'.

DATA: bds_instance TYPE REF TO cl_bds_document_set.
DATA: doc_signature TYPE sbdst_signature,
      wa_doc_signature LIKE LINE OF doc_signature,
      doc_components TYPE sbdst_components,
      doc_uris TYPE sbdst_uri,
      wa_doc_uris LIKE LINE OF doc_uris,
      g_macros_run type text32,
      g_CREATE_SCREEN type char1,
      g_ON_SCREEN type char1.

*DATA: already_done,
*      colCount type i value 10.
DATA: has TYPE i.

*DATA  cell_value(64) TYPE C.
DATA: control TYPE REF TO i_oi_ole_container_control.
DATA: int_container TYPE REF TO cl_gui_custom_container.
DATA: ext_container TYPE REF TO cl_gui_custom_container.
DATA: table_coll TYPE REF TO i_oi_table_collection.

DATA: retcode TYPE t_oi_ret_string,
      error   TYPE REF TO i_oi_error,
      document_type TYPE soi_document_type,
      document TYPE REF TO i_oi_document_proxy.
*     document_format TYPE soi_document_type.
DATA  handle TYPE REF TO i_oi_spreadsheet.

DATA item_url(256).
*   таблица для вывода при помощи Z_EXCEL
Data value_table type zexcel_cells.
Data wa_value_table like line of value_table.
Data wa_in_value_table like line of value_table.
Data str like wa_value_table-value.
Data len type i.

FUNCTION Z_EXCEL.

* переносим строки входной таблицы во внутреннюю

  g_macros_run = macros_run.
  g_CREATE_SCREEN = CREATE_SCREEN.
  g_ON_SCREEN = ON_SCREEN.

  REFRESH value_table.
  loop at in_value_table into wa_in_value_table.
*   адрес, примечание и цвет фона ячейки переносим как есть
    wa_value_table-range = wa_in_value_table-range.
    wa_value_table-commentariy = wa_in_value_table-commentariy.
    wa_value_table-color = wa_in_value_table-color.

*   значение ячейки сначала проверим
    str = wa_in_value_table-value.
    IF str <> ''.
      len = strlen( str ) - 1.
*    если значение типа '    12.45-', тогда надопреобразовать к
*    нормальному виду   '-12.45'
      if str+len(1) eq '-'.
        str+len = ' '.
        condense str.
        concatenate '-' str into str.
      endif.
    ENDIF.
    wa_value_table-value = str.
    append wa_value_table to value_table.
  endloop.



* first get the SAP DOI i_oi_container_control interface
  CALL METHOD c_oi_ole_control_creator=>get_ole_container_control
                    IMPORTING control = control
                              error = error.

* create a control container as defined in dynpro 100

  IF ON_SCREEN IS INITIAL.

    IF container is initial.
      CREATE OBJECT int_container
            EXPORTING container_name = '__CONTAINER'.
    else.
      int_container = container.
    endif.

  ELSE.

      CREATE OBJECT int_container
            EXPORTING container_name = 'CONTAINER'.

  ENDIF.

* initialize the SAP DOI Container, tell it to run in the container
* specified above and tell it to run Excel in-place
    CALL METHOD control->init_control
                      EXPORTING r3_application_name =
                                            'R/3 Basis'     "#EC NOTEXT
                                inplace_enabled = ON_SCREEN
                                inplace_scroll_documents = 'X'
                                parent = int_container
                                register_on_close_event = 'X'
                                register_on_custom_event = 'X'
                                no_flush = 'X'
                      IMPORTING error = error.

  CALL METHOD control->get_table_collection
                     EXPORTING no_flush = 'X'
                     IMPORTING table_collection = table_coll
                               retcode = retcode.

* Передаем таблицы:
  IF NOT value_table[] IS INITIAL.
    CALL METHOD table_coll->add_table
                         EXPORTING table_name = 'value_table'
                           table_type = table_coll->table_type_output
                            no_flush  = 'X'
                         IMPORTING retcode = retcode
                         CHANGING  data_table = value_table.
  ENDIF.

CLEAR item_url.
  wa_doc_signature-prop_name = 'DESCRIPTION'.
  document_type = 'Excel.Sheet'.
  wa_doc_signature-prop_value = DOC_ID. " имя файла (его ID)
  doc_object_key = DOC_KEY.

  APPEND wa_doc_signature TO doc_signature.
  CREATE OBJECT bds_instance.

  CALL METHOD bds_instance->get_info
                  EXPORTING classname = doc_classname
                            classtype = doc_classtype
                            object_key = doc_object_key
                  CHANGING components = doc_components
                           signature = doc_signature.

  CALL METHOD bds_instance->get_with_url
                       EXPORTING classname = doc_classname
                                 classtype = doc_classtype
                                 object_key = doc_object_key
                       CHANGING uris = doc_uris
                                signature = doc_signature.

  FREE bds_instance.

  READ TABLE doc_uris INTO wa_doc_uris INDEX 1.

  item_url = wa_doc_uris-uri.
  CALL METHOD control->get_document_proxy
             EXPORTING document_type = document_type
                       REGISTER_CONTAINER = 'X'
             IMPORTING document_proxy = document
                       error = error.

  if create_screen is initial.

    perform open_document using g_macros_run.

  else.

    call screen 100.

  endif.

endfunction.

form open_document using macros_run TYPE  TEXT32.

  CALL METHOD document->open_document
  EXPORTING
    open_inplace   = g_ON_SCREEN
    protect_document = ' '
    document_url = item_url
  IMPORTING
    retcode = retcode
    error = error.

  CALL METHOD document->has_spreadsheet_interface
      IMPORTING
              is_available = has
              retcode = retcode
              error = error.

  IF NOT has IS INITIAL.
    CALL METHOD document->get_spreadsheet_interface
        IMPORTING
                sheet_interface = handle.

    CALL METHOD document->execute_macro
         EXPORTING
           macro_string = MACROS_RUN
         IMPORTING
           retcode = retcode.

  ENDIF.

endform.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: ФМ выгрузки данных в MS Excel через OLE и OAER  Тема решена
СообщениеДобавлено: Чт, сен 05 2013, 10:00 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Ср, май 23 2012, 14:38
Сообщения: 30
Пол: Мужской
В общем другого решения не нашлось, сделали как в этой теме viewtopic.php?f=13&t=76441


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB