Application Development and Automation 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: 
Read only

making screen field uneditable in runtime

Former Member
0 Likes
3,532

Hi all,

I have a field that should be READ-ONLY when the screen appears (SCREEN-INPUT = 0). Then i should be able to select F4 help for the field, for which i make SCREEN-INPUT = 1. But after selection of a value from the F4 help i want to make the field again READ-ONLY (SCREEN-INPUT = 0) which is not happening.

Either am able to display the value that i select from F4 help or I am able to make the field READ-ONLY. Both are not happening together.

Can any one please let me know how to do this.

Thanks and Regards,

Ram.

1 ACCEPTED SOLUTION
Read only

rahulkavuri
Active Contributor
0 Likes
2,450

hi ram kumar check this one, i worked with this kind of scenraio, check only the bold portion, the rest just shows the scenario

When i looping again at at selection screen output i check whether the field with F4 help is filled or not and then lock them accordingly

AT SELECTION-SCREEN ON VALUE-REQUEST FOR ST_NAME.

  CLEAR: FIELD_VALUE, DYNPRO_VALUES.
  REFRESH DYNPRO_VALUES.
  FIELD_VALUE-FIELDNAME = 'EXCH'.

  APPEND FIELD_VALUE TO DYNPRO_VALUES.

  CALL FUNCTION 'DYNP_VALUES_READ'
    EXPORTING
      DYNAME             = SY-CPROG
      DYNUMB             = SY-DYNNR
      TRANSLATE_TO_UPPER = 'X'
    TABLES
      DYNPFIELDS         = DYNPRO_VALUES.

  READ TABLE DYNPRO_VALUES INDEX 1 INTO FIELD_VALUE.

  IF FIELD_VALUE-FIELDVALUE IS NOT INITIAL.

    IF SY-SUBRC = 0 AND FIELD_VALUE-FIELDVALUE = 1.

      FIELD_VALUE-FIELDVALUE = 'BSE'.

    ELSEIF SY-SUBRC = 0 AND FIELD_VALUE-FIELDVALUE = 2.

      FIELD_VALUE-FIELDVALUE = 'NSE'.

    ENDIF.

    SELECT STOCK ST_NAME
                 CURRPR
                 FROM
                 ZEXCH
                 INTO TABLE TEMP_ITAB
                 WHERE EXCH = FIELD_VALUE-FIELDVALUE.

    CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
      EXPORTING
        RETFIELD    = 'ST_NAME'
        DYNPPROG    = SY-CPROG
        DYNPNR      = SY-DYNNR
        DYNPROFIELD = 'ST_NAME'
        VALUE_ORG   = 'S'
      TABLES
        VALUE_TAB   = TEMP_ITAB
        RETURN_TAB  = RETURN.

    SELECT STOCK CURRPR
                 FROM ZEXCH
                 INTO (T_CODE, T_CURRPR)
                 WHERE ST_NAME = RETURN-FIELDVAL.
    ENDSELECT.

    CLEAR DYNPRO_VALUES[].

    FIELD_VALUE-FIELDNAME = 'ST_NAME'.
    FIELD_VALUE-FIELDVALUE = RETURN-FIELDVAL.
    APPEND  FIELD_VALUE  TO DYNPRO_VALUES .

    FIELD_VALUE-FIELDNAME = 'ST_CODE'.
    FIELD_VALUE-FIELDVALUE = T_CODE.
    APPEND  FIELD_VALUE  TO DYNPRO_VALUES .

    CALL FUNCTION 'HRCM_AMOUNT_TO_STRING_CONVERT'
      EXPORTING
        BETRG  = T_CURRPR
      IMPORTING
        STRING = T_CHAR.

    FIELD_VALUE-FIELDNAME = 'CURRPR'.
    FIELD_VALUE-FIELDVALUE = T_CHAR.
    APPEND  FIELD_VALUE  TO DYNPRO_VALUES .

* Update the dynpro values.
    CALL FUNCTION 'DYNP_VALUES_UPDATE'
      EXPORTING
        DYNAME     = SY-CPROG
        DYNUMB     = SY-DYNNR
      TABLES
        DYNPFIELDS = DYNPRO_VALUES.

  ENDIF.

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

AT SELECTION-SCREEN OUTPUT.

*  APPEND 'ONLI' TO CURRENT_SCR-EXCL.   "Execute
*  APPEND 'PRIN' TO CURRENT_SCR-EXCL.   "Execute and Print
*  APPEND 'SJOB' TO CURRENT_SCR-EXCL.   "Execute in Background

  LOOP AT SCREEN.

    IF SCREEN-NAME = 'ACCNO'.

      SELECT ACCNO
             NAME
             BANK
             BANKACC
             AMOUNT
             FROM ZUSERDETAILS
             INTO (ACCNO,NAME,BANK,BANKACC,AMOUNT)
             WHERE ACCNO = TEMP_ACCNO.

      ENDSELECT.

      SCREEN-INPUT = 0.
      MODIFY SCREEN.

    ENDIF.

    IF SCREEN-NAME = 'NAME' OR
       SCREEN-NAME = 'BANKNAME' OR
       SCREEN-NAME = 'BANKACC' OR
       SCREEN-NAME = 'AMOUNT' OR
       SCREEN-NAME = 'CURRPR' OR
       SCREEN-NAME = 'ST_CODE'.

      SELECT NAME FROM ZBANKCODE INTO BANKNAME WHERE BANK = BANK.
      ENDSELECT.

      SCREEN-INPUT = 0.
      MODIFY SCREEN.

    ENDIF.

<b>    IF SCREEN-NAME = 'ST_NAME'.

      IF ST_NAME IS NOT INITIAL AND FLAG_SEL IS INITIAL.

        CLEAR LIMPR.
        CLEAR QTY.


        IF EXCH = 1.
          L_EXCH = 'BSE'.
        ELSEIF EXCH = 2.
          L_EXCH = 'NSE'.
        ELSE.
          FLAG_END = 'X'.
          MESSAGE I000(ZZ) WITH 'Select an exchange from dropdown'.
          STOP.
        ENDIF.

        SELECT STOCK CURRPR
                     FROM
                     ZEXCH
                     INTO (ST_CODE, CURRPR)
                     WHERE ST_NAME = ST_NAME
                     AND EXCH = L_EXCH.
        ENDSELECT.

        IF SY-SUBRC <> 0.

          FLAG_END = 'X'.
          CLEAR CURRPR.
          CLEAR ST_CODE.
          CLEAR ST_NAME.

          LOOP AT SCREEN.

            IF SCREEN-NAME = 'ST_CODE' OR SCREEN-NAME = 'CURRPR'.

              SCREEN-INPUT = 0.
              MODIFY SCREEN.

            ENDIF.

          ENDLOOP.

          MESSAGE I000(ZZ) WITH 'This is not valid name of the stock'.
          STOP.
        ENDIF.

      ENDIF.</b>
    ENDIF.


  ENDLOOP.

hi ram kumar check this one, i worked with this kind of scenraio, check only the bold portion, the rest just shows the scenario

When i looping again at at selection screen output i check whether the field with F4 help is filled or not and then lock them accordingly

AT SELECTION-SCREEN ON VALUE-REQUEST FOR ST_NAME.

  CLEAR: FIELD_VALUE, DYNPRO_VALUES.
  REFRESH DYNPRO_VALUES.
  FIELD_VALUE-FIELDNAME = 'EXCH'.

  APPEND FIELD_VALUE TO DYNPRO_VALUES.

  CALL FUNCTION 'DYNP_VALUES_READ'
    EXPORTING
      DYNAME             = SY-CPROG
      DYNUMB             = SY-DYNNR
      TRANSLATE_TO_UPPER = 'X'
    TABLES
      DYNPFIELDS         = DYNPRO_VALUES.

  READ TABLE DYNPRO_VALUES INDEX 1 INTO FIELD_VALUE.

  IF FIELD_VALUE-FIELDVALUE IS NOT INITIAL.

    IF SY-SUBRC = 0 AND FIELD_VALUE-FIELDVALUE = 1.

      FIELD_VALUE-FIELDVALUE = 'BSE'.

    ELSEIF SY-SUBRC = 0 AND FIELD_VALUE-FIELDVALUE = 2.

      FIELD_VALUE-FIELDVALUE = 'NSE'.

    ENDIF.

    SELECT STOCK ST_NAME
                 CURRPR
                 FROM
                 ZEXCH
                 INTO TABLE TEMP_ITAB
                 WHERE EXCH = FIELD_VALUE-FIELDVALUE.

    CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
      EXPORTING
        RETFIELD    = 'ST_NAME'
        DYNPPROG    = SY-CPROG
        DYNPNR      = SY-DYNNR
        DYNPROFIELD = 'ST_NAME'
        VALUE_ORG   = 'S'
      TABLES
        VALUE_TAB   = TEMP_ITAB
        RETURN_TAB  = RETURN.

    SELECT STOCK CURRPR
                 FROM ZEXCH
                 INTO (T_CODE, T_CURRPR)
                 WHERE ST_NAME = RETURN-FIELDVAL.
    ENDSELECT.

    CLEAR DYNPRO_VALUES[].

    FIELD_VALUE-FIELDNAME = 'ST_NAME'.
    FIELD_VALUE-FIELDVALUE = RETURN-FIELDVAL.
    APPEND  FIELD_VALUE  TO DYNPRO_VALUES .

    FIELD_VALUE-FIELDNAME = 'ST_CODE'.
    FIELD_VALUE-FIELDVALUE = T_CODE.
    APPEND  FIELD_VALUE  TO DYNPRO_VALUES .

    CALL FUNCTION 'HRCM_AMOUNT_TO_STRING_CONVERT'
      EXPORTING
        BETRG  = T_CURRPR
      IMPORTING
        STRING = T_CHAR.

    FIELD_VALUE-FIELDNAME = 'CURRPR'.
    FIELD_VALUE-FIELDVALUE = T_CHAR.
    APPEND  FIELD_VALUE  TO DYNPRO_VALUES .

* Update the dynpro values.
    CALL FUNCTION 'DYNP_VALUES_UPDATE'
      EXPORTING
        DYNAME     = SY-CPROG
        DYNUMB     = SY-DYNNR
      TABLES
        DYNPFIELDS = DYNPRO_VALUES.

  ENDIF.

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

AT SELECTION-SCREEN OUTPUT.

*  APPEND 'ONLI' TO CURRENT_SCR-EXCL.   "Execute
*  APPEND 'PRIN' TO CURRENT_SCR-EXCL.   "Execute and Print
*  APPEND 'SJOB' TO CURRENT_SCR-EXCL.   "Execute in Background

  LOOP AT SCREEN.

    IF SCREEN-NAME = 'ACCNO'.

      SELECT ACCNO
             NAME
             BANK
             BANKACC
             AMOUNT
             FROM ZUSERDETAILS
             INTO (ACCNO,NAME,BANK,BANKACC,AMOUNT)
             WHERE ACCNO = TEMP_ACCNO.

      ENDSELECT.

      SCREEN-INPUT = 0.
      MODIFY SCREEN.

    ENDIF.

    IF SCREEN-NAME = 'NAME' OR
       SCREEN-NAME = 'BANKNAME' OR
       SCREEN-NAME = 'BANKACC' OR
       SCREEN-NAME = 'AMOUNT' OR
       SCREEN-NAME = 'CURRPR' OR
       SCREEN-NAME = 'ST_CODE'.

      SELECT NAME FROM ZBANKCODE INTO BANKNAME WHERE BANK = BANK.
      ENDSELECT.

      SCREEN-INPUT = 0.
      MODIFY SCREEN.

    ENDIF.

<b>    IF SCREEN-NAME = 'ST_NAME'.

      IF ST_NAME IS NOT INITIAL AND FLAG_SEL IS INITIAL.

        CLEAR LIMPR.
        CLEAR QTY.


        IF EXCH = 1.
          L_EXCH = 'BSE'.
        ELSEIF EXCH = 2.
          L_EXCH = 'NSE'.
        ELSE.
          FLAG_END = 'X'.
          MESSAGE I000(ZZ) WITH 'Select an exchange from dropdown'.
          STOP.
        ENDIF.

        SELECT STOCK CURRPR
                     FROM
                     ZEXCH
                     INTO (ST_CODE, CURRPR)
                     WHERE ST_NAME = ST_NAME
                     AND EXCH = L_EXCH.
        ENDSELECT.

        IF SY-SUBRC <> 0.

          FLAG_END = 'X'.
          CLEAR CURRPR.
          CLEAR ST_CODE.
          CLEAR ST_NAME.

          LOOP AT SCREEN.

            IF SCREEN-NAME = 'ST_CODE' OR SCREEN-NAME = 'CURRPR'.

              SCREEN-INPUT = 0.
              MODIFY SCREEN.

            ENDIF.

          ENDLOOP.

          MESSAGE I000(ZZ) WITH 'This is not valid name of the stock'.
          STOP.
        ENDIF.

      ENDIF.</b>
    ENDIF.


  ENDLOOP.

13 REPLIES 13
Read only

gopi_narendra
Active Contributor
0 Likes
2,450

make ur field input enabled only if its initial.

it means by default ur field will be in display mode

Read only

dani_mn
Active Contributor
0 Likes
2,450

HI,

try this code for your field.

<b>AT SELECTION-SCREEN output.

If NOT field IS INITIAL.

LOOP AT SCREEN.
if screen-name = 'FIELD'.
   screen-input = 0.
   modify screen.
ENDIF.
ENDLOOP.</b>

Regards,

Read only

andreas_mann3
Active Contributor
0 Likes
2,450

Hi,

use your routine to modify at events:

1) initialzation

2) at selection-screen output

A.

Read only

0 Likes
2,450

Hi,

I tried all the events possible.But those events doesnot get triggered when i select a value from F4 help.because after selecting a value i want to make the field READ-ONLY. Kindly help.

Thanks and Regards,

Ram.

Read only

0 Likes
2,450

Hi

You're right Ram, so you can't update the screen after pressing F4.

Perhaps you can try to manage the search help programmaticly by event AT SELECTION-SCREEN ON VALUE-REQUEST and here re-call the selection-screen, so AT SELECTION-SCREEN OUTPUT event should be triggered, but I'm not sure it can work....try!

Max

Read only

Former Member
0 Likes
2,450

Hi,

R u using a selection-screen or a screen??

Rgds

Read only

Former Member
0 Likes
2,450

hi,

I think you can not provide F4 help for a field which is in display mode on selection screen.

My suggestion is instead of changing it to display mode, let the user input some value. You can do validation for the input given in at selection-screen event.

Regards,

Sailaja.

Read only

Former Member
0 Likes
2,450

Hi,

If its selection-screen :

1. Process it in the AT SELECTION-SCREEN ON FIELD ...

event. Set a flag and make your screen changes in AT SELECTION OUTPUT.

If you`re using a Dialog Module :

1. Process it in the POV, have a module with the field statement and set a flag. Make screen changes in the PBO.

Reward if helpful.

Rgds

Read only

0 Likes
2,450

Hi,

I tried both inputs given by Zapper and Max, but it doesnot sem to work. Is there a sample code that you can send so i can verify if what iam doing is right?

Also Sailaja, the user requirement is this way. So i cannot change it

It is in Display mode. I change it to Input mode, then press F4 help and select a value. Now with the value displayed in the field, I want to chagne it to display mode again.

Thanks and Regards,

Ram.

Read only

rahulkavuri
Active Contributor
0 Likes
2,451

hi ram kumar check this one, i worked with this kind of scenraio, check only the bold portion, the rest just shows the scenario

When i looping again at at selection screen output i check whether the field with F4 help is filled or not and then lock them accordingly

AT SELECTION-SCREEN ON VALUE-REQUEST FOR ST_NAME.

  CLEAR: FIELD_VALUE, DYNPRO_VALUES.
  REFRESH DYNPRO_VALUES.
  FIELD_VALUE-FIELDNAME = 'EXCH'.

  APPEND FIELD_VALUE TO DYNPRO_VALUES.

  CALL FUNCTION 'DYNP_VALUES_READ'
    EXPORTING
      DYNAME             = SY-CPROG
      DYNUMB             = SY-DYNNR
      TRANSLATE_TO_UPPER = 'X'
    TABLES
      DYNPFIELDS         = DYNPRO_VALUES.

  READ TABLE DYNPRO_VALUES INDEX 1 INTO FIELD_VALUE.

  IF FIELD_VALUE-FIELDVALUE IS NOT INITIAL.

    IF SY-SUBRC = 0 AND FIELD_VALUE-FIELDVALUE = 1.

      FIELD_VALUE-FIELDVALUE = 'BSE'.

    ELSEIF SY-SUBRC = 0 AND FIELD_VALUE-FIELDVALUE = 2.

      FIELD_VALUE-FIELDVALUE = 'NSE'.

    ENDIF.

    SELECT STOCK ST_NAME
                 CURRPR
                 FROM
                 ZEXCH
                 INTO TABLE TEMP_ITAB
                 WHERE EXCH = FIELD_VALUE-FIELDVALUE.

    CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
      EXPORTING
        RETFIELD    = 'ST_NAME'
        DYNPPROG    = SY-CPROG
        DYNPNR      = SY-DYNNR
        DYNPROFIELD = 'ST_NAME'
        VALUE_ORG   = 'S'
      TABLES
        VALUE_TAB   = TEMP_ITAB
        RETURN_TAB  = RETURN.

    SELECT STOCK CURRPR
                 FROM ZEXCH
                 INTO (T_CODE, T_CURRPR)
                 WHERE ST_NAME = RETURN-FIELDVAL.
    ENDSELECT.

    CLEAR DYNPRO_VALUES[].

    FIELD_VALUE-FIELDNAME = 'ST_NAME'.
    FIELD_VALUE-FIELDVALUE = RETURN-FIELDVAL.
    APPEND  FIELD_VALUE  TO DYNPRO_VALUES .

    FIELD_VALUE-FIELDNAME = 'ST_CODE'.
    FIELD_VALUE-FIELDVALUE = T_CODE.
    APPEND  FIELD_VALUE  TO DYNPRO_VALUES .

    CALL FUNCTION 'HRCM_AMOUNT_TO_STRING_CONVERT'
      EXPORTING
        BETRG  = T_CURRPR
      IMPORTING
        STRING = T_CHAR.

    FIELD_VALUE-FIELDNAME = 'CURRPR'.
    FIELD_VALUE-FIELDVALUE = T_CHAR.
    APPEND  FIELD_VALUE  TO DYNPRO_VALUES .

* Update the dynpro values.
    CALL FUNCTION 'DYNP_VALUES_UPDATE'
      EXPORTING
        DYNAME     = SY-CPROG
        DYNUMB     = SY-DYNNR
      TABLES
        DYNPFIELDS = DYNPRO_VALUES.

  ENDIF.

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

AT SELECTION-SCREEN OUTPUT.

*  APPEND 'ONLI' TO CURRENT_SCR-EXCL.   "Execute
*  APPEND 'PRIN' TO CURRENT_SCR-EXCL.   "Execute and Print
*  APPEND 'SJOB' TO CURRENT_SCR-EXCL.   "Execute in Background

  LOOP AT SCREEN.

    IF SCREEN-NAME = 'ACCNO'.

      SELECT ACCNO
             NAME
             BANK
             BANKACC
             AMOUNT
             FROM ZUSERDETAILS
             INTO (ACCNO,NAME,BANK,BANKACC,AMOUNT)
             WHERE ACCNO = TEMP_ACCNO.

      ENDSELECT.

      SCREEN-INPUT = 0.
      MODIFY SCREEN.

    ENDIF.

    IF SCREEN-NAME = 'NAME' OR
       SCREEN-NAME = 'BANKNAME' OR
       SCREEN-NAME = 'BANKACC' OR
       SCREEN-NAME = 'AMOUNT' OR
       SCREEN-NAME = 'CURRPR' OR
       SCREEN-NAME = 'ST_CODE'.

      SELECT NAME FROM ZBANKCODE INTO BANKNAME WHERE BANK = BANK.
      ENDSELECT.

      SCREEN-INPUT = 0.
      MODIFY SCREEN.

    ENDIF.

<b>    IF SCREEN-NAME = 'ST_NAME'.

      IF ST_NAME IS NOT INITIAL AND FLAG_SEL IS INITIAL.

        CLEAR LIMPR.
        CLEAR QTY.


        IF EXCH = 1.
          L_EXCH = 'BSE'.
        ELSEIF EXCH = 2.
          L_EXCH = 'NSE'.
        ELSE.
          FLAG_END = 'X'.
          MESSAGE I000(ZZ) WITH 'Select an exchange from dropdown'.
          STOP.
        ENDIF.

        SELECT STOCK CURRPR
                     FROM
                     ZEXCH
                     INTO (ST_CODE, CURRPR)
                     WHERE ST_NAME = ST_NAME
                     AND EXCH = L_EXCH.
        ENDSELECT.

        IF SY-SUBRC <> 0.

          FLAG_END = 'X'.
          CLEAR CURRPR.
          CLEAR ST_CODE.
          CLEAR ST_NAME.

          LOOP AT SCREEN.

            IF SCREEN-NAME = 'ST_CODE' OR SCREEN-NAME = 'CURRPR'.

              SCREEN-INPUT = 0.
              MODIFY SCREEN.

            ENDIF.

          ENDLOOP.

          MESSAGE I000(ZZ) WITH 'This is not valid name of the stock'.
          STOP.
        ENDIF.

      ENDIF.</b>
    ENDIF.


  ENDLOOP.

Read only

0 Likes
2,450

Hi Rahul,

I am not sure if i had explained the scenario properly or not. Here we go again.

1. First a screen is displayed with four radio buttons.

2. Up on selecting a radio button accordingly a text box appears (it was hidden in INITIALIZATION eventas well it is made READ-ONLY).

3. Now when i press F4 help, here i Loop at screen and make the text box editable.

4. I select a value from F4 help. Now the value that i selected should be displayed and also the text box should be changed to READ-ONLY mode.

As you have mentioned, in the event AT SELECTION-SCREEN OUTPUT, i have looped at screen and tried to change the field to READ-ONLY mode, but after selecting a value through F4 help, this particular event doesnot get triggered. This is where i stand now..

Any inputs please.

Thanks and Regards,

Ram.

Read only

0 Likes
2,450

Hi Ram

Try this sample perhaps it can help you:

PARAMETERS: P_MATNR LIKE MARA-MATNR.

DATA F4.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_MATNR.

DATA: TABNAME TYPE DFIES-TABNAME,

FIELDNAME TYPE DFIES-FIELDNAME.

DATA T_VALUE TYPE STANDARD TABLE OF DDSHRETVAL WITH HEADER LINE.

CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'

EXPORTING

TABNAME = TABNAME

FIELDNAME = FIELDNAME

SEARCHHELP = 'MAT1'

TABLES

RETURN_TAB = T_VALUE

EXCEPTIONS

FIELD_NOT_FOUND = 1

NO_HELP_FOR_FIELD = 2

INCONSISTENT_HELP = 3

NO_VALUES_FOUND = 4

OTHERS = 5.

IF SY-SUBRC <> 0.

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

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

ELSE.

READ TABLE T_VALUE INDEX 1.

P_MATNR = T_VALUE-FIELDVAL.

F4 = 'x'.

SET SCREEN 1000. LEAVE SCREEN.

ENDIF.

AT SELECTION-SCREEN OUTPUT.

IF F4 = 'x'.

LOOP AT SCREEN.

SCREEN-INPUT = 0.

MODIFY SCREEN.

ENDLOOP.

ENDIF.

Max

Read only

0 Likes
2,450

Hi Max,

That was the resolution i was looking for. Thanks a lot Max. full marks to you

Thanks and Regards,

Ram.