Wednesday, November 5, 2008

Report Table Joiner

REPORT zjoiner NO STANDARD PAGE HEADING LINE-SIZE 130.
TYPE-POOLS: icon.

DATA: flagpop,
title LIKE sy-title VALUE 'Select the tables you wish to join',
BEGIN OF watab,
tno TYPE i,
parent TYPE i,
tabname TYPE dd02l-tabname,
END OF watab,
jtables LIKE TABLE OF watab,
cur_field(25),
b_sel(18) VALUE 'Select base table',
b_rel(14) VALUE 'Related Tables',
b_del(12) VALUE 'Delete Table',
b_dis(18) VALUE 'Display Conditions' ,
b_fld(16) VALUE 'Select Fields',
b_exe(30) VALUE 'Generate SELECT statement!',
b_cop(30) VALUE 'Copy Query to Clipboard...',
b_hel(36) VALUE 'Click here for detailed instructions',
BEGIN OF wa_joins,
ltab TYPE dd02l-tabname,
rtab TYPE dd02l-tabname,
jtype,
field1 TYPE dd03l-fieldname,
field2 TYPE dd03l-fieldname,
END OF wa_joins,
it_joins LIKE TABLE OF wa_joins,
BEGIN OF wa_av_fields,
tabname TYPE dd02l-tabname,
fieldname TYPE dd03l-fieldname,
alias TYPE dd03l-fieldname,
text TYPE dd04t-scrtext_l,
selected,
pos TYPE i,
END OF wa_av_fields,
it_av_fields LIKE TABLE OF wa_av_fields,
t_done(75) VALUE 'Click the cancel button (F12) when done..',
flagsel,
qtext(72),
qtab LIKE TABLE OF qtext,
not_all.


*Declarations for relationships
TYPES: BEGIN OF ddtab_tabdef,
dd02v LIKE dd02v,
dd03p LIKE dd03p OCCURS 0,
dd05m LIKE dd05m OCCURS 0,
dd08v LIKE dd08v OCCURS 0,
END OF ddtab_tabdef,
ddtab_set TYPE ddtab_tabdef OCCURS 10.
DATA BEGIN OF ddtb.
INCLUDE STRUCTURE dd27p.
DATA: mark(1),
mod(1).
DATA END OF ddtb.
DATA: ddtb_tab LIKE ddtb OCCURS 50 WITH HEADER LINE.
DATA: base_tabs TYPE ddtab_set.
DATA BEGIN OF itab1.
INCLUDE STRUCTURE dd26v.
DATA: mark(1).
DATA END OF itab1.
DATA: tc1_tab LIKE itab1 OCCURS 10 WITH HEADER LINE.
DATA BEGIN OF itab2.
INCLUDE STRUCTURE dd28j.
DATA: mark(1).
DATA END OF itab2.
DATA: tc2_tab LIKE itab2 OCCURS 10 WITH HEADER LINE.
DATA BEGIN OF itab3.
INCLUDE STRUCTURE dd28v.
DATA: mark(1).
DATA END OF itab3.
DATA: tc3_tab LIKE itab3 OCCURS 10 WITH HEADER LINE.
DATA: i TYPE i.
DATA subrc LIKE sy-subrc.
DATA: ddxx LIKE dd25v.

*---------------------------------------------------------------------*
* CLASS lcl_type DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_type DEFINITION.
PUBLIC SECTION.
CLASS-METHODS get_type IMPORTING name TYPE string
RETURNING value(ty) TYPE string.
ENDCLASS. "lcl_type DEFINITION

*---------------------------------------------------------------------*
* CLASS lcl_type IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_type IMPLEMENTATION.
METHOD get_type.
DATA: des TYPE REF TO cl_abap_elemdescr,
df TYPE dfies.
des ?= cl_abap_typedescr=>describe_by_name( name ).
df = des->get_ddic_field( ).
ty = df-datatype.
ENDMETHOD. "get_type
ENDCLASS. "lcl_type IMPLEMENTATION

START-OF-SELECTION.
SET BLANK LINES ON.
sy-title = title.
watab-tno = 1.
APPEND watab TO jtables.

PERFORM list_tabs.



AT LINE-SELECTION.
CASE sy-lsind.
WHEN 1.
GET CURSOR FIELD cur_field.
CASE cur_field.
WHEN 'ICON_SEARCH' OR 'B_SEL'.
PERFORM value_help.
PERFORM list_tabs.
sy-lsind = 0.
WHEN 'ICON_REFERENCE_LIST' OR 'B_REL'.
CLEAR: ddtb, ddtb_tab[], base_tabs[], itab1, tc1_tab[],
itab2, tc2_tab[], itab3, tc3_tab[],
i, subrc, ddxx.
tc1_tab-viewname = 'ZV_DUSTYPLANET'.
tc1_tab-tabname = watab-tabname.
tc1_tab-fortabname = watab-tabname.
tc1_tab-mark = 'X'.
APPEND tc1_tab.
PERFORM v_list_joins.
CLEAR qtab[].
PERFORM list_tabs.
sy-lsind = 0.
WHEN 'ICON_DISPLAY' OR 'B_DIS'.
CHECK watab-tno NE 1.
PERFORM show_relationship.
WHEN 'ICON_DELETE' OR 'B_DEL'.
PERFORM confirm_delete.
CLEAR qtab[].
PERFORM del_table_and_joins USING watab-tno.
PERFORM reorg_tables.
PERFORM list_tabs.
sy-lsind = 0.
WHEN 'ICON_TERMINOLOGY' OR 'B_FLD'.
CLEAR qtab[].
WINDOW STARTING AT 10 10 ENDING AT 120 25.
PERFORM select_fields.
WHEN 'ICON_EXECUTE_OBJECT' OR 'B_EXE'.
PERFORM check_fields.
PERFORM gen_query.
PERFORM list_tabs.
sy-lsind = 0.
WHEN 'ICON_SYSTEM_COPY' OR 'B_COP'.
PERFORM copy_to_clipboard.
WHEN 'ICON_SYSTEM_HELP' OR 'B_HEL'.
PERFORM load_help.
ENDCASE.
WHEN 2.
GET CURSOR FIELD cur_field.
CASE cur_field.
WHEN 'ICON_INSERT_ROW'.
READ TABLE it_av_fields INTO wa_av_fields
WITH KEY tabname = wa_av_fields-tabname
fieldname = wa_av_fields-fieldname.
PERFORM check_alias USING wa_av_fields.
wa_av_fields-selected = 'X'.
MODIFY it_av_fields
FROM wa_av_fields
TRANSPORTING selected alias
WHERE tabname = wa_av_fields-tabname
AND fieldname = wa_av_fields-fieldname.
PERFORM select_fields.

SCROLL LIST INDEX sy-lsind TO PAGE 1 LINE sy-staro.
sy-lsind = 1.
WHEN 'ICON_DELETE_ROW'.
READ TABLE it_av_fields INTO wa_av_fields
WITH KEY tabname = wa_av_fields-tabname
fieldname = wa_av_fields-fieldname.
CLEAR: wa_av_fields-selected,
wa_av_fields-alias.
MODIFY it_av_fields FROM wa_av_fields INDEX sy-tabix.
PERFORM select_fields.

SCROLL LIST INDEX sy-lsind TO PAGE 1 LINE sy-staro.
sy-lsind = 1.
WHEN 'ICON_WORKFLOW_ACTIVITY'.
PERFORM add_all_fields USING wa_av_fields-tabname.
PERFORM select_fields.
SCROLL LIST INDEX sy-lsind TO PAGE 1 LINE sy-staro.
sy-lsind = 1.
ENDCASE.
ENDCASE.

TOP-OF-PAGE.
FORMAT COLOR COL_HEADING INTENSIFIED.
ULINE.
WRITE: sy-vline,
'Select the tables you wish to join',
' by clicking on the appropriate icons...',
icon_system_help AS ICON HOTSPOT,
b_hel COLOR COL_TOTAL INTENSIFIED HOTSPOT,
icon_system_help AS ICON HOTSPOT,
AT sy-linsz sy-vline.
ULINE.

TOP-OF-PAGE DURING LINE-SELECTION.
IF flagpop IS INITIAL AND flagsel EQ 'X'.
ULINE.
WRITE: sy-vline,
'Select the fields you wish to use from the list below',
AT sy-linsz sy-vline.
WRITE: sy-vline,
(53) t_done COLOR COL_TOTAL CENTERED,
AT 31 icon_cancel COLOR COL_TOTAL AS ICON,
AT sy-linsz sy-vline.
ELSEIF cur_field EQ 'B_DIS' OR cur_field EQ 'ICON_DISPLAY'.
FORMAT COLOR COL_HEADING INTENSIFIED.
ULINE.
WRITE: sy-vline,
'Join conditions',
AT sy-linsz sy-vline.
ULINE.
CLEAR cur_field.
ELSE.
FORMAT COLOR COL_HEADING INTENSIFIED.
ULINE.
WRITE: sy-vline,
'Select the tables you wish to join',
' by clicking on the appropriate icons...',
icon_system_help AS ICON HOTSPOT,
b_hel COLOR COL_TOTAL INTENSIFIED HOTSPOT,
icon_system_help AS ICON HOTSPOT,

AT sy-linsz sy-vline.
ULINE.
ENDIF.

*&--------------------------------------------------------------------*
*& Form value_help
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM value_help.
DATA: old_tab TYPE dd02l-tabname,
result VALUE '1', text(150).
old_tab = watab-tabname.
IF LINES( jtables ) > 1.
CONCATENATE 'All tables and joins will be deleted...'
'Are you sure you want to select a new base table?'
INTO text SEPARATED BY space.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
titlebar = 'Warning...'
text_question = text
display_cancel_button = space
IMPORTING
answer = result.
ENDIF.
IF result = '1'.
CALL FUNCTION 'F4_DD_TABLES'
EXPORTING
object = watab-tabname
suppress_selection = 'X'
IMPORTING
RESULT = watab-tabname.
IF watab-tabname NE old_tab.
CLEAR: jtables[], it_joins[], it_av_fields[].
watab-tno = 1.
APPEND watab TO jtables.
PERFORM get_fields USING watab-tabname.
ELSE.
MESSAGE 'Base table not changed...' TYPE 'S'.
ENDIF.
ENDIF.

ENDFORM. "value_help
*&--------------------------------------------------------------------*
*& Form list_tabs
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM list_tabs.
LOOP AT jtables INTO watab.
NEW-LINE.
WRITE: sy-vline,
(2) watab-tno,
sy-vline,
watab-tabname COLOR COL_NORMAL,
sy-vline,
60 sy-vline,
icon_reference_list AS ICON HOTSPOT,
b_rel COLOR COL_TOTAL INTENSIFIED HOTSPOT,
sy-vline,
icon_display AS ICON HOTSPOT,
b_dis COLOR COL_GROUP INTENSIFIED HOTSPOT,
sy-vline,
icon_delete AS ICON HOTSPOT,
b_del COLOR COL_NEGATIVE HOTSPOT,
AT sy-linsz sy-vline.
IF sy-tabix = 1.
WRITE: 40 b_sel COLOR COL_KEY HOTSPOT.
WRITE: 58 icon_search AS ICON HOTSPOT.
WRITE: 82(22) space.
IF watab-tabname IS INITIAL.
WRITE: 61(19) space.
WRITE: 105(20) space.
ENDIF.
ENDIF.
HIDE: watab-tabname, watab-tno, watab-parent.
CLEAR watab.

ENDLOOP.
ULINE.
READ TABLE jtables INTO watab INDEX 1.
IF watab-tabname IS NOT INITIAL.
WRITE:sy-vline,
icon_terminology AS ICON HOTSPOT,
b_fld COLOR COL_KEY INTENSIFIED HOTSPOT,
AT sy-linsz sy-vline.
ULINE.
WRITE:sy-vline,
icon_execute_object AS ICON HOTSPOT,
b_exe COLOR COL_KEY INTENSIFIED HOTSPOT,
AT sy-linsz sy-vline.
ULINE.
IF qtab IS NOT INITIAL.
FORMAT COLOR COL_TOTAL INTENSIFIED.
ULINE.
WRITE:sy-vline,
(128) 'SELECT statement generated successfully!' CENTERED,
AT sy-linsz sy-vline.
ULINE.
WRITE:sy-vline,
50 icon_system_copy AS ICON HOTSPOT,
b_cop HOTSPOT,
AT sy-linsz sy-vline.
ULINE.

FORMAT COLOR COL_TOTAL INTENSIFIED OFF.
LOOP AT qtab INTO qtext.
WRITE:sy-vline,
qtext,
AT sy-linsz sy-vline.
ENDLOOP.
ULINE.
FORMAT RESET.
ENDIF.
ENDIF.
CLEAR watab.
ENDFORM. "list_tabs


*&--------------------------------------------------------------------*
*& Form v_list_joins
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM v_list_joins.
DATA: dd05m_out LIKE dd05m OCCURS 20 WITH HEADER LINE,
dd08v_out LIKE dd08v OCCURS 10 WITH HEADER LINE,
dd08v_ok LIKE dd08v OCCURS 10,
dd08v_no LIKE dd08v OCCURS 10,
dd08v_tab LIKE dd08v OCCURS 10 WITH HEADER LINE,
basetabnames LIKE dd26v OCCURS 10 WITH HEADER LINE.
DATA: BEGIN OF tab_joins OCCURS 10.
INCLUDE STRUCTURE dd05m.
DATA: mark(1),
sele(1),
nofs(1),
END OF tab_joins.
PERFORM get_basetab_info(radvimnt)
TABLES tc1_tab
base_tabs
USING 0 ddxx
CHANGING subrc.

CLEAR basetabnames[].
LOOP AT tc1_tab INTO basetabnames
WHERE mark = 'X'.
APPEND basetabnames.
ENDLOOP.
ddxx-viewclass = 'D'.
PERFORM get_all_frks(radvimnt)
TABLES base_tabs
basetabnames
dd08v_out
dd05m_out
USING ddxx space.

DESCRIBE TABLE dd08v_out LINES i.
IF i = 0.
READ TABLE basetabnames INDEX 1
TRANSPORTING tabname.
IF sy-tfill = 1.
MESSAGE s315(e2) WITH basetabnames-tabname.
ELSE.
MESSAGE s306(e2).
ENDIF.
ELSE.
dd08v_ok[] = dd08v_out[].
CLEAR dd08v_no[].
PERFORM v_list_fk_head
TABLES basetabnames
dd08v_ok
dd08v_no
dd05m_out.

ENDIF.
ENDFORM. "v_list_joins

*&--------------------------------------------------------------------*
*& Form v_list_fk_head
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
* -->BASETABNAMEtext
* -->DD08V_OK text
* -->DD08V_NO text
* -->DD05M_OUT text
*---------------------------------------------------------------------*
FORM v_list_fk_head
TABLES basetabnames STRUCTURE dd26v
dd08v_ok
dd08v_no
dd05m_out.
DATA: tabnams LIKE dd02l-tabname OCCURS 10 WITH HEADER LINE,
dd08v_tab LIKE dd08v OCCURS 10 WITH HEADER LINE.
DATA: BEGIN OF tab_joins OCCURS 10.
INCLUDE STRUCTURE dd08v.
DATA: mark(1),
sele(1),
END OF tab_joins,
ltab TYPE dd02l-tabname,
old_tno TYPE i,
wa_check LIKE watab,
dup_tables LIKE RANGE OF watab-tabname,
wa_dup LIKE LINE OF dup_tables.

LOOP AT basetabnames.
tabnams = basetabnames-tabname.
APPEND tabnams.
ENDLOOP.
tab_joins[] = dd08v_ok[].



CALL FUNCTION 'DD_LIST_TAB_RELATIONS'
EXPORTING
viewclass = ddxx-viewclass
TABLES
tab_names = tabnams
dd08v_ok = tab_joins
dd08v_no = dd08v_no
dd05m_tab = dd05m_out
EXCEPTIONS
not_executed = 1
OTHERS = 2.
IF sy-subrc = 0.
CLEAR: dd08v_tab[].
LOOP AT tab_joins
WHERE mark = 'X'
AND sele = ' '.
dd08v_tab = tab_joins.
APPEND dd08v_tab.
ENDLOOP.
IF sy-subrc = 0.

PERFORM add_join_from_frk(radvimnt)
TABLES base_tabs
tc1_tab "dd26v_tab
tc2_tab "dd28j_tab
tc3_tab "dd28v_rest
dd08v_tab "dd08v_tab
USING ddxx
CHANGING subrc.
IF subrc = 4.
MESSAGE s325(e2).
ELSE.
ltab = watab-tabname.
old_tno = watab-tno.
LOOP AT tc1_tab.
IF sy-tabix NE 1.
READ TABLE jtables INTO wa_check
WITH KEY tabname = tc1_tab-tabname TRANSPORTING tabname.
IF sy-subrc NE 0.
watab-parent = old_tno.
ADD 1 TO watab-tno.
watab-tabname = tc1_tab-tabname.
APPEND watab TO jtables.
PERFORM get_fields USING watab-tabname.
ELSEIF sy-subrc = 0.
wa_dup-sign = 'I'.
wa_dup-option = 'EQ'.
wa_dup-low = wa_check-tabname.
APPEND wa_dup TO dup_tables.
ENDIF.
ENDIF.
ENDLOOP.
LOOP AT tc2_tab.
CHECK dup_tables IS INITIAL OR
( tc2_tab-ltab NOT IN dup_tables AND
tc2_tab-ltab NOT IN dup_tables ).
wa_joins-ltab = tc2_tab-ltab.
wa_joins-rtab = tc2_tab-rtab.
wa_joins-field1 = tc2_tab-lfield.
wa_joins-field2 = tc2_tab-rfield.
APPEND wa_joins TO it_joins.
ENDLOOP.
PERFORM reorg_tables.
ENDIF.
ENDIF.
ENDIF.
ENDFORM. "v_list_fk_h

*&--------------------------------------------------------------------*
*& Form tab_dupl
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM tab_dupl.
DATA: checktab LIKE jtables,
wa_check LIKE LINE OF checktab,
wa_old LIKE wa_check,
text(50).
checktab = jtables.
SORT checktab BY tabname.
LOOP AT checktab INTO wa_check.
IF wa_check-tabname IS NOT INITIAL
AND wa_check-tabname = wa_old-tabname.
CONCATENATE 'Table ' wa_old-tabname ' has already been added'
INTO text SEPARATED BY space.
MESSAGE text TYPE 'E'.
ENDIF.
wa_old = wa_check.
ENDLOOP.
ENDFORM. "tab_dupl


*&--------------------------------------------------------------------*
*& Form show_relationship
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM show_relationship.
DATA: text(73),
wapre LIKE watab.
flagpop = 'X'.
FORMAT COLOR COL_GROUP INTENSIFIED.
NEW-PAGE.
READ TABLE jtables INTO wapre WITH KEY tno = watab-parent.
WINDOW STARTING AT 10 10 ENDING AT 100 15.

LOOP AT it_joins INTO wa_joins
WHERE
( rtab = watab-tabname AND ltab = wapre-tabname )
OR ( ltab = watab-tabname AND rtab = wapre-tabname ).
ULINE (75).
CONCATENATE wa_joins-ltab '-'
wa_joins-field1
` = `
wa_joins-rtab '-'
wa_joins-field1 INTO text.
CONDENSE text.

WRITE:/ sy-vline,
text,
AT 75 sy-vline.
ENDLOOP.
ULINE (75).
CLEAR flagpop.
ENDFORM. "show_relationship
*&--------------------------------------------------------------------*
*& Form del_table_and_joins
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
* -->P_TNO text
*---------------------------------------------------------------------*
FORM del_table_and_joins USING p_tno TYPE i.
DATA: wapre LIKE watab,
wacurr LIKE watab,
wachild LIKE watab.
READ TABLE jtables INTO wacurr WITH KEY tno = p_tno.
READ TABLE jtables INTO wapre WITH KEY tno = wacurr-parent.
LOOP AT it_joins INTO wa_joins
WHERE
( rtab = wacurr-tabname AND ltab = wapre-tabname )
OR ( ltab = wacurr-tabname AND rtab = wapre-tabname ).
DELETE TABLE it_joins FROM wa_joins.
ENDLOOP.
LOOP AT jtables INTO wachild WHERE parent = wacurr-tno.
PERFORM del_table_and_joins USING wachild-tno.
ENDLOOP.
DELETE it_av_fields WHERE tabname = wacurr-tabname.
DELETE TABLE jtables FROM wacurr.
ENDFORM. "del_table_and_joins

*&--------------------------------------------------------------------*
*& Form reorg_tables
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM reorg_tables.
DATA: wa_curr LIKE LINE OF jtables.
IF jtables IS INITIAL.
wa_curr-tno = 1.
APPEND wa_curr TO jtables.
ELSE.
LOOP AT jtables INTO wa_curr.
wa_curr-tno = sy-tabix.
MODIFY TABLE jtables FROM wa_curr.
ENDLOOP.
ENDIF.
ENDFORM. "reorg_tables

*&--------------------------------------------------------------------*
*& Form confirm_delete
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM confirm_delete.
DATA: text(150),result, wa_curr LIKE LINE OF jtables.
READ TABLE jtables INTO wa_curr INDEX 1.
IF wa_curr-tabname IS INITIAL.
MESSAGE 'Nothing to delete...' TYPE 'E'.
ELSE.
CONCATENATE 'Do you wish to delete the table' watab-tabname
', its dependent tables and their join conditions?'
INTO text SEPARATED BY space.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
titlebar = 'Warning...'
text_question = text
display_cancel_button = space
IMPORTING
answer = result.
IF result = '2'.
MESSAGE 'Delete action cancelled by user...' TYPE 'E'.
ENDIF.
ENDIF.
ENDFORM. "confirm_delete

*&--------------------------------------------------------------------*
*& Form get_fields
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
* -->PTABNAME text
*---------------------------------------------------------------------*
FORM get_fields USING ptabname TYPE dd02l-tabname.
DATA: BEGIN OF wa_field,
pos TYPE dd03l-position,
fieldname TYPE dd03l-fieldname,
text TYPE dd04t-scrtext_l,
END OF wa_field,
it_fields LIKE TABLE OF wa_field.

SELECT dd03l~position dd03l~fieldname dd04t~scrtext_l
INTO TABLE it_fields
FROM dd03l INNER JOIN dd04t
ON dd03l~rollname = dd04t~rollname
WHERE dd03l~tabname = ptabname
AND dd04t~ddlanguage = sy-langu
AND dd03l~datatype NE 'CLNT'
ORDER BY dd03l~position.
wa_av_fields-tabname = ptabname.
LOOP AT it_fields INTO wa_field.

MOVE-CORRESPONDING wa_field TO wa_av_fields.
APPEND wa_av_fields TO it_av_fields.
ENDLOOP.
ENDFORM. "get_fields

*&--------------------------------------------------------------------*
*& Form SELECT_FIELDS
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM select_fields.
flagsel = 'X'.
ULINE.
WRITE: sy-vline,
(30) 'Available Fields' CENTERED,
(2) space,
sy-vline,
(25) 'Description' CENTERED,
sy-vline,
(2) space,
(30) 'Selected Fields' CENTERED,
sy-vline,
(14) 'Alias' CENTERED,
AT sy-linsz sy-vline.
FORMAT COLOR COL_TOTAL.
LOOP AT it_av_fields INTO wa_av_fields.
AT NEW tabname.
FORMAT COLOR COL_GROUP INTENSIFIED.
ULINE.
WRITE: sy-vline,
(60) wa_av_fields-tabname,
34 icon_workflow_activity AS ICON HOTSPOT
QUICKINFO 'Select All',
AT sy-linsz sy-vline.
HIDE wa_av_fields-tabname.
ULINE.
FORMAT COLOR COL_TOTAL.
ENDAT.
IF wa_av_fields-selected IS INITIAL.
WRITE: sy-vline,
(30) wa_av_fields-fieldname,
icon_insert_row AS ICON HOTSPOT,
sy-vline,
(25) wa_av_fields-text,
sy-vline,
(2) space,
(30) space COLOR COL_KEY,
sy-vline,
(14) wa_av_fields-alias ,

AT sy-linsz sy-vline.
ELSEIF wa_av_fields-alias IS INITIAL.
WRITE: sy-vline,
(30) space,
(2) space,
sy-vline,
(25) wa_av_fields-text,
sy-vline,
icon_delete_row AS ICON HOTSPOT,
(30) wa_av_fields-fieldname COLOR COL_KEY,
sy-vline,
(14) space,
AT sy-linsz sy-vline.
ELSE.
WRITE: sy-vline,
(30) space,
(2) space,
sy-vline,
(25) wa_av_fields-text,
sy-vline,
icon_delete_row AS ICON HOTSPOT,
(30) wa_av_fields-fieldname COLOR COL_TOTAL INTENSIFIED,
sy-vline,
(14) wa_av_fields-alias COLOR COL_KEY,
AT sy-linsz sy-vline.
ENDIF.
HIDE: wa_av_fields-tabname,
wa_av_fields-fieldname.

ENDLOOP.
ULINE.
CLEAR: flagsel, wa_av_fields.
ENDFORM. "SELECT_FIELDS

*&--------------------------------------------------------------------*
*& Form CHECK_ALIAS
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
* -->P_WA text
*---------------------------------------------------------------------*
FORM check_alias CHANGING p_wa LIKE wa_av_fields.
DATA: wa_check LIKE p_wa,
text1(50), text2(50), text3(30), result, subrc LIKE sy-subrc.
READ TABLE it_av_fields INTO wa_check
WITH KEY fieldname = p_wa-fieldname
alias = space
selected = 'X'.
IF sy-subrc = 0.
CONCATENATE wa_check-tabname '-' p_wa-fieldname
INTO text1.
text2 = 'already exists. Please enter an'.
text3 = 'alias for this field...'.

CALL FUNCTION 'POPUP_TO_GET_ONE_VALUE'
EXPORTING
textline1 = text1
textline2 = text2
textline3 = text3
titel = 'Alias needed !'
valuelength = 14
IMPORTING
answer = result
value1 = p_wa-alias.
IF result = 'A'.
MESSAGE 'Alias must be specified...' TYPE 'E' DISPLAY LIKE 'I'.
ELSE.
READ TABLE it_av_fields INTO wa_check
WITH KEY alias = p_wa-alias
selected = 'X'.
READ TABLE it_av_fields INTO wa_check
WITH KEY fieldname = p_wa-alias
selected = 'X'.

IF sy-subrc EQ 0 OR subrc EQ 0.
DO.
CLEAR p_wa-alias.
CALL FUNCTION 'POPUP_TO_GET_ONE_VALUE'
EXPORTING
textline1 = 'The alias you specified'
textline2 = 'already exists!'
textline3 = 'Please enter a new alias...'
titel = 'Alias needed !'
valuelength = 14
IMPORTING
answer = result
value1 = p_wa-alias.
IF result = 'A'.
MESSAGE 'Alias must be specified...' TYPE 'E' DISPLAY LIKE 'I'.
ELSE.
READ TABLE it_av_fields INTO wa_check
WITH KEY alias = p_wa-alias
selected = 'X'.
IF sy-subrc NE 0.
READ TABLE it_av_fields INTO wa_check
WITH KEY fieldname = p_wa-alias
selected = 'X'.
IF sy-subrc NE 0.
EXIT.
ENDIF.
ENDIF.
ENDIF.
ENDDO.
ENDIF.
ENDIF.
ENDIF.
ENDFORM. "CHECK_A

*&--------------------------------------------------------------------*
*& Form gen_query
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM gen_query.
DATA:fname TYPE string, it_av LIKE it_av_fields.
CLEAR qtab[].
it_av = it_av_fields.
DELETE it_av WHERE selected = space.
IF LINES( jtables ) EQ 1 AND it_joins IS INITIAL.
APPEND 'SELECT' TO qtab.
LOOP AT it_av INTO wa_av_fields.
AT NEW tabname.
CONCATENATE '****Fields from'
wa_av_fields-tabname
INTO qtext SEPARATED BY space.
APPEND qtext TO qtab.
ENDAT.
CONCATENATE ` ` wa_av_fields-fieldname INTO qtext.
APPEND qtext TO qtab.
ENDLOOP.
APPEND '****Target' TO qtab.
APPEND 'INTO [target] "replace with data object(s)'
TO qtab.
CONCATENATE 'FROM' wa_av_fields-tabname
INTO qtext SEPARATED BY space.
APPEND qtext TO qtab.
ELSE.
APPEND 'SELECT' TO qtab.
LOOP AT it_av INTO wa_av_fields.
AT NEW tabname.
CONCATENATE '****Fields from'
wa_av_fields-tabname
INTO qtext SEPARATED BY space.
APPEND qtext TO qtab.
ENDAT.
CONCATENATE ` ` wa_av_fields-tabname
'~'
wa_av_fields-fieldname
INTO qtext.
IF wa_av_fields-alias IS NOT INITIAL.
CONCATENATE qtext 'AS' wa_av_fields-alias
INTO qtext SEPARATED BY space.
ENDIF.
APPEND qtext TO qtab.
ENDLOOP.
APPEND '****Target' TO qtab.
APPEND 'INTO [target] "replace with data object(s)'
TO qtab.
APPEND '****Inner joins' TO qtab.
APPEND 'FROM' TO qtab.
LOOP AT it_joins INTO wa_joins.
AT NEW ltab.
IF sy-tabix = 1.
APPEND wa_joins-ltab TO qtab.
ENDIF.
ENDAT.
AT NEW rtab.
CONCATENATE 'INNER JOIN' wa_joins-rtab 'ON'
INTO qtext SEPARATED BY space.
APPEND qtext TO qtab.

ENDAT.
IF qtext(5) NE 'INNER'.
CONCATENATE ` ` 'AND' INTO qtext.
APPEND qtext TO qtab.
ELSE.
CONCATENATE wa_joins-rtab '-' wa_joins-field2 INTO fname.
IF lcl_type=>get_type( fname ) = 'CLNT'.
CONTINUE.
ENDIF.
ENDIF.
CONCATENATE ` ` wa_joins-ltab '~' wa_joins-field1 ` = `
wa_joins-rtab '~' wa_joins-field2
INTO qtext.

APPEND qtext TO qtab.
ENDLOOP.
ENDIF.
ENDFORM. "gen_query

*&--------------------------------------------------------------------*
*& Form check_fields
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM check_fields.
READ TABLE it_av_fields INTO wa_av_fields
WITH KEY selected = 'X'
TRANSPORTING NO FIELDS.
IF sy-subrc NE 0.
MESSAGE 'Select at least one field...'
TYPE 'E' DISPLAY LIKE 'I'.
ENDIF.

ENDFORM. "check_fields

*&--------------------------------------------------------------------*
*& Form add_all_fields
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
* -->TNAME text
*---------------------------------------------------------------------*
FORM add_all_fields USING tname LIKE wa_av_fields-tabname.
DATA wa_fields LIKE wa_av_fields.
DATA: wa_check LIKE wa_fields,
text1(50), text2(50), text3(30), result, subrc LIKE sy-subrc.
LOOP AT it_av_fields INTO wa_fields WHERE tabname = tname
AND selected IS INITIAL.
READ TABLE it_av_fields INTO wa_check
WITH KEY fieldname = wa_fields-fieldname
alias = space
selected = 'X'.
IF sy-subrc = 0.
CONCATENATE wa_fields-fieldname 'already exists.'
INTO text1 SEPARATED BY space.
text2 = 'Enter an alias. It can consist of'.
text3 = 'only alphabets and digits...'.

CALL FUNCTION 'POPUP_TO_GET_ONE_VALUE'
EXPORTING
textline1 = text1
textline2 = text2
textline3 = text3
titel = 'Alias needed !'
valuelength = 14
IMPORTING
answer = result
value1 = wa_fields-alias.
IF result = 'A'.
MESSAGE 'Alias must be specified...' TYPE 'I'.
CONTINUE.
ELSE.
READ TABLE it_av_fields INTO wa_check
WITH KEY alias = wa_fields-alias
selected = 'X'.
subrc = sy-subrc.
READ TABLE it_av_fields INTO wa_check
WITH KEY fieldname = wa_fields-alias
selected = 'X'.

IF sy-subrc EQ 0 OR subrc EQ 0.
DO.
CLEAR wa_fields-alias.
CALL FUNCTION 'POPUP_TO_GET_ONE_VALUE'
EXPORTING
textline1 = 'The alias you specified'
textline2 = 'already exists!'
textline3 = 'Please enter a new alias...'
titel = 'Alias needed !'
valuelength = 14
IMPORTING
answer = result
value1 = wa_fields-alias.
IF result = 'A'.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
titlebar = 'Cancel Action?'
text_question = 'Stop adding fields?'
text_button_1 = 'Yes'
text_button_2 = 'No'
IMPORTING
answer = result.
IF result = 1.
EXIT.
ELSE.
CONTINUE.
ENDIF.
ELSE.
READ TABLE it_av_fields INTO wa_check
WITH KEY alias = wa_fields-alias
selected = 'X'.
IF sy-subrc NE 0.
READ TABLE it_av_fields INTO wa_check
WITH KEY fieldname = wa_fields-alias
selected = 'X'.
IF sy-subrc NE 0.
EXIT.
ENDIF.
ENDIF.
ENDIF.
ENDDO.
IF result = '1'.
CLEAR result.
EXIT.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
wa_fields-selected = 'X'.
MODIFY it_av_fields
FROM wa_fields
TRANSPORTING selected alias
WHERE tabname = wa_fields-tabname
AND fieldname = wa_fields-fieldname.
ENDLOOP.

ENDFORM. "add_all_fi


*&--------------------------------------------------------------------*
*& Form copy_to_clipboard
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM copy_to_clipboard.
DATA: rc TYPE i.
CALL METHOD cl_gui_frontend_services=>clipboard_export
IMPORTING
data = qtab
CHANGING
rc = rc.
MESSAGE 'Query copied to clipboard!' TYPE 'I'.
ENDFORM. "copy_to_clipboard

FORM LOAD_HELP.
CALL FUNCTION 'WS_EXECUTE'
EXPORTING
PROGRAM = 'https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/7136'
EXCEPTIONS OTHERS = 0.

ENDFORM.

Tuesday, November 4, 2008

FM for Application Log

FUNCTION zlog.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(FI_OBJECT) TYPE BALOBJ_D DEFAULT '/BA1/B0'
*" REFERENCE(FI_SUBOBJECT) TYPE BALSUBOBJ DEFAULT 'DEFAULT'
*" TABLES
*" FT_MESSAGES TYPE BAPIRET2_T
*"----------------------------------------------------------------------
FIELD-SYMBOLS:
TYPE bapiret2.

DATA:
lv_message(300) TYPE c,
ls_log TYPE bal_s_log,
lv_loghandle TYPE balloghndl,
lt_loghandle TYPE bal_t_logh.

* open log
ls_log-object = fi_object.
ls_log-subobject = fi_subobject.
ls_log-aluser = sy-uname.
ls_log-alprog = sy-repid.

CALL FUNCTION 'BAL_LOG_CREATE' "#EC *
EXPORTING
i_s_log = ls_log
IMPORTING
e_log_handle = lv_loghandle
EXCEPTIONS
OTHERS = 1.

LOOP AT ft_messages ASSIGNING .
lv_message = -message.
IF NOT -message_v1 IS INITIAL. REPLACE FIRST OCCURRENCE OF '&' IN lv_message WITH -message_v1. ENDIF.
IF NOT -message_v2 IS INITIAL. REPLACE FIRST OCCURRENCE OF '&' IN lv_message WITH -message_v2. ENDIF.
IF NOT -message_v3 IS INITIAL. REPLACE FIRST OCCURRENCE OF '&' IN lv_message WITH -message_v3. ENDIF.
IF NOT -message_v4 IS INITIAL. REPLACE FIRST OCCURRENCE OF '&' IN lv_message WITH -message_v4. ENDIF.

CALL FUNCTION 'BAL_LOG_MSG_ADD_FREE_TEXT' "#EC *
EXPORTING
i_log_handle = lv_loghandle
i_msgty = -type
i_text = lv_message
EXCEPTIONS
log_not_found = 1
msg_inconsistent = 2
log_is_full = 3
OTHERS = 4.
ENDLOOP.

INSERT lv_loghandle INTO TABLE lt_loghandle.

CALL FUNCTION 'BAL_DB_SAVE' "#EC *
EXPORTING
i_save_all = ' '
i_t_log_handle = lt_loghandle
EXCEPTIONS
log_not_found = 1
save_not_allowed = 2
numbering_error = 3
OTHERS = 4.

ENDFUNCTION.

Thursday, October 30, 2008

Report Complete ALV Grid functions

REPORT zalv.
*----------------------------------------------------------------------*
* CLASS lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION .
METHODS:
*--Double-click control
handle_double_click
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column,
*--Context-Menu
handle_context_menu_request
FOR EVENT context_menu_request OF cl_gui_alv_grid
IMPORTING e_object,
*-- User Command
handle_user_command
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm,
*-- After user command
handle_after_user_command
FOR EVENT after_user_command OF cl_gui_alv_grid
IMPORTING e_ucomm e_saved e_not_processed,
*-- Toolbar
handle_toolbar
FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object e_interactive,
*-- Menu button
handle_menu_button
FOR EVENT menu_button OF cl_gui_alv_grid
IMPORTING e_object e_ucomm,
*-- Data Change
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed,
*-- F1 Help
handle_onf1
FOR EVENT onf1 OF cl_gui_alv_grid
IMPORTING e_fieldname es_row_no er_event_data.
ENDCLASS. "lcl_event_handler DEFINITION


*--- ALV Grid instance reference
DATA gr_alvgrid TYPE REF TO cl_gui_alv_grid .
*--- Name of the custom control added on the screen
DATA gc_custom_control_name TYPE scrfname VALUE 'CC_ALCV' .
*--- Custom container instance reference
DATA gr_ccontainer TYPE REF TO cl_gui_custom_container .
DATA: gr_dock_ccontainer TYPE REF TO cl_gui_docking_container..

*--- Field catalog table
DATA gt_fieldcat TYPE lvc_t_fcat .
*--- Layout structure
DATA gs_layout TYPE lvc_s_layo .
*--- Exclusion table
DATA gt_exclude TYPE ui_functions.
*--- Sort table
DATA gt_sort TYPE lvc_t_sort.
*--- Filter table
DATA gt_filt TYPE lvc_t_filt.
*--- Hyperlink table
DATA gt_hype TYPE lvc_t_hype.


DATA gr_event_handler TYPE REF TO lcl_event_handler .

*--- Internal table holding list data
DATA BEGIN OF gt_list OCCURS 0 .
INCLUDE STRUCTURE sflight .
DATA rowcolor(4) TYPE c .
DATA cellcolors TYPE lvc_t_scol .
DATA carrid_handle TYPE int4 . " hyperlink
DATA ptype_dd_hndl TYPE int4 . " DDLB
DATA cellstyles TYPE lvc_t_styl . " Cell Styles
DATA END OF gt_list .


CALL SCREEN 100.

*----------------------------------------------------------------------*
* CLASS lcl_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION .
METHOD handle_double_click.
PERFORM handle_double_click USING e_row e_column .
ENDMETHOD . "handle_double_click
METHOD handle_context_menu_request.
PERFORM handle_context_menu_request USING e_object.
ENDMETHOD. "handle_context_menu_request
METHOD handle_user_command.
PERFORM handle_user_command USING e_ucomm.
ENDMETHOD. "handle_user_command
METHOD handle_after_user_command.
ENDMETHOD. "handle_after_user_command
METHOD handle_toolbar.
PERFORM handle_toolbar USING e_object.
ENDMETHOD. "handle_toolbar
METHOD handle_menu_button.
PERFORM handle_menu_button USING e_object e_ucomm.
ENDMETHOD. "handle_menu_button
METHOD handle_data_changed.
PERFORM handle_data_changed USING er_data_changed.
ENDMETHOD. "handle_data_changed
METHOD handle_onf1.
PERFORM f1_help USING e_fieldname es_row_no .
er_event_data->m_event_handled = 'X' .
ENDMETHOD. "handle_onf1
ENDCLASS. "lcl_event_handler IMPLEMENTATION

*&---------------------------------------------------------------------*
*& Module DISPLAY_ALV OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE display_alv OUTPUT.
PERFORM display_alv.
ENDMODULE. " DISPLAY_ALV OUTPUT
*&---------------------------------------------------------------------*
*& Form DISPLAY_ALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM display_alv .

PERFORM get_data.

IF gr_alvgrid IS INITIAL .
**----Creating custom container instance
* CREATE OBJECT gr_ccontainer
* EXPORTING
* container_name = gc_custom_control_name
* EXCEPTIONS
* cntl_error = 1
* cntl_system_error = 2
* create_error = 3
* lifetime_error = 4
* lifetime_dynpro_dynpro_link = 5
* OTHERS = 6 .
* IF sy-subrc <> 0.
**--Exception handling
* ENDIF.
*----------------------------------------------------------------------------------
* Create docking container
CREATE OBJECT gr_dock_ccontainer
EXPORTING
parent = cl_gui_container=>screen0
ratio = 90 " 90% yet not full-screen size
EXCEPTIONS
OTHERS = 6.
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 gr_dock_ccontainer->set_extension
EXPORTING
extension = 99999 " full-screen size !!!
EXCEPTIONS
cntl_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
*----------------------------------------------------------------------------------

*----Creating ALV Grid instance
CREATE OBJECT gr_alvgrid
EXPORTING
i_parent = gr_dock_ccontainer"gr_ccontainer
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
OTHERS = 5 .
IF sy-subrc <> 0.
*--Exception handling
ENDIF.

*--Creating an instance for the event handler
CREATE OBJECT gr_event_handler .
SET HANDLER gr_event_handler->handle_double_click FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_context_menu_request FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_user_command FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_after_user_command FOR gr_alvgrid.
SET HANDLER gr_event_handler->handle_toolbar FOR gr_alvgrid.
SET HANDLER gr_event_handler->handle_menu_button FOR gr_alvgrid.
SET HANDLER gr_event_handler->handle_data_changed FOR gr_alvgrid.
SET HANDLER gr_event_handler->handle_onf1 FOR gr_alvgrid.

*----Preparing field catalog.
PERFORM prepare_field_catalog CHANGING gt_fieldcat .
*----Preparing layout structure
PERFORM prepare_layout CHANGING gs_layout .
*----Preparing functions to be excluded
PERFORM exclude_tb_functions CHANGING gt_exclude.
*----Preparing Sort table
PERFORM prepare_sort_table CHANGING gt_sort.
*----Preparing filter table
PERFORM prepare_filter_table CHANGING gt_filt.
*----Preparing hyperlink table
PERFORM prepare_hyperlinks_table CHANGING gt_hype.
*----Preparing DDLB table
PERFORM prepare_drilldown_values.



*--functions
CALL METHOD gr_alvgrid->set_table_for_first_display
EXPORTING
* I_BUFFER_ACTIVE =
* I_CONSISTENCY_CHECK =
* I_STRUCTURE_NAME =
* IS_VARIANT =
i_save = 'U'
* I_DEFAULT = 'X'
is_layout = gs_layout
* IS_PRINT =
* IT_SPECIAL_GROUPS =
it_toolbar_excluding = gt_exclude
it_hyperlink = gt_hype
CHANGING
it_outtab = gt_list[]
it_fieldcatalog = gt_fieldcat
it_sort = gt_sort
it_filter = gt_filt
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4 .
IF sy-subrc <> 0.
*--Exception handling
ENDIF.
ELSE .
CALL METHOD gr_alvgrid->refresh_table_display
* EXPORTING
* IS_STABLE =
* I_SOFT_REFRESH =
EXCEPTIONS
finished = 1
OTHERS = 2 .
IF sy-subrc <> 0.
*--Exception handling
ENDIF.
ENDIF .
ENDFORM. " DISPLAY_ALV
*&---------------------------------------------------------------------*
*& Form PREPARE_FIELD_CATALOG
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_GT_FIELDCAT text
*----------------------------------------------------------------------*
FORM prepare_field_catalog CHANGING pt_fieldcat TYPE lvc_t_fcat.
DATA ls_fcat TYPE lvc_s_fcat .
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'SFLIGHT'
CHANGING
ct_fieldcat = pt_fieldcat[]
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
*--Exception handling
ENDIF.
LOOP AT pt_fieldcat INTO ls_fcat .
CASE ls_fcat-fieldname .
WHEN 'CARRID' .
ls_fcat-outputlen = '10' .
ls_fcat-coltext = 'Airline Carrier ID' .
ls_fcat-web_field = 'CARRID_HANDLE'.
ls_fcat-drdn_field = 'PTYPE_DD_HNDL'.
MODIFY pt_fieldcat FROM ls_fcat .
WHEN 'PAYMENTSUM' .
* ls_fcat-no_out = 'X' .
ls_fcat-do_sum = 'X'.
MODIFY pt_fieldcat FROM ls_fcat .
ENDCASE .
ENDLOOP .

ENDFORM. " PREPARE_FIELD_CATALOG
*&---------------------------------------------------------------------*
*& Form PREPARE_LAYOUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_GS_LAYOUT text
*----------------------------------------------------------------------*
FORM prepare_layout CHANGING ps_layout TYPE lvc_s_layo.
ps_layout-zebra = 'X' .
ps_layout-grid_title = 'Flights' .
ps_layout-smalltitle = 'X' .
ps_layout-sel_mode = 'B' .
ps_layout-info_fname = 'ROWCOLOR'.
ps_layout-ctab_fname = 'CELLCOLORS'.
ps_layout-stylefname = 'CELLSTYLES'.
* ps_layout-no_merging = 'X'.
ENDFORM. " PREPARE_LAYOUT
*&---------------------------------------------------------------------*
*& Form EXCLUDE_TB_FUNCTIONS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_GT_EXCLUDE text
*----------------------------------------------------------------------*
FORM exclude_tb_functions CHANGING pt_exclude TYPE ui_functions.
DATA ls_exclude TYPE ui_func.
ls_exclude = cl_gui_alv_grid=>mc_fc_maximum .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_minimum .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_subtot .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_sum .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_average .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_mb_sum .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_mb_subtot .
ENDFORM. " EXCLUDE_TB_FUNCTIONS
*&---------------------------------------------------------------------*
*& Form PREPARE_SORT_TABLE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_GT_SORT text
*----------------------------------------------------------------------*
FORM prepare_sort_table CHANGING pt_sort TYPE lvc_t_sort.
DATA ls_sort TYPE lvc_s_sort .
ls_sort-spos = '1' .
ls_sort-fieldname = 'CARRID' .
ls_sort-up = 'X' . "A to Z
ls_sort-down = space .
APPEND ls_sort TO pt_sort .
ls_sort-spos = '2' .
ls_sort-fieldname = 'SEATSOCC' .
ls_sort-up = space .
ls_sort-down = 'X' . "Z to A
APPEND ls_sort TO pt_sort .
ENDFORM. " PREPARE_SORT_TABLE
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS 'ALV'.
SET TITLEBAR 'ALV'.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
LEAVE TO SCREEN 0.
ENDMODULE. " USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*& Form PREPARE_FILTER_TABLE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_GT_FILT text
*----------------------------------------------------------------------*
FORM prepare_filter_table CHANGING pt_filt TYPE lvc_t_filt .
DATA ls_filt TYPE lvc_s_filt .
ls_filt-fieldname = 'FLDATE' .
ls_filt-sign = 'E' .
ls_filt-option = 'BT' .
ls_filt-low = '20070101' .
ls_filt-high = '20071231' .
APPEND ls_filt TO pt_filt .
ENDFORM. " PREPARE_FILTER_TABLE
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_data .
DATA ld_color(1) TYPE c.
DATA ls_cellcolor TYPE lvc_s_scol .
DATA ls_style TYPE lvc_s_styl .


SELECT * FROM sflight INTO CORRESPONDING FIELDS OF TABLE gt_list." WHERE SEATSOCC > 0.

LOOP AT gt_list.
** Coloring Row
ld_color = ld_color + 1.
* Only 7 colours so need to reset color value
IF ld_color = 8.
ld_color = 1.
ENDIF.
CONCATENATE 'C' ld_color '00' INTO gt_list-rowcolor.

* Coloring Cell
IF gt_list-seatsocc < 0.
ls_cellcolor-fname = 'SEATSOCC' .
ls_cellcolor-color-col = '6' .
ls_cellcolor-color-int = '1' .
APPEND ls_cellcolor TO gt_list-cellcolors.
ENDIF.

* Hyper Links
IF gt_list-carrid = 'AA'.
gt_list-carrid_handle = '1' .
ELSEIF gt_list-carrid = 'LH'.
gt_list-carrid_handle = '2' .
ELSEIF gt_list-carrid = 'AZ'..
gt_list-ptype_dd_hndl = '1'.
ENDIF.

IF gt_list-planetype = '747-400'.
ls_style-fieldname = 'SEATSMAX' .
ls_style-style = cl_gui_alv_grid=>mc_style_button .
APPEND ls_style TO gt_list-cellstyles .
ENDIF.

** Makes the field Editable
IF gt_list-fldate < class="L1S52">AND
gt_list-cellstyles IS INITIAL.
CLEAR ls_style.
ls_style-fieldname = 'FLDATE'.
ls_style-style = cl_gui_alv_grid=>mc_style_enabled.
APPEND ls_style TO gt_list-cellstyles .
ENDIF.

MODIFY gt_list.
ENDLOOP.
ENDFORM. " GET_DATA
*&---------------------------------------------------------------------*
*& Form PREPARE_HYPERLINKS_TABLE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_GT_HYPE text
*----------------------------------------------------------------------*
FORM prepare_hyperlinks_table CHANGING pt_hype TYPE lvc_t_hype.
DATA ls_hype TYPE lvc_s_hype .
ls_hype-handle = '1' .
ls_hype-href = 'http://www.aa.com/' .
APPEND ls_hype TO pt_hype .
ls_hype-handle = '2' .
ls_hype-href = 'http://www.lufthansa.com/' .
APPEND ls_hype TO pt_hype .
ENDFORM. " PREPARE_HYPERLINKS_TABLE
*&---------------------------------------------------------------------*
*& Form PREPARE_DRILLDOWN_VALUES
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM prepare_drilldown_values .
DATA lt_ddval TYPE lvc_t_drop .
DATA ls_ddval TYPE lvc_s_drop .
ls_ddval-handle = '1' .
ls_ddval-value = 'JFK-12' .
APPEND ls_ddval TO lt_ddval .
ls_ddval-handle = '1' .
ls_ddval-value = 'JSF-44' .
APPEND ls_ddval TO lt_ddval .
ls_ddval-handle = '1' .
ls_ddval-value = 'KMDA-53' .
APPEND ls_ddval TO lt_ddval .
ls_ddval-handle = '1' .
ls_ddval-value = 'SS3O/N' .
APPEND ls_ddval TO lt_ddval .
CALL METHOD gr_alvgrid->set_drop_down_table
EXPORTING
it_drop_down = lt_ddval.
ENDFORM. " PREPARE_DRILLDOWN_VALUES
*&---------------------------------------------------------------------*
*& Form HANDLE_DOUBLE_CLICK
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_E_ROW text
* -->P_E_COLUMN text
* -->P_ES_ROW_NO text
*----------------------------------------------------------------------*
FORM handle_double_click USING p_row
p_column.
BREAK-POINT.
ENDFORM. " HANDLE_DOUBLE_CLICK
*&---------------------------------------------------------------------*
*& Form HANDLE_CONTEXT_MENU_REQUEST
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_E_OBJECT text
*----------------------------------------------------------------------*
FORM handle_context_menu_request USING p_object TYPE REF TO cl_ctmenu.
CALL METHOD p_object->add_function
EXPORTING
fcode = 'CREA'
text = 'Create Booking'.
ENDFORM. " HANDLE_CONTEXT_MENU_REQUEST
*&---------------------------------------------------------------------*
*& Form HANDLE_TOOLBAR
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_E_OBJECT text
*----------------------------------------------------------------------*
FORM handle_toolbar USING p_object TYPE REF TO cl_alv_event_toolbar_set.
*0 Button (normal)
*1 Menu and default button
*2 Menu
*3 Separator
*4 Radio button
*5 Checkbox
*6 Menu entry
DATA: ls_toolbar TYPE stb_button.

CLEAR ls_toolbar.
MOVE 3 TO ls_toolbar-butn_type.
APPEND ls_toolbar TO p_object->mt_toolbar.

CLEAR ls_toolbar.
MOVE 'PER' TO ls_toolbar-function. "#EC NOTEXT
MOVE icon_display_text TO ls_toolbar-icon.
MOVE 'Passenger Info'(201) TO ls_toolbar-quickinfo.
MOVE 'Passenger Info'(201) TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled. "#EC NOTEXT
APPEND ls_toolbar TO p_object->mt_toolbar.

CLEAR ls_toolbar.
MOVE 'EXCH' TO ls_toolbar-function. "#EC NOTEXT
MOVE 2 TO ls_toolbar-butn_type.
MOVE icon_calculation TO ls_toolbar-icon.
MOVE 'Payment in Other Currencies'(202) TO ls_toolbar-quickinfo.
MOVE ' ' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled. "#EC NOTEXT
APPEND ls_toolbar TO p_object->mt_toolbar.

CLEAR ls_toolbar.
MOVE 'CHNG' TO ls_toolbar-function. "#EC NOTEXT
MOVE icon_change TO ls_toolbar-icon.
MOVE 'Change Date of Flight'(202) TO ls_toolbar-quickinfo.
MOVE ' ' TO ls_toolbar-text.
MOVE ' ' TO ls_toolbar-disabled. "#EC NOTEXT
APPEND ls_toolbar TO p_object->mt_toolbar.

ENDFORM. " HANDLE_TOOLBAR
*&---------------------------------------------------------------------*
*& Form HANDLE_MENU_BUTTON
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_E_OBJECTE text
* -->P_E_UCOMM text
*----------------------------------------------------------------------*
FORM handle_menu_button USING p_object TYPE REF TO cl_ctmenu
p_ucomm TYPE syucomm.
CASE p_ucomm .
WHEN 'EXCH' .
CALL METHOD p_object->add_function
EXPORTING
fcode = 'EU'
text = 'Euro'.
CALL METHOD p_object->add_function
EXPORTING
fcode = 'TRL'
text = 'Turkish Lira'.
ENDCASE .
ENDFORM. " HANDLE_MENU_BUTTON
*&---------------------------------------------------------------------*
*& Form HANDLE_USER_COMMAND
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_E_UCOMM text
*----------------------------------------------------------------------*
FORM handle_user_command USING p_ucomm TYPE syucomm.
DATA lt_selected_rows TYPE lvc_t_roid .
DATA ls_selected_row TYPE lvc_s_roid .

CALL METHOD gr_alvgrid->get_selected_rows
IMPORTING
et_row_no = lt_selected_rows.

CASE p_ucomm.
WHEN 'CHNG'.
CALL METHOD gr_alvgrid->set_ready_for_input
EXPORTING
i_ready_for_input = 1.
ENDCASE.

ENDFORM. " HANDLE_USER_COMMAND
*&---------------------------------------------------------------------*
*& Form HANDLE_DATA_CHANGED
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_ER_DATA_CHANGED text
*----------------------------------------------------------------------*
FORM handle_data_changed USING pr_data_changed TYPE REF TO cl_alv_changed_data_protocol.
DATA : ls_mod_cell TYPE lvc_s_modi ,
lv_value TYPE lvc_value .
* BREAK-POINT.
SORT pr_data_changed->mt_mod_cells BY row_id .

LOOP AT pr_data_changed->mt_mod_cells INTO ls_mod_cell WHERE fieldname = 'FLDATE'.

CALL METHOD pr_data_changed->get_cell_value
EXPORTING
i_row_id = ls_mod_cell-row_id
i_fieldname = 'FLDATE'
IMPORTING
e_value = lv_value.

IF lv_value > sy-datum.
CALL METHOD pr_data_changed->add_protocol_entry
EXPORTING
i_msgid = 'SU'
i_msgno = '000'
i_msgty = 'E'
i_msgv1 = 'This date cannot be in year 2009'
i_msgv2 = lv_value
i_msgv3 = 'The value is set to Today`s date'
i_fieldname = ls_mod_cell-fieldname
i_row_id = ls_mod_cell-row_id.

CALL METHOD pr_data_changed->modify_cell
EXPORTING
i_row_id = ls_mod_cell-row_id
i_fieldname = ls_mod_cell-fieldname
i_value = sy-datum.

ENDIF.
ENDLOOP.
ENDFORM. " HANDLE_DATA_CHANGED
*&---------------------------------------------------------------------*
*& Form F1_HELP
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_E_FIELDNAME text
* -->P_ES_ROW_NO text
*----------------------------------------------------------------------*
FORM f1_help USING p_fieldname
p_es_row_no.

ENDFORM. " F1_HELP