‎2007 Nov 15 11:53 AM
Hi experts,
a question for people who worked with
CALL FUNCTION ...STARTING NEW TASK ...DESTINATION IN GROUP
I just made my first try for this: The test program tries to get user details using a BAPI which is called as often as a process is available.
Unfortunately it dumps with the first call with "COMMUNICATION_FAILURE" .
I hope this is an elemetry error. Further I like to know how I can determine the number of available processes dynamically just before calling.
Here my code:
DATA:
gv_taskname TYPE char08,"scma_tpi_id,
gt_bapiaddr3 TYPE bapiaddr3t.
START-OF-SELECTION.
PERFORM paralleltest.
*&---------------------------------------------------------------------*
*& Form paralleltest
*&---------------------------------------------------------------------*
FORM paralleltest.
DATA:
ls_bapiaddr3 TYPE bapiaddr3,
lv_group TYPE rzllitab-classname,
lv_max TYPE i,
lv_inc TYPE i,
lv_free TYPE i,
lv_nproc TYPE i,
lv_bsize TYPE i,
lv_grid_title TYPE lvc_title,
lt_bname TYPE TABLE OF usr03-bname,
lt_bname2do TYPE TABLE OF usr03-bname.
FIELD-SYMBOLS:
<bname> TYPE usr03-bname.
SELECT bname INTO TABLE lt_bname FROM usr01.
SELECT classname
INTO lv_group
FROM rzllitab UP TO 1 ROWS
WHERE grouptype = 'S'.
ENDSELECT.
CALL FUNCTION 'SPBT_INITIALIZE'
EXPORTING
group_name = lv_group
IMPORTING
max_pbt_wps = lv_max
free_pbt_wps = lv_free
EXCEPTIONS
invalid_group_name = 1
internal_error = 2
pbt_env_already_initialized = 3
currently_no_resources_avail = 4
no_pbt_resources_found = 5
cant_init_different_pbt_groups = 6
OTHERS = 7.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
gv_taskname = 'A0000000'.
lv_nproc = lv_free - 2.
CHECK lv_nproc > 1.
DESCRIBE TABLE lt_bname.
lv_bsize =
sy-tfill DIV ( lv_nproc - 1 ).
LOOP AT lt_bname ASSIGNING <bname>.
ADD 1 TO lv_inc.
CALL FUNCTION 'BAPI_USER_GET_DETAIL'
STARTING NEW TASK gv_taskname
DESTINATION IN GROUP lv_group
PERFORMING bapi_receive ON END OF TASK
EXPORTING
username = <bname>.
CHECK lv_inc >= lv_nproc.
CLEAR lv_inc.
WAIT UNTIL gv_taskname IS INITIAL.
ENDLOOP.
WAIT UNTIL gv_taskname IS INITIAL.
lv_grid_title = gv_taskname.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_structure_name = 'BAPIADDR3'
i_grid_title = lv_grid_title
TABLES
t_outtab = gt_bapiaddr3.
ENDFORM. " paralleltest
*&---------------------------------------------------------------------*
*& Form bapi_receive
*&---------------------------------------------------------------------*
FORM bapi_receive USING pv_taskname .
DATA:
ls_bapiaddr3 TYPE bapiaddr3,
lv_msg TYPE text80,
lt_mbew TYPE TABLE OF mbew.
RECEIVE RESULTS FROM FUNCTION 'MBEW_EXTEND'
IMPORTING
address = ls_bapiaddr3
EXCEPTIONS
communication_failure = 1 MESSAGE lv_msg
system_failure = 2 MESSAGE lv_msg .
CASE sy-subrc.
WHEN 0.
APPEND ls_bapiaddr3 TO gt_bapiaddr3.
WHEN 1.
WRITE: 'communication_failure for task', pv_taskname, lv_msg.
WHEN 2.
WRITE: 'system_failure', pv_taskname, lv_msg.
ENDCASE.
CHECK pv_taskname = gv_taskname.
CLEAR: gv_taskname.
ENDFORM. " bapi_receive
Regards,
Clemens
‎2008 Jul 24 10:03 AM
Obviously my question was a bit too special. I remember I wrote a blog or wiki on that together with the working solution.
Unfortunately the search function(s) do not help me (now) to find it...
Regards,
Clemens
‎2014 May 22 8:32 AM
Can you post the link for your blog or the solution to this problem?
Thanks,
Sanyam Kataria
‎2014 May 22 8:08 PM
Here's the link (though it's rather old):
Easily implement parallel processing in online and batch processing - Code Gallery - SCN Wiki
Hope it helps
Regards Clemens
P.S.: I don't remember what the Communication Failure was about - actually an exception for the BAPi called with addition of MESSAGE <mess> may have shown me the solution.
‎2014 May 23 8:51 AM