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

Единый макрос на все отчёты



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



Joined: 08 Apr 2009
Posts: 75

PostPosted: Fri Feb 04, 2011 5:18 pm    Post subject: Единый макрос на все отчёты Reply with quote

Приветствую!

У нас в "oaer", много шаблонов для отчётов, шаблоны разные но заполняются при помощи одного макроса... соответственно в каждом шаблоне свой модуль, со своим текстом одинакового макроса... если находиться недочёт по макросу, надо перелопачивать все шаблоны...

Вопрос: Подскажите как-то можно использовать один модуль?
может не "oaer"?

p/s/ есть идея, но она не очень, вызывать пустой шаблон, в котором лежит модуль с макросом, потом вызывать шаблоны, которые будут вызывать макрос из первого шаблона
Smile


p/p/s sap стары (4,6 по моему)
Back to top
View user's profile Send private message
Nicks
Участник
Участник



Joined: 02 Aug 2010
Posts: 9

PostPosted: Tue Feb 08, 2011 1:08 pm    Post subject: Reply with quote

Ну по моему у Parazitа есть код импортирующий текстовый файл в книгу Excel и запускающий от туда макрос - вроде у него уворовано
Code:
 create object xlapplication 'excel.application'.
  call method of xlapplication 'Workbooks' = xlworkbook.
  if sy-subrc ne 0. raise excel_init_error. endif.
  call method of xlworkbook 'Open'
                  exporting #1 = wa_path_xls.
  if sy-subrc ne 0. raise excel_init_error. endif.
  call method of xlapplication 'Worksheets' = xlsheet
                 exporting #1 = 1.
  if sy-subrc ne 0. raise excel_init_error. endif.
* импорт файла в Excel
  call method of xlapplication 'VBE' = xlvbe.
  call method of xlvbe 'ActiveVBProject' = xlactivevbproject.
  call method of xlactivevbproject 'VBComponents' = xlvbcomponents.
  loop at it_module into wa_module.
    wa_save_pos = sy-tabix.
    call method of xlvbcomponents 'Import' = wa_module-xlimport
                        exporting #1 = wa_module-wa_path_bas.
    modify it_module from wa_module index wa_save_pos.
    call method cl_gui_frontend_services=>file_delete
      exporting
        filename      = wa_module-wa_path_bas_s
      changing
        rc            = wa_rc
      exceptions
        access_denied = 1.
  endloop.
  " проверка на возможность запуска макросов
  " запуск макроса-пустышки 's0', а не сразу 'Dovba',
  " потому что, если в макросе есть 'ActiveWorkbook.Close', то sy-subrc <> 0 тоже
  call method of xlapplication 'Run' = xlrun
                        exporting #1 = 's0'.
  if sy-subrc ne 0.
      call function 'POPUP_TO_INFORM'
      exporting
        titel         = 'Ошибка создания отчета'
        txt1          = 'Необходимо сделать следующее:'
        txt2          = '1) открыть Excel - Меню - Сервис - Макрос - Безопасность - '
        txt3          = 'Надежные издатели - Доверять доступ к Visual Basic Project (поставить галочку)'
        txt4          = '2) закрыть Excel и заново сформировать отчет'.
  else.
    if i_background <> 'X'.
      progress curstep totalstep 'Формирование отчета в Excel'.
      call method of xlapplication 'Run' = xlrun
                            exporting #1 = 'Dovba'.
    endif.
  endif.

  if i_background <> 'X'.
    loop at it_module into wa_module.
      call method of xlvbcomponents 'Remove' = xlremove
                            exporting #1 = wa_module-xlimport.
      free object wa_module-xlimport.
    endloop.
  endif.

  set property of xlapplication 'DisplayAlerts' = 0.
  if sy-subrc ne 0. raise excel_open_error. endif.

  call method of xlapplication 'Save'.
  if sy-subrc ne 0. raise excel_open_error. endif.

  set property of xlapplication 'Visible' = 1.
  if sy-subrc ne 0. raise excel_open_error. endif.

  free object xlapplication. " надо очищать - иначе Excel даже после закрытия висит в процессах
  free object xlworkbook.
  free object xlsheet.
  free object xlvbe.
  free object xlactivevbproject.
  free object xlvbcomponents.
  free object xlremove.
  free object xlrun.

Сам не пытался так сделать - сделал по аналогии - в общем доступе лежит файл в нем макрос - его и вставляю в виде модуля. Но не на ABAP это все было. Концепция важна Very Happy
Back to top
View user's profile Send private message
vladkop
Участник
Участник


Age: 195
Joined: 28 Jul 2010
Posts: 2

PostPosted: Fri Feb 18, 2011 4:43 pm    Post subject: Reply with quote

Можно сделать и по другому, через ABAP динамически формировать код Excel и затем загружать его в нужный файл, можно реализовать это через инклуду и влючать ее в необходимую программу. Вариаций на эту тему много.

Code:
************************************************************************
*             Работа с Exel с помощью OLE                              *
************************************************************************
  INCLUDE ole2incl.
  DATA: lv_app             TYPE ole2_object, " Приложение
        lv_vbe             TYPE ole2_object, " VBA Editor
        lv_activevbproject TYPE ole2_object, " Проект
        lv_vbcomponents    TYPE ole2_object, " Коллекция компонент
        lv_vbcomponent     TYPE ole2_object, " Компонент проекта
        lv_workbook        TYPE ole2_object, " Книга
        lv_sheet           TYPE ole2_object, " Страница
        lv_range           TYPE ole2_object. " Диапазон

* создаем OLE объект
  CREATE OBJECT lv_app 'Excel.Application'.
  IF sy-subrc NE 0.
    WRITE: / 'Невозможно создать объект Excel'(i01).
    STOP.
  ENDIF.


***********************************************************************
* Загрузка файла, созданного по шаблону из SMW0, в рабочую книгу Excel
***********************************************************************
DATA: lv_full_name     TYPE rlgrap-filename.

  CALL METHOD OF lv_app 'Workbooks' = lv_workbook.
  IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.
  CALL METHOD OF lv_workbook 'Open'
       EXPORTING #1 = lv_full_name.
  IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.

***********************************************************************
* Удаление всех стандартных модулей из текущего проекта (типа 1)
* 1    vbext_ct_StdModule        Standard module
* 2    vbext_ct_ClassModule      Class module
* 3    vbext_ct_MSForm           Microsoft Form
* 11   vbext_ct_ActiveXDesigner  ActiveX Designer
* 100  vbext_ct_Document         Document Module

***********************************************************************
  CALL METHOD OF lv_app 'VBE' = lv_vbe.
  IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.
  CALL METHOD OF lv_vbe 'ActiveVBProject' = lv_activevbproject.
  IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.
  CALL METHOD OF lv_activevbproject 'VBComponents' = lv_vbcomponents.
  IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.

* найдем число компонент в проекте
  DATA: lv_count TYPE n,   " число элементов в семействе
        lv_type  TYPE i,   " тип компонента в семействе
        lv_name(128).      " имя компонента

  GET PROPERTY OF lv_vbcomponents
      'Count' = lv_count.
  IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.

* удалим из проекта компоненты типа 1 (Стандартные модули)
  DO lv_count TIMES.
    CALL METHOD OF lv_vbcomponents 'Item' = lv_vbcomponent
             EXPORTING #1 = sy-index.
    IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.
    GET PROPERTY OF lv_vbcomponent
        'Type' = lv_type.
    IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.
    IF lv_type = '1'.
      GET PROPERTY OF lv_vbcomponent
      'Name' = lv_name.
      IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.
      CALL METHOD OF lv_vbcomponents 'Remove'
         EXPORTING #1 = lv_vbcomponent.
      IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.
    ENDIF.
    FREE OBJECT: lv_vbcomponent.
  ENDDO.

***********************************************************************
* Динамическое создание программы для макроса,
* выгрузка ее в текстовый файл с расширением '.BAS' и
* загрузка в рабочую книгу текущего проекта
* !!! В проекте в стандартных модулях не должно быть процедуры
* с таким же именем
***********************************************************************
  DATA: lv_string TYPE string,
        lt_module LIKE TABLE OF lv_string.

* Выгрузка в файл - фокус на страницу "Описание задачи"
  lv_string = 'Sub SetHeighFoobod(sMsgText As String)'.
  APPEND lv_string TO lt_module.
  lv_string = 'Worksheets("Описание задачи").Activate'.
  APPEND lv_string TO lt_module.
  lv_string = 'End Sub'.
  APPEND lv_string TO lt_module.
  CALL FUNCTION 'GUI_DOWNLOAD'
       EXPORTING
*          BIN_FILESIZE            =
            filename                = lv_full_name_bas
*          FILETYPE                = 'ASC'
*     IMPORTING
*          FILELENGTH              =
       TABLES
            data_tab                =  lt_module
     EXCEPTIONS
          file_write_error        = 1
          no_batch                = 2
          gui_refuse_filetransfer = 3
          invalid_type            = 4
          OTHERS                  = 5
            .
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

* импорт файла в текущий проект
  CALL METHOD OF lv_vbcomponents 'Import'
    EXPORTING #1 = lv_full_name_bas.
  IF sy-subrc NE 0. RAISE excel_init_error. ENDIF.
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.