SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

Проблема при двойном вызове EXCEL_OLE_STANDARD_DAT



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
Shvetz
Специалист
Специалист



Joined: 05 Oct 2007
Posts: 53

PostPosted: Fri Oct 05, 2007 4:42 pm    Post subject: Reply with quote

Есть возможность сделать то же самое, только с помощью ФМ?

Проблемка. Потому что при двойном вызове EXCEL_OLE_STANDARD_DAT (имена файла, и листов указаны) происходит следующее - первый вызов открывает excel и экспортирует в указанный файл указанный лист, при втором вызове создается новый временный файл с другим указанным листом.

Пример моей проблемки. Два вызова подряд.

CALL FUNCTION 'EXCEL_OLE_STANDARD_DAT'
EXPORTING
file_name = 'C:\test'
data_sheet_name = '1'
TABLES
data_tab = <xls_table>
fieldnames = fieldnames

* вот этот вызов не создает лист в test.xls
CALL FUNCTION 'EXCEL_OLE_STANDARD_DAT'
EXPORTING
file_name = 'C:\test'
data_sheet_name = '2'
TABLES
data_tab = <xls_table>
fieldnames = fieldnames
Back to top
View user's profile Send private message
admin
Администратор
Администратор



Joined: 01 Sep 2007
Posts: 1639

PostPosted: Fri Oct 05, 2007 9:37 pm    Post subject: Reply with quote

Если я вас правильно понял, то Вы хотите чтобы создался второй лист в существующем файле. Этот функциональный модуль не предназначен для этого. Симптомы, которую Вы описали, как раз говорят о том, что Вы пытаетесь открыть экземпляр Excel, когда в памяти находится незакрытый Excel.
Можно попробовать, но не факт, что это получится, сначала загрузить первый Лист, сохранить и закрыть Excel, чтобы он не висел в процессах, и попробовать загрузить вторую таблицу в другой Лист уже существующего файла.
Если это не получится, то используйте алгоритм, описанный в теме
http://www.sapnet.ru/viewtopic.php?t=107
Back to top
View user's profile Send private message
Shvetz
Специалист
Специалист



Joined: 05 Oct 2007
Posts: 53

PostPosted: Sat Oct 06, 2007 3:32 pm    Post subject: Reply with quote

Проблема как раз в том, что не хочется столько кода OLE писать для ерундовой задачки, вот и вопрос ЕСТЬ ЛИ ФУНКЦИОНАЛЬНЫЕ МОДУЛИ для этого. Я их в интернете не нашел, да и по ходу их и не существует для этого. А закрывать процесс, это конечно решение, но понимаю, что не идеальное. Остается использовать похожий алгоритм, указанный по ссылке, и на нем свой ФМ сделать.
Back to top
View user's profile Send private message
admin
Администратор
Администратор



Joined: 01 Sep 2007
Posts: 1639

PostPosted: Sat Oct 06, 2007 4:17 pm    Post subject: Reply with quote

Как правило Все разработчики имеют готовый универсальный шаблон для таких типовых операций, как вывод в Excel/ALV.
Можете использовать готовый ФМ для выгрузки данных в WORD, EXCEL автора Parazit, в нем реализована работа с листами в Excel
http://viktorov.narod.ru/programming/myprograms/index.htm
Или же взять оттуда идеи.
Back to top
View user's profile Send private message
Shvetz
Специалист
Специалист



Joined: 05 Oct 2007
Posts: 53

PostPosted: Tue Oct 09, 2007 11:54 am    Post subject: Reply with quote

Хочу выразть свое субъективное мнение по поводу метода описанного здесь http://www.sapnet.ru/viewtopic.php?t=107. Данные копируются из клипбоарда и соответсвенно не форматируются, то есть поле записи внутренней табличке не взаимоднозначны с ячейками в экселе.

Программисты SAP в ФМ 'EXCEL_OLE_STANDARD_DAT' использовали метод копирования внутренней таблицы во временный файл. Далее из файла данные копируются в Excel. Видимо к такому не совсем хорошему методу привело отсутствие соответствующего инструментария, более того если у вас файл называется system.xls и в той же директории находиться system.dat, то ФМ вам не поможет - будет вызвано исключение. В этом же дефолтном ФМ кроются недостатки двойного вызова.
Back to top
View user's profile Send private message
admin
Администратор
Администратор



Joined: 01 Sep 2007
Posts: 1639

PostPosted: Tue Oct 09, 2007 12:44 pm    Post subject: Reply with quote

Этот метод копирования через клипборд придумал одни индиец для скорости, насколько я понимаю. У него есть свои ньюансы.

Вы можете использовать, что думаю более предпочтительно,
методы
INSERT_ONE_TABLE
SET_RANGES_DATA
Spreadsheet Interface I_OI_SPREADSHEET


Last edited by admin on Tue Oct 09, 2007 12:51 pm; edited 1 time in total
Back to top
View user's profile Send private message
Shvetz
Специалист
Специалист



Joined: 05 Oct 2007
Posts: 53

PostPosted: Tue Oct 09, 2007 12:50 pm    Post subject: Reply with quote

Вот было бы просто прекрасно, если бы можно было форматировать clipboard данные для вставки в Excel, либо форматировать непосредственно при Paste.
Как это возможно в методе Excel MS Basic - Application.Workbooks.Open(filename,..)
Back to top
View user's profile Send private message
admin
Администратор
Администратор



Joined: 01 Sep 2007
Posts: 1639

PostPosted: Tue Oct 09, 2007 12:54 pm    Post subject: Reply with quote

Shvetz wrote:
Вот было бы просто прекрасно, если бы можно было форматировать clipboard данные для вставки в Excel, либо форматировать непосредственно при Paste.
Как это возможно в методе Excel MS Basic - Application.Workbooks.Open(filename,..)


К сожалению формат у Excel закрытый, поэтому такие форматирования все равно бы пришлось делать через вызов OLE2 методов, а это будет медленно.
Так что советую обратить внимание на I_OI_SPREADSHEET интерфейс.
Back to top
View user's profile Send private message
Shvetz
Специалист
Специалист



Joined: 05 Oct 2007
Posts: 53

PostPosted: Wed Oct 10, 2007 11:22 am    Post subject: Reply with quote

Да, спасибо, это нужная библиотека для моего случая. Но как назло табличка не копируется в лист

Code:
* используем interface I_OI_SPREADSHEET и I_OI_DOCUMENT_PROXY
    DATA control TYPE REF TO i_oi_container_control.
    DATA document TYPE REF TO i_oi_document_proxy.
    DATA container TYPE REF TO cl_gui_custom_container.
    DATA link_server TYPE REF TO i_oi_link_server.
    DATA document_type TYPE soi_document_type
                                       VALUE SOI_DOCTYPE_EXCEL_SHEET.
    DATA error TYPE REF TO I_OI_ERROR.
    DATA retcode TYPE SOI_RET_STRING.
    DATA spreadsheet TYPE REF TO i_oi_spreadsheet.
    DATA document_url(256) TYPE c.
    DATA range_name(5) TYPE c VALUE 'Range'.

    CALL METHOD c_oi_container_control_creator=>get_container_control
     IMPORTING control = control
               retcode = retcode.

    CALL METHOD c_oi_errors=>show_message
         EXPORTING type = 'E'.

    CREATE OBJECT container
              EXPORTING container_name = 'CONTAINER'.

    CALL METHOD c_oi_errors=>show_message
         EXPORTING type = 'E'.

    CALL METHOD control->init_control
                        EXPORTING r3_application_name =
                                              'Demo' "#EC NOTEXT
                                  inplace_enabled = 'X'
                                  inplace_scroll_documents = 'X'
                                  parent = container
                                  no_flush = 'X'
                        IMPORTING retcode = retcode.

    CALL METHOD c_oi_errors=>show_message
         EXPORTING type = 'E'.

    CALL METHOD control->get_document_proxy
      EXPORTING document_type = document_type
                no_flush = 'X'
      IMPORTING document_proxy = document
                retcode = retcode.

    CALL METHOD c_oi_errors=>show_message
         EXPORTING type = 'E'.

    CONCATENATE 'file://' p_path
    INTO document_url.

    CALL METHOD document->open_document
      EXPORTING
        document_url = document_url
      IMPORTING
        retcode = retcode.

    CALL METHOD c_oi_errors=>show_message
         EXPORTING type = 'E'.

    CALL METHOD document->get_spreadsheet_interface
     IMPORTING sheet_interface = spreadsheet
               retcode         = retcode.

    CALL METHOD c_oi_errors=>show_message
         EXPORTING type = 'E'.

    CALL METHOD spreadsheet->add_sheet
       EXPORTING name    = lv_sheet_name
       IMPORTING retcode   = retcode.

    CALL METHOD c_oi_errors=>show_message
         EXPORTING type = 'E'.

    CALL METHOD spreadsheet->select_sheet
           EXPORTING name      = lv_sheet_name
                     no_flush  = ' '
           IMPORTING retcode   = retcode.

    CALL METHOD c_oi_errors=>show_message
         EXPORTING type = 'E'.

    CALL METHOD spreadsheet->set_selection
           EXPORTING top       = 1
                     left      = 1
                     rows      = lv_rownum
                     columns   = lv_colnum
                     no_flush  = ' '
           IMPORTING retcode   = retcode.

    CALL METHOD c_oi_errors=>show_message
         EXPORTING type = 'E'.

    CALL METHOD spreadsheet->insert_range
           EXPORTING name      = range_name
                     rows      = lv_rownum
                     columns   = lv_colnum
                     no_flush  = ' '
           IMPORTING retcode   = retcode.

    CALL METHOD c_oi_errors=>show_message
         EXPORTING type = 'E'.

    CALL METHOD spreadsheet->insert_one_table
    EXPORTING
      data_table = <xls_table>
      fields_table = lt_fieldnames
      rangename = range_name
      wholetable = 'X'
      updating = 1
      no_flush = ''
    IMPORTING
      retcode = retcode.

    CALL METHOD c_oi_errors=>show_message
         EXPORTING type = 'E'.


Метод insert_one_table просто ничего не делает. Внутри ошибок не происходит. Lt_Fieldnames заполняю полностью кроме имени таблицы так как она динамическая. Пробовал подставлять вместо динамической таблицы <xls_table> статический вариант, также никаких реакций. Все что я вижу это открытый пустой лист экселя с выделенной областью, которая выделяется сразу после set_selection. Так что вопрос остается открытым. Теперь уже на счет метода insert_one_table. Перепробовал разные варианты c использованием Range и без него, разные варианты параметры updating. ничего не помогает.
Back to top
View user's profile Send private message
admin
Администратор
Администратор



Joined: 01 Sep 2007
Posts: 1639

PostPosted: Wed Oct 10, 2007 11:46 am    Post subject: Reply with quote

Попробуйте сравить ваш код с примерами
http://www.sapnet.ru/search.php?mode=results&search_keywords=insert_one_table
Back to top
View user's profile Send private message
Shvetz
Специалист
Специалист



Joined: 05 Oct 2007
Posts: 53

PostPosted: Wed Oct 10, 2007 12:34 pm    Post subject: Reply with quote

Все, аллелуйя!! Наконец-то получилось. В моем коде выше необходимо добавить непосредственно перед вызовом insert_one_table следующее:

Code:


  REFRESH lt_fieldnames. " я заполнял ее в ручную, поэтому пишу Refresh
  call function 'DP_GET_FIELDS_FROM_TABLE'
    tables
      data   = <xls_table>[]
      fields = lt_fieldnames[].



Таким образом, все работает. Единственное теперь потребуется проформатировать вставленную табличку - длина столбцов шрифт и т д.

В help.sap.com о DOI читать по этой ссылке:
http://help.sap.com/saphelp_47x200/helpdata/en/ad/fdc5b39eef11d1bcb9080009b4534c/frameset.htm

to admin.
Очень благодарю за помощь
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG.
SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG.
Every effort is made to ensure content integrity. Use information on this site at your own risk.