Table Controls in Tab Strip
Tab strip is a screen container where we can have multiple screen fields from different tables or same table. Tab contains two parts – tab title and page area. Here the tab title works like a push button. In the page area of tab we need to design a sub screen. Each tab is a container of each sub screen where we can show different fields. We can have table control also in that sub screen. We have to looping the internal table with the table control to create a table control in a tab strip.
In the following example we have created a main screen where an input field of Airline code is there. Based on that input the program will fetch data from Airline, Flight schedule and Flight database table. After that the program will display the details inside the three tabs. Here at the first tab we are declaring the details of Airline. This is a normal display because we are selecting only one input of airline code. Now according to the function one airline can contain one or more flight schedule and flight details. So we are displaying those multiple data by using a table control created in different tabs.
Step – 1:
At first we need to create the different includes of the module pool.
INCLUDE mz_test_top . " global Data
INCLUDE mz_test_o01 . " PBO-Modules
INCLUDE mz_test_i01 . " PAI-Modules
INCLUDE mz_test_f01 . " FORM-Routines
INCLUDE mz_test_o01 . " PBO-Modules
INCLUDE mz_test_i01 . " PAI-Modules
INCLUDE mz_test_f01 . " FORM-Routines
Step – 2:
Next we are declaring the variables, structures and tables at the top include.
*-------Declaring tables for screen fields-----------------------------*
TABLES: scarr, spfli, sflight.
TYPES:
*------Airline internal structure--------------------------------------*
BEGIN OF ty_scarr,
carrid TYPE scarr-carrid,
carrname TYPE scarr-carrname,
currcode TYPE scarr-currcode,
END OF ty_scarr,
*------Flight schedule internal structure------------------------------*
BEGIN OF ty_spfli,
carrid TYPE spfli-carrid,
connid TYPE spfli-connid,
cityfrom TYPE spfli-cityfrom,
airpfrom TYPE spfli-airpfrom,
cityto TYPE spfli-cityto,
airpto TYPE spfli-airpto,
deptime TYPE spfli-deptime,
arrtime TYPE spfli-arrtime,
distance TYPE spfli-distance,
END OF ty_spfli,
*------Flight internal structure---------------------------------------*
BEGIN OF ty_sflight,
carrid TYPE sflight-carrid,
connid TYPE sflight-connid,
fldate TYPE sflight-fldate,
price TYPE sflight-price,
currency TYPE sflight-currency,
seatsmax TYPE sflight-seatsmax,
seatsocc TYPE sflight-seatsocc,
END OF ty_sflight.
*-----Work area & internal table declaration---------------------------*
DATA: wa_scarr TYPE ty_scarr,
wa_spfli TYPE ty_spfli,
it_spfli TYPE TABLE OF ty_spfli,
wa_sflight TYPE ty_sflight,
it_sflight TYPE TABLE OF ty_sflight.
DATA: ok_code TYPE sy-ucomm, "User command capturing variable
v_carrid TYPE scarr-carrid. "Screen field variable
CONTROLS:
*---------Declaring the tab strip--------------------------------------*
ts_air TYPE TABSTRIP,
*---------Declaring the table controls---------------------------------*
tc_spfli TYPE TABLEVIEW USING SCREEN 9003,
tc_sflight TYPE TABLEVIEW USING SCREEN 9004.
TABLES: scarr, spfli, sflight.
TYPES:
*------Airline internal structure--------------------------------------*
BEGIN OF ty_scarr,
carrid TYPE scarr-carrid,
carrname TYPE scarr-carrname,
currcode TYPE scarr-currcode,
END OF ty_scarr,
*------Flight schedule internal structure------------------------------*
BEGIN OF ty_spfli,
carrid TYPE spfli-carrid,
connid TYPE spfli-connid,
cityfrom TYPE spfli-cityfrom,
airpfrom TYPE spfli-airpfrom,
cityto TYPE spfli-cityto,
airpto TYPE spfli-airpto,
deptime TYPE spfli-deptime,
arrtime TYPE spfli-arrtime,
distance TYPE spfli-distance,
END OF ty_spfli,
*------Flight internal structure---------------------------------------*
BEGIN OF ty_sflight,
carrid TYPE sflight-carrid,
connid TYPE sflight-connid,
fldate TYPE sflight-fldate,
price TYPE sflight-price,
currency TYPE sflight-currency,
seatsmax TYPE sflight-seatsmax,
seatsocc TYPE sflight-seatsocc,
END OF ty_sflight.
*-----Work area & internal table declaration---------------------------*
DATA: wa_scarr TYPE ty_scarr,
wa_spfli TYPE ty_spfli,
it_spfli TYPE TABLE OF ty_spfli,
wa_sflight TYPE ty_sflight,
it_sflight TYPE TABLE OF ty_sflight.
DATA: ok_code TYPE sy-ucomm, "User command capturing variable
v_carrid TYPE scarr-carrid. "Screen field variable
CONTROLS:
*---------Declaring the tab strip--------------------------------------*
ts_air TYPE TABSTRIP,
*---------Declaring the table controls---------------------------------*
tc_spfli TYPE TABLEVIEW USING SCREEN 9003,
tc_sflight TYPE TABLEVIEW USING SCREEN 9004.
Step – 3:
Now we are creating the main screen 9001. We shall have one single main screen which contains the tab strip. Several other tabs will contain several other sub screens.
PROCESS BEFORE OUTPUT.
*--------Calling the module for GUI status of PBO----------------------*
MODULE status_9001.
*------Calling the sub screens which contains the table control--------*
CALL SUBSCREEN sub1 INCLUDING sy-repid '9002'.
CALL SUBSCREEN sub2 INCLUDING sy-repid '9003'.
CALL SUBSCREEN sub3 INCLUDING sy-repid '9004'.
PROCESS AFTER INPUT.*------Calling the sub screens which contains the table control--------*
CALL SUBSCREEN sub1.
CALL SUBSCREEN sub2.
CALL SUBSCREEN sub3.
*--------Calling the module to capture the sy-ucomm--------------------*
MODULE user_command_9001.
*--------Calling the module for GUI status of PBO----------------------*
MODULE status_9001.
*------Calling the sub screens which contains the table control--------*
CALL SUBSCREEN sub1 INCLUDING sy-repid '9002'.
CALL SUBSCREEN sub2 INCLUDING sy-repid '9003'.
CALL SUBSCREEN sub3 INCLUDING sy-repid '9004'.
PROCESS AFTER INPUT.*------Calling the sub screens which contains the table control--------*
CALL SUBSCREEN sub1.
CALL SUBSCREEN sub2.
CALL SUBSCREEN sub3.
*--------Calling the module to capture the sy-ucomm--------------------*
MODULE user_command_9001.
Here we have call other sub screens which belong to different tabs. The sub screens are 9002, 9003 & 9004.
Step – 4:
Now we are creating the GUI status for the main screen.
MODULE status_9001 OUTPUT.
SET PF-STATUS 'PF_MAIN_9001'. "GUI status
SET TITLEBAR 'TI_MAIN_9001'. "GUI title
ENDMODULE. " status_9001 OUTPUT
SET PF-STATUS 'PF_MAIN_9001'. "GUI status
SET TITLEBAR 'TI_MAIN_9001'. "GUI title
ENDMODULE. " status_9001 OUTPUT
Step – 5:
After that we have to create the user command functionality (push button) in PAI.
MODULE user_command_9001 INPUT.
CASE ok_code.
WHEN 'TAB1'. "TAB1 tab title works like a push button
ts_air-activetab = 'TAB1'.
WHEN 'TAB2'. "TAB2 tab title works like a push button
ts_air-activetab = 'TAB2'.
WHEN 'TAB3'. "TAB3 tab title works like a push button
ts_air-activetab = 'TAB3'.
WHEN 'DISP'. "Display push button
PERFORM get_airline.
PERFORM get_flight_schedule.
PERFORM get_flight.
WHEN 'CLR'. "Clear push button
PERFORM clear_program.
WHEN 'BACK' OR 'EXIT' OR 'CANCEL'. "GUI buttons
LEAVE PROGRAM.
ENDCASE.
ENDMODULE. " user_command_9001 INPUT
CASE ok_code.
WHEN 'TAB1'. "TAB1 tab title works like a push button
ts_air-activetab = 'TAB1'.
WHEN 'TAB2'. "TAB2 tab title works like a push button
ts_air-activetab = 'TAB2'.
WHEN 'TAB3'. "TAB3 tab title works like a push button
ts_air-activetab = 'TAB3'.
WHEN 'DISP'. "Display push button
PERFORM get_airline.
PERFORM get_flight_schedule.
PERFORM get_flight.
WHEN 'CLR'. "Clear push button
PERFORM clear_program.
WHEN 'BACK' OR 'EXIT' OR 'CANCEL'. "GUI buttons
LEAVE PROGRAM.
ENDCASE.
ENDMODULE. " user_command_9001 INPUT
Since tab titles work as push buttons we have activated the tab strip with the tab name. Now for display command we have created three sub routines to fetch data from database tables.
Step – 6:
Now we are fetching data from database tables by using the sub routines.
*&---------------------------------------------------------------------*
*& Form get_airline
*&---------------------------------------------------------------------*
* Get data from Airline
*----------------------------------------------------------------------*
FORM get_airline .
IF scarr-carrid IS NOT INITIAL.
SELECT SINGLE carrid carrname currcode
FROM scarr INTO wa_scarr
WHERE carrid = scarr-carrid.
IF sy-subrc = 0.
"To avoid the selection screen field and display field
"we are using different name for carrid
v_carrid = wa_scarr-carrid.
scarr-carrname = wa_scarr-carrname.
scarr-currcode = wa_scarr-currcode.
CLEAR wa_scarr.
ENDIF.
ELSE.
MESSAGE 'Please enter a valid Airline code' TYPE 'I'.
ENDIF.
ENDFORM. " get_airline
*&---------------------------------------------------------------------*
*& Form get_flight_schedule
*&---------------------------------------------------------------------*
* Get data from Flight schedule table
*----------------------------------------------------------------------*
FORM get_flight_schedule .
IF scarr-carrid IS NOT INITIAL.
SELECT carrid connid cityfrom airpfrom
cityto airpto deptime arrtime distance
FROM spfli INTO TABLE it_spfli
WHERE carrid = scarr-carrid.
ENDIF.
ENDFORM. " get_flight_schedule
*&---------------------------------------------------------------------*
*& Form get_flight
*&---------------------------------------------------------------------*
* Get data from Flight table
*----------------------------------------------------------------------*
FORM get_flight .
IF scarr-carrid IS NOT INITIAL.
SELECT carrid connid fldate price
currency seatsmax seatsocc
FROM sflight INTO TABLE it_sflight
WHERE carrid = scarr-carrid.
ENDIF.
ENDFORM. " get_flight
*& Form get_airline
*&---------------------------------------------------------------------*
* Get data from Airline
*----------------------------------------------------------------------*
FORM get_airline .
IF scarr-carrid IS NOT INITIAL.
SELECT SINGLE carrid carrname currcode
FROM scarr INTO wa_scarr
WHERE carrid = scarr-carrid.
IF sy-subrc = 0.
"To avoid the selection screen field and display field
"we are using different name for carrid
v_carrid = wa_scarr-carrid.
scarr-carrname = wa_scarr-carrname.
scarr-currcode = wa_scarr-currcode.
CLEAR wa_scarr.
ENDIF.
ELSE.
MESSAGE 'Please enter a valid Airline code' TYPE 'I'.
ENDIF.
ENDFORM. " get_airline
*&---------------------------------------------------------------------*
*& Form get_flight_schedule
*&---------------------------------------------------------------------*
* Get data from Flight schedule table
*----------------------------------------------------------------------*
FORM get_flight_schedule .
IF scarr-carrid IS NOT INITIAL.
SELECT carrid connid cityfrom airpfrom
cityto airpto deptime arrtime distance
FROM spfli INTO TABLE it_spfli
WHERE carrid = scarr-carrid.
ENDIF.
ENDFORM. " get_flight_schedule
*&---------------------------------------------------------------------*
*& Form get_flight
*&---------------------------------------------------------------------*
* Get data from Flight table
*----------------------------------------------------------------------*
FORM get_flight .
IF scarr-carrid IS NOT INITIAL.
SELECT carrid connid fldate price
currency seatsmax seatsocc
FROM sflight INTO TABLE it_sflight
WHERE carrid = scarr-carrid.
ENDIF.
ENDFORM. " get_flight
Since we are selecting one single airline code to fetch details on tab 1 we have selected single record from airline table into work area. Rest of the selection has been done by using the internal tables which will be displayed on the table controls.
Step – 7:
After that we have created the CLEAR button functionality.
*&---------------------------------------------------------------------*
*& Form clear_program
*&---------------------------------------------------------------------*
* Clearing & refreshing all screen fields and tables
*----------------------------------------------------------------------*
FORM clear_program .
CLEAR: scarr, spfli, sflight, v_carrid,
wa_scarr, wa_spfli, wa_sflight.
REFRESH: it_spfli, it_sflight.
ENDFORM. " clear_program
*& Form clear_program
*&---------------------------------------------------------------------*
* Clearing & refreshing all screen fields and tables
*----------------------------------------------------------------------*
FORM clear_program .
CLEAR: scarr, spfli, sflight, v_carrid,
wa_scarr, wa_spfli, wa_sflight.
REFRESH: it_spfli, it_sflight.
ENDFORM. " clear_program
Step – 8:
Since tab1 does not contain any user command functionality we haven’t created any PBO and PAI on that sub screen.
Here at tab2 (9003 sub screen) we are declaring the table control for flight schedule. Hence we have to loop internal table with table control at PBO and PAI.
PROCESS BEFORE OUTPUT.* MODULE STATUS_9003.
*------Applying the table control with the internal table--------------*
LOOP AT it_spfli INTO wa_spfli WITH CONTROL tc_spfli.
"Populating the table control with table data
MODULE display_tc_spfli.
ENDLOOP.
PROCESS AFTER INPUT.
*------Looping the output table for next lines at scrolling------------*
LOOP AT it_spfli.
"Modify the output table with current line
MODULE modify_tc_spfli.
ENDLOOP.
* MODULE USER_COMMAND_9003.
*------Applying the table control with the internal table--------------*
LOOP AT it_spfli INTO wa_spfli WITH CONTROL tc_spfli.
"Populating the table control with table data
MODULE display_tc_spfli.
ENDLOOP.
PROCESS AFTER INPUT.
*------Looping the output table for next lines at scrolling------------*
LOOP AT it_spfli.
"Modify the output table with current line
MODULE modify_tc_spfli.
ENDLOOP.
* MODULE USER_COMMAND_9003.
Here we are not declaring any GUI status and button functionality since we don’t need that.
Step – 9:
Now we are creating the PBO module to populate the records at the table control.
MODULE display_tc_spfli OUTPUT.
*---------To activate the scrolling option of table control------------*
PERFORM current_line_spfli.
*-------Moving data from work area to screen fields--------------------*
spfli-carrid = wa_spfli-carrid.
spfli-connid = wa_spfli-connid.
spfli-cityfrom = wa_spfli-cityfrom.
spfli-airpfrom = wa_spfli-airpfrom.
spfli-cityto = wa_spfli-cityto.
spfli-airpto = wa_spfli-airpto.
spfli-deptime = wa_spfli-deptime.
spfli-arrtime = wa_spfli-arrtime.
spfli-distance = wa_spfli-distance.
ENDMODULE. " display_tc_spfli OUTPUT
*---------To activate the scrolling option of table control------------*
PERFORM current_line_spfli.
*-------Moving data from work area to screen fields--------------------*
spfli-carrid = wa_spfli-carrid.
spfli-connid = wa_spfli-connid.
spfli-cityfrom = wa_spfli-cityfrom.
spfli-airpfrom = wa_spfli-airpfrom.
spfli-cityto = wa_spfli-cityto.
spfli-airpto = wa_spfli-airpto.
spfli-deptime = wa_spfli-deptime.
spfli-arrtime = wa_spfli-arrtime.
spfli-distance = wa_spfli-distance.
ENDMODULE. " display_tc_spfli OUTPUT
Step – 10:
Here we have declared a sub routine to activate the scrolling option in the table control.
*&---------------------------------------------------------------------*
*& Form current_line_spfli
*&---------------------------------------------------------------------*
* Scrolling operation in flight schedule table control
*----------------------------------------------------------------------*
FORM current_line_spfli .
"Describing the internal table to populate the sy-dbcnt
DESCRIBE TABLE it_spfli LINES sy-dbcnt.
"Field current line of table control needs to be populated
"with sy-loopc - loop information in table control
tc_spfli-current_line = sy-loopc.
"Field lines is populated with the number of table lines
"which has been processed yet
tc_spfli-lines = sy-dbcnt.
ENDFORM. " current_line_spfli
*& Form current_line_spfli
*&---------------------------------------------------------------------*
* Scrolling operation in flight schedule table control
*----------------------------------------------------------------------*
FORM current_line_spfli .
"Describing the internal table to populate the sy-dbcnt
DESCRIBE TABLE it_spfli LINES sy-dbcnt.
"Field current line of table control needs to be populated
"with sy-loopc - loop information in table control
tc_spfli-current_line = sy-loopc.
"Field lines is populated with the number of table lines
"which has been processed yet
tc_spfli-lines = sy-dbcnt.
ENDFORM. " current_line_spfli
Step – 11:
Now we have to modify the internal table in table control at PAI. The scrolling function always works at PAI.
MODULE modify_tc_spfli INPUT.
READ TABLE it_spfli INTO wa_spfli
INDEX tc_spfli-current_line.
IF sy-subrc = 0.
MODIFY it_spfli FROM wa_spfli INDEX tc_spfli-current_line.
ENDIF.
ENDMODULE. " modify_tc_spfli INPUT
READ TABLE it_spfli INTO wa_spfli
INDEX tc_spfli-current_line.
IF sy-subrc = 0.
MODIFY it_spfli FROM wa_spfli INDEX tc_spfli-current_line.
ENDIF.
ENDMODULE. " modify_tc_spfli INPUT
Step – 12:
Similarly we are creating another sub screen for another tab. The screen flow logic will be similar as follows.
PROCESS BEFORE OUTPUT.* MODULE STATUS_9004.
*------Applying the table control with the internal table--------------*
LOOP AT it_sflight INTO wa_sflight WITH CONTROL tc_sflight.
"Populating the table control with table data
MODULE display_tc_sflight.
ENDLOOP.
PROCESS AFTER INPUT.
*------Looping the output table for next lines at scrolling------------*
LOOP AT it_sflight.
"Modify the output table with current line
MODULE modify_tc_sflight.
ENDLOOP.
* MODULE USER_COMMAND_9004.
*------Applying the table control with the internal table--------------*
LOOP AT it_sflight INTO wa_sflight WITH CONTROL tc_sflight.
"Populating the table control with table data
MODULE display_tc_sflight.
ENDLOOP.
PROCESS AFTER INPUT.
*------Looping the output table for next lines at scrolling------------*
LOOP AT it_sflight.
"Modify the output table with current line
MODULE modify_tc_sflight.
ENDLOOP.
* MODULE USER_COMMAND_9004.
Step – 13:
Now the PBO module is as following.
MODULE display_tc_sflight OUTPUT.
*---------To activate the scrolling option of table control------------*
PERFORM current_line_sflight.
*-------Moving data from work area to screen fields--------------------*
sflight-carrid = wa_sflight-carrid.
sflight-connid = wa_sflight-connid.
sflight-fldate = wa_sflight-fldate.
sflight-price = wa_sflight-price.
sflight-currency = wa_sflight-currency.
sflight-seatsmax = wa_sflight-seatsmax.
sflight-seatsocc = wa_sflight-seatsocc.
ENDMODULE. " display_tc_sflight OUTPUT
*---------To activate the scrolling option of table control------------*
PERFORM current_line_sflight.
*-------Moving data from work area to screen fields--------------------*
sflight-carrid = wa_sflight-carrid.
sflight-connid = wa_sflight-connid.
sflight-fldate = wa_sflight-fldate.
sflight-price = wa_sflight-price.
sflight-currency = wa_sflight-currency.
sflight-seatsmax = wa_sflight-seatsmax.
sflight-seatsocc = wa_sflight-seatsocc.
ENDMODULE. " display_tc_sflight OUTPUT
Step – 14:
Similarly we are creating the sub routine for scrolling option of table control.
FORM current_line_sflight .
"Describing the internal table to populate the sy-dbcnt
DESCRIBE TABLE it_sflight LINES sy-dbcnt.
"Field current line of table control needs to be populated
"with sy-loopc - loop information in table control
tc_sflight-current_line = sy-loopc.
"Field lines is populated with the number of table lines
"which has been processed yet
tc_sflight-lines = sy-dbcnt.
ENDFORM. " current_line_sflight
"Describing the internal table to populate the sy-dbcnt
DESCRIBE TABLE it_sflight LINES sy-dbcnt.
"Field current line of table control needs to be populated
"with sy-loopc - loop information in table control
tc_sflight-current_line = sy-loopc.
"Field lines is populated with the number of table lines
"which has been processed yet
tc_sflight-lines = sy-dbcnt.
ENDFORM. " current_line_sflight
Step – 15:
Similarly we are modifying the internal table with current line of table control.
MODULE modify_tc_sflight INPUT.
READ TABLE it_sflight INTO wa_sflight
INDEX tc_sflight-current_line.
IF sy-subrc = 0.
MODIFY it_sflight FROM wa_sflight INDEX tc_sflight-current_line.
ENDIF.
ENDMODULE. " modify_tc_sflight INPUT
READ TABLE it_sflight INTO wa_sflight
INDEX tc_sflight-current_line.
IF sy-subrc = 0.
MODIFY it_sflight FROM wa_sflight INDEX tc_sflight-current_line.
ENDIF.
ENDMODULE. " modify_tc_sflight INPUT
Step – 16:
Finally we create a transaction code to run the module pool from the system.
Now we have the output of this.