07-07-2008 7:10 AM
Hi
I have a report based on UWE's two grids example.
The Top and bottom parts both contain data which needs to be printed
However there is now a requirement to be able to run this in the background as well.
UWE's report basically creates a Docking container with splitters and will only run ONLINE.
Now if you ALREADY use a docking container then the examples I've seen posted won't work because the report creation starts from the premise that if the report is ONLINE then you create the Custom container but if it's Batch then you create a docking container.
UWE's report uses a Docking container right from the start (no custom control container).
I messed around with creating another docking container but still get the Fatal error GUI not reached
I suppose I could change the report to use a custom container but I really need the Grids to be "Top and Bottom" with no gaps between them etc (as per UWE's Two Grids report).
Please OO only (No REUSE function module groups).
Note also this system doesn't have the new salv classes so it will have to be based on cl_gui_alv_grid.
Thanks
Jimbo
07-17-2008 8:07 AM
I'm going to reply to my own question here -- nobody seems to have an answer for this one
however I can essentially make it work via a bit of "poodle faking".
I basically have 2 lists -- one of Errors and one of the data . These are normally displayed in Foreground on a single screen using the SPLITTER control but of course this won't work in batch.
What I essentially do is to let the ist list print normally (the data list) and create the 2nd list via submitting a small program with export list to memory.
After the main list has printed I retrieve the 2nd list and print that -- although you get 2 spool lists it does work. It's better also printing from the main program as the user can easily identify his / her output.
..... extract
describe table t_errors lines lv_tab.
if lv_tab > 0. " Only if there is data to print
if sy-batch = 'X'. " only if batch
* Note here that because of the way the OO GRID control framework
* is set up there is a problem of printing multiple GRIDS in the background when
* you have multiple grids on a single screen.
*
* The control framework only prints the ist Grid when running in background
*
* The get around here is to use the "Old Fashioned" REUS LIST DISPLAY
* module to print the secondary list but note again if this is used from the main OO program
* the spool program will overwrite this in our call to screen 100
* and You'll only get a single list of the primary grid.
*
* So the not very elegant solution is simply to pass the field catalog
* and table data and call an external program generate the list.
* Note the field catalog is a little different from the OO CL_GUI_ALV_GRID
* but the fields we are interested are essentially the same ones.
* so we create the SLIS type of field catalog and pass the data
* to zr_mm_0021a to create the the error listing
* which we print at the end of the program. The spool list is
* imported back into this program where it is printed
* after SCREEN 100 has been processed.
* Screen 100 is exited after PBO with set screen 0, leave screen sequence
* so normal list processing can print the list after the primary
* OO ALV list has been printed without the spool manager overwriting the list..
*
*
*It doesn't seem possible currently to print multiple ALV lists
* via OO CL_GUI_ALV_GRID when run in the background
*
*
* generate SLIS type of fieldcat
loop at it_fldcat1 into wa1_it_fldcat1.
move-corresponding wa1_it_fldcat1 to lv_fieldcat.
* Create column header titles for the secondary list
case lv_fieldcat-fieldname.
when 'CAT'.
lv_fieldcat-seltext_m = 'Error'.
lv_fieldcat-ddictxt = 'M'.
lv_fieldcat-outputlen = 12.
when 'MATNR'.
lv_fieldcat-seltext_m = 'Material Number'.
lv_fieldcat-ddictxt = 'M'.
lv_fieldcat-outputlen = 16.
when 'MAKTX'.
lv_fieldcat-seltext_l = 'Material Description'.
lv_fieldcat-ddictxt = 'L'.
lv_fieldcat-outputlen = 23.
when 'MTART'.
lv_fieldcat-seltext_m = 'Mat.Type'.
lv_fieldcat-ddictxt = 'M'.
lv_fieldcat-outputlen = 12.
when 'MATKL'.
lv_fieldcat-seltext_m = 'Mat.Grp'.
lv_fieldcat-ddictxt = 'M'.
lv_fieldcat-outputlen = 12.
when 'WERKS'.
lv_fieldcat-seltext_m = 'Plant'.
lv_fieldcat-ddictxt = 'M'.
lv_fieldcat-outputlen = 12.
when 'MESS'.
lv_fieldcat-seltext_l = 'Error Description'.
lv_fieldcat-ddictxt = 'L'.
lv_fieldcat-outputlen = 40.
endcase.
append lv_fieldcat to ta_fieldcat.
clear lv_fieldcat.
endloop.
assign ta_fieldcat[] to <a>.
assign t_errors[] to <b>.
export <a> to memory id 'katalog'. " the field catalog
export <b> to memory id 'errortab'. "data table
* Note we need to retrieve the generated spool list later
submit zr_mm_0021a
exporting list to memory
and return.
call function 'LIST_FROM_MEMORY'
tables
listobject = ta_abaplist.
endif.
endif.
.... extract
*
*after printing initial grid in background
*
* Print the error list created (if any).
* Note because the Split object is not available in the
* Background (GUI ctl frame work and objects don't exist in the background))
* only the primary GRID object will be printed
* so we need to separately print the secondary list
*here
case sy-batch.
when 'X'.
describe table ta_abaplist lines sy-index.
if sy-index > 0.
call function 'WRITE_LIST'
tables
listobject = ta_abaplist.
.endif.
endcase.
* submitted program is
program xxxxx.
type-pools: slis.
* Generates error report for Inventory aging when run in batch
* Normal splitter only prints ist list.
*
types: ls_fieldcat type slis_fieldcat_alv.
data: lv_fieldcat type ls_fieldcat.
data: ta_fieldcat type ls_fieldcat occurs 1.
types: begin of ty_errors,
cat type icon-id,
matnr type mara-matnr,
maktx type makt-maktx,
mtart type mara-mtart,
matkl type mara-matkl,
werks type marc-werks,
mess(40) type c,
end of ty_errors.
data t_errors type table of ty_errors.
field-symbols : <a> type standard table,
<b> type standard table.
data: g_repid like sy-repid.
g_repid = sy-repid.
assign ta_fieldcat to <a>.
assign t_errors to <b>.
import <a> from memory id 'katalog'. " Field catalog created from main program
import <b> from memory id 'errortab'. "Data table passed from main table
call function 'REUSE_ALV_LIST_DISPLAY'
exporting
i_callback_program = g_repid
it_fieldcat = <a>[]
tables
t_outtab = <b>[].
* end
Not very elegant but it works.
Cheers
jimbo
12-23-2010 2:54 AM
Hi,Host
I just encounter this issue,
I have two comments about this
1, SALV can solve batch alv run.
data or_doc type ref to cl_gui_docking_container,
if cl_gui_alv_grid=>offline( ) is initial.
if lv_container is initial.
create object lv_container
exporting
container_name = 'GD_CONTAINER'.
endif.
try.
call method cl_salv_table=>factory
exporting
r_container = lv_container
container_name = 'GD_CONTAINER'
importing
r_salv_table = lv_table
changing
t_table = p_output[].
catch cx_salv_msg .
endtry."
else.
try.
call method cl_salv_table=>factory
exporting
r_container = or_doc
container_name = 'GD_CONTAINER'
importing
r_salv_table = lv_table
changing
t_table = p_output[].
catch cx_salv_msg .
endtry."
endif.
2, if use method set_table_for_first_display
a, you should use exist structure for reference ,
b, container should be difference setting
Refer to std program BCALV_GRID_02
it can run background job directly .
and code should be :
if CL_GUI_ALV_GRID=>offline( ) is INITIAL .
create object custom_container
exporting
container_name = cont_for_flights
exceptions
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5.
if sy-subrc ne 0.
add your handling, for example
call function 'POPUP_TO_INFORM'
exporting
titel = g_repid
txt2 = sy-subrc
txt1 = 'The control could not be created'(510).
endif.
endif." just importing container for foreend run .
create an instance of alv control
create object grid1
exporting i_parent = custom_container.
*
Set a titlebar for the grid control
*
gs_layout-grid_title = 'Flights'(100).
call method grid1->set_table_for_first_display
exporting i_structure_name = 'SFLIGHT'
is_layout = gs_layout
changing it_outtab = gt_sflight.