Quantcast
Channel: SCN : Document List - ABAP Development
Viewing all articles
Browse latest Browse all 935

Access data browser without authorization to SE16

$
0
0


Hi Guys I just want to share my experience here, few days back I was searching for a way to access data browser without using SE16. I have landed at Function Modules  "RS_TOOL_ACCESS" ; "RS_TABLE_LIST_CREATE" and later I have realized that SAP uses a program "/1BCDWB/DBTABLE"  ( where TABLE is replaced with any name of any Table e.g,  "/1BCDWB/DBKNA1" ; "/1BCDWB/DBLFA1"  ).

 

                              Later I have realized that all the above ways need authorization to t-code SE16. But my requirement was I need to build SE16 kind of thing without having authorization to SE16.

 

                            I have used SE16 kind of layout via dynamic programing to acheive my requirement. I would like to share my experience here.

 

I have create a program "Y_VENDOR_TBLS" which uses SE16 kind of layout program "YSE16_LAYOUT" to generate required dynamic program.

 

 

              I have create a FM "Y_DYM_FIELD_SELECTION" to achieve dynamic input fields for selection.[ Copy GUI STATUS 'SELECTIO' from Program 'SAPLSETB' to main program of Function group; Create a screen 100 with model dailog box and reduce the screen to a box size ]

 

 

Testing with code -

Push button of a table.jpg

 

Press on LFA1 -> It should display data browser of LFA1

 

OPens data browser.jpg

 

For dynamic input fields -> Settings ->Fields for Selection

For Dynamic input fields.jpg

 

It displays below pop up as in SE16

Displays input options.jpg

 

Select few more input fields and select enter

Select few input fields.jpg

 

->Displays new input screen

New INput screen.jpg

 

 

-> One can try with code provided , you can feel SE16 kind of thing. Though my code deosn't support Settings->User paramters; Settings->Format list

 

 

Program - YSE16_LAYOUT

*&---------------------------------------------------------------------*
*& This Report is a layout to access SE16 by report Y_VENDOR_TBLS     *&
*& Please do not modify this, instead make of copy of it and use it   *&
*&---------------------------------------------------------------------*


REPORT  YSE16_LAYOUT.

TABLES: sscrfields.

SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE t1.

SELECTION-SCREEN SKIP 1.
PARAMETERS list_bre  TYPE rseumod-tblistbr DEFAULT '250'.
PARAMETERS max_sel   TYPE rseumod-tbmaxsel DEFAULT '500'.
SELECTION-SCREEN: END OF BLOCK b1.

PARAMETERS: p_table  TYPE dd02l-tabname DEFAULT 'XXXX' NO-DISPLAY.

DATA: i_selc_texts   TYPE STANDARD TABLE OF rsseltexts,
      prog           TYPE sy-repid VALUE sy-repid,
      list           TYPE STANDARD TABLE OF string,
      where          TYPE STANDARD TABLE OF string,
      it_fieldcat    TYPE lvc_t_fcat,
      tref           TYPE REF TO data,
      struct_type    TYPE REF TO cl_abap_structdescr,
      table_type     TYPE REF TO cl_abap_tabledescr,
      comp_tab1      TYPE cl_abap_structdescr=>component_table.


FIELD-SYMBOLS:
      <i_selc_texts> LIKE LINE OF i_selc_texts,
      <table>        TYPE STANDARD TABLE.


INITIALIZATION.


  APPEND INITIAL LINE TO i_selc_texts ASSIGNING <i_selc_texts>.
  <i_selc_texts>-name = 'LIST_BRE'.
  <i_selc_texts>-kind = 'P'.
  <i_selc_texts>-text = 'Width of Output List'(001).

  APPEND INITIAL LINE TO i_selc_texts ASSIGNING <i_selc_texts>.
  <i_selc_texts>-name = 'MAX_SEL'.
  <i_selc_texts>-kind = 'P'.
  <i_selc_texts>-text = 'Maximum No. of Hits'(002).


**--Set the Title
  PERFORM set_title_selection(saplsetb) USING p_table.

**--Set the PF Status same as SE16
  CALL FUNCTION 'RS_EXTERNAL_SELSCREEN_STATUS'
    EXPORTING
      p_fb = 'RS_DATABROWSE_STATUS_SET'.


**--Create texts for Select options and Paramerters at run time.
  CALL FUNCTION 'SELECTION_TEXTS_MODIFY'
    EXPORTING
      program  = prog
    TABLES
      seltexts = i_selc_texts.


AT SELECTION-SCREEN.

**--Copy GUI STATUS 'SELECTIO' from Program 'SAPLSETB'.

  CASE sscrfields-ucomm.
    WHEN 'ONLI'.
**--Select query on select options
      PERFORM select_query.
    WHEN 'AEIN'.
**--Lists of no.of Entries
      PERFORM select_no_entries.
    WHEN 'SEOP'.
**--Select Fields of repective table for select options
      PERFORM select_input_fields.
    WHEN OTHERS.
  ENDCASE.


END-OF-SELECTION.

  IF <table> IS ASSIGNED.

**--Fetch the field catlouge by passing table as structure
    CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
      EXPORTING
        i_structure_name = p_table
      CHANGING
        ct_fieldcat      = it_fieldcat.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.

**--Display the table as in GRID display
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
      EXPORTING
        it_fieldcat_lvc = it_fieldcat
      TABLES
        t_outtab        = <table>.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.

  ENDIF.  "IF <table> IS ASSIGNED.

*&---------------------------------------------------------------------*
*&      Form  SELECT_QUERY
*&---------------------------------------------------------------------*
* Select query on selected table with slected select options
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM select_query .

  FIELD-SYMBOLS: <fs> LIKE LINE OF comp_tab1.

  struct_type ?=
     cl_abap_typedescr=>describe_by_name( p_table ).
  comp_tab1 = struct_type->get_components( ).


  struct_type = cl_abap_structdescr=>create( comp_tab1 ).
  table_type = cl_abap_tabledescr=>create( struct_type ).
  CREATE DATA tref TYPE HANDLE table_type.
  ASSIGN tref->* TO <table>.

  LOOP AT comp_tab1 ASSIGNING <fs>.
    APPEND <fs>-name TO list.
  ENDLOOP.  " LOOP AT comp_tab1 ASSIGNING <fs>.

**--Import where conditions from Program - ZFI_VENDOR_TBLS to Dyanmic program
  IMPORT where TO where FROM MEMORY ID 'DYNMIC_PROG1'.

  IF max_sel IS INITIAL.

**--Dynamic Select query
    SELECT (list) FROM (p_table) INTO TABLE <table>
                  WHERE (where).

  ELSE.

**--Dynamic Select query
    SELECT (list) FROM (p_table) INTO TABLE <table>
                  UP TO max_sel ROWS
                  WHERE (where).

  ENDIF.


ENDFORM.                    " SELECT_QUERY
*&---------------------------------------------------------------------*
*&      Form  SELECT_NO_ENTRIES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM select_no_entries .

  DATA: isscr     TYPE STANDARD TABLE OF  rsscr,
        v_string  TYPE string.

  FIELD-SYMBOLS:
        <isscr> LIKE LINE OF isscr.

  REFRESH : where.
  LOAD REPORT prog PART 'SSCR' INTO isscr.

  DELETE isscr WHERE kind NE 'S'.

  IF NOT isscr[] IS INITIAL.

    LOOP AT isscr ASSIGNING <isscr> .
      IF sy-tabix = 1.

        CLEAR:v_string.
        CONCATENATE  <isscr>-name  'in'   <isscr>-name  INTO v_string SEPARATED BY space.
        APPEND v_string TO where.

      ELSE.

        CLEAR:v_string.
        CONCATENATE 'AND'  <isscr>-name  'in'   <isscr>-name  INTO v_string SEPARATED BY space.
        APPEND v_string TO where.

      ENDIF.

    ENDLOOP.  "LOOP AT isscr ASSIGNING <isscr>.

  ENDIF. "IF not isccr IS INITIAL.


**--Check the no.of entries
  SELECT COUNT(*) FROM (p_table) WHERE (where).
  IF sy-subrc = 0.
    MESSAGE i398(00) WITH 'Number of entries which meet' 'the selection criteria:' sy-dbcnt.
  else.
     MESSAGE i398(00) WITH 'Number of entries which meet' 'the selection criteria:' sy-dbcnt.
  ENDIF.


ENDFORM.                    " SELECT_NO_ENTRIES
*&---------------------------------------------------------------------*
*&      Form  SELECT_INPUT_FIELDS
*&---------------------------------------------------------------------*
* Dynamically select input fields for the given table
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM select_input_fields .

**--select input fields dynamically
  CALL FUNCTION 'Y_DYM_FIELD_SELECTION'
    EXPORTING
      p_table = p_table.

  LEAVE PROGRAM.

ENDFORM.                    " SELECT_INPUT_FIELDS

 

 

_____________________________________________________________________________________________

 

Program - Y_VENDOR_TBLS

 

 

 

*&---------------------------------------------------------------------*
*& Report  Y_VENDOR_TBLS
*&---------------------------------------------------------------------*
*& Display Vendor tables - LFA1,LFAS,LFB1
*&---------------------------------------------------------------------*


REPORT  Y_vendor_tbls.

*----------------------------------------------------------------------*
* Tables                                                               *
*----------------------------------------------------------------------*
TABLES:  sscrfields.

*----------------------------------------------------------------------*
* Data Declarations                                                    *
*----------------------------------------------------------------------*
DATA:    buttonis      TYPE dd02l-tabname,
         prog          TYPE c LENGTH 30 VALUE 'YSE16_LAYOUT',
         prog1         TYPE c LENGTH 30 VALUE 'YDYM_SE16',
         itab          TYPE TABLE OF string,
         where         TYPE TABLE OF string,
         v_line        TYPE i,
         v_string      TYPE string.


*----------------------------------------------------------------------*
* Field - Symbols                                                      *
*----------------------------------------------------------------------*
FIELD-SYMBOLS:
         <fs>          TYPE ANY,
        <itab>         LIKE LINE OF itab.

*----------------------------------------------------------------------*
* Selection Screen                                                     *
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-100.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN PUSHBUTTON (15) w_bt101 USER-COMMAND bt101.
SELECTION-SCREEN PUSHBUTTON (15) w_bt102 USER-COMMAND bt102.
SELECTION-SCREEN PUSHBUTTON (15) w_bt103 USER-COMMAND bt103.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK b1.

*----------------------------------------------------------------------*
* Initialization                                                       *
*----------------------------------------------------------------------*
INITIALIZATION.

**--Declare Tables as buttons
  w_bt101 = 'LFA1'.
  w_bt102 = 'LFAS'.
  w_bt103 = 'LFB1'.


*----------------------------------------------------------------------*
* At Selection Screen                                                  *
*----------------------------------------------------------------------*

AT SELECTION-SCREEN.

*------- Fetch the Table which need to be display
  LOOP AT SCREEN.
    IF screen-name CS sscrfields-ucomm.
      buttonis = screen-name.
      EXIT.
    ENDIF.  " IF screen-name CS sscrfields-ucomm.
  ENDLOOP.  "LOOP AT SCREEN.

  IF NOT buttonis IS INITIAL.

**--Fetch the table named assiociated with the button name
    ASSIGN (buttonis) TO <fs>.

**--Display the table selected via pushbutton
    PERFORM se16_program USING <fs>.

  ENDIF.   "IF NOT buttonis IS INITIAL.

*----------------------------------------------------------------------*
* End -of -Selection                                                   *
*----------------------------------------------------------------------*
END-OF-SELECTION.

*---------------------------------------------------------------------*
* Display the selected table in se16
*---------------------------------------------------------------------*
FORM se16_program USING table TYPE any.

  DATA: table1 TYPE dd02l-tabname.

  table1 = table.

*  CALL FUNCTION 'RS_TOOL_ACCESS'
*    EXPORTING
*      operation          = 'TAB_CONT'
*      object_name        = table1
*      object_type        = 'VIEW'
*      monitor_activation = space
*    EXCEPTIONS
*      not_executed       = 0.


* submit /1BCDWB/DBLFA1 via selection-screen and return.

  PERFORM call_se16_table USING table1.

ENDFORM.                    " FORM se16_program USING table1 TYPE any.
*&---------------------------------------------------------------------*
*&      Form  CALL_SE16_TABLE
*&---------------------------------------------------------------------*
*  Create a program dynamically with selected Select options
*----------------------------------------------------------------------*
*   Input -> Table
*----------------------------------------------------------------------*
FORM call_se16_table  USING   table TYPE dd02l-tabname.

**--Define structure for Field selection table
  TYPES: BEGIN OF st_final,
             tabname      TYPE tabname,
             fieldname    TYPE fieldname,
             datatype     TYPE datatype,
             scrtext_m    TYPE scrtext_m,
             flag         TYPE c LENGTH 1,
           END OF st_final.


  DATA:      i_tab        TYPE STANDARD TABLE OF st_final,
             v_string     TYPE string,
             x030l        TYPE x030l,
             l_dfies      TYPE STANDARD TABLE OF dfies.

  FIELD-SYMBOLS:
             <i_tab>      LIKE LINE OF i_tab,
             <l_dfies>    LIKE LINE OF l_dfies.


**--refresh all internal tables used
  REFRESH: itab,i_tab,l_dfies,where.

**-- Read the layout code of program designed for SE16 approach
  READ REPORT prog INTO itab .
  IF sy-subrc = 0.


**--Insert Tables line w.rt. table selected on selection screen into dynamic program
    LOOP AT itab ASSIGNING <itab> WHERE table_line CS 'REPORT  Yse16_layout'.
      v_line = sy-tabix.
      v_line = v_line + 1.

      CLEAR:v_string.
      CONCATENATE 'TABLES:'  table  '.' INTO v_string SEPARATED BY space.
      INSERT v_string INTO itab INDEX v_line.
      EXIT.
    ENDLOOP. " LOOP AT itab ASSIGNING <itab> WHERE table_line CS 'REPORT  Yse16_layout'.


**--Insert Selection Options into dynamic program
    LOOP AT itab ASSIGNING <itab> WHERE table_line CS 'SELECTION-SCREEN SKIP 1'.
      v_line = sy-tabix.
      v_line = v_line - 1.

**--Import Field selection list from Function group - YFI_DYNAMIC - Main program - LYFI_DYNAMICO01
      IMPORT i_tab TO i_tab FROM MEMORY ID  'SAPLYFI_DYNAMIC'.
      IF NOT i_tab IS INITIAL.

**--Delete entries where fieldname is MANDT
        DELETE i_tab  WHERE fieldname = 'MANDT'.

**--Insert Select options for only selected entries
        LOOP AT i_tab ASSIGNING <i_tab> WHERE flag = 'X'.

          CLEAR:v_string.
          CONCATENATE 'SELECT-OPTIONS: '  <i_tab>-fieldname  'for '  INTO v_string SEPARATED BY space.
          CONCATENATE v_string            <i_tab>-tabname            INTO v_string SEPARATED BY space.
          CONCATENATE v_string  '-'       <i_tab>-fieldname  '.'     INTO v_string.
          INSERT v_string INTO itab INDEX v_line.

          v_line = v_line + 1.
        ENDLOOP.  "LOOP AT i_tab ASSIGNING <i_tab> WHERE flag = 'X'.

        CLEAR: v_string.
        INSERT v_string INTO itab INDEX v_line.

**--Delete the field list from Memory Function group - YFI_DYNAMIC - Main program - LYFI_DYNAMICO01
        DELETE FROM MEMORY ID 'SAPLYFI_DYNAMIC'.

      ELSE.
**---Get initial settings of field selection from Key fields of Table

**--Fetch all fields of table
        CALL FUNCTION 'DDIF_FIELDINFO_GET'
          EXPORTING
            tabname   = table
          IMPORTING
            x030l_wa  = x030l
          TABLES
            dfies_tab = l_dfies
          EXCEPTIONS
            OTHERS    = 0.

**--Delete entry with field name MANDT
        DELETE l_dfies WHERE fieldname = 'MANDT'.

**--Insert Select options for Key fields - Initially
        LOOP AT l_dfies ASSIGNING <l_dfies> WHERE keyflag = 'X'.

          CLEAR:v_string.
          CONCATENATE 'SELECT-OPTIONS:' <l_dfies>-fieldname  'for' INTO v_string SEPARATED BY space.
          CONCATENATE v_string          <l_dfies>-tabname          INTO v_string SEPARATED BY space.
          CONCATENATE v_string  '-'     <l_dfies>-fieldname '.'    INTO v_string.
          INSERT v_string INTO itab INDEX v_line.

          v_line = v_line + 1.

        ENDLOOP.   " LOOP AT L_DFIES ASSIGNING <L_DFIES> WHERE KEYFLAG = 'X'.

        CLEAR: v_string.
        INSERT v_string INTO itab INDEX v_line.

      ENDIF.  "IF NOT i_tab IS INITIAL.

      EXIT.
    ENDLOOP. "LOOP AT itab ASSIGNING <itab> WHERE table_line CS 'SELECTION-SCREEN SKIP 1'.


**--Insert texts for Selection Options.
    LOOP AT itab ASSIGNING <itab> WHERE table_line CS 'INITIALIZATION'.
      v_line = sy-tabix.
      v_line = v_line + 2.

      IF NOT i_tab[] IS INITIAL.

        LOOP AT i_tab ASSIGNING <i_tab> WHERE flag = 'X'.

          INSERT ' APPEND INITIAL LINE TO I_SELC_TEXTS ASSIGNING <I_SELC_TEXTS>.' INTO itab INDEX v_line.
          v_line = v_line + 1.

          CLEAR:v_string.
          CONCATENATE '<I_SELC_TEXTS>-NAME = '   ''''       INTO v_string SEPARATED BY space.
          CONCATENATE v_string  <i_tab>-fieldname ''''  '.' INTO v_string.
          INSERT v_string INTO itab INDEX v_line.
          v_line = v_line + 1.

          INSERT '<I_SELC_TEXTS>-KIND = ''S''.'             INTO itab INDEX v_line.
          v_line = v_line + 1.

          CLEAR:v_string.
          CONCATENATE '<I_SELC_TEXTS>-TEXT = '   ''''       INTO v_string SEPARATED BY space.
          CONCATENATE v_string <i_tab>-scrtext_m ''''  '.'  INTO v_string.
          INSERT v_string INTO itab INDEX v_line.
          v_line = v_line + 1.

          CLEAR:v_string.
          INSERT v_string INTO itab INDEX v_line.
          v_line = v_line + 1.

        ENDLOOP.  "LOOP AT I_TAB ASSIGNING <I_TAB> WHERE FLAG = 'X'.


      ELSEIF NOT l_dfies[] IS INITIAL.


        LOOP AT l_dfies ASSIGNING <l_dfies> WHERE keyflag = 'X'.

          INSERT ' APPEND INITIAL LINE TO I_SELC_TEXTS ASSIGNING <I_SELC_TEXTS>.' INTO itab INDEX v_line.
          v_line = v_line + 1.

          CLEAR:v_string.
          CONCATENATE '<I_SELC_TEXTS>-NAME = '  ''''         INTO v_string SEPARATED BY space.
          CONCATENATE v_string <l_dfies>-fieldname ''''  '.' INTO v_string.
          INSERT v_string INTO itab INDEX v_line.
          v_line = v_line + 1.

          INSERT '<I_SELC_TEXTS>-KIND = ''S''.'              INTO itab INDEX v_line.
          v_line = v_line + 1.

          CLEAR:v_string.
          CONCATENATE '<I_SELC_TEXTS>-TEXT = '  ''''         INTO v_string SEPARATED BY space.
          CONCATENATE v_string <l_dfies>-scrtext_l ''''  '.' INTO v_string.
          INSERT v_string INTO itab INDEX v_line.
          v_line = v_line + 1.


          CLEAR:v_string.
          INSERT v_string INTO itab INDEX v_line.
          v_line = v_line + 1.

        ENDLOOP.  "LOOP AT L_DFIES ASSIGNING <L_DFIES> WHERE FLAG = 'X'.

      ENDIF.  "IF NOT i_tab[] IS INITIAL. ; ELSEIF NOT l_dfies[] IS INITIAL.

      EXIT.
    ENDLOOP.  " LOOP AT ITAB ASSIGNING <ITAB> WHERE TABLE_LINE CS 'INITIALIZATION'.

 

**--Replace XXXX with table name
    LOOP AT itab ASSIGNING <itab> WHERE table_line CS 'PARAMETERS: P_TABLE'.
      REPLACE 'XXXX' IN <itab> WITH table.
    ENDLOOP.

**--Delete existing program PROG1
    DELETE REPORT prog1.

**--Insert code from ITAB into Program PROG1
    INSERT REPORT prog1 FROM itab.

**--Generate the created report PROG1
    GENERATE REPORT prog1.


**--Export the where condition.

    IF NOT i_tab[] IS INITIAL.

      LOOP AT i_tab ASSIGNING <i_tab> WHERE flag = 'X'.

        IF sy-tabix = 1.

          CLEAR:v_string.
          CONCATENATE <i_tab>-fieldname  'in'  <i_tab>-fieldname INTO v_string SEPARATED BY space.
          APPEND v_string TO where.

        ELSE.

          CLEAR:v_string.
          CONCATENATE 'AND'  <i_tab>-fieldname  'in'  <i_tab>-fieldname INTO v_string SEPARATED BY space.
          APPEND v_string TO where.

        ENDIF.

      ENDLOOP.  "LOOP AT I_TAB ASSIGNING <I_TAB> WHERE FLAG = 'X'.


    ELSEIF NOT l_dfies[] IS INITIAL.


      LOOP AT l_dfies ASSIGNING <l_dfies> WHERE keyflag = 'X'.

        IF sy-tabix = 1.

          CLEAR:v_string.
          CONCATENATE  <l_dfies>-fieldname  'in'   <l_dfies>-fieldname  INTO v_string SEPARATED BY space.
          APPEND v_string TO where.

        ELSE.

          CLEAR:v_string.
          CONCATENATE 'AND'  <l_dfies>-fieldname   'in'  <l_dfies>-fieldname INTO v_string SEPARATED BY space.
          APPEND v_string TO where.

        ENDIF.

      ENDLOOP.  "LOOP AT L_DFIES ASSIGNING <L_DFIES> WHERE KEYFLAG = 'X'.

    ENDIF. "IF NOT i_tab[] IS INITIAL. ; ELSEIF NOT l_dfies[] IS INITIAL.

**--Export where conditions to the dynamic program.
    DELETE FROM MEMORY ID  'DYNMIC_PROG1'.
    EXPORT where FROM where TO MEMORY ID 'DYNMIC_PROG1'.

**--Submit the program to display
    SUBMIT (prog1) VIA SELECTION-SCREEN AND RETURN.

**--Delete existing program PROG1
    DELETE REPORT prog1.

  ENDIF.  "  READ REPORT PROG INTO ITAB .

ENDFORM.                    " CALL_SE16_TABLE

 

 

______________________________________________________________________________

 

Attached are the files to create Function module  - Y_DYM_FIELD_SELECTION ; its top include; Include program


Viewing all articles
Browse latest Browse all 935

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>