Текущее время: Пт, июл 18 2025, 19:25

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Yandex [Bot]


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

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