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: 

Code reusabilty for custom F4 helps

Former Member
0 Kudos

Hi Folks,

i want to reuse my code for F4 functionality like

im having two characterstics selections screen fields,

im creating custom f4 helps since both are same

AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_CHNAM1-LOW.

PERFORM CHAR_F4_HELP.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_CHNAM2-LOW.

PERFORM CHAR_F4_HELP.

FORM CHAR_F4_HELP .

DATA: BEGIN OF T_KLAH OCCURS 0,

CLINT TYPE CLINT,

END OF T_KLAH.

DATA: BEGIN OF T_KSML OCCURS 0,

IMERK TYPE ATINN,

END OF T_KSML.

DATA: BEGIN OF T_CABN OCCURS 0,

ATINN TYPE ATINN,

ATNAM TYPE ATNAM,

END OF T_CABN.

DATA: BEGIN OF T_CABNT OCCURS 0,

ATINN TYPE ATINN,

SPRAS TYPE SPRAS,

ATBEZ TYPE ATBEZ,

END OF T_CABNT.

DATA: BEGIN OF T_FINAL OCCURS 0,

ATNAM TYPE ATNAM,

ATBEZ TYPE ATBEZ,

END OF T_FINAL.

DATA: T_RETURN3 LIKE DDSHRETVAL OCCURS 0 WITH HEADER LINE,

V_NEW TYPE P.

w_cabns type atinn .

IF NOT S_CLASS1 IS INITIAL.

SELECT CLINT FROM KLAH INTO TABLE T_KLAH

WHERE KLART = '011' AND

CLASS = S_CLASS1-LOW .

IF NOT T_KLAH[] IS INITIAL.

SELECT IMERK FROM KSML INTO TABLE T_KSML

FOR ALL ENTRIES IN T_KLAH

WHERE CLINT = T_KLAH-CLINT.

ENDIF.

IF NOT T_KSML[] IS INITIAL.

SELECT ATINN ATNAM FROM CABN INTO TABLE T_CABN

FOR ALL ENTRIES IN T_KSML

WHERE ATINN = T_KSML-IMERK.

SELECT ATINN SPRAS ATBEZ FROM CABNT INTO TABLE T_CABNT

FOR ALL ENTRIES IN T_KSML

WHERE ATINN = T_KSML-IMERK.

ENDIF.

REFRESH T_FINAL[].

LOOP AT T_CABN.

T_FINAL-ATNAM = T_CABN-ATNAM.

READ TABLE T_CABNT WITH KEY ATINN = T_CABN-ATINN SPRAS = 'E'.

T_FINAL-ATBEZ = T_CABNT-ATBEZ.

APPEND T_FINAL.

CLEAR T_FINAL.

ENDLOOP.

CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'

EXPORTING

RETFIELD = 'ATNAM'

DYNPPROG = SY-CPROG

DYNPNR = SY-DYNNR

DYNPROFIELD = 'S_CHNAM1-LOW'

VALUE_ORG = 'S'

TABLES

VALUE_TAB = T_FINAL

RETURN_TAB = T_RETURN3

EXCEPTIONS

PARAMETER_ERROR = 1

NO_VALUES_FOUND = 2

OTHERS = 3.

IF SY-SUBRC = 0.

READ TABLE T_RETURN3 WITH KEY RETFIELD = 'S_CHNAM1-LOW'.

IF SY-SUBRC EQ 0.

S_CHNAM1-LOW = T_RETURN3-FIELDVAL.

SELECT ATINN FROM CABN INTO W_CABNS

WHERE ATNAM = T_RETURN3-FIELDVAL.

ENDSELECT.

ENDIF.

ENDIF.

ENDIF.

i want to use the same for my s_chnam2 , s_cham3 fields etc.,

please give some inputs.

Thanks,

Shwetha

11 REPLIES 11

Former Member
0 Kudos

Hi,

Try this.

Maintain the retfield and dynprofield in text elements and call the subroutine accordingly.

Ex: text-001 = ATNAM and text-002 = S_CHNAM1-LOW

PERFORM CHAR_F4_HELP using text-001

text-002.

In form, pass as

RETFIELD = <text-001 formal parameter>

DYNPROFIELD = <text-002 formal parameter>

Regards,

Sharin

0 Kudos

Hi folks,

can you please elobrate..

former_member585060
Active Contributor
0 Kudos

Hi,

You must not use the CLASS value while getting entries from KLAH table.

Declare 3 internal tables(or no. of internal tables equal to no. of fields in selection screen) with 2 fileds.

While accessing the KLAH table, don't pass the CLASS value, get all the entries for a '011' class type.

SELECT-OPTIONS : s_chnam1 FOR klah-class,
                 s_chnam2 FOR klah-class,
                 s_chnam3 FOR klah-class.


TYPES : BEGIN OF t_field,
          fieldname1 TYPE dd03l-fieldname,
          fieldname2 TYPE dd03l-fieldname,
        END OF t_field.

DATA : i_chnam1     TYPE STANDARD TABLE OF t_field,
       i_chnam2     TYPE STANDARD TABLE OF t_field,
       i_chnam3     TYPE STANDARD TABLE OF t_field.



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

  IF i_chnam1[] IS INITIAL.
    PERFORM get_f4values CHANGING s_chnam1-low
                                   i_chnam1[].
  ENDIF.

  PERFORM display_value TABLES   i_chnam1[]
                        CHANGING s_chnam1-low.

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

  IF i_chnam2[] IS INITIAL.
    PERFORM get_f4values CHANGING s_chnam2-low
                                   i_chnam2[].
  ENDIF.

  PERFORM display_value TABLES   i_chnam2[]
                        CHANGING s_chnam2-low.

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

  IF i_chnam3[] IS INITIAL.
    PERFORM get_f4values CHANGING s_chnam3-low
                                   i_chnam3[].
  ENDIF.

  PERFORM display_value TABLES   i_chnam3[]
                        CHANGING s_chnam3-low.

START-OF-SELECTION.

  BREAK-POINT.

Forms are in the second posting.

Thanks & Regards

Bala Krishna.

0 Kudos
FORM get_f4values  CHANGING p_sfield
                            p_table TYPE ANY TABLE.

  DATA: BEGIN OF t_klah OCCURS 0,
           clint TYPE clint,
         END OF t_klah.

  DATA: BEGIN OF t_ksml OCCURS 0,
           imerk TYPE atinn,
        END OF t_ksml.

  DATA: BEGIN OF t_cabn OCCURS 0,
           atinn TYPE atinn,
           atnam TYPE atnam,
        END OF t_cabn.

  DATA: BEGIN OF t_cabnt OCCURS 0,
          atinn TYPE atinn,
          spras TYPE spras,
          atbez TYPE atbez,
        END OF t_cabnt.

  DATA: BEGIN OF t_final OCCURS 0,
          atnam TYPE atnam,
          atbez TYPE atbez,
        END OF t_final.


  SELECT clint
               FROM klah
               INTO TABLE t_klah
               WHERE klart = '011'.

  IF NOT t_klah[] IS INITIAL.

    SELECT imerk FROM ksml INTO TABLE t_ksml
    FOR ALL ENTRIES IN t_klah
    WHERE clint = t_klah-clint.

  ENDIF.

  IF NOT t_ksml[] IS INITIAL.
    SELECT atinn atnam FROM cabn INTO TABLE t_cabn
    FOR ALL ENTRIES IN t_ksml
    WHERE atinn = t_ksml-imerk.

    SELECT atinn spras atbez FROM cabnt INTO TABLE t_cabnt
    FOR ALL ENTRIES IN t_ksml
    WHERE atinn = t_ksml-imerk.

  ENDIF.

  REFRESH t_final[].
  LOOP AT t_cabn.
    t_final-atnam = t_cabn-atnam.
    READ TABLE t_cabnt WITH KEY atinn = t_cabn-atinn spras = 'E'.
    t_final-atbez = t_cabnt-atbez.
    APPEND t_final.
    CLEAR t_final.
  ENDLOOP.

  SORT t_final.


  p_table[] = t_final[].

ENDFORM.

FORM display_value  TABLES   p_table
                    CHANGING p_sfield.

  DATA :  lt_return     TYPE STANDARD TABLE OF ddshretval, " Selected
          ls_return     TYPE ddshretval.                  " Workarea


  CONSTANTS:  lc_s         TYPE c VALUE 'S'.


  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield        = 'FIELDNAME1'   "First field name in T_FIELD structure
      dynpprog        = sy-repid
      dynpnr          = sy-dynnr
      window_title    = 'Select Size'
      display         = ' '
      value_org       = lc_s
    TABLES
      value_tab       = p_table
      return_tab      = lt_return
    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.

* Check whether LT_RETURN is blank
  CHECK NOT lt_return[] IS INITIAL.
  READ TABLE lt_return INTO ls_return INDEX 1.
  p_sfield = ls_return-fieldval.


  REFRESH : lt_return.
  CLEAR : ls_return.
ENDFORM.

Thanks & Regards

Bala Krishna

Edited by: Bala Krishna on Dec 16, 2011 5:46 PM

0 Kudos

Hi Krishna,

Thanks for your input..But in post you mentioned as " you must not use class while getting values from KLAh table".

In my case it is must since im creating custom helps for characterstic name based on class provided above and custom f4 for characterstic value based on characterstic name, so i need to mention my class name how can i provide my class1 or class2 or class3 how can I know, using 'DYNP_VALUES_READ' FM we can get the value of dynpro value but how can get my class name dynamically based von my selection.

class1 -


characterstic name1 -


characterstic value1 -


class2 -


characterstic name2 -


characterstic value 2 -


please any one throw some light ..

Thanks in advance,

Shwetha

0 Kudos

Hi Swetha,

I am still not clear, is your selection screen having only with CLASS names or it also has Characteristics Name and Characteristic Value and you want F4 for only those values.

Can you provide your Selection screen defined fields.

Thanks & Regards

Bala Krishna

0 Kudos

Hi Krishna,

please find my selection screen design below, and please let me know if you need any further detials

SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-002.

SELECT-OPTIONS: S_CLASS1 FOR RMCLM-CLASS NO INTERVALS NO-EXTENSION,

S_CHNAM1 FOR KSML-IMERK NO INTERVALS NO-EXTENSION,

S_CHVAL1 FOR RMCLM-CLASS.

SELECTION-SCREEN SKIP.

SELECT-OPTIONS: S_CLASS2 FOR RMCLM-CLASS NO INTERVALS NO-EXTENSION,

S_CHNAM2 FOR KSML-IMERK NO INTERVALS NO-EXTENSION,

S_CHVAL2 FOR RMCLM-CLASS.

SELECTION-SCREEN SKIP.

SELECT-OPTIONS: S_CLASS3 FOR RMCLM-CLASS NO INTERVALS NO-EXTENSION,

S_CHNAM3 FOR KSML-IMERK NO INTERVALS NO-EXTENSION,

S_CHVAL3 FOR RMCLM-CLASS.

SELECTION-SCREEN SKIP.

SELECT-OPTIONS: S_CLASS4 FOR RMCLM-CLASS NO INTERVALS NO-EXTENSION,

S_CHNAM4 FOR KSML-IMERK NO INTERVALS NO-EXTENSION,

S_CHVAL4 FOR RMCLM-CLASS.

SELECTION-SCREEN END OF BLOCK B2.

im creating custome f4 helps for classes, characterstic names, characterstic values.. characterstic name(s_chnam1) f4 id based on selected class(s_class1), like same chractestic values(s_chval1) f4 is based on characterstic name(s_chnam1)..

Thanks in advance,

Shwetha

0 Kudos

Hi,

Try below code

TYPES : BEGIN OF t_field,
          fieldname1 TYPE dd03l-fieldname,
          fieldname2 TYPE dd03l-fieldname,
        END OF t_field.

DATA : i_chval1     TYPE STANDARD TABLE OF t_field,
       i_chval2     TYPE STANDARD TABLE OF t_field,
       i_chval3     TYPE STANDARD TABLE OF t_field,
       wa_chval1    TYPE t_field,
       v_fieldvalue TYPE dynpread-fieldvalue.




SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.

SELECT-OPTIONS: s_class1 FOR rmclm-class NO INTERVALS NO-EXTENSION,
                s_chnam1 FOR ksml-imerk  NO INTERVALS NO-EXTENSION,
                s_chval1 FOR cabn-atnam.
SELECTION-SCREEN SKIP.
SELECT-OPTIONS: s_class2 FOR rmclm-class NO INTERVALS NO-EXTENSION,
                s_chnam2 FOR ksml-imerk  NO INTERVALS NO-EXTENSION,
                s_chval2 FOR cabn-atnam.
SELECTION-SCREEN SKIP.
SELECT-OPTIONS: s_class3 FOR rmclm-class NO INTERVALS NO-EXTENSION,
                s_chnam3 FOR ksml-imerk  NO INTERVALS NO-EXTENSION,
                s_chval3 FOR cabn-atnam.
SELECTION-SCREEN SKIP.
SELECT-OPTIONS: s_class4 FOR rmclm-class NO INTERVALS NO-EXTENSION,
                s_chnam4 FOR ksml-imerk  NO INTERVALS NO-EXTENSION,
                s_chval4 FOR cabn-atnam.

SELECTION-SCREEN END OF BLOCK b2.


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

  PERFORM get_f4values     USING    'S_CLASS1-LOW'
                          CHANGING  s_chnam1-low.


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

  PERFORM get_f4cvalues    USING     'S_CHNAM1-LOW'
                           CHANGING  s_chval1-low
                                     i_chval1[].


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

  PERFORM get_f4values     USING    'S_CLASS2-LOW'
                          CHANGING  s_chnam2-low.

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

  PERFORM get_f4cvalues    USING    'S_CHNAM2-LOW'
                           CHANGING  s_chval2-low
                                     i_chval2[].

FORM get_f4values  USING    p_ifield
                  CHANGING  p_ofield.

  TYPES : BEGIN OF t_klah,
            clint TYPE clint,
          END OF t_klah.

  TYPES: BEGIN OF t_ksml,
           imerk TYPE atinn,
         END OF t_ksml.

  DATA : lt_klah       TYPE STANDARD TABLE OF t_klah,
         lt_ksml       TYPE STANDARD TABLE OF t_ksml,
         lv_svalue     TYPE dynpread-fieldvalue.

  DATA :  lt_return      TYPE STANDARD TABLE OF ddshretval, " Selected
          lwa_return     TYPE ddshretval.                  " Workarea


  PERFORM get_screen_values USING     p_ifield
                            CHANGING  lv_svalue.


  SELECT clint
               FROM klah
               INTO TABLE lt_klah
               WHERE klart = '011'
               AND   class = lv_svalue.

  IF NOT lt_klah[] IS INITIAL.

    SELECT imerk
                 FROM ksml
                 INTO TABLE lt_ksml
                 FOR ALL ENTRIES IN lt_klah
                 WHERE clint = lt_klah-clint.

  ENDIF.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield        = 'IMERK'
      dynpprog        = sy-repid
      dynpnr          = sy-dynnr
      window_title    = 'Select Size'
      display         = ' '
      value_org       = 'S'
    TABLES
      value_tab       = lt_ksml
      return_tab      = lt_return
    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.

* Check whether LT_RETURN is blank
  CHECK NOT lt_return[] IS INITIAL.
  READ TABLE lt_return INTO lwa_return INDEX 1.

  CALL FUNCTION 'CONVERSION_EXIT_ATINN_INPUT'
    EXPORTING
      input  = lwa_return-fieldval
    IMPORTING
      output = p_ofield.

  REFRESH : lt_return.
  CLEAR : lwa_return.


ENDFORM.                    " GET_F4VALUES

Thanks & Regards

Bala Krishna

0 Kudos
FORM get_f4cvalues  USING    p_ifield
                  CHANGING   p_ofield
                             p_table TYPE ANY TABLE.

  TYPES : BEGIN OF t_cabnt,
           atinn TYPE atinn,
           spras TYPE spras,
           atbez TYPE atbez,
          END OF t_cabnt.

  TYPES : BEGIN OF t_cabn,
           atinn TYPE atinn,
           atnam TYPE atnam,
         END OF t_cabn.


  TYPES: BEGIN OF t_final,
          atnam TYPE atnam,
          atbez TYPE atbez,
        END OF t_final.


  DATA : lt_cabnt  TYPE STANDARD TABLE OF t_cabnt,
         lt_cabn   TYPE STANDARD TABLE OF t_cabn,
         lt_final  TYPE STANDARD TABLE OF t_final,
         lwa_cabnt TYPE t_cabnt,
         lwa_cabn  TYPE t_cabn,
         lwa_final TYPE t_final,
         lv_svalue TYPE dynpread-fieldvalue..


  DATA :  lt_return      TYPE STANDARD TABLE OF ddshretval, " Selected
          lwa_return     TYPE ddshretval.                  " Workarea



  PERFORM get_screen_values USING    p_ifield
                            CHANGING lv_svalue.

  IF v_fieldvalue <> lv_svalue.
    CLEAR : v_fieldvalue.
    v_fieldvalue = lv_svalue.

    CALL FUNCTION 'CONVERSION_EXIT_ATINN_INPUT'
      EXPORTING
        input  = lv_svalue
      IMPORTING
        output = lv_svalue.

    SELECT atinn
           atnam FROM cabn
                 INTO TABLE lt_cabn
                 WHERE atinn = lv_svalue.

    SELECT atinn
           spras
           atbez FROM cabnt
                 INTO TABLE lt_cabnt
                 WHERE atinn = lv_svalue.


    REFRESH : lt_final, p_table.

    LOOP AT lt_cabn INTO lwa_cabn.
      lwa_final-atnam = lwa_cabn-atnam.
      READ TABLE lt_cabnt INTO lwa_cabnt WITH KEY
                                            atinn = lwa_cabn-atinn
                                            spras = 'E'.
      IF sy-subrc = 0.
        lwa_final-atbez = lwa_cabnt-atbez.
      ENDIF.

      APPEND lwa_final TO lt_final.
      CLEAR : lwa_final, lwa_cabn, lwa_cabnt.
    ENDLOOP.

    SORT lt_final.

    p_table[] = lt_final[].
  ENDIF.

  lt_final[] = p_table[].

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield        = 'ATNAM'
      dynpprog        = sy-repid
      dynpnr          = sy-dynnr
      window_title    = 'Select Size'
      display         = ' '
      value_org       = 'S'
    TABLES
      value_tab       = lt_final
      return_tab      = lt_return
    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.

* Check whether LT_RETURN is blank
  CHECK NOT lt_return[] IS INITIAL.
  READ TABLE lt_return INTO lwa_return INDEX 1.

  CALL FUNCTION 'CONVERSION_EXIT_ATINN_OUTPUT'
    EXPORTING
      input  = lwa_return-fieldval
    IMPORTING
      output = p_ofield.

  REFRESH : lt_return.
  CLEAR : lwa_return.


ENDFORM.                    " GET_F4CVALUES

FORM get_screen_values  USING    p_ifield
                        CHANGING p_svalue.


  DATA : lt_dynpread   TYPE  STANDARD TABLE OF dynpread,
         lwa_dynpread  TYPE dynpread,
         lv_repid      TYPE sy-repid.


  lwa_dynpread-fieldname = p_ifield.
  APPEND lwa_dynpread TO lt_dynpread.

  CLEAR lwa_dynpread.

  lv_repid = sy-repid.

  CALL FUNCTION 'DYNP_VALUES_READ'
    EXPORTING
      dyname                         = lv_repid
      dynumb                         = '1000'
*   TRANSLATE_TO_UPPER             = ' '
*   REQUEST                        = ' '
*   PERFORM_CONVERSION_EXITS       = ' '
*   PERFORM_INPUT_CONVERSION       = ' '
*   DETERMINE_LOOP_INDEX           = ' '
    TABLES
      dynpfields                     = lt_dynpread
   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.

  READ TABLE lt_dynpread INTO lwa_dynpread INDEX 1.
  IF sy-subrc = 0.
    p_svalue = lwa_dynpread-fieldvalue.
  ENDIF.

ENDFORM.                    " GET_SCREEN_VALUES

Thanks & Regards

Bala Krishna

Former Member
0 Kudos

answered