Hello Larry!
As I was unable to find a decent answer to your question, I decided to send you one crazy idea. Hopefully you'll find something useful in this. Consider the following REPORT:
--------------------
REPORT zold_new.
SELECTION-SCREEN BEGIN OF SCREEN 9000.
PARAMETERS: p_old TYPE mara-matnr,
p_new TYPE mara-matnr.
SELECTION-SCREEN END OF SCREEN 9000.
*&---------------------------------------------------------------------*
*& Form show_screen
*&---------------------------------------------------------------------*
FORM show_screen CHANGING new_value TYPE mara-matnr
old_value TYPE mara-matnr.
CALL SELECTION-SCREEN 9000. "you can use starting at X Y for pop-up
new_value = p_new.
old_value = p_new.
ENDFORM. "show_screen
------------------
Now imagine this report was something created with INSERT REPORT in a ZSOMETHING program. You could easy manipulate the type "MARA-MATNR" there to the desired DDIC structure, and use the PERFORM... IN PROGRAM to grab your data.
But even using INSERT REPORT, something we should avoid above a lot of things, that alone won't be of any help.
If you use INSERT REPORT to create a ZREPORT in the repository, you won't be able to call the generated program on the same runtime window with PERFORM..IN PROGRAM. That's why you'll have to call the generated FORM using CALL FUNCTION... STARTING NEW TASK, and then grab the old/new data with PERFORMING xxx ON END OF TASK (something similar to parallel processing).
I know it's kinda crazy and very ugly, but it's a possible solution.
As I said, hopefully it will give you a hint to a better option.
Best Regards!
Mauricio