Hola, para recuperar valores de dynpros puedes utilizar este FORM.
* Recuperamos el valor de la pantalla.
PERFORM selscn_leer_valor_de_pantalla
USING sy-repid
sy-dynnr
'CAMPO-DYNPRO'
CHANGING lf_valor.
*---------------------------------------------------------------------*
* FORM SELSCN_leer_valor_de_pantalla *
*---------------------------------------------------------------------*
* Recupera de la pantalla de selección un valor antes de que se *
* actualice. *
*---------------------------------------------------------------------*
* --> F_REPID -> Nombre del programa, normalmente SY-REPID *
* --> F_DYNNR -> Número de dynpro, normalmente SY-DYNNR *
* --> F_FIELDNAME_IN -> Nombre del campo que pretendemos recuperar *
* --> F_FIELDVALUE -> Valor recuperado *
*---------------------------------------------------------------------*
FORM selscn_leer_valor_de_pantalla
USING f_repid
f_dynnr
value(f_fieldname_in)
CHANGING f_fieldvalue.
DATA: ltab_fields TYPE TABLE OF dynpread.
DATA: ltab_fields_wa LIKE LINE OF ltab_fields.
DATA: lc_dyname LIKE sy-repid.
DATA: lc_dynumb LIKE sy-dynnr.
ltab_fields_wa-fieldname = f_fieldname_in.
APPEND ltab_fields_wa TO ltab_fields.
lc_dyname = f_repid.
lc_dynumb = f_dynnr.
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
dyname = lc_dyname
dynumb = lc_dynumb
TABLES
dynpfields = ltab_fields
EXCEPTIONS
OTHERS = 01.
IF sy-subrc IS INITIAL.
READ TABLE ltab_fields INDEX 1 INTO ltab_fields_wa.
*-- Return the value from the screen
IF sy-subrc EQ 0.
f_fieldvalue = ltab_fields_wa-fieldvalue.
ENDIF.
ENDIF.
ENDFORM. "SELSCN_leer_valor_de_pantalla
Un saludo.