Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

Dynamic Selection Screen with Select Options/range

Former Member
0 Kudos

Hi Every One,

I am new to abap and need help with this.

I am trying to a do a dynamic search help with select options in a selection screen. My requirement is = displaying vbap-posnr ('item no') based on the first field vbak-vbeln (sales order).

if i input sales-order-low without sales-order-high, I should get item values belonging to only sales-order-low and viceversa.

Similarly, if I give a range in select-options, all the items belonging to that sales order should be displayed.

Below is the code that I have given, but it does not give any values. Need help with this code to achive my requirementt.

tables: vbak, vbap.

TYPES: BEGIN OF ty_vbap,

       vbeln type vbak-vbeln,

       posnr type vbap-posnr

       END OF ty_vbap.

*--------------------------------------------------------------*

*Data Declaration

*--------------------------------------------------------------*

DATA: gwa_posnr      TYPE ty_vbap,

      gt_posnr       TYPE TABLE OF ty_vbap.

DATA: gt_return      TYPE TABLE OF ddshretval,

      gwa_return     TYPE ddshretval.

DATA: gwa_dynpfields TYPE dynpread,

      gt_dynpfields  TYPE TABLE OF dynpread.

DATA: gv_vbeln       TYPE vbak-vbeln.

*--------------------------------------------------------------*

*Selection-Screen

*--------------------------------------------------------------*

SELECT-OPTIONS: SLS_OR TYPE VBAK-VBELN.

PARAMETERS: ITEM_NO TYPE VBAP-POSNR.

*--------------------------------------------------------------*

*Selection-Screen on Value-Request

*--------------------------------------------------------------*

AT SELECTION-SCREEN ON VALUE-REQUEST FORITEM_NO.

  REFRESH gt_dynpfields.

  gwa_dynpfields-fieldname = 'SLS_OR-LOW'.

  APPEND gwa_dynpfields TO gt_dynpfields.

*Get plant value on the selection screen

  CALL FUNCTION 'DYNP_VALUES_READ'

    EXPORTING

      dyname               = sy-repid

      dynumb               = sy-dynnr

    TABLES

      dynpfields           = gt_dynpfields

    EXCEPTIONS

      invalid_abapworkarea = 1

      invalid_dynprofield  = 2

      invalid_dynproname   = 3

      invalid_dynpronummer = 4

      invalid_request      = 5

      no_fielddescription  = 6

      invalid_parameter    = 7

      undefind_error       = 8

      double_conversion    = 9

      stepl_not_found      = 10

      OTHERS               = 11.

  READ TABLE gt_dynpfields INTO gwa_dynpfields

         WITH KEY fieldname = 'SLS_OR-LOW'.

  IF sy-subrc = 0.

    gv_VBELN = gwa_dynpfields-fieldvalue.

  ENDIF.

*Get values from the database based on plant

  SELECT a~VBELN

         b~POSNR

        

         INTO TABLE gt_POSNR

         FROM VBAK AS a

         INNER JOIN VBAP AS b

         ON a~VBELN = b~VBELN

         WHERE B~POSNR = GV_VBELN.

         

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'

    EXPORTING

      retfield        = 'POSNR'

      value_org       = 'S'

      DYNPROFIELD = 'SLS_OR-LOW'

    TABLES

      value_tab       = gt_POSNR

      return_tab      = gt_return

    EXCEPTIONS

      parameter_error = 1

      no_values_found = 2

      OTHERS          = 3.

  READ TABLE gt_return INTO gwa_return INDEX 1.

  IF sy-subrc = 0.

    ITEM_NO = gwa_return-fieldval.

  ENDIF.

1 ACCEPTED SOLUTION

Former Member
0 Kudos

hi mack,

there were many mistakes your code.

Now it seems to be working. have a look.

tables: vbak, vbap.


TYPES: BEGIN OF ty_vbap,
        vbeln type vbak-vbeln,
        posnr type vbap-posnr,
        END OF ty_vbap.
*--------------------------------------------------------------*
*Data Declaration
*--------------------------------------------------------------*
DATA: gwa_posnr      TYPE ty_vbap,
       gt_posnr       TYPE TABLE OF ty_vbap.
DATA: gt_return      TYPE TABLE OF ddshretval,
       gwa_return     TYPE ddshretval.
DATA: gwa_dynpfields TYPE dynpread,
       gt_dynpfields  TYPE TABLE OF dynpread.
DATA: gv_vbeln       TYPE vbak-vbeln.
*--------------------------------------------------------------*
*Selection-Screen
*--------------------------------------------------------------*
SELECT-OPTIONS: SLS_OR FOR VBAK-VBELN.
PARAMETERS: ITEM_NO TYPE VBAP-POSNR.

*--------------------------------------------------------------*
*Selection-Screen on Value-Request
*--------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR ITEM_NO.

   REFRESH gt_dynpfields.

  
   gwa_dynpfields-fieldname = 'SLS_OR-LOW'.
   APPEND gwa_dynpfields TO gt_dynpfields.

*Get plant value on the selection screen

   CALL FUNCTION 'DYNP_VALUES_READ'
     EXPORTING
       dyname               = sy-repid
       dynumb               = sy-dynnr
     TABLES
       dynpfields           = gt_dynpfields
     EXCEPTIONS
       invalid_abapworkarea = 1
       invalid_dynprofield  = 2
       invalid_dynproname   = 3
       invalid_dynpronummer = 4
       invalid_request      = 5
       no_fielddescription  = 6
       invalid_parameter    = 7
       undefind_error       = 8
       double_conversion    = 9
       stepl_not_found      = 10
       OTHERS               = 11.

   READ TABLE gt_dynpfields INTO gwa_dynpfields
          WITH KEY fieldname = 'SLS_OR-LOW'.

  
   IF sy-subrc = 0.
     gv_VBELN = gwa_dynpfields-fieldvalue.
   ENDIF.
  
   CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
     EXPORTING
       INPUT         = gv_VBELN
    IMPORTING
      OUTPUT        = gv_VBELN
             .
  

 
*Get values from the database based on plant
   SELECT a~VBELN
          b~POSNR
          INTO TABLE gt_POSNR
          FROM VBAK AS a
          INNER JOIN VBAP AS b
          ON a~VBELN = b~VBELN
          WHERE B~VBELN = GV_VBELN.

        

   CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
     EXPORTING
       retfield        = 'POSNR'
       value_org       = 'S'
       DYNPROFIELD = 'ITEM_NO'
     TABLES
       value_tab       = gt_POSNR
       return_tab      = gt_return
     EXCEPTIONS
       parameter_error = 1
       no_values_found = 2
       OTHERS          = 3.

   READ TABLE gt_return INTO gwa_return INDEX 1.

   IF sy-subrc = 0.
     ITEM_NO = gwa_return-fieldval.
   ENDIF.

5 REPLIES 5

Former Member
0 Kudos

hi mack,

there were many mistakes your code.

Now it seems to be working. have a look.

tables: vbak, vbap.


TYPES: BEGIN OF ty_vbap,
        vbeln type vbak-vbeln,
        posnr type vbap-posnr,
        END OF ty_vbap.
*--------------------------------------------------------------*
*Data Declaration
*--------------------------------------------------------------*
DATA: gwa_posnr      TYPE ty_vbap,
       gt_posnr       TYPE TABLE OF ty_vbap.
DATA: gt_return      TYPE TABLE OF ddshretval,
       gwa_return     TYPE ddshretval.
DATA: gwa_dynpfields TYPE dynpread,
       gt_dynpfields  TYPE TABLE OF dynpread.
DATA: gv_vbeln       TYPE vbak-vbeln.
*--------------------------------------------------------------*
*Selection-Screen
*--------------------------------------------------------------*
SELECT-OPTIONS: SLS_OR FOR VBAK-VBELN.
PARAMETERS: ITEM_NO TYPE VBAP-POSNR.

*--------------------------------------------------------------*
*Selection-Screen on Value-Request
*--------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR ITEM_NO.

   REFRESH gt_dynpfields.

  
   gwa_dynpfields-fieldname = 'SLS_OR-LOW'.
   APPEND gwa_dynpfields TO gt_dynpfields.

*Get plant value on the selection screen

   CALL FUNCTION 'DYNP_VALUES_READ'
     EXPORTING
       dyname               = sy-repid
       dynumb               = sy-dynnr
     TABLES
       dynpfields           = gt_dynpfields
     EXCEPTIONS
       invalid_abapworkarea = 1
       invalid_dynprofield  = 2
       invalid_dynproname   = 3
       invalid_dynpronummer = 4
       invalid_request      = 5
       no_fielddescription  = 6
       invalid_parameter    = 7
       undefind_error       = 8
       double_conversion    = 9
       stepl_not_found      = 10
       OTHERS               = 11.

   READ TABLE gt_dynpfields INTO gwa_dynpfields
          WITH KEY fieldname = 'SLS_OR-LOW'.

  
   IF sy-subrc = 0.
     gv_VBELN = gwa_dynpfields-fieldvalue.
   ENDIF.
  
   CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
     EXPORTING
       INPUT         = gv_VBELN
    IMPORTING
      OUTPUT        = gv_VBELN
             .
  

 
*Get values from the database based on plant
   SELECT a~VBELN
          b~POSNR
          INTO TABLE gt_POSNR
          FROM VBAK AS a
          INNER JOIN VBAP AS b
          ON a~VBELN = b~VBELN
          WHERE B~VBELN = GV_VBELN.

        

   CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
     EXPORTING
       retfield        = 'POSNR'
       value_org       = 'S'
       DYNPROFIELD = 'ITEM_NO'
     TABLES
       value_tab       = gt_POSNR
       return_tab      = gt_return
     EXCEPTIONS
       parameter_error = 1
       no_values_found = 2
       OTHERS          = 3.

   READ TABLE gt_return INTO gwa_return INDEX 1.

   IF sy-subrc = 0.
     ITEM_NO = gwa_return-fieldval.
   ENDIF.

0 Kudos

Thank You so much. I have corrected my mistakes.

Former Member
0 Kudos

For starters, the WHERE clause is incorrect. It should be:

WHERE b~vbeln = gv_vbeln.

Rob

0 Kudos

Additionally, before the SELECT, you will have to add:

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'

  EXPORTING

    input = gv_vbeln

  IMPORTING

    output = gv_vbeln.

Rob

Former Member
0 Kudos

HI

I have done same thing in my report..

check below logic for your ref..

REPORT  zreport.

*Structure declaration

TYPES: BEGIN OF ty_posnr,

       vbeln TYPE vbeln,

       posnr TYPE vbap-posnr,

       END OF ty_posnr.

*internal table creatioin

DATA:t_posnr TYPE STANDARD TABLE OF ty_posnr INITIAL SIZE 0.

DATA: t_dyn TYPE TABLE OF dynpread,

      w_dyn TYPE dynpread.

DATA: g_vbeln TYPE likp-vbeln,

      g_posnr LIKE vbap-posnr.

*Selection screen

SELECTION-SCREEN BEGIN OF BLOCK b1.

SELECT-OPTIONS: s_vbeln FOR g_vbeln NO INTERVALS NO-EXTENSION ,

s_posnr FOR g_posnr NO INTERVALS NO-EXTENSION .

SELECTION-SCREEN END OF BLOCK b1.

*At selection screen on event

AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_posnr-low.

  PERFORM f4_help.

*&---------------------------------------------------------------------*

*&      Form  f4_help

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

FORM f4_help .

  w_dyn-fieldname = 'S_VBELN-LOW'.

  APPEND w_dyn TO t_dyn.

  CALL FUNCTION 'DYNP_VALUES_READ'

     EXPORTING

       dyname                               = sy-repid

       dynumb                               = '1000'

*   translate_to_upper                   = 'X'

*   REQUEST                              = ' '

*   PERFORM_CONVERSION_EXITS             = 'X'

*   PERFORM_INPUT_CONVERSION             = 'X'

*   DETERMINE_LOOP_INDEX                 = ' '

*   START_SEARCH_IN_CURRENT_SCREEN       = ' '

*   START_SEARCH_IN_MAIN_SCREEN          = ' '

*   START_SEARCH_IN_STACKED_SCREEN       = ' '

*   START_SEARCH_ON_SCR_STACKPOS         = ' '

*   SEARCH_OWN_SUBSCREENS_FIRST          = ' '

*   SEARCHPATH_OF_SUBSCREEN_AREAS        = ' '

     TABLES

       dynpfields                           = t_dyn

EXCEPTIONS

   invalid_abapworkarea                 = 1

   invalid_dynprofield                  = 2

   invalid_dynproname                   = 3

   invalid_dynpronummer                 = 4

   invalid_request                      = 5

   no_fielddescription                  = 6

   invalid_parameter                    = 7

   undefind_error                       = 8

   double_conversion                    = 9

   stepl_not_found                      = 10

   OTHERS                               = 11

             .

  IF sy-subrc <> 0.

    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

  ENDIF.

  CLEAR w_dyn.

  READ TABLE t_dyn INTO w_dyn WITH KEY fieldname = 'S_VBELN-LOW' .

  IF sy-subrc = 0.

    SELECT vbeln

           posnr

           FROM vbap

           INTO TABLE t_posnr

           WHERE vbeln = w_dyn-fieldvalue.

  ENDIF.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'

    EXPORTING

*            DDIC_STRUCTURE         = ' '

            retfield               = 'POSNR'

*            pvalkey                = ''

            dynpprog               = sy-repid

            dynpnr                 = '1000'

            dynprofield            = 'S_POSNR-LOW'

*            STEPL                  = 0

*            WINDOW_TITLE           =

*            VALUE                  = ' '

            value_org              = 'S'

*            MULTIPLE_CHOICE        = ' '

*            DISPLAY                = ' '

*            CALLBACK_PROGRAM       = ' '

*            CALLBACK_FORM          = ' '

*            MARK_TAB               =

*          IMPORTING

*            USER_RESET             =

    TABLES

      value_tab              = t_posnr

*            FIELD_TAB              =

*            RETURN_TAB             =

*            DYNPFLD_MAPPING        =

*          EXCEPTIONS

*            PARAMETER_ERROR        = 1

*            NO_VALUES_FOUND        = 2

*            OTHERS                 = 3

            .

  IF sy-subrc <> 0.

* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ENDIF.

ENDFORM.                                                    " f4_help

regards

laxman