At last I have find time to write this 🙂 . If you find anything wrong pls let me know.
As all you know screen process in ABAP has two main block PBO ( Process before output ) and PAI ( Process after input ). All screen has this block.
For dialog program I used this.
So we can declare a parent screen object for all screen which we use in program.
Definition:
CLASS lcl_screen DEFINITION ABSTRACT.
PUBLIC SECTION.
METHODS : constructor
IMPORTING
i_dynnr TYPE sy-dynnr.
* All screen process
METHODS : pbo ABSTRACT,
pai ABSTRACT
IMPORTING
fcode TYPE sy-ucomm
RETURNING value(r_fcode) TYPE sy-ucomm,
free ABSTRACT.
* Exit-command
METHODS : exit_command
IMPORTING
fcode TYPE sy-ucomm.
* Screen static methods
CLASS-METHODS : get_screen
IMPORTING
i_dynnr TYPE sy-dynnr
RETURNING value(r_screen) TYPE REF TO lcl_screen.
CLASS-METHODS : del_screen
IMPORTING
i_dynnr TYPE sy-dynnr.
PRIVATE SECTION.
DATA : screen TYPE sy-dynnr.
TYPES : BEGIN OF lst_screen,
screen TYPE REF TO lcl_screen,
END OF lst_screen.
CLASS-DATA : t_screen TYPE STANDARD TABLE OF lst_screen.
CONSTANTS : c_class_name TYPE string VALUE 'LCL_SCREEN'.
ENDCLASS. "lcl_screen DEFINITION
Implementation
CLASS lcl_screen IMPLEMENTATION.
METHOD constructor.
screen = i_dynnr."Which screen
ENDMETHOD. "constructor
METHOD exit_command.
CASE fcode.
WHEN 'EXIT'.
LEAVE PROGRAM.
ENDCASE.
ENDMETHOD. "exit_command
METHOD get_screen.
DATA : ls_screen TYPE lst_screen,
lv_type TYPE string.
READ TABLE t_screen
INTO ls_screen
WITH KEY screen->screen = i_dynnr.
IF sy-subrc NE 0.
CONCATENATE c_class_name
i_dynnr
INTO lv_type
SEPARATED BY '_'.
CREATE OBJECT ls_screen-screen TYPE (lv_type)
EXPORTING
i_dynnr = i_dynnr.
APPEND ls_screen
TO t_screen.
ENDIF.
r_screen ?= ls_screen-screen.
ENDMETHOD. "get_screen
METHOD del_screen.
DATA : ls_screen TYPE lst_screen,
lv_type TYPE string.
READ TABLE t_screen
INTO ls_screen
WITH KEY screen->screen = i_dynnr.
IF sy-subrc NE 0.
* Screen doesnt exist
RETURN.
ENDIF.
ls_screen-screen->free( ).
DELETE t_screen
WHERE screen->screen = i_dynnr.
ENDMETHOD. "del_screen
ENDCLASS. "lcl_screen IMPLEMENTATION
In get_screen method, to decide which screen object will be created, logic is all screen object start with LCL_SCREEN_ and last 4 character is screen number. If screen object is not created, we create object and adding it to object table then returning screen object. If it is created just returning the object.
lets create our first screen :
And screen module is:
MODULE pbo OUTPUT.
lcl_screen=>get_screen( sy-dynnr )->pbo( ).
ENDMODULE. " PBO OUTPUT
MODULE pai INPUT.
gv_okcode = lcl_screen=>get_screen( sy-dynnr )->pai( gv_okcode ).
ENDMODULE. " PAI INPUT
MODULE exit_command INPUT.
lcl_screen=>get_screen( sy-dynnr )->exit_command( gv_okcode ).
ENDMODULE. " EXIT_COMMAND INPUT
Now lets create screen 9000 object
Definition
CLASS lcl_screen_9000 DEFINITION INHERITING FROM lcl_screen FINAL.
PUBLIC SECTION.
METHODS : pbo REDEFINITION,
pai REDEFINITION,
free REDEFINITION.
PRIVATE SECTION.
* Screen 9000 methods
METHODS : set_exclude
RETURNING value(rt_ex) TYPE status_excl_fcode_tt.
ENDCLASS. "lcl_screen_9000 DEFINITION
Implementation
CLASS lcl_screen_9000 IMPLEMENTATION.
METHOD pbo.
DATA : lt_ex TYPE status_excl_fcode_tt.
lt_ex = set_exclude( ).
SET PF-STATUS 'STATUS_9000' EXCLUDING lt_ex.
SET TITLEBAR '9000'.
ENDMETHOD. "pbo
METHOD set_exclude.
DATA : lv_ex TYPE fcode.
lv_ex = 'SAVE'.
APPEND lv_ex
TO rt_ex.
ENDMETHOD. "set_exclude
METHOD pai.
CASE fcode.
WHEN 'BACK'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMETHOD. "pai
METHOD free.
* If we declare global object data, we can clear or refresh here!
ENDMETHOD. "free
ENDCLASS. "lcl_screen_9000 IMPLEMENTATION
As you can see screen releated methods can be declare in screen object.
like set_exclude method.
If a method is global for all screen we can add to lcl_screen for example POPUP_TO_CONFIRM function. we can add this method to lcl_screen
TYPES : ty_text(400) TYPE c.
METHODS : call_popup
IMPORTING
i_title TYPE text60
i_text TYPE ty_text
RETURNING value(r_answer) TYPE char1.
METHOD call_popup.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
titlebar = i_title
text_question = i_text
IMPORTING
answer = r_answer
EXCEPTIONS
text_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDMETHOD. "call_popup
Now we can use this method in all screen.
METHOD pai.
CASE fcode.
WHEN 'BACK'.
IF call_popup( i_title = text-006
i_text = text-007 ) EQ '1'.
LEAVE TO SCREEN 0.
ENDIF.
ENDCASE.
ENDMETHOD. "pai
If we need to create ALV object in one screen we can add this to screen like, or picture element. Just we need to do declare screen object inherited from lcl_screen.
I hope you like it.
Have a nice day.
Nice try. But you should have explained further to differentiate the sap standard code to yours.
Thank you, I will add more comment about my code.
Hi Tolga Polat,
Nice concept and thanks for sharing.
Regards,
Siva kumar.
Thank you
Excellent!
Hello!
Thanks for sharing! I think it’s really better than regular PBO-PAI module programming.
I have a proposal. Why don’t you use event raising instead of direct method calls in PAI?
Your class lcl_screen is just an abstraction of the screen, so It shouldn’t know what methods of business logic have to be called when user presses one of toolbar buttons. Split lcl_screen from business logic. It will be something like this:
MODULE pai_input.
case gv_okcode.
when ‘CODE01’
raise event lcl_screen=>code01.
when ‘CODE02’.
raise event lcl_screen=>code02.
ENDMODULE.
Then the objects of business layer handles this events and provide necessary results.
Hi Vadim,
Thanks for your comment, I will try with events.
Moderator Message
The question that was posted here about emailing pdfs has been removed. The original question was rejected by moderators. To repost it here is ignoring moderator instructions and can lead to account suspension. Hijacking a blog comment thread to ask your own question is similarly disapproved.