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

Экспорт из ALV Grid в текстовый файл



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
Илья Петров
Участник
Участник



Joined: 16 Jan 2008
Posts: 15
Location: оттуда

PostPosted: Wed Jan 16, 2008 6:00 pm    Post subject: Экспорт из ALV Grid в текстовый файл Reply with quote

В интерфейсе стандартного ALV Grid есть кнопка Экспорт -> Локальный файл -> Без преобр. -> Указать каталог и имя текстового файла -> нажать ОК. После этого он сохраняет содержимое грида в текстовый файл.

Мне заранее известны и каталог и имя файла, они - константы. Как закодить выгрузку в нужный текстовый файл, чтобы пользователю не приходилось ничего выбирать, а выгружалось по одной кнопке ?

Само событие - нажатие кнопки - есть документация как кнопку можно добавить и обработать EVENT before_user_command OF cl_gui_alv_grid

А что вызывать чтоб содержимое куда надо в нужном текстовом формате сохранить ? Об этом ничего пока не нашёл ни в инете ни в перечне методов класса cl_gui_alv_grid. Отладка тоже не помогла - по кнопке Экспорт вызывается контекстное меню, которое при переключении из отладчика обратно в грид исчезает Sad.

Буду благодарен за идеи, как сохранить грид в текст стандартного SAP формата ни о чём не спрашивая пользователя.
Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 165
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Wed Jan 16, 2008 11:02 pm    Post subject: Reply with quote

При экспорте в файл сначала формируется листинг на экране, а далее вызовом ФМ LIST_TO_ASCI сохраняется во внутренней таблице и далее в файле. Все жестко интегрировано в ALV, можно попробовать обойти место выбора формата и файла через динамический вызов. Криво, сами понимаете.

Нашел только один похожий пример, но его нужно реанимировать
Quote:

I have an old code that I have wrote to transform ALV in HTML in background to send the result by email. Maybe that could help you (don't be rude, it's one of my first ALV program Wink ).

The comments are in french, but, you could understand.


Code:
REPORT z_alv_to_html.

DATA:
     itab_fieldcatalog  TYPE lvc_t_fcat,
     itab_mt_sort       TYPE lvc_t_sort,
     v_es_layout        TYPE lvc_s_layo,
     struct_variant     TYPE disvariant.

* Complete.
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
  EXPORTING
    i_structure_name   = 'ZGRE000_S2'
    i_bypassing_buffer = ' '
    i_buffer_active    = ' '
  CHANGING
    ct_fieldcat        = itab_fieldcatalog.

CALL FUNCTION 'LVC_FIELDCAT_COMPLETE'
EXPORTING
* I_COMPLETE =
is_layout = v_es_layout
i_refresh_buffer = ''
i_buffer_active = ''
* IMPORTING
* E_EDIT =
CHANGING
ct_fieldcat = itab_fieldcatalog.

CALL FUNCTION 'LVC_SORT_COMPLETE'
  EXPORTING
    it_fieldcat = itab_fieldcatalog
  CHANGING
    ct_sort     = itab_mt_sort.

CALL FUNCTION 'ALV_DATA_EXPORT'
  EXPORTING
    i_report    = ''
    it_fieldcat = itab_fieldcatalog
  TABLES
    it_data     = itab_zgre000_s2.


* Recherche de la variante d'affichage.
MOVE : sy-repid TO struct_variant-report ,
sy-uname TO struct_variant-username ,
'2' TO struct_variant-handle.
IF p_vgrid NE space.
  MOVE p_vgrid TO struct_variant-variant.
ENDIF.

* Ne pas demander d'explication, merci :)
GET REFERENCE OF itab_zgre000_s2 INTO mt_outtab.

* Cree l'objet variant.
CREATE OBJECT m_cl_variant
EXPORTING
it_outtab = mt_outtab
it_fieldcatalog = itab_fieldcatalog
it_sort = itab_mt_sort
it_filter = itab_mt_filter
is_variant = struct_variant
is_layout = v_es_layout
i_variant_save = v_e_var_save
i_variant_default = v_e_var_def.
MOVE : 'A' TO v_e_var_save ,
'X' TO v_e_var_def .

CALL METHOD m_cl_variant->set_values
  EXPORTING
    it_outtab         = mt_outtab
    it_fieldcatalog   = itab_fieldcatalog
    it_sort           = itab_mt_sort
    it_filter         = itab_mt_filter
    is_variant        = struct_variant
    is_layout         = v_es_layout
    i_variant_save    = v_e_var_save
    i_variant_default = v_e_var_def.

LOOP AT itab_fieldcatalog INTO tmp_fieldcatalog
WHERE tabname NE space.
  EXIT.
ENDLOOP.

* Recherche de la variante.
CALL METHOD m_cl_variant->load_variant
  EXPORTING
    i_tabname          = tmp_fieldcatalog-tabname
    i_bypassing_buffer = 'X'
    i_dialog           = space.

CREATE DATA mt_ct00 LIKE itab_zgre000_s2.
CREATE DATA mt_ct01 LIKE itab_zgre000_s2.
CREATE DATA mt_ct02 LIKE itab_zgre000_s2.
CREATE DATA mt_ct03 LIKE itab_zgre000_s2.
CREATE DATA mt_ct04 LIKE itab_zgre000_s2.
CREATE DATA mt_ct05 LIKE itab_zgre000_s2.
CREATE DATA mt_ct06 LIKE itab_zgre000_s2.
CREATE DATA mt_ct07 LIKE itab_zgre000_s2.
CREATE DATA mt_ct08 LIKE itab_zgre000_s2.
CREATE DATA mt_ct09 LIKE itab_zgre000_s2.

ASSIGN mt_ct00->* TO <lt_ct00>.
ASSIGN mt_ct01->* TO <lt_ct01>.
ASSIGN mt_ct02->* TO <lt_ct02>.
ASSIGN mt_ct03->* TO <lt_ct03>.
ASSIGN mt_ct04->* TO <lt_ct04>.
ASSIGN mt_ct05->* TO <lt_ct05>.
ASSIGN mt_ct06->* TO <lt_ct06>.
ASSIGN mt_ct07->* TO <lt_ct07>.
ASSIGN mt_ct08->* TO <lt_ct08>.
ASSIGN mt_ct09->* TO <lt_ct09>.

recherche des valeurs a partir de la variante selectionnee.
CALL METHOD m_cl_variant->get_values
  IMPORTING
    es_variant            = struct_variant
    et_fieldcatalog       = itab_fieldcatalog
    et_sort               = itab_mt_sort
    et_filter             = itab_mt_filter
    es_layout             = v_es_layout
    et_grouplevels_filter = mt_grouplevels_filter
    e_variant_save        = v_e_var_save
    e_variant_default     = v_e_var_def.

CALL FUNCTION 'LVC_SORT_APPLY'
EXPORTING
it_sort = itab_mt_sort
* I_AS_TEXT = 'X'
* I_STABLE = 'X'
TABLES
ct_data = itab_zgre000_s2.

CALL FUNCTION 'LVC_TRANSFER_TO_KKBLO'
  EXPORTING
    it_sort_lvc             = itab_mt_sort
    it_grouplevels_lvc      = mt_grouplevels_filter
  IMPORTING
    et_sort_kkblo           = itab_lt_sort
    et_grouplevels_kkblo    = itab_lt_grouplevels
  EXCEPTIONS
    it_data_missing         = 1
    it_fieldcat_lvc_missing = 2
    OTHERS                  = 3.

CALL FUNCTION 'ALV_GROUPLEVELS_GET'
  EXPORTING
    i_subtotals_only   = 'X'
    it_sort            = itab_lt_sort
    i_subtract_counter = 'X'
  IMPORTING
    et_groups          = itab_lt_grouplevels
  TABLES
    t_outtab           = itab_zgre000_s2.

CALL FUNCTION 'LVC_TRANSFER_FROM_KKBLO'
  EXPORTING
    it_grouplevels_kkblo = itab_lt_grouplevels
  IMPORTING
    et_grouplevels_lvc   = mt_grouplevels_filter
  EXCEPTIONS
    it_data_missing      = 1
    OTHERS               = 2.

* Recuperation des totaux.
CALL FUNCTION 'LVC_TOTALS_GET'
EXPORTING
it_sort = itab_mt_sort
is_layout = v_es_layout
it_filter_index = itab_mt_filter_i
TABLES
it_data = itab_zgre000_s2
et_collect00 = <lt_ct00>
et_collect01 = <lt_ct01>
et_collect02 = <lt_ct02>
et_collect03 = <lt_ct03>
et_collect04 = <lt_ct04>
et_collect05 = <lt_ct05>
et_collect06 = <lt_ct06>
et_collect07 = <lt_ct07>
et_collect08 = <lt_ct08>
et_collect09 = <lt_ct09>
CHANGING
cs_total_options = ms_total_options
* ct_fieldcat = mt_fieldcatalog
ct_fieldcat = itab_fieldcatalog
ct_grouplevels = mt_grouplevels_filter
c_calculate_totals = m_calculate_totals
c_sumlevel = m_sumlevel .

* Converti dans un language comprehensible par SAP.
CALL FUNCTION 'LVC_TABLE_FOR_DISPLAY'
  EXPORTING
    it_fieldcat           = itab_fieldcatalog
    it_sort               = itab_mt_sort
    it_filter             = itab_mt_filter
    is_total_options      = ms_total_options
    is_layout             = v_es_layout
  IMPORTING
    et_lvc_data           = itab_mt_data
    et_lvc_info           = itab_mt_info
  TABLES
    it_data               = itab_zgre000_s2
    it_collect00          = <lt_ct00>
    it_collect01          = <lt_ct01>
    it_collect02          = <lt_ct02>
    it_collect03          = <lt_ct03>
    it_collect04          = <lt_ct04>
    it_collect05          = <lt_ct05>
    it_collect06          = <lt_ct06>
    it_collect07          = <lt_ct07>
    it_collect08          = <lt_ct08>
    it_collect09          = <lt_ct09>
  CHANGING
    ct_grouplevels        = mt_grouplevels_filter
  EXCEPTIONS
    fieldcat_not_complete = 1
    OTHERS                = 2.

IF sy-subrc NE space.
  WRITE : /1 'Probleme de convertion.'.
  STOP.
ENDIF.


* Convertie en HTML.
CALL FUNCTION 'LVC_ALV_CONVERT_TO_HTML'
  EXPORTING
    it_data       = itab_mt_data
    it_info       = itab_mt_info
    i_file_dialog = ' '
  IMPORTING
    et_html       = itab_html.

https://www.sdn.sap.com/irj/sdn/thread?threadID=111071
Back to top
View user's profile Send private message Blog Visit poster's website
Илья Петров
Участник
Участник



Joined: 16 Jan 2008
Posts: 15
Location: оттуда

PostPosted: Thu Jan 17, 2008 12:03 pm    Post subject: Reply with quote

Спасибо за ответ !
С трассировкой разобрался. Но там действительно глубоко в дебрях лежит экспорт, и внутри себя два эти диалога создаёт (который тип выбирает и потом имя файла) и вызывает.
Никаких публичных методов у ALV grid для этих целей экспорта нет Sad

А что имелось в виду под "можно попробовать обойти место выбора формата и файла через динамический вызов" ?

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


Age: 165
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Thu Jan 17, 2008 12:36 pm    Post subject: Reply with quote

Илья Петров wrote:

А что имелось в виду под "можно попробовать обойти место выбора формата и файла через динамический вызов" ?


Это фактически переписать код alv в Z-программе.
Получать с помощью assign ссылки на внутренние структуры alv, заполнять их в своей программе или вызывая последовательно участки кода в alv через
PERFORM (zzz) IN PROGRAM ( xxx ) IF FOUND, где
zzz - alv подпрограмма,
xxx - alv программа.


Просто таблицу сохратить GUI_DOWNLOAD, но пропадет часть форматирования (шапка)
Back to top
View user's profile Send private message Blog Visit poster's website
Илья Петров
Участник
Участник



Joined: 16 Jan 2008
Posts: 15
Location: оттуда

PostPosted: Fri Jan 18, 2008 10:14 pm    Post subject: Reply with quote

спасибо за ответ!
уфф... 3 дня трассировки - это жесть Smile изучение внутренней вселенной САПа даётся не быстро Smile

быстрее сделать таки думаю через GUI_DOWNLOAD, чем весь код по выгрузке грида в абап лист разбирать и дублировать...

последний вопрос наверно: через GUI_DOWNLOAD я выгрузил таблицу в текст с разделителями табуляции. 2 мелких "проблемки":

1. Я наивно надеялся что параметр fieldnames GUI_DOWNLOAD позволяет (как у АЛВ грида - каталог полей) указать, какие поля таблицы выгрузить в каком порядке. Эксперимент показывает что это не так - он тупо пишет всё что туда записал в 1-ю строку файла.

2. При выводе ячеек не подавляются лидирующие нули и дата выводится в формате ГГГГММДД. Ну, это мелочь совсем...

Полагаю таки что мне проще будет загрузку в 1С переписать, пропарсив файл и всё расставив на свои места при загрузке. Или существуют какие-то ФМ в SAP для вывода таблицы в файл с минимальными опциями указания порядка полей и форматирования, в качестве альтернативы GUI_DOWNLOAD ?
Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 165
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Fri Jan 18, 2008 11:39 pm    Post subject: Reply with quote

Илья Петров wrote:

2. При выводе ячеек не подавляются лидирующие нули и дата выводится в формате ГГГГММДД. Ну, это мелочь совсем...


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

Другой вариант, если разделителем поля является какой-нибудь разделитель, например символ табуляции или вертикальной черты, всю поля можно собирать в одной строке, например типа char(1000), не заботясь о длине каждого поля, вставляя разделитель.

Полученную таблицу выгружаем на сервер.


Илья Петров wrote:

Полагаю таки что мне проще будет загрузку в 1С переписать, пропарсив файл и всё расставив на свои места при загрузке. Или существуют какие-то ФМ в SAP для вывода таблицы в файл с минимальными опциями указания порядка полей и форматирования, в качестве альтернативы GUI_DOWNLOAD ?


Можно и в абапе парсить указанным выше способом. Других ФМ, принципиально отличающихся, что-то на ум не приходит. Поищите самописные.
Back to top
View user's profile Send private message Blog Visit poster's website
Илья Петров
Участник
Участник



Joined: 16 Jan 2008
Posts: 15
Location: оттуда

PostPosted: Sun Jan 20, 2008 4:25 pm    Post subject: Reply with quote

вобщем, прописал всё через GUI_Download , доделал малость загрузку в 1С.

GUI_Download даже по-своему более удобен: в заголовках полей можно задать параметры каждой колонки для 1Са (Имя, тип, ширина, заголовок и т.п.). И в 1Се жёстко не кодить колонки при загрузке, а брать все данные из того что задано при выгрузке из SAP.
Просто я до этого делал отчёты в SQ01, а там только типовыми средствами можно выгрузить, для него универсальная загрузка и была. Теперь вот дорвался до чистого АБАПа, загрузку дописал, стала вдвойне универсальной Smile.

всё получилось, огромное спасибо за помощь !
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.