Question

Suppose I have a selection-screen block with two parameters. I want to dynamically fill the second parameter based on what the user inputs in the first, for instance by querying a table to find the expected value for the key field in parameter 1.

As an example, say I have a program that does something for a combination of order number (p_aufnr) and WBS element (p_wbs). Instead of asking the user to provide both, I can determine one of them from the PSPEL field on the AUFK table. However, I still want to show this field to the user after he inputs his order number so he can verify that the WBS element is correct.

I've managed to do this by using the AT SELECTION SCREEN ON p_aufnr event to assign a value to p_wbs. This event is processed when the user presses enter. However, I can only ever get it to work once. So if the user enters an order number, realises from the retrieved WBS element that he made a mistake and changes it, the second parameter never changes. Even though the AT SELECTION SCREEN event is processed in the debugger, the parameter is not updated.

Am I not supposed to use this event for my scenario? If so, how would I then implement this sort of dynamic selection screen?

Forgot to add a code sample. The following report illustrates my issue: after entering a value in p_netw and pressing enter, p_wbs is filled with the value 1. However, if you press enter again the AT SELECTION-SCREEN ON routine is processed but the value for p_wbs is not updated, while lv_count is.

DATA: lv_count    TYPE i.

SELECTION-SCREEN BEGIN OF BLOCK main.
PARAMETERS: p_netw    TYPE aufnr OBLIGATORY MODIF ID auf.
PARAMETERS: p_wbs     TYPE i MODIF ID psp.
SELECTION-SCREEN END OF BLOCK   main.

AT SELECTION-SCREEN ON p_netw.
  ADD 1 TO lv_count.
  p_wbs = lv_count.

START-OF-SELECTION.
  PERFORM main.


FORM main.
  WRITE: 'The value reached ', lv_count.
ENDFORM.
Was it helpful?

Solution

Apparently the data is not written back to the screen if you update the field in the field-specific block. If you move the field update from AT SELECTION-SCREEN ON p_netw to the global AT SELECTION-SCREEN event, it works. Don't ask me why, though - this seems to a case of undocumented system behaviour...

DATA: lv_count    TYPE i.

SELECTION-SCREEN BEGIN OF BLOCK main.
PARAMETERS: p_netw    TYPE aufnr OBLIGATORY MODIF ID auf.
PARAMETERS: p_wbs     TYPE i MODIF ID psp.
SELECTION-SCREEN END OF BLOCK   main.

AT SELECTION-SCREEN ON p_netw.
  ADD 1 TO lv_count.

AT SELECTION-SCREEN.
  p_wbs = lv_count.

OTHER TIPS

You need to use a PAI (process after input) module on your screen which then takes the new p_aufnr and finds the appropriate p_wbs - probably exactly like your at selection screen event. You will then CALL SCREEN ### <-- your screen number to display the data on your screen. Without any code to work off thats all i can help with.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top