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

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


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

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


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

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