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

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 37 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Метод insert_one_table (DOI)
СообщениеДобавлено: Чт, янв 25 2007, 15:27 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, янв 16 2007, 19:00
Сообщения: 168
Откуда: город
Добрый день всем. Может быть кто-нибудь сталкивался с вставкой таблиц в эксель или ворд. Для этого я использую DOI (без OLE). Вот мой код:

Code:
  DATA i_spreadsheet TYPE REF TO i_oi_spreadsheet.
  CALL METHOD i_document->get_spreadsheet_interface
    IMPORTING
      sheet_interface = i_spreadsheet.

  DATA gt_test TYPE TABLE OF string WITH HEADER LINE.
  gt_test = 'abcdefg'.
  APPEND gt_test.
  gt_test = 'hijklmn'.
  APPEND gt_test.

  CALL METHOD i_spreadsheet->insert_one_table
    EXPORTING
      data_table   = gt_test[]
      rangename    = 'table1'.


Проблема в том, что выпадаю в дамп всякий раз при выполнении метода insert_one_table (ошибка system failure). Причем то же наблюдается, если попытаться вставить таблицу в ворд через интерфейс i_oi_word_processor_document.

Почитал на help.sap.com - вроде бы никаких особенностей не нашел.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, янв 25 2007, 15:32 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
Попробуйте перед insert_one_table позвать

CALL METHOD i_spreadsheet->insert_range_dim.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, янв 25 2007, 15:48 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, янв 16 2007, 19:00
Сообщения: 168
Откуда: город
Спасибо за ответ.

Перед вызовом метода insert_one_table вставил этот код:
Code:
CALL METHOD i_spreadsheet->insert_range_dim
  EXPORTING
    name      = 'table1'
    left      = 1
    top       = 1
    rows      = 2
    columns   = 1.

Честно говоря, не совсем понял, что делает этот метод и какие должны быть параметры top и left. :oops: Однако не помогло, теперь при выполнении метода insert_one_table выдает ошибку move_to_lit_not_allowed_nodata.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, янв 25 2007, 16:03 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
Честно говоря, не уверен, ...
Попробуйте в insert_one_table проставить галку на параметр wholetable = 'X'.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, янв 25 2007, 16:28 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, авг 22 2005, 14:50
Сообщения: 1285
Откуда: с работы
Пол: Женский
Объясняю

Code:
* -- field catalog for range
  CALL FUNCTION 'DP_GET_FIELDS_FROM_TABLE'
    TABLES
      data   = it_excel
      fields = fields_table.
  DESCRIBE TABLE fields_table LINES columns_number.

...

  DESCRIBE TABLE p_excel LINES rows_number.
* -- create an excel range for our data
  CALL METHOD spreadsheet->insert_range_dim
    EXPORTING
      name     = p_rname         " это имя должно совпадать с именем в insert_one_table
      top      = p_y                   " координата y левого верхнего угла
      left     = p_x                    " координата х левого верхнего угла
      rows     = rows_number   " количество строк в вашей таблице
      no_flush = 'X'
      columns  = columns_number " столбцов в вашей таблице
    IMPORTING
      error    = error.

* -- transfer R/3 table data into excel range
  CALL METHOD spreadsheet->insert_one_table
    EXPORTING
      data_table   = p_excel[]
      rangename    = p_rname
      fields_table = fields_table
      no_flush     = 'X'
      wholetable   = 'X'
    IMPORTING
      error        = error.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, янв 25 2007, 17:14 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, янв 16 2007, 19:00
Сообщения: 168
Откуда: город
Спасибо за новые идеи. Правда я наврал... :oops: ошибка возникает при обработке ФМ AC_FLUSH_CALL_INTERNAL, который вызывается автоматически после вызова insert_one_table с исключением System Failure. Пробовал снимать/ставить no_flush в параметрах - результат тот же. Импортируемый rcode возвращает 'call not flushed'. Что это может значить и как побороть?
Мой нынешний код:
Code:
  DATA gt_test TYPE TABLE OF string WITH HEADER LINE.
  gt_test = 'abcdefg'.
  APPEND gt_test.
  gt_test = 'hijklmn'.
  APPEND gt_test.

  DATA gt_ftab TYPE soi_fields_table WITH HEADER LINE.

  CALL METHOD i_spreadsheet->insert_range_dim
    EXPORTING
      NO_FLUSH  = 'X'
      name      = 'table1'
      left      = 1
      top       = 1
      rows      = 2
      columns   = 1.

  CALL FUNCTION 'DP_GET_FIELDS_FROM_TABLE'
    TABLES
      data   = gt_test[]
      fields = gt_ftab[].

  CALL METHOD i_spreadsheet->insert_one_table
    EXPORTING
      data_table   = gt_test[]
      fields_table = gt_ftab[]
      rangename    = 'table1'
      no_flush = 'X'
    IMPORTING
       retcode = rcode.

Обязательно ли использовать ФМ DP_GET_FIELDS_FROM_TABLE?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, янв 25 2007, 18:48 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
Code:
CALL FUNCTION 'DP_GET_FIELDS_FROM_TABLE'
    TABLES
      data   = gt_test[]
      fields = gt_ftab[].


Обычно используеется чтобы посчитать кол-во столбцов и передать fields в insert_one_table.
И в этом случае его стоит вставить перед insert_range_dim.

Если опираетесь на словарную структуру - можно пользовать параметр ddic_name в том же методе.

И попробуйте, все таки, wholetable = 'X'
Может посмотрим весь код целиком с инициализациями и т.д. ?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, янв 25 2007, 19:14 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, янв 16 2007, 19:00
Сообщения: 168
Откуда: город
Спасибо за поддержку. Пытался я включить whole_table - тщетно.
Вот весь код моей незамысловатой программы:
Code:
REPORT zdoi_test.

DATA: i_control  TYPE REF TO i_oi_container_control.
DATA: i_document TYPE REF TO i_oi_document_proxy.
DATA: gr_container TYPE REF TO cl_gui_custom_container.

START-OF-SELECTION.
  PERFORM preparation.
  PERFORM excel_processing.

*&---------------------------------------------------------------------*
*&      Form  preparation
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM preparation.
* Creating the instance i_control
  CALL METHOD c_oi_container_control_creator=>get_container_control
    IMPORTING
      control = i_control.

* Initializing control
  CALL METHOD i_control->init_control
    EXPORTING
      r3_application_name = 'R/3 application'
      parent              = gr_container
      inplace_enabled     = ' '
      no_flush            = ' '.
ENDFORM.                    "preparation

*&---------------------------------------------------------------------*
*&      Form  excel_processing
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM excel_processing.

  CALL METHOD i_control->get_document_proxy
    EXPORTING
      document_type      = 'Excel.Sheet.8'
      register_container = 'X'
    IMPORTING
      document_proxy     = i_document.

  CALL METHOD i_document->create_document
    EXPORTING
      open_inplace = ' '.

  DATA i_spreadsheet TYPE REF TO i_oi_spreadsheet.
  CALL METHOD i_document->get_spreadsheet_interface
    IMPORTING
      sheet_interface = i_spreadsheet.


  DATA gt_test TYPE TABLE OF string WITH HEADER LINE.
  gt_test = 'abcdefg'.
  APPEND gt_test.
  gt_test = 'hijklmn'.
  APPEND gt_test.

  DATA gt_ftab TYPE soi_fields_table WITH HEADER LINE.

  CALL FUNCTION 'DP_GET_FIELDS_FROM_TABLE'
    TABLES
      data   = gt_test[]
      fields = gt_ftab[].

  CALL METHOD i_spreadsheet->insert_range_dim
    EXPORTING
      no_flush = 'X'
      name     = 'table1'
      left     = 1
      top      = 1
      rows     = 2
      columns  = 1.

  CALL METHOD i_spreadsheet->insert_one_table
    EXPORTING
      data_table   = gt_test[]
      fields_table = gt_ftab[]
      rangename    = 'table1'
      wholetable   = 'X'
      no_flush     = 'X'.

  WRITE 'Excel document has been created...'.

ENDFORM.                    "excel_processing


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 26 2007, 11:36 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
проблема. как мне кажется в объявлении таблички
gt_test

Сделайте её типа:
Code:
  DATA: begin of gt_test occurs 0,
         string(132),
        end of gt_test.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 26 2007, 11:42 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, янв 16 2007, 19:00
Сообщения: 168
Откуда: город
Lars, спасибо огромное. Сказать по правде, не поверил своим глазам! :shock: Действительно, все дело оказалось в объявлении тестовой таблички. А я даже и подумать не мог... Еще раз благодарю за помощь!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 26 2007, 11:57 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, авг 22 2005, 14:50
Сообщения: 1285
Откуда: с работы
Пол: Женский
И как тут может нормальный человек догадаться?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 26 2007, 13:49 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, янв 16 2007, 19:00
Сообщения: 168
Откуда: город
Да уж... самое плохое, что в документации ни слова...
Кстати, Galka, без ФМ DP_GET_FIELDS_FROM_TABLE, тоже не хотит работать, так что спасибо за совет :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 26 2007, 14:46 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
Думается мне, что передача типа string в excel идентична передаче array и variant, которые мы, к сожалению, передать не можем.

А DP_GET_FIELDS_FROM_TABLE работает нормально. Он вернул тип 'g' - видимо generic. И длину в 8 байт.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Метод insert_one_table (DOI)
СообщениеДобавлено: Вт, фев 06 2007, 10:00 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Вт, янв 09 2007, 15:40
Сообщения: 56
Откуда: Поволжье
Тоже попробовал через insert_one_table. Все получилось. Значительно быстрее через ОЛЕ, но вот не во всем разобрался, в частности
как изменть имена листов и
возможно сохранить и закрыть этот созданный файл Excel :?:


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, фев 06 2007, 13:00 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, янв 16 2007, 19:00
Сообщения: 168
Откуда: город
Когда научишься, отпиши, как переименовывать вкладки. Самому скоро понадобится :!:


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 37 ]  На страницу 1, 2, 3  След.

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


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

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


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

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