| *&---------------------------------------------------------------------* *& Report ZVK_DYN_REPORT *&---------------------------------------------------------------------* *& Report to Display Pricing condition Master Records *&---------------------------------------------------------------------* REPORT zvk_dyn_report. ** Text Elements * p_kappl : Application Area * p_kschl : Condition Type ** TYPE-POOLS : rsds,abap. TABLES : t685,dd02l,t681a. ** Type definition for KONP & KONH Table TYPES : BEGIN OF ty_konp, knumh TYPE knumh, kbetr TYPE kbetr_kond, krech TYPE krech, loevm_ko TYPE loevm_ko, END OF ty_konp. TYPES : BEGIN OF ty_konh, knumh TYPE knumh, END OF ty_konh. DATA : lt_konp TYPE STANDARD TABLE OF ty_konp, lt_konh TYPE STANDARD TABLE OF ty_konh, ls_konp TYPE ty_konp, ls_konh TYPE ty_konh. DATA : key_index TYPE sy-tabix, val_index TYPE sy-tabix. ** Definitions for Pricing tables determination ** DATA : ls_t685 TYPE t685, ls_t681 TYPE t681, ls_tmc1t TYPE tmc1t. ** Definition for ALV Grid ** DATA : gr_table TYPE REF TO cl_salv_table. DATA : gr_columns TYPE REF TO cl_salv_columns_table, gr_column TYPE REF TO cl_salv_column_table, lt_columns TYPE salv_t_column_ref, ls_columns TYPE salv_s_column_ref, lv_domname TYPE domname. DATA : gr_functions TYPE REF TO cl_salv_functions_list. DATA : gr_layout TYPE REF TO cl_salv_layout, gr_layout_key TYPE salv_s_layout_key. DATA : gr_content TYPE REF TO cl_salv_form_element. ** Defintions for Dynamic Structures ** DATA : lt_tab TYPE REF TO cl_abap_tabledescr, ls_row TYPE REF TO cl_abap_structdescr, ls_frow TYPE REF TO cl_abap_structdescr, lt_component TYPE cl_abap_structdescr=>component_table, ls_component TYPE cl_abap_structdescr=>component. FIELD-SYMBOLS : <gt_tab> TYPE STANDARD TABLE, <gs_row> TYPE ANY, <gd_fld> TYPE ANY. DATA : gt_tab TYPE REF TO data, gs_row TYPE REF TO data. DATA : p_table TYPE dd02l-tabname. ** Declarations for Free Selections DATA : lt_tables TYPE STANDARD TABLE OF rsdstabs, ls_tables TYPE rsdstabs, lt_fields TYPE STANDARD TABLE OF rsdsfields, ls_fields TYPE rsdsfields, lt_fields_n TYPE STANDARD TABLE OF rsdsfields, ls_fields_n TYPE rsdsfields. DATA : selection_id TYPE dynselid, fs_dyns TYPE rsds_type, fs_num TYPE sy-tfill, lv_kind TYPE char01. ** Declarations for Table Properties ** DATA : lt_field_list TYPE ddfields, ls_field_list TYPE dfies. ** Declaration for Dynamic Where Clause ** DATA : lt_clause TYPE STANDARD TABLE OF rsds_where, ls_clause TYPE rsds_where. DATA : lt_where TYPE STANDARD TABLE OF rsdswhere, lt_where_add TYPE STANDARD TABLE OF rsdswhere, ls_where TYPE rsdswhere. DATA : lv_kappl TYPE char04, lv_kschl TYPE char6. ** Selection Screen SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME. PARAMETERS : p_kappl TYPE t681a-kappl. PARAMETERS : p_kschl TYPE t685-kschl. SELECTION-SCREEN END OF BLOCK b1. START-OF-SELECTION. PERFORM get_table_det. PERFORM create_structures. PERFORM free_selections. PERFORM report_display. *&---------------------------------------------------------------------* *& Form get_table_det *&---------------------------------------------------------------------* * To Get Details of Pricing condition Tables *----------------------------------------------------------------------* FORM get_table_det. CLEAR : ls_t685, ls_t681, ls_tmc1t. ** Get Pricing condition Access Sequence Key CALL FUNCTION 'SD_COND_T685_SELECT' EXPORTING cts_kappl = p_kappl cts_kschl = p_kschl cts_kvewe = 'A' IMPORTING cts_t685 = ls_t685. ** Get condition table based on access sequence selection IF ls_t685-kozgf IS NOT INITIAL. CALL FUNCTION 'RV_GET_CONDITION_TABLES' EXPORTING access_sequence = ls_t685-kozgf application = p_kappl condition_type = p_kschl condition_use = 'A' get_text = 'X' like_pf4 = ' ' IMPORTING table_t681 = ls_t681 table_tmc1t = ls_tmc1t EXCEPTIONS invalid_condition_type = 1 missing_parameter = 2 no_selection_done = 3 no_table_found = 4 table_not_valid = 5 OTHERS = 6. IF sy-subrc <> 0 OR ls_t681-kotab IS INITIAL. MESSAGE 'Error in Determining Condition Table..' TYPE 'I' DISPLAY LIKE 'E'. STOP. ELSE. MOVE ls_t681-kotab TO p_table. ENDIF. ENDIF. ENDFORM. "get_table_det *&---------------------------------------------------------------------* *& Form create_structures *&---------------------------------------------------------------------* * To Create Dynamic Structures for Display *----------------------------------------------------------------------* FORM create_structures. * define local data data: lo_typedescr type ref to cl_abap_typedescr. ** Get Structure of the table ** ls_row ?= cl_abap_typedescr=>describe_by_name( p_name = p_table ). ls_row ?= cl_abap_typedescr=>describe_by_name( p_name = p_table ). ** Get the components in the extracted structrue ** And add one more field for Pricing condition value IF ls_row IS NOT INITIAL. lt_component = ls_row->get_components( ). CLEAR ls_component. MOVE 'KBETR' TO ls_component-name. ls_component-type ?= cl_abap_datadescr=>describe_by_name( 'KBETR_KOND' ). lo_typedescr ?= cl_abap_datadescr=>describe_by_name( 'KBETR_KOND' ). ** ls_component-type = lo_typedescr->type_kind. APPEND ls_component TO lt_component. ENDIF. DESCRIBE TABLE lt_component LINES val_index. ** Find the Index for the Key field KNUMH LOOP AT lt_component INTO ls_component. IF ls_component-name = 'KNUMH'. MOVE sy-tabix TO key_index. ENDIF. ENDLOOP. ** Create new line type with added field CLEAR : ls_frow. TRY. ls_frow = cl_abap_structdescr=>create( p_components = lt_component ). CATCH cx_sy_struct_creation . ENDTRY. ** Create the Internal Table structure IF ls_frow IS NOT INITIAL. CLEAR : lt_tab. TRY. ** lt_tab = cl_abap_tabledescr=>create( p_line_type = ls_frow ). lt_tab = cl_abap_tabledescr=>create( p_line_type = ls_frow ). CATCH cx_sy_table_creation . ENDTRY. ENDIF. IF lt_tab IS NOT INITIAL. CREATE DATA gt_tab TYPE HANDLE lt_tab. ENDIF. IF ls_row IS NOT INITIAL. CREATE DATA gs_row TYPE HANDLE ls_row. ENDIF. ASSIGN gt_tab->* to <gt_tab>. ASSIGN gs_row->* to <gs_row>. ENDFORM. "create_structures *&---------------------------------------------------------------------* *& Form free_selections *&---------------------------------------------------------------------* * To Display Free Selections & extraction of data *----------------------------------------------------------------------* FORM free_selections. REFRESH : lt_tables, lt_fields, lt_fields_n. CLEAR : ls_tables, ls_fields, ls_fields_n. CLEAR : selection_id. CLEAR : fs_dyns, fs_num. REFRESH : lt_where, lt_where_add. ** Extract Primary Key fields REFRESH : lt_field_list. CLEAR : ls_field_list. CALL METHOD cl_reca_ddic_tabl=>get_field_list EXPORTING id_name = p_table if_suppress_mandt = abap_true if_suppress_key = abap_false if_suppress_nonkey = abap_true IMPORTING et_field_list = lt_field_list EXCEPTIONS not_found = 1 OTHERS = 2. IF lt_field_list IS NOT INITIAL. ** Delete the Mandatory fields available in Selection screen so that ** these fields will not show in Free Selection DELETE lt_field_list WHERE fieldname EQ 'KAPPL'. IF sy-subrc EQ 0. CLEAR : ls_where. CONCATENATE '''' p_kappl '''' INTO lv_kappl. CONCATENATE '(' 'KAPPL EQ ' lv_kappl ')' INTO ls_where-line SEPARATED BY space. APPEND ls_where TO lt_where. ENDIF. DELETE lt_field_list WHERE fieldname EQ 'KSCHL'. IF sy-subrc EQ 0. IF lt_where[] IS NOT INITIAL. CLEAR : ls_where. MOVE 'AND' TO ls_where-line. APPEND ls_where TO lt_where. ENDIF. CONCATENATE '''' p_kschl '''' INTO lv_kschl. CONCATENATE '(' 'KSCHL EQ' lv_kschl ')' INTO ls_where-line SEPARATED BY space. APPEND ls_where TO lt_where. ENDIF. MOVE 'F' TO lv_kind. "Activate only Key fields in Free Selection. LOOP AT lt_field_list INTO ls_field_list. CLEAR : ls_fields. MOVE p_table TO ls_fields-tablename. MOVE ls_field_list-fieldname TO ls_fields-fieldname. APPEND ls_fields TO lt_fields. ENDLOOP. ELSE. MOVE 'T' TO lv_kind. "Activate all fields in Free- Selections ENDIF. ** Call Free-Selections Init ** MOVE p_table TO ls_tables-prim_tab. APPEND ls_tables TO lt_tables. CALL FUNCTION 'FREE_SELECTIONS_INIT' EXPORTING kind = lv_kind expressions = fs_dyns-texpr IMPORTING selection_id = selection_id where_clauses = fs_dyns-clauses expressions = fs_dyns-texpr field_ranges = fs_dyns-trange number_of_active_fields = fs_num TABLES tables_tab = lt_tables fields_tab = lt_fields fields_not_selected = lt_fields_n EXCEPTIONS fields_incomplete = 1 fields_no_join = 2 field_not_found = 3 no_tables = 4 table_not_found = 5 expression_not_supported = 6 incorrect_expression = 7 illegal_kind = 8 area_not_found = 9 inconsistent_area = 10 kind_f_no_fields_left = 11 kind_f_no_fields = 12 too_many_fields = 13 dup_field = 14 field_no_type = 15 field_ill_type = 16 dup_event_field = 17 node_not_in_ldb = 18 area_no_field = 19 OTHERS = 20. IF sy-subrc EQ 0. ** Call Free Selection Dialog Screen ** CALL FUNCTION 'FREE_SELECTIONS_DIALOG' EXPORTING selection_id = selection_id title = 'Free Selection for Pricing Conditions' as_window = ' ' alv = 'X' tree_visible = 'X' IMPORTING where_clauses = fs_dyns-clauses expressions = fs_dyns-texpr field_ranges = fs_dyns-trange number_of_active_fields = fs_num TABLES fields_tab = lt_fields fields_not_selected = lt_fields_n EXCEPTIONS internal_error = 1 no_action = 2 selid_not_found = 3 illegal_status = 4 OTHERS = 5. IF sy-subrc <> 0. MESSAGE 'Invalid Selection' TYPE 'I' DISPLAY LIKE 'E'. STOP. ELSE. ** Create Dynamic Where Clause CLEAR : ls_clause, ls_where. READ TABLE fs_dyns-clauses INTO ls_clause INDEX 1. IF sy-subrc EQ 0. lt_where_add[] = ls_clause-where_tab. ENDIF. IF lt_where[] IS NOT INITIAL. IF lt_where_add[] IS NOT INITIAL. CLEAR : ls_where. MOVE 'AND' TO ls_where-line. APPEND ls_where TO lt_where. ENDIF. ENDIF. APPEND LINES OF lt_where_add TO lt_where. ** Select Records From dynamic Pricing condition table using Dynamic Where clause IF lt_where[] IS NOT INITIAL. SELECT * FROM (p_table) INTO CORRESPONDING FIELDS OF TABLE <gt_tab> where (lt_where). ** Update Pricing condition record number in LT_KONH Table IF sy-subrc EQ 0 AND <gt_tab> is NOT INITIAL. LOOP AT <gt_tab> assigning <gs_row>. ASSIGN component key_index of structure <gs_row> to <gd_fld>. IF sy-subrc EQ 0. CLEAR : ls_konh. MOVE <gd_fld> TO ls_konh-knumh. APPEND ls_konh TO lt_konh. ENDIF. ENDLOOP. ** Extract Pricing Condition Value from KONP IF lt_konh[] IS NOT INITIAL. REFRESH : lt_konp. SELECT knumh kbetr krech loevm_ko FROM konp INTO TABLE lt_konp FOR ALL ENTRIES IN lt_konh WHERE knumh = lt_konh-knumh. IF lt_konp[] IS NOT INITIAL. DELETE lt_konp WHERE loevm_ko EQ 'X'. ENDIF. ENDIF. ENDIF. ENDIF. IF <gt_tab> is NOT INITIAL. LOOP AT <gt_tab> assigning <gs_row>. * CLEAR . ASSIGN component key_index of structure <gs_row> to <gd_fld>. IF sy-subrc EQ 0. CLEAR : ls_konp. READ TABLE lt_konp INTO ls_konp WITH KEY knumh = <gd_fld>. IF sy-subrc EQ 0. IF ls_konp-krech EQ 'A'. "Calculation type is % then divide by 10 COMPUTE ls_konp-kbetr = ls_konp-kbetr / 10. ENDIF. ASSIGN component val_index of structure <gs_row> to <gd_fld>. MOVE ls_konp-kbetr to <gd_fld>. ENDIF. ENDIF. ENDLOOP. ENDIF. ENDIF. ENDIF. ENDFORM. "free_selections *&---------------------------------------------------------------------* *& Form report_display *&---------------------------------------------------------------------* * For Displaying ALV Grid *----------------------------------------------------------------------* FORM report_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 = <gt_tab>. CATCH cx_salv_msg . ENDTRY. IF gr_table IS NOT INITIAL. ** Activate standard Functions of ALV ** gr_functions = gr_table->get_functions( ). gr_functions->set_all( if_salv_c_bool_sap=>true ). ** Activate Standard Layout Options ** MOVE sy-repid TO gr_layout_key-report. gr_layout = gr_table->get_layout( ). gr_layout->set_key( gr_layout_key ). gr_layout->set_save_restriction( if_salv_c_layout=>restrict_none ). ** Column Settings ** gr_columns = gr_table->get_columns( ). IF gr_columns IS NOT INITIAL. PERFORM column_settings. ENDIF. gr_columns->set_optimize( if_salv_c_bool_sap=>true ). ** Top of List ** PERFORM top_of_page CHANGING gr_content. gr_table->set_top_of_list( gr_content ). CALL METHOD gr_table->display. ENDIF. ENDFORM. "report_display *&---------------------------------------------------------------------* *& Form column_settings *&---------------------------------------------------------------------* * For Column settings for ALV Grid *----------------------------------------------------------------------* FORM column_settings. REFRESH : lt_columns. CLEAR : ls_columns. lt_columns = gr_columns->get( ). IF lt_columns[] IS NOT INITIAL. LOOP AT lt_columns INTO ls_columns. TRY. gr_column ?= gr_columns->get_column( columnname = ls_columns-columnname ). CATCH cx_salv_not_found . ENDTRY. IF gr_column IS NOT INITIAL. lv_domname = gr_column->get_ddic_domain( ). ** Hide Client and condition number columns in ALV Grid IF lv_domname EQ 'MANDT' OR lv_domname EQ 'KNUMB'. gr_column->set_technical( if_salv_c_bool_sap=>true ). ENDIF. ENDIF. ENDLOOP. ENDIF. ENDFORM. "column_settings *&---------------------------------------------------------------------* *& Form top_of_page *&---------------------------------------------------------------------* * To setting Top of Page in ALV Grid *----------------------------------------------------------------------* * -->LR_CONTENT text *---------------------------------------------------------------------* 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, lr_row TYPE string. MOVE 'Pricing Conditions Report' TO lr_head. CONCATENATE 'Condition Type : ' p_kschl INTO lr_row SEPARATED BY space. CREATE OBJECT lr_grid. lr_grid->create_header_information( row = 1 column = 1 text = lr_head tooltip = lr_head ). lr_grid->add_row( ). lr_label = lr_grid->create_label( row = 2 column = 1 text = lr_row tooltip = lr_row ). CONCATENATE 'Table : ' ls_tmc1t-gstru '/ Key Combination : ' ls_tmc1t-gstxt INTO lr_row SEPARATED BY space. lr_grid->add_row( ). lr_label = lr_grid->create_label( row = 3 column = 1 text = lr_row tooltip = lr_row ). lr_content = lr_grid. ENDFORM. "top_of_page |