Skip to content

Instantly share code, notes, and snippets.

@weiserman
Created December 11, 2013 14:20
Show Gist options
  • Save weiserman/7911192 to your computer and use it in GitHub Desktop.
Save weiserman/7911192 to your computer and use it in GitHub Desktop.
SAP Report to display long texts contained in a Purchase Order
REPORT zpo_texts.
TABLES: ekko.
TYPE-POOLS : abap, slis, rsanm, icon.
DATA: lt_ekko TYPE STANDARD TABLE OF ekko.
DATA: l_rec(5) TYPE n.
* Internal table and type definition
TYPES: BEGIN OF ty_alv,
bukrs TYPE ekko-bukrs,
ebeln TYPE ekko-ebeln,
ekorg TYPE ekko-ekorg,
ernam TYPE ekko-ernam,
aedat TYPE ekko-aedat,
lifnr TYPE ekko-lifnr,
tdline TYPE tline-tdline,
END OF ty_alv.
TYPES: BEGIN OF ty_tdname,
tdname TYPE stxh-tdname,
END OF ty_tdname.
DATA: ls_tdname TYPE ty_tdname,
lt_tdname TYPE STANDARD TABLE OF ty_tdname,
ls_line TYPE tline,
lv_lines type i.
DATA: lt_stxh TYPE STANDARD TABLE OF stxh.
DATA: lt_alv TYPE STANDARD TABLE OF ty_alv,
ls_alv TYPE ty_alv.
DATA: lt_text TYPE STANDARD TABLE OF tdline,
lv_text TYPE tdline,
lv_ebeln TYPE ekko-ebeln,
lt_lines TYPE STANDARD TABLE OF tline.
FIELD-SYMBOLS: <ls_alv> TYPE ty_alv,
<ls_stxh> TYPE stxh.
DATA: alv_container TYPE REF TO cl_gui_custom_container,
alv_grid TYPE REF TO cl_gui_alv_grid,
ok_code LIKE sy-ucomm,
fieldcat TYPE lvc_t_fcat.
** Declaration for ALV Grid **
DATA : gr_table TYPE REF TO cl_salv_table.
** Declarations for ALV Functions
DATA : gr_functions TYPE REF TO cl_salv_functions_list.
** declaration for ALV Columns
DATA : gr_columns TYPE REF TO cl_salv_columns_table,
gr_column TYPE REF TO cl_salv_column_table,
lt_column_ref TYPE salv_t_column_ref,
ls_column_ref TYPE salv_s_column_ref.
** declaration for Layout Settings
DATA : gr_layout TYPE REF TO cl_salv_layout,
gr_layout_key TYPE salv_s_layout_key,
ls_layout TYPE salv_s_layout,
lt_layout_info TYPE salv_t_layout_info.
** Declaration for Global Display Settings
DATA : gr_display TYPE REF TO cl_salv_display_settings,
lv_title TYPE lvc_title.
** Declaration for Aggregate Function Settings
DATA : gr_aggr TYPE REF TO cl_salv_aggregations.
** Declaration for Sort Function Settings
DATA : gr_sort TYPE REF TO cl_salv_sorts.
** Declaration for Table Selection settings
DATA : gr_select TYPE REF TO cl_salv_selections.
** Declaration for Top of List settings
DATA : gr_content TYPE REF TO cl_salv_form_element.
** Class for handling Events
CLASS : lcl_handle_events DEFINITION DEFERRED.
DATA : gr_events TYPE REF TO lcl_handle_events,
lr_events TYPE REF TO cl_salv_events_table.
** Coloring of Date columns **
DATA : lt_colo TYPE STANDARD TABLE OF lvc_s_colo,
ls_colo TYPE lvc_s_colo.
** Color Structure of columns **
DATA : lt_color TYPE lvc_t_scol,
ls_color TYPE lvc_s_scol.
*----------------------------------------------------------------------*
* CLASS lcl_handle_events DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_handle_events DEFINITION.
PUBLIC SECTION.
METHODS : on_double_click FOR EVENT double_click OF cl_salv_events_table
IMPORTING row column.
METHODS : on_link_click FOR EVENT link_click OF cl_salv_events_table
IMPORTING row column.
ENDCLASS. "lcl_handle_events DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_handle_events IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_handle_events IMPLEMENTATION.
METHOD on_double_click.
PERFORM get_ord_info USING row column.
ENDMETHOD. "on_double_click
METHOD on_link_click.
PERFORM get_ord_info USING row column.
ENDMETHOD. "on_link_click
ENDCLASS. "lcl_handle_events IMPLEMENTATION
* Choose dates and PO Order types
SELECTION-SCREEN BEGIN OF BLOCK part1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_date FOR ekko-aedat.
PARAMETERS: p_ekorg LIKE ekko-ekorg DEFAULT '1000'.
PARAMETERS: p_stat LIKE ekko-procstat DEFAULT '02'. "Rejected
PARAMETERS: p_tdid LIKE stxh-tdid DEFAULT 'F01'. "Text type
PARAMETERs: p_var TYPE slis_vari.
SELECTION-SCREEN END OF BLOCK part1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_var.
CLEAR : ls_layout.
TRY.
CALL METHOD cl_salv_table=>factory
EXPORTING
list_display = if_salv_c_bool_sap=>false
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = lt_alv.
CATCH cx_salv_msg .
ENDTRY.
IF gr_table IS NOT INITIAL.
MOVE sy-repid TO gr_layout_key-report. "Set Layout Key as Report ID"
gr_layout = gr_table->get_layout( ). "Get Layout of the Table"
gr_layout->set_key( gr_layout_key ). "Set Layout key to Layout"
lt_layout_info = gr_layout->get_layouts( )."Get the Layouts of report"
IF lt_layout_info[] IS NOT INITIAL.
ls_layout = gr_layout->f4_layouts( ). "Activate F4 Help for Layouts"
IF ls_layout IS NOT INITIAL.
MOVE ls_layout-layout TO p_var.
ENDIF.
ENDIF.
ENDIF.
START-OF-SELECTION.
* Extract the table entries
SELECT * FROM ekko INTO CORRESPONDING FIELDS OF TABLE lt_alv
WHERE aedat IN s_date
AND ekorg EQ p_ekorg
AND procstat EQ p_stat.
* Sort table by doc number for better searching later
SORT lt_alv BY ebeln.
DESCRIBE TABLE lt_alv lines lv_lines.
move lv_lines to l_rec.
* Build up internal table for selecting texts -> we need to get the typing correct
LOOP AT lt_alv ASSIGNING <ls_alv>.
MOVE <ls_alv>-ebeln TO ls_tdname.
APPEND ls_tdname TO lt_tdname.
ENDLOOP.
* Now select all the texts that have been maintained
SELECT * FROM stxh INTO TABLE lt_stxh FOR ALL ENTRIES IN lt_tdname
WHERE tdobject = 'EKKO'
AND tdid = p_tdid
AND tdname = lt_tdname-tdname.
* Loop through POs that have text and update main table for display
LOOP AT lt_stxh ASSIGNING <ls_stxh>.
MOVE <ls_stxh>-tdname TO lv_ebeln.
READ TABLE lt_alv WITH KEY ebeln = lv_ebeln INTO ls_alv.
IF sy-subrc = 0. "always should be found
CLEAR: lt_lines[].
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = p_tdid
language = sy-langu
name = <ls_stxh>-tdname
object = 'EKKO '
TABLES
lines = lt_lines
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc <> 0.
CONTINUE. "ignore this loop - unlikely to occur
ELSE.
READ TABLE lt_lines INTO ls_line INDEX 1.
move ls_line-tdline to ls_alv-tdline.
MODIFY lt_alv FROM ls_alv TRANSPORTING tdline where ebeln = lv_ebeln.
ENDIF.
ENDIF.
ENDLOOP.
SORT lt_alv ASCENDING BY ebeln.
IF lt_alv[] IS INITIAL.
MESSAGE s429(mo).
EXIT.
ELSE.
PERFORM set_color.
PERFORM alv_grid_display.
ENDIF.
*&---------------------------------------------------------------------*
*& Form alv_grid_display
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM alv_grid_display.
CLEAR : gr_table.
TRY.
CALL METHOD cl_salv_table=>factory
EXPORTING
list_display = if_salv_c_bool_sap=>false
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = lt_alv.
CATCH cx_salv_msg .
ENDTRY.
IF gr_table IS INITIAL.
MESSAGE 'Error Creating ALV Grid ' TYPE 'I' DISPLAY LIKE 'E'.
STOP.
ENDIF.
** Get functions details
gr_functions = gr_table->get_functions( ).
** Activate All Buttons in Tool Bar
gr_functions->set_all( if_salv_c_bool_sap=>true ).
******* Layout Settings *******
CLEAR : gr_layout, gr_layout_key.
MOVE sy-repid TO gr_layout_key-report. "Set Report ID as Layout Key"
gr_layout = gr_table->get_layout( ). "Get Layout of Table"
gr_layout->set_key( gr_layout_key ). "Set Report Id to Layout"
gr_layout->set_save_restriction( if_salv_c_layout=>restrict_none ). "No Restriction to Save Layout"
IF p_var IS INITIAL.
gr_layout->set_default( if_salv_c_bool_sap=>true ). "Set Default Variant"
ELSE.
gr_layout->set_initial_layout( p_var ). "Set the Selected Variant as Initial"
ENDIF.
******* Global Display Settings *******
CLEAR : gr_display.
MOVE 'Purchase Order Details' TO lv_title.
gr_display = gr_table->get_display_settings( ). " Global Display settings"
gr_display->set_striped_pattern( if_salv_c_bool_sap=>true ). "Activate Strip Pattern"
gr_display->set_list_header( lv_title ). "Report Header"
******* Aggregate Function Settings *******
gr_aggr = gr_table->get_aggregations( ). "Get Aggregate Functions"
******* Sort Functions *******
gr_sort = gr_table->get_sorts( ).
IF gr_sort IS NOT INITIAL.
TRY.
gr_sort->add_sort( columnname = 'AEDAT'
position = 1
sequence = if_salv_c_sort=>sort_up
subtotal = if_salv_c_bool_sap=>true
group = if_salv_c_sort=>group_none
obligatory = if_salv_c_bool_sap=>false ).
CATCH cx_salv_not_found .
CATCH cx_salv_existing .
CATCH cx_salv_data_error .
ENDTRY.
TRY.
gr_sort->add_sort( columnname = 'LIFNR'
position = 2
sequence = if_salv_c_sort=>sort_down
subtotal = if_salv_c_bool_sap=>false
group = if_salv_c_sort=>group_none
obligatory = if_salv_c_bool_sap=>false ).
CATCH cx_salv_not_found .
CATCH cx_salv_existing .
CATCH cx_salv_data_error .
ENDTRY.
ENDIF.
******* Table Selection Settings *******
gr_select = gr_table->get_selections( ).
IF gr_select IS NOT INITIAL.
gr_select->set_selection_mode( if_salv_c_selection_mode=>row_column ). "Allow single row Selection"
ENDIF.
******* Top of List settings *******
PERFORM top_of_page CHANGING gr_content.
gr_table->set_top_of_list( gr_content ).
******* Event Register settings *******
lr_events = gr_table->get_event( ).
CREATE OBJECT gr_events.
SET HANDLER gr_events->on_double_click FOR lr_events.
SET HANDLER gr_events->on_link_click FOR lr_events.
** Get the columns from ALV Table
gr_columns = gr_table->get_columns( ).
IF gr_columns IS NOT INITIAL.
REFRESH : lt_column_ref.
CLEAR : ls_column_ref.
lt_column_ref = gr_columns->get( ).
** Get columns properties
gr_columns->set_optimize( if_salv_c_bool_sap=>true ).
gr_columns->set_key_fixation( if_salv_c_bool_sap=>true ).
TRY.
gr_columns->set_color_column( 'T_COLOR' ).
CATCH cx_salv_data_error .
ENDTRY.
** Individual Column Properties.
PERFORM column_settings.
ENDIF.
CALL METHOD gr_table->display.
ENDFORM. "alv_grid_display
*&---------------------------------------------------------------------*
*& Form column_settings
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM column_settings.
* Local Data
data lv_scrtext_s type scrtext_s.
LOOP AT lt_column_ref INTO ls_column_ref.
TRY.
gr_column ?= gr_columns->get_column( ls_column_ref-columnname ).
CATCH cx_salv_not_found.
ENDTRY.
IF gr_column IS NOT INITIAL.
** Make Mandt column invisible **
IF gr_column->get_ddic_datatype( ) = 'CLNT'.
gr_column->set_technical( if_salv_c_bool_sap=>true ).
ENDIF.
** Set text title for the TDLINE
IF gr_column->GET_COLUMNNAME( ) = 'TDLINE'.
lv_scrtext_s = 'Long Text'.
gr_column->SET_SHORT_TEXT( lv_scrtext_s ).
ENDIF.
** Create Aggregate function total for All Numeric/Currency Fields **
IF gr_column->get_ddic_inttype( ) EQ 'P' OR
gr_column->get_ddic_datatype( ) EQ 'CURR'.
IF gr_aggr IS NOT INITIAL.
TRY.
gr_aggr->add_aggregation( columnname = ls_column_ref-columnname
aggregation = if_salv_c_aggregation=>total ).
CATCH cx_salv_data_error .
CATCH cx_salv_not_found .
CATCH cx_salv_existing .
ENDTRY.
ENDIF.
ENDIF.
** Create Check box for fields with domain "XFELD"
IF gr_column->get_ddic_domain( ) EQ 'XFELD'.
gr_column->set_cell_type( if_salv_c_cell_type=>checkbox ).
ENDIF.
** Set color to Date Columns **
IF gr_column->get_ddic_datatype( ) EQ 'DATS'.
CLEAR : ls_colo.
MOVE 2 TO ls_colo-col.
MOVE 1 TO ls_colo-int.
MOVE 1 TO ls_colo-inv.
gr_column->set_color( ls_colo ).
ENDIF.
** Add Hotspot&Hyper Link to the column ebeln
IF ls_column_ref-columnname EQ 'EBELN'.
gr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
gr_column->set_key( if_salv_c_bool_sap=>true ).
ENDIF.
** Add Hotspot&Hyper Link to the column ebeln
IF ls_column_ref-columnname EQ 'TLINE'.
gr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. "column_settings
*&---------------------------------------------------------------------*
*& Form top_of_page
*&---------------------------------------------------------------------*
FORM top_of_page CHANGING lr_content TYPE REF TO cl_salv_form_element.
DATA : lr_grid TYPE REF TO cl_salv_form_layout_grid,
lr_text TYPE REF TO cl_salv_form_text,
lr_label TYPE REF TO cl_salv_form_label,
lr_head TYPE string.
MOVE 'Purchase Order List' TO lr_head.
CREATE OBJECT lr_grid.
** Header of Top of Page **
lr_grid->create_header_information( row = 1
column = 1
text = lr_head
tooltip = lr_head ).
** Add Row **
lr_grid->add_row( ).
** Add Label in Grid **
lr_label = lr_grid->create_label( row = 2
column = 1
text = 'No of Records'
tooltip = 'No of Records' ).
** Add Text in The Grid **
lr_text = lr_grid->create_text( row = 2
column = 2
text = l_rec
tooltip = l_rec ).
** Set Label and Text Link **
lr_label->set_label_for( lr_text ).
** Move lr_grid to lr_content **
lr_content = lr_grid.
ENDFORM. "top_of_page
*&---------------------------------------------------------------------*
*& Form
*&---------------------------------------------------------------------*
FORM get_ord_info USING row TYPE salv_de_row
column TYPE salv_de_column.
IF column EQ 'EBELN' or column EQ 'TLINE'.
CLEAR : ls_alv.
READ TABLE lt_alv INTO ls_alv INDEX row.
IF sy-subrc EQ 0.
SET PARAMETER ID 'BES' FIELD ls_alv-ebeln.
CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.
ENDIF.
ENDIF.
ENDFORM. "get_ord_info
*&---------------------------------------------------------------------*
*& Form set_color
*&---------------------------------------------------------------------*
* Set color to the column
*----------------------------------------------------------------------*
FORM set_color.
LOOP AT lt_alv assigning <ls_alv>.
IF <ls_alv>-tdline eq space.
REFRESH : lt_color.
CLEAR : ls_color.
MOVE 'EBELN' TO ls_color-fname.
MOVE 3 TO ls_color-color-col.
MOVE 0 TO ls_color-color-int.
MOVE 0 TO ls_color-color-inv.
APPEND ls_color TO lt_color.
ENDIF.
ENDLOOP.
ENDFORM. "set_color
@imtiazg
Copy link

imtiazg commented May 26, 2022

Hi, Congratulations ,Very nicely written code for this topic with opps ALV and long text issue resolved .

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment