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

Выполнить Report Writer-отчёт в другой программе и записать



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
Chiffa44
Участник
Участник


Age: 36
Joined: 12 Mar 2010
Posts: 13
Location: Санкт-Петербург

PostPosted: Fri Mar 12, 2010 5:31 pm    Post subject: Выполнить Report Writer-отчёт в другой программе и записать Reply with quote

Зарегистрирован:
10 фев 2009, 13:20
Сообщения: 26
Пол: Женский Доброго времени суток!

У меня есть RW отчёт(1SVG-001, library 1VK). Нужно его выполнить в другом отчёте и выходной экран записать в память с тем, чтобы потом можно было преобразовать в html.
Нашла обычный ABAP-отчёт, который вызывается при запуске RW-отчёта.
Выполняю его с помощью SUBMIT:


Code:

SUBMIT GP58AMUXFQ3ZHQL3YHD50PM8IYN300 WITH SELECTION-TABLE SELTAB
    EXPORTING LIST TO MEMORY           " Save list in memory
    AND RETURN.    " Return control to this program




При выполнении зависает. Подозреваю, что это из-за сообщения, которое выскакивет при выходе.
Если убрать EXPORTING LIST TO MEMORY, то зависания не происходит.

Вопрос в следующем: как записать выходной экран этого отчёта в память?

Может можно использовать SUBMIT с дополнением via job jobname или TO SAP-SPOOL? Но как потом достать данные?

Заранее спасибо за помощь.
Back to top
View user's profile Send private message
vga
Мастер
Мастер


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

PostPosted: Fri Mar 12, 2010 9:38 pm    Post subject: Reply with quote

Попробуйте при вызове указать параметр with nodialog = 'X'

Code:
DATA : it_listobject LIKE abaplist OCCURS 0 WITH HEADER LINE.

SUBMIT GP58AMUXFQ3ZHQL3YHD50PM8IYN300
    WITH $1kokre = '1000'
    WITH $1gjahr = '2004'
    WITH nodialog = 'X'
    AND RETURN
    EXPORTING LIST TO MEMORY.


CALL FUNCTION 'LIST_FROM_MEMORY'
  TABLES
    listobject = it_listobject
  EXCEPTIONS
    not_found  = 1
    OTHERS     = 2.

CALL FUNCTION 'WRITE_LIST'
  TABLES
    listobject = it_listobject.

_________________
Молитва - это запрос разработчику на изменение кода программы.
Back to top
View user's profile Send private message Blog Visit poster's website
Chiffa44
Участник
Участник


Age: 36
Joined: 12 Mar 2010
Posts: 13
Location: Санкт-Петербург

PostPosted: Sun Mar 14, 2010 12:41 am    Post subject: Reply with quote

Спасибо большое!

В понедельник попробую и отпишусь, а то сейчас САПа под рукой нет.
Back to top
View user's profile Send private message
Chiffa44
Участник
Участник


Age: 36
Joined: 12 Mar 2010
Posts: 13
Location: Санкт-Петербург

PostPosted: Mon Mar 15, 2010 4:14 pm    Post subject: Reply with quote

К сожалению, не помогло.

Функция 'LIST_FROM_MEMORY' возвращает пустой лист. Хотя всё выполняется без зависания.

Может ещё какие-нибудь предложения?

_________________
…пока человек жив, ничего не пропало. Из любой ситуации всегда есть выход, причём не один, а несколько – и кто ты такой, чтобы оказаться первым человеческим существом во Вселенной, попавшим в действительно безвыходную ситуацию.
Back to top
View user's profile Send private message
vga
Мастер
Мастер


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

PostPosted: Mon Mar 15, 2010 5:11 pm    Post subject: Reply with quote

Можете привести пример вашего кода, интересует чем заполнены входные параметры WITH SELECTION-TABLE SELTAB?
_________________
Молитва - это запрос разработчику на изменение кода программы.
Back to top
View user's profile Send private message Blog Visit poster's website
Chiffa44
Участник
Участник


Age: 36
Joined: 12 Mar 2010
Posts: 13
Location: Санкт-Петербург

PostPosted: Mon Mar 15, 2010 5:46 pm    Post subject: Reply with quote

Заполнение SELTAB:
Code:
SELTAB-SELNAME = '$1KOKRE'.
SELTAB-KIND = 'S'.
SELTAB-SIGN = 'I'.
SELTAB-OPTION = 'EQ'.
SELTAB-LOW = '1000'.
APPEND SELTAB.
SELTAB-SELNAME = '$1GJAHR'.
SELTAB-KIND = 'S'.
SELTAB-SIGN = 'I'.
SELTAB-OPTION = 'EQ'.
SELTAB-LOW = '2009'.
APPEND SELTAB.


Спасибо.

_________________
…пока человек жив, ничего не пропало. Из любой ситуации всегда есть выход, причём не один, а несколько – и кто ты такой, чтобы оказаться первым человеческим существом во Вселенной, попавшим в действительно безвыходную ситуацию.
Back to top
View user's profile Send private message
John Doe
Модератор
Модератор


Age: 46
Joined: 05 Nov 2007
Posts: 725
Location: КраснАдар

PostPosted: Mon Mar 15, 2010 7:06 pm    Post subject: Reply with quote

Я думаю, что проблема в том, что на выходе возникает диалоговое окно с гуи-статусом в котором зарегистрирован Enter. А тогда включается автоматически добавочка:
Quote:
Addition 3
... EXPORTING LIST TO MEMORY


Effect
This addition stores the basic list for the program accessed in the ABAP Memory. It can only be used together with the addition AND RETURN.

The list is stored in the ABAP Memory as an internal table of the row type ABAPLIST, ABAPLIST being a structured data type in the ABAP Dictionary.

The calling program can access the list stored once program access is completed, using function modules belonging to the function group SLST.

The function module LIST_FROM_MEMORY loads the list from the ABAP Memory to an internal table of the row type ABAPLIST.

The function module WRITE_LIST inserts the content of an internal table of the row type ABAPLIST in the current list.

The function module DISPLAY_LIST displays the content of an internal table of the row type ABAPLIST in a separate list screen.



Note
The addition can only work provided the function key Enter is not linked to a function code in the GUI status last defined for the program accessed.
Back to top
View user's profile Send private message Blog
Chiffa44
Участник
Участник


Age: 36
Joined: 12 Mar 2010
Posts: 13
Location: Санкт-Петербург

PostPosted: Tue Mar 16, 2010 1:25 am    Post subject: Reply with quote

А можно скопировать этот отчёт в другой и убрать данное сообщение?
_________________
…пока человек жив, ничего не пропало. Из любой ситуации всегда есть выход, причём не один, а несколько – и кто ты такой, чтобы оказаться первым человеческим существом во Вселенной, попавшим в действительно безвыходную ситуацию.
Back to top
View user's profile Send private message
vga
Мастер
Мастер


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

PostPosted: Tue Mar 16, 2010 12:31 pm    Post subject: Reply with quote

Думаю, дело не в этом сообщении. При submit
в FM G_LEAVE_REPORT, где это сообщение формируется, программа вообще не заходит.
Это сообщение можно вообще убрать через меню в запущенном отчете
Settings - Options - Send Confirmation Prompt.


Как Background Job отчет выполняется, думаю нужно подумать в этом направлении и забирать результат из спула.

См. FM RSPO_RETURN_ABAP_SPOOLJOB, RSPO_DISPLAY_ABAP_SPOOLJOB, RSPO_DOWNLOAD_SPOOLJOB

_________________
Молитва - это запрос разработчику на изменение кода программы.
Back to top
View user's profile Send private message Blog Visit poster's website
Chiffa44
Участник
Участник


Age: 36
Joined: 12 Mar 2010
Posts: 13
Location: Санкт-Петербург

PostPosted: Tue Mar 16, 2010 3:57 pm    Post subject: Reply with quote

Да, спасибо, я уже пробовала вот так:

Code:
CALL FUNCTION 'JOB_OPEN'

submit ...
TO SAP-SPOOL
SPOOL PARAMETERS print_parameters
WITHOUT SPOOL DYNPRO
VIA JOB name NUMBER number
AND RETURN.

CALL FUNCTION 'JOB_CLOSE'
DO. " Пока job не выполнится
select single * from TBTCO where jobname = name and jobcount = number and status = 'F'.
ENDDO.

CALL FUNCTION 'BP_JOB_READ'

CALL FUNCTION 'RSPO_RETURN_ABAP_SPOOLJOB'


Но статус в таблице TBTCO 'P' и соответственно прога зависает в цикле.

Что я не так делаю?

_________________
…пока человек жив, ничего не пропало. Из любой ситуации всегда есть выход, причём не один, а несколько – и кто ты такой, чтобы оказаться первым человеческим существом во Вселенной, попавшим в действительно безвыходную ситуацию.
Back to top
View user's profile Send private message
vga
Мастер
Мастер


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

PostPosted: Tue Mar 16, 2010 4:42 pm    Post subject: Reply with quote

Code:
DATA:   l_valid,
        ls_params LIKE pri_params,
        l_jobcount LIKE tbtcjob-jobcount,
        l_jobname LIKE tbtcjob-jobname,
        ls_jobhead LIKE  tbtcjob,
        lt_job_read_steplist TYPE TABLE OF tbtcstep
          WITH HEADER LINE,
        l_spool_id        LIKE tsp01-rqident,
        lt_spool_list      TYPE bapixmspow OCCURS 0
          WITH HEADER LINE.

START-OF-SELECTION.

* Get Print Parameters
  CALL FUNCTION 'GET_PRINT_PARAMETERS'
    EXPORTING
      no_dialog      = 'X'
    IMPORTING
      valid          = l_valid
      out_parameters = ls_params.

* Open Job
  l_jobname = 'RW_1SVG'.
  CALL FUNCTION 'JOB_OPEN'
    EXPORTING
      jobname  = l_jobname
    IMPORTING
      jobcount = l_jobcount.

* Submit report to job
  SUBMIT gp58amuxfq3zhql3yhd50pm8iyn300
     WITH $1kokre = '1000'
     WITH $1gjahr = '2004'
     WITH $1periv = '01'
     WITH $1perib = '12'
     WITH $1verp  = '0'
        VIA JOB     l_jobname
            NUMBER  l_jobcount
        TO SAP-SPOOL WITHOUT SPOOL DYNPRO
            SPOOL PARAMETERS ls_params
               AND RETURN.

* Schedule and close job.
  CALL FUNCTION 'JOB_CLOSE'
    EXPORTING
      jobcount  = l_jobcount
      jobname   = l_jobname
      strtimmed = 'X'.


* Wait for a while so jobs can run
  WHILE ( NOT ls_jobhead-status = 'F' ) AND
  ( NOT ls_jobhead-status = 'A' ).
    CALL FUNCTION 'BP_JOB_READ'
      EXPORTING
        job_read_jobcount     = l_jobcount
        job_read_jobname      = l_jobname
        job_read_opcode       = '20'
      IMPORTING
        job_read_jobhead      = ls_jobhead
      TABLES
        job_read_steplist     = lt_job_read_steplist
      EXCEPTIONS
        invalid_opcode        = 1
        job_doesnt_exist      = 2
        job_doesnt_have_steps = 3
        OTHERS                = 4.
    IF ls_jobhead-status = 'F'. " F = Finished
      EXIT.
    ELSEIF ls_jobhead-status = 'A'. " A = Aborted
      MESSAGE e000(su) WITH 'BP_JOB_READ function Aborted.'
      'Status is "' ls_jobhead-status '"'.
    ELSE.
      WAIT UP TO 2 SECONDS.
    ENDIF.
  ENDWHILE.
 
  READ TABLE lt_job_read_steplist INDEX 1.
  l_spool_id = lt_job_read_steplist-listident.

  CALL FUNCTION 'RSPO_RETURN_ABAP_SPOOLJOB'
    EXPORTING
      rqident              = l_spool_id
    TABLES
      buffer               = lt_spool_list
    EXCEPTIONS
      no_such_job          = 1
      not_abap_list        = 2
      job_contains_no_data = 3
      no_permission        = 4
      OTHERS               = 8.

  LOOP AT lt_spool_list.
    WRITE: / lt_spool_list.
  ENDLOOP.

_________________
Молитва - это запрос разработчику на изменение кода программы.
Back to top
View user's profile Send private message Blog Visit poster's website
Chiffa44
Участник
Участник


Age: 36
Joined: 12 Mar 2010
Posts: 13
Location: Санкт-Петербург

PostPosted: Wed Mar 17, 2010 2:01 pm    Post subject: Reply with quote

Спасибо большое!!!

В JOB_CLOSE strtimmed = 'X'. забыла, теперь всё работает.

_________________
…пока человек жив, ничего не пропало. Из любой ситуации всегда есть выход, причём не один, а несколько – и кто ты такой, чтобы оказаться первым человеческим существом во Вселенной, попавшим в действительно безвыходную ситуацию.
Back to top
View user's profile Send private message
vga
Мастер
Мастер


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

PostPosted: Wed Mar 17, 2010 3:44 pm    Post subject: Reply with quote

Единственное, что скажу, вот такой код - это очень плохо, Ваша программа не одна к базе данных обращается.

Code:
DO. " Пока job не выполнится
select single * from TBTCO where jobname = name and jobcount = number and status = 'F'.
ENDDO.


Нужно обязательно временную задежку делать. Например так, или как в примере выше.

Code:
DO. " Пока job не выполнится

  SELECT SINGLE jobname INTO name
    FROM tbtco
    WHERE jobname = name
      AND jobcount = number
      AND status = 'F'.

  IF sy-subrc IS INITIAL.
    EXIT.
  ENDIF.

  WAIT UP TO 1 SECONDS.

ENDDO.

_________________
Молитва - это запрос разработчику на изменение кода программы.
Back to top
View user's profile Send private message Blog Visit poster's website
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.