23/11/2010

Dynamic Read Table With Key and Value

Introduction

The concepts of dynamic programming are part of the unique features that ABAP offers for business programming.

Exploiting the features of dynamic programming allows you to write powerful and flexible applications.


REPORT ZADN_SAMPLE.

*----------------------------------------------------------------------*
* -> CLASS lc_abnsample DEFINITION
*----------------------------------------------------------------------*
CLASS lc_abnsample DEFINITION.

PUBLIC SECTION.

TYPES : BEGIN OF ty_table_line,
id TYPE char02,
name TYPE char20,
phone TYPE char15,
END OF ty_table_line.

METHODS : constructor.

METHODS : get_item_by_key IMPORTING p_key TYPE char12
p_value TYPE any
EXPORTING p_item TYPE any.

PRIVATE SECTION.

TYPES : ty_table TYPE STANDARD TABLE OF ty_table_line.

DATA : it_table TYPE ty_table,
st_table TYPE LINE OF ty_table.

METHODS : load_table_data.

ENDCLASS. "lc_abnsample DEFINITION

*----------------------------------------------------------------------*
* -> CLASS lc_abnsample DEFINITION
*----------------------------------------------------------------------*
CLASS lc_abnsample IMPLEMENTATION.

METHOD constructor.

me->load_table_data( ).

ENDMETHOD. "constructor

METHOD load_table_data.

CLEAR : me->st_table.

me->st_table-id = 'AA'.
me->st_table-name = 'NAME AA'.
me->st_table-phone = 'PHONE AA'.

APPEND me->st_table TO me->it_table.

CLEAR : me->st_table.

me->st_table-id = 'BB'.
me->st_table-name = 'NAME BB'.
me->st_table-phone = 'PHONE BB'.

APPEND me->st_table TO me->it_table.

CLEAR : me->st_table.

me->st_table-id = 'CC'.
me->st_table-name = 'NAME CC'.
me->st_table-phone = 'PHONE CC'.

APPEND me->st_table TO me->it_table.

CLEAR : me->st_table.

ENDMETHOD. "load_table_data

METHOD get_item_by_key.

READ TABLE me->it_table WITH KEY (p_key) = p_value INTO me->st_table.

p_item = me->st_table.

CLEAR : me->st_table.

ENDMETHOD. "get_item_by_key

ENDCLASS. "lc_abnsample DEFINITION

************************************************************************
************************************************************************
* *
* PROGRAM FLOW LOGIC *
* *
************************************************************************

PARAMETERS : pa_key TYPE char12 DEFAULT 'ID', " Use : ID, NAME or PHONE
pa_value TYPE char12 DEFAULT 'AA'. " For ID Use :
" AA, BB or CC
" For NAME Use :
" NAME AA, NAME BB or NAME CC
" For PHONE Use :
" PHONE AA, PHONE BB or PHONE CC

START-OF-SELECTION.

DATA : olc_abnsample TYPE REF TO lc_abnsample,
o_data TYPE REF TO data.

FIELD-SYMBOLS : TYPE ANY,
TYPE ANY.

CREATE OBJECT olc_abnsample.

CREATE DATA o_data TYPE lc_abnsample=>ty_table_line.

IF olc_abnsample IS BOUND.

ASSIGN o_data->* TO .

olc_abnsample->get_item_by_key( EXPORTING p_key = pa_key
p_value = pa_value
IMPORTING p_item = ).

IF IS ASSIGNED AND IS NOT INITIAL.

DO.

ASSIGN COMPONENT sy-index OF STRUCTURE TO .

IF sy-subrc NE 0.

EXIT.

ELSE.

WRITE / : .

ENDIF.

ENDDO.

ELSE.

WRITE / : 'Filter not found in table'.

ENDIF.

UNASSIGN : .

ENDIF.

22/11/2010

Dependency Injection in ABAP OO

Introduction

Dependency Injection (DI) is a technique and a set of design patterns that enable us to develop loosely coupled code. Instead of directly instantiating concrete classes whenever we need to invoke a particular service, we program against interfaces. Instances of these interfaces are injected into the code by the external client so that the code can vary independently of the Dependency.

Here we will take a detailed look at the DI pattern known as Constructor Injection. Since it is a design pattern, I have chosen to present it in the formal design pattern style.

How do we guarantee that a necessary Dependency is always available to the class we are currently developing?

By requiring all callers to supply the Dependency as a parameter to the class' constructor.


REPORT ZADN_SAMPLE.

*----------------------------------------------------------------------*
* -> INTERFACE IF_LOG_PERSISTENCE
*----------------------------------------------------------------------*
INTERFACE if_log_persistence.

METHODS : save_log IMPORTING p_message TYPE char128.

ENDINTERFACE. "IF_LOG_PERSISTENCE

*----------------------------------------------------------------------*
* -> CLASS lc_log_in_email DEFINITION
*----------------------------------------------------------------------*
CLASS lc_log_in_email DEFINITION.

PUBLIC SECTION.

INTERFACES : if_log_persistence.

ENDCLASS. "lc_log_in_email DEFINITION

*----------------------------------------------------------------------*
* -> CLASS lc_log_in_email IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lc_log_in_email IMPLEMENTATION.

METHOD if_log_persistence~save_log.

WRITE / : 'LOG SEND BY EMAIL',
'-----------------',
p_message.

ENDMETHOD. "if_log_persistence~save_log

ENDCLASS. "lc_log_in_email IMPLEMENTATION

*----------------------------------------------------------------------*
* -> CLASS lc_log_in_file DEFINITION
*----------------------------------------------------------------------*
CLASS lc_log_in_file DEFINITION.

PUBLIC SECTION.

INTERFACES : if_log_persistence.

ENDCLASS. "lc_log_in_file DEFINITION

*----------------------------------------------------------------------*
* -> CLASS lc_log_in_file IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lc_log_in_file IMPLEMENTATION.

METHOD if_log_persistence~save_log.

WRITE / : 'LOG SEND TO FILE',
'-----------------',
p_message.

ENDMETHOD. "if_log_persistence~save_log

ENDCLASS. "lc_log_in_file IMPLEMENTATION

*----------------------------------------------------------------------*
* -> CLASS lc_log_in_database DEFINITION
*----------------------------------------------------------------------*
CLASS lc_log_in_database DEFINITION.

PUBLIC SECTION.

INTERFACES : if_log_persistence.

ENDCLASS. "lc_log_in_database DEFINITION

*----------------------------------------------------------------------*
* -> CLASS lc_log_in_database IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lc_log_in_database IMPLEMENTATION.

METHOD if_log_persistence~save_log.

WRITE / : 'LOG CREATE IN DATABASE TABLE',
'-----------------',
p_message.

ENDMETHOD. "if_log_persistence~save_log

ENDCLASS. "lc_log_in_database IMPLEMENTATION

*----------------------------------------------------------------------*
* -> CLASS LC_CALCULATOR DEFINITION
*----------------------------------------------------------------------*
CLASS lc_calculator DEFINITION.

PUBLIC SECTION.

METHODS : constructor IMPORTING p_log_target TYPE REF TO if_log_persistence,
div IMPORTING p_x TYPE i p_y TYPE i.

PRIVATE SECTION.

DATA : v_value TYPE i,
v_msg TYPE char128,
o_log TYPE REF TO if_log_persistence,
o_exp TYPE REF TO cx_sy_zerodivide.

ENDCLASS. "LC_CALCULATOR DEFINITION

*----------------------------------------------------------------------*
* -> CLASS LC_CALCULATOR IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lc_calculator IMPLEMENTATION.

METHOD constructor.

me->o_log = p_log_target.

ENDMETHOD. "CONSTRUCTOR

METHOD div.

TRY.

me->v_value = ( p_x / p_y ).

WRITE / : ' Division Operation = ', me->v_value.

CATCH cx_sy_zerodivide INTO me->o_exp.

me->v_msg = o_exp->get_text( ).

o_log->save_log( me->v_msg ).

ENDTRY.

ENDMETHOD. "DIV

ENDCLASS. "LC_CALCULATOR IMPLEMENTATION

************************************************************************
************************************************************************
* *
* PROGRAM FLOW LOGIC *
* *
************************************************************************

*----------------------------------------------------------------------*
* -> DEFINE SCREEN ELEMENTS
*----------------------------------------------------------------------*
PARAMETERS : p_ltype TYPE i DEFAULT 1. " Use 1, 2, 3 or 4
" with value of p_ltype

*----------------------------------------------------------------------*
* -> START-OF-SELECTION EVENT PROCESSING
*----------------------------------------------------------------------*
START-OF-SELECTION.

DATA : o_log_in_database TYPE REF TO lc_log_in_database,
o_log_in_file TYPE REF TO lc_log_in_file,
o_log_in_email TYPE REF TO lc_log_in_email,
o_calculator TYPE REF TO lc_calculator.

CASE p_ltype.

WHEN 1.

CREATE OBJECT o_log_in_database.

IF o_log_in_database IS BOUND.

CREATE OBJECT o_calculator
EXPORTING
p_log_target = o_log_in_database.

IF o_calculator IS BOUND.

o_calculator->div( EXPORTING p_x = 1 p_y = 1 ). " Sucess
o_calculator->div( EXPORTING p_x = 1 p_y = 0 ). " Error

ENDIF.

ENDIF.

WHEN 2.

CREATE OBJECT o_log_in_file.

IF o_log_in_file IS BOUND.

CREATE OBJECT o_calculator
EXPORTING
p_log_target = o_log_in_file.

o_calculator->div( EXPORTING p_x = 2 p_y = 1 ). " Sucess
o_calculator->div( EXPORTING p_x = 2 p_y = 0 ). " Error

ENDIF.

WHEN 3.

CREATE OBJECT o_log_in_email.

IF o_log_in_email IS BOUND.

CREATE OBJECT o_calculator
EXPORTING
p_log_target = o_log_in_email.

o_calculator->div( EXPORTING p_x = 3 p_y = 1 ). " Sucess
o_calculator->div( EXPORTING p_x = 3 p_y = 0 ). " Error

ENDIF.

WHEN OTHERS.

WRITE / 'NO IMPLEMENTATION ACTIVE FOR THIS LOG TYPE'.

ENDCASE.

22/10/2010

First Char to Upper: Regex Vs Function


REPORT ZADN_SAMPLE.

*----------------------------------------------------------------------*
* -> CLASS cl_regex_vs_Function DEFINITION
*----------------------------------------------------------------------*
CLASS cl_regex_vs_function DEFINITION.

PUBLIC SECTION.

METHODS : first_char_to_upper_regex IMPORTING p_text TYPE char50,
first_char_to_upper_function IMPORTING p_text TYPE char50.

PRIVATE SECTION.

DATA : v_input_text TYPE c LENGTH 50,
v_match TYPE match_result.

DATA : it_matches TYPE match_result_tab.

ENDCLASS. "cl_regex_vs_Function DEFINITION


*----------------------------------------------------------------------*
* -> CLASS cl_regex_vs_Function IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_regex_vs_function IMPLEMENTATION.

METHOD first_char_to_upper_regex.

me->v_input_text = p_text.

WRITE / me->v_input_text.

FIND ALL OCCURRENCES OF REGEX '\<[[:lower:]]' IN me->v_input_text RESULTS me->it_matches.

LOOP AT me->it_matches INTO me->v_match.

TRANSLATE me->v_input_text+me->v_match-offset(1) TO UPPER CASE.

ENDLOOP.

WRITE / me->v_input_text.

CLEAR : me->v_input_text,
me->v_match.

REFRESH me->it_matches.

ENDMETHOD. "first_char_to_upper_regex

METHOD first_char_to_upper_function.

me->v_input_text = p_text.

WRITE / me->v_input_text.

CALL FUNCTION 'ISP_CONVERT_FIRSTCHARS_TOUPPER'
EXPORTING
input_string = me->v_input_text
separators = ' -.,;:'
IMPORTING
output_string = me->v_input_text.

WRITE / me->v_input_text.

CLEAR : me->v_input_text.

ENDMETHOD. "first_char_to_upper_function

ENDCLASS. "cl_regex_vs_Function IMPLEMENTATION

************************************************************************
************************************************************************
* *
* PROGRAM FLOW LOGIC *
* *
************************************************************************

PARAMETERS : pa_text TYPE char50.

START-OF-SELECTION.

DATA : o_cl_regex_vs_function TYPE REF TO cl_regex_vs_function.

CREATE OBJECT o_cl_regex_vs_function.

IF o_cl_regex_vs_function IS BOUND.

o_cl_regex_vs_function->first_char_to_upper_regex( pa_text ).

ULINE.

o_cl_regex_vs_function->first_char_to_upper_function( pa_text ).

ENDIF.

01/10/2010

Using Regex to validate CNPJ number

This regular expressions matches CNPJ number. CNPJ is a Registration Number of Brazilian Companies.


REPORT ZADN_SAMPLE.

*----------------------------------------------------------------------*
* -> CLASS cl_regex_test DEFINITION
*----------------------------------------------------------------------*
CLASS cl_regex_test DEFINITION FINAL.

PUBLIC SECTION.

METHODS : check_cnpj IMPORTING p_cnpj TYPE string.

PRIVATE SECTION.

DATA: o_regex TYPE REF TO cl_abap_regex,
o_matcher TYPE REF TO cl_abap_matcher.

ENDCLASS. "cl_regex_test DEFINITION

*----------------------------------------------------------------------*
* -> CLASS cl_regex_test IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_regex_test IMPLEMENTATION.

METHOD check_cnpj.

* Create the regular expression:

CREATE OBJECT o_regex
EXPORTING
pattern = '\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2}'.

* Check to see if the CNPJ number matches the regular expression:

CREATE OBJECT o_matcher
EXPORTING
regex = o_regex
text = p_cnpj.

IF o_matcher->match( ) NE abap_true.

MESSAGE 'Enter valid CNPJ number...' TYPE 'E'.

ELSE.

MESSAGE 'This is a valid CNPJ number...' TYPE 'S'.

ENDIF.

ENDMETHOD. "check_cnpj

ENDCLASS. "cl_regex_test IMPLEMENTATION

************************************************************************
************************************************************************
* *
* PROGRAM FLOW LOGIC *
* *
************************************************************************

START-OF-SELECTION.

DATA : ocl_regex_test TYPE REF TO cl_regex_test.

CREATE OBJECT ocl_regex_test.

ocl_regex_test->check_cnpj( '12.043.129/0001-98' ). " IS VALID

"ocl_regex_test->check_cnpj( '02.025.659/0001-981' ). " IS INVALID

Dynamically Created Internal Tables and Display ALV


REPORT ZADN_SAMPLE.

*----------------------------------------------------------------------*
* - > CLASS cl_dynamical_alv DEFINITION
*----------------------------------------------------------------------*
CLASS cl_dynamical_alv DEFINITION.

PUBLIC SECTION.

TYPES: BEGIN OF ty_screenfields,
tab_name TYPE tabname,
tab_rows TYPE i,
END OF ty_screenfields.

METHODS : display_table_data IMPORTING p_tabname TYPE tabname
p_maxrow TYPE i.

PRIVATE SECTION.

DATA: dtabref TYPE REF TO data,
alv TYPE REF TO cl_gui_alv_grid.

ENDCLASS. "cl_dynamical_alv DEFINITION

*----------------------------------------------------------------------*
* - > CLASS cl_dynamical_alv IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_dynamical_alv IMPLEMENTATION.

METHOD display_table_data.

FIELD-SYMBOLS: TYPE ANY TABLE.

CREATE DATA me->dtabref TYPE TABLE OF (p_tabname).

ASSIGN me->dtabref->* TO .

SELECT *
FROM (p_tabname) UP TO p_maxrow ROWS
INTO TABLE .

CREATE OBJECT alv
EXPORTING
i_parent = cl_gui_container=>screen0.

CALL METHOD alv->set_table_for_first_display
EXPORTING
i_structure_name = p_tabname
CHANGING
it_outtab = .

CALL SCREEN 100.

ENDMETHOD. "DISPLAY_TABLE_DATA

ENDCLASS. "cl_dynamical_alv IMPLEMENTATION

************************************************************************
************************************************************************
* *
* PROGRAM FLOW LOGIC *
* *
************************************************************************

SELECTION-SCREEN BEGIN OF BLOCK b001 WITH FRAME TITLE text-001.

PARAMETERS : p_tbname TYPE cl_dynamical_alv=>ty_screenfields-tab_name,
p_tbrows TYPE cl_dynamical_alv=>ty_screenfields-tab_rows.

SELECTION-SCREEN END OF BLOCK b001.

START-OF-SELECTION.

DATA : o_cl_dynamical_alv TYPE REF TO cl_dynamical_alv.

CREATE OBJECT o_cl_dynamical_alv.

o_cl_dynamical_alv->display_table_data( EXPORTING p_tabname = p_tbname
p_maxrow = p_tbrows ).

29/09/2010

Using Regex to validate email address


REPORT ZADN_SAMPLE.

*----------------------------------------------------------------------*
* -> CLASS cl_regex_test DEFINITION
*----------------------------------------------------------------------*
CLASS cl_regex_test DEFINITION FINAL.

PUBLIC SECTION.

METHODS : check_email IMPORTING p_email TYPE string.

PRIVATE SECTION.

DATA: o_regex TYPE REF TO cl_abap_regex,
o_matcher TYPE REF TO cl_abap_matcher.

ENDCLASS. "cl_regex_test DEFINITION

*----------------------------------------------------------------------*
* -> CLASS cl_regex_test IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_regex_test IMPLEMENTATION.

METHOD check_email.

* Create the regular expression:

CREATE OBJECT o_regex
EXPORTING
pattern = '^[a-zA-Z]+(([\''\,\.\- ][a-zA-Z ])?[a-zA-Z]*)*\s+<' &
'(\w[-._\w]*\w@\w[-._\w]*\w\.\w{2,3})>$|^(\w[-._\w]*' &
'\w@\w[-._\w]*\w\.\w{2,3})$'.

* Check to see if the email matches the regular expression:

CREATE OBJECT o_matcher
EXPORTING
regex = o_regex
text = p_email.

IF o_matcher->match( ) NE abap_true.

MESSAGE 'Enter email address valid...' TYPE 'E'.

ELSE.

MESSAGE 'This is a valid email address...' TYPE 'S'.

ENDIF.

ENDMETHOD. "check_email

ENDCLASS. "cl_regex_test IMPLEMENTATION

************************************************************************
************************************************************************
* *
* PROGRAM FLOW LOGIC *
* *
************************************************************************

START-OF-SELECTION.

DATA : ocl_regex_test TYPE REF TO cl_regex_test.

CREATE OBJECT ocl_regex_test.

ocl_regex_test->check_email( 'abapdn.network@mail.com' ).

28/09/2010

Alert Sound in ABAP


REPORT ZADN_SAMPLE.

DATA: it_vbscript LIKE STANDARD TABLE OF soli WITH HEADER LINE,
v_vbsfile LIKE rlgrap-filename.

*-----------------------------------------------------------------------
* This code creates the vbScript to play sound ringin.wav
*-----------------------------------------------------------------------
APPEND: 'strSoundFile = "C:\WINDOWS\Media\ringin.wav"' TO it_vbscript,
'Set objShell = CreateObject("Wscript.Shell")' TO it_vbscript,
'strCommand = "sndrec32 /play /close " & chr(34) & strSoundFile & chr(34)' TO it_vbscript,
'objShell.Run strCommand, 0, True' TO it_vbscript.

*-----------------------------------------------------------------------
* Generated Script file must be downloaded into the TEMP folder of
* the Windows environment
*-----------------------------------------------------------------------
CALL FUNCTION 'WS_QUERY'
EXPORTING
environment = 'TEMP'
query = 'EN'
IMPORTING
return = v_vbsfile
EXCEPTIONS
inv_query = 1
no_batch = 2
frontend_error = 3
OTHERS = 4.

IF sy-subrc <> 0.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ELSE.

CONCATENATE v_vbsfile '\my_script.vbs' INTO v_vbsfile.

*-----------------------------------------------------------------------
* Script file is downloaded
*-----------------------------------------------------------------------
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
filename = v_vbsfile
filetype = 'DAT'
mode = 'S'
TABLES
data_tab = it_vbscript
EXCEPTIONS
file_open_error = 1
file_write_error = 2
invalid_filesize = 3
invalid_table_width = 4
invalid_type = 5
no_batch = 6
unknown_error = 7
OTHERS = 8.

IF sy-subrc <> 0.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ELSE.

*-----------------------------------------------------------------------
* The Script file is executed
*-----------------------------------------------------------------------
CALL FUNCTION 'WS_EXECUTE'
EXPORTING
commandline = v_vbsfile
program = 'WSCRIPT.EXE'
EXCEPTIONS
frontend_error = 1
no_batch = 2
prog_not_found = 3
illegal_option = 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.

ENDIF.

ENDIF.

ENDIF.

SAP knows how to speak


REPORT ZADN_SAMPLE.

INCLUDE ole2incl.

DATA : v_objole TYPE ole2_object,
v_objolevoice TYPE ole2_object,
v_strtotalk TYPE string.

CREATE OBJECT v_objolevoice 'SAPI.SpVoice'.

v_strtotalk = 'SAP is the market and technology leader in business management software'.

CALL METHOD OF v_objolevoice 'Speak' = v_objole
EXPORTING #1 = v_strtotalk.

WAIT UP TO 1 SECONDS.

v_strtotalk = 'ABAP DEVELOPER NETWORK'.

CALL METHOD OF v_objolevoice 'Speak' = v_objole
EXPORTING #1 = v_strtotalk.

FREE: v_objolevoice,v_objole.

27/09/2010

Introduction to SpreadsheetML in ABAP

SpreadsheetML is an XML dialect developed by Microsoft to represent information in an Excel workbook. This column, explores the concept, schema definition, and some scenarios in which it makes sense to programmatically generate Excel workbooks using Office 2003 and SpreadsheetML.

Excel workbooks using Office 2003 and SpreadsheetML



REPORT ZADN_SAMPLE.

*----------------------------------------------------------------------*
* -> CLASS cl_xls_generator DEFINITION
*----------------------------------------------------------------------*
CLASS cl_xls_generator DEFINITION.

PUBLIC SECTION.

METHODS : crete_xls_data,
save_xls_data.

PRIVATE SECTION.

TYPES : BEGIN OF line_data,
fname TYPE c LENGTH 50,
lname TYPE c LENGTH 50,
phone TYPE c LENGTH 20,
END OF line_data.

DATA : v_filename TYPE string,
v_path TYPE string,
v_fullpath TYPE string ,
it_data TYPE STANDARD TABLE OF line_data,
it_xls TYPE STANDARD TABLE OF string,
wa_data LIKE LINE OF it_data,
wa_xls LIKE LINE OF it_xls.

ENDCLASS. "cl_xls_generator DEFINITION

*----------------------------------------------------------------------*
* -> CLASS cl_xls_generator IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_xls_generator IMPLEMENTATION.

METHOD crete_xls_data.

DO 30 TIMES.

CLEAR me->wa_data.

me->wa_data-fname = `Rafael`.
me->wa_data-lname = `Riso`.
me->wa_data-phone = `(99) 9999 - 9999`.

APPEND me->wa_data TO me->it_data.

ENDDO.

ENDMETHOD. "crete_xls_data

METHOD save_xls_data.

CLEAR me->wa_data.

APPEND '' TO me->it_xls.
APPEND '' TO me->it_xls.
APPEND '' TO me->it_xls.
APPEND '' TO me->it_xls.
APPEND '' TO me->it_xls.
APPEND '
' TO me->it_xls.
APPEND '
' TO me->it_xls.
APPEND '' TO me->it_xls.
APPEND '' TO me->it_xls.
APPEND '' TO me->it_xls.
APPEND '' TO me->it_xls.
APPEND '' TO me->it_xls.
APPEND '' TO me->it_xls.
APPEND '' TO me->it_xls.
APPEND 'First Name' TO me->it_xls.
APPEND '
' TO me->it_xls.
APPEND '' TO me->it_xls.
APPEND 'Last Name' TO me->it_xls.
APPEND '
' TO me->it_xls.
APPEND '' TO me->it_xls.
APPEND 'Phone Number' TO me->it_xls.
APPEND '
' TO me->it_xls.
APPEND '
' TO me->it_xls.

LOOP AT me->it_data INTO me->wa_data.

CLEAR me->wa_xls.

APPEND '' TO it_xls.

APPEND '' TO it_xls.

CONCATENATE '' me->wa_data-fname '' INTO me->wa_xls.

APPEND me->wa_xls TO me->it_xls.

CLEAR me->wa_xls.

APPEND '
' TO me->it_xls.

APPEND '' TO me->it_xls.

CONCATENATE '' me->wa_data-lname '' INTO me->wa_xls.

APPEND me->wa_xls TO me->it_xls.

CLEAR me->wa_xls.

APPEND '
' TO me->it_xls.

APPEND '' TO me->it_xls.

CONCATENATE '' me->wa_data-phone '' INTO me->wa_xls.

APPEND me->wa_xls TO me->it_xls.

CLEAR me->wa_xls.

APPEND '
' TO me->it_xls.

APPEND '
' TO me->it_xls.

ENDLOOP.

APPEND '
' TO me->it_xls.
APPEND '
' TO me->it_xls.
APPEND '
' TO me->it_xls.

CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = 'Enter File Name'
default_extension = 'xls'
file_filter = '*.xls'
initial_directory = 'c:'
prompt_on_overwrite = 'X'
CHANGING
filename = me->v_filename
path = me->v_path
fullpath = me->v_fullpath
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.

IF sy-subrc <> 0.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = me->v_fullpath
filetype = 'ASC'
show_transfer_status = 'X'
CHANGING
data_tab = me->it_xls[]
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
not_supported_by_gui = 22
error_no_gui = 23
OTHERS = 24.

IF sy-subrc <> 0.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDMETHOD. "save_xls_data

ENDCLASS. "cl_xls_generator IMPLEMENTATION

************************************************************************
************************************************************************
* *
* PROGRAM FLOW LOGIC *
* *
************************************************************************

START-OF-SELECTION.

DATA : o_cl_xls_generator TYPE REF TO cl_xls_generator.

CREATE OBJECT o_cl_xls_generator.

o_cl_xls_generator->crete_xls_data( ).
o_cl_xls_generator->save_xls_data( ).

24/09/2010

Builder Design Pattern

The builder pattern is a design pattern that allows for the step-by-step creation of complex objects using the correct sequence of actions. The construction is controlled by a director object that only needs to know the type of object it is to create.


REPORT ZADN_SAMPLE.

*----------------------------------------------------------------------*
* -> CLASS cl_Meal DEFINITION
*----------------------------------------------------------------------*
CLASS cl_meal DEFINITION.

PUBLIC SECTION.

DATA : sandwich TYPE string,
sideorder TYPE string,
drink TYPE string,
offer TYPE string,
price TYPE p LENGTH 4 DECIMALS 2.

METHODS : tostring.

ENDCLASS. "cl_Meal DEFINITION

*----------------------------------------------------------------------*
* -> CLASS cl_meal IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_meal IMPLEMENTATION.

METHOD tostring.

DATA : v_msg TYPE string,
v_price TYPE c LENGTH 15.

WRITE me->price TO v_price.

CONCATENATE : `Sandwich: `
me->sandwich
` - SideOrder: `
me->sideorder
` - Drink: `
me->drink
` - Offer: `
me->offer
` - Price: R$ `
v_price INTO v_msg.

WRITE / v_msg.

ENDMETHOD. "ToString

ENDCLASS. "cl_meal IMPLEMENTATION

*----------------------------------------------------------------------*
* -> CLASS cl_MealBuilder DEFINITION
*----------------------------------------------------------------------*
CLASS cl_mealbuilder DEFINITION ABSTRACT.

PUBLIC SECTION.

METHODS : addsandwich ABSTRACT,
addsideorder ABSTRACT,
adddrink ABSTRACT,
addofferitem ABSTRACT,
setprice ABSTRACT,
getmeal ABSTRACT EXPORTING p_meal TYPE REF TO cl_meal.

ENDCLASS. "cl_MealBuilder DEFINITION

*----------------------------------------------------------------------*
* -> CLASS cl_MealDirector DEFINITION
*----------------------------------------------------------------------*
CLASS cl_mealdirector DEFINITION.

PUBLIC SECTION.

METHODS : makemeal IMPORTING p_mealbuilder TYPE REF TO cl_mealbuilder.

ENDCLASS. "cl_MealDirector DEFINITION

*----------------------------------------------------------------------*
* -> CLASS cl_mealdirector IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_mealdirector IMPLEMENTATION.

METHOD makemeal.

p_mealbuilder->addsandwich( ).
p_mealbuilder->addsideorder( ).
p_mealbuilder->adddrink( ).
p_mealbuilder->addofferitem( ).
p_mealbuilder->setprice( ).

ENDMETHOD. "MakeMeal

ENDCLASS. "cl_mealdirector IMPLEMENTATION

*----------------------------------------------------------------------*
* -> CLASS cl_JollyVegetarianMealBuilder DEFINITION
*----------------------------------------------------------------------*
CLASS cl_jollyvegetarianmealbuilder DEFINITION INHERITING FROM cl_mealbuilder.

PUBLIC SECTION.

METHODS : constructor,
addsandwich REDEFINITION,
addsideorder REDEFINITION,
adddrink REDEFINITION,
addofferitem REDEFINITION,
setprice REDEFINITION,
getmeal REDEFINITION.

PRIVATE SECTION.

DATA : o_meal TYPE REF TO cl_meal.

ENDCLASS. "cl_JollyVegetarianMealBuilder DEFINITION

*----------------------------------------------------------------------*
* -> CLASS cl_jollyvegetarianmealbuilder IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_jollyvegetarianmealbuilder IMPLEMENTATION.

METHOD constructor.

super->constructor( ).

CREATE OBJECT o_meal.

ENDMETHOD. "constructor

METHOD addsandwich.

o_meal->sandwich = `Vegeburger`.

ENDMETHOD. "addsandwich

METHOD addsideorder.

o_meal->sideorder = `Fries`.

ENDMETHOD. "addsideorder

METHOD adddrink.

o_meal->drink = `Orange Juice`.

ENDMETHOD. "adddrink

METHOD addofferitem.

o_meal->offer = `Donut Voucher`.

ENDMETHOD. "addofferitem

METHOD setprice.

o_meal->price = `4.99`.

ENDMETHOD. "setprice

METHOD getmeal.

p_meal = me->o_meal.

ENDMETHOD. "getmeal

ENDCLASS. "cl_jollyvegetarianmealbuilder IMPLEMENTATION


*----------------------------------------------------------------------*
* -> CLASS cl_mischievousbrazilianbuilder DEFINITION
*----------------------------------------------------------------------*
CLASS cl_mischievousbrazilianbuilder DEFINITION INHERITING FROM cl_mealbuilder.

PUBLIC SECTION.

METHODS : constructor,
addsandwich REDEFINITION,
addsideorder REDEFINITION,
adddrink REDEFINITION,
addofferitem REDEFINITION,
setprice REDEFINITION,
getmeal REDEFINITION.

PRIVATE SECTION.

DATA : o_meal TYPE REF TO cl_meal.

ENDCLASS. "cl_mischievousbrazilianbuilder DEFINITION


*----------------------------------------------------------------------*
* -> CLASS cl_mischievousbrazilianbuilder IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_mischievousbrazilianbuilder IMPLEMENTATION.

METHOD constructor.

super->constructor( ).

CREATE OBJECT o_meal.

ENDMETHOD. "constructor

METHOD addsandwich.

o_meal->sandwich = `X-TUDO Burger`.

ENDMETHOD. "addsandwich

METHOD addsideorder.

o_meal->sideorder = `Fries`.

ENDMETHOD. "addsideorder

METHOD adddrink.

o_meal->drink = `Caipirinha`.

ENDMETHOD. "adddrink

METHOD addofferitem.

o_meal->offer = `Weekend Happy`.

ENDMETHOD. "addofferitem

METHOD setprice.

o_meal->price = `15.49`.

ENDMETHOD. "setprice

METHOD getmeal.

p_meal = me->o_meal.

ENDMETHOD. "getmeal

ENDCLASS. "cl_mischievousbrazilianbuilder IMPLEMENTATION

************************************************************************
************************************************************************
* *
* PROGRAM FLOW LOGIC *
* *
************************************************************************

START-OF-SELECTION.

DATA : o_director TYPE REF TO cl_mealdirector,
o_jvmb TYPE REF TO cl_jollyvegetarianmealbuilder,
o_mvbb TYPE REF TO cl_mischievousbrazilianbuilder,
o_vegmeal TYPE REF TO cl_meal,
o_brameal TYPE REF TO cl_meal.

CREATE OBJECT : o_director,
o_jvmb,
o_mvbb.

o_director->makemeal( EXPORTING p_mealbuilder = o_jvmb ).

o_jvmb->getmeal( IMPORTING p_meal = o_vegmeal ).

o_director->makemeal( EXPORTING p_mealbuilder = o_mvbb ).

o_mvbb->getmeal( IMPORTING p_meal = o_brameal ).

o_vegmeal->tostring( ).

o_brameal->tostring( ).

Prototype Design Pattern

The prototype design pattern is a design pattern that is used to instantiate a class by copying, or cloning, the properties of an existing object. The new object is an exact copy of the prototype but permits modification without altering the original.


REPORT ZADN_SAMPLE.

*----------------------------------------------------------------------*
* -> CLASS cl_employee DEFINITION
*----------------------------------------------------------------------*
CLASS cl_employee DEFINITION ABSTRACT.

PUBLIC SECTION.

DATA : name TYPE string,
role TYPE string.

METHODS : clone ABSTRACT EXPORTING clone_instance TYPE REF TO cl_employee,
tostring ABSTRACT.

ENDCLASS. "cl_employee DEFINITION

*----------------------------------------------------------------------*
* -> CLASS cl_Typist DEFINITION
*----------------------------------------------------------------------*
CLASS cl_typist DEFINITION INHERITING FROM cl_employee.

PUBLIC SECTION.

DATA : wordsperminute TYPE n.

METHODS : clone REDEFINITION,
tostring REDEFINITION.

ENDCLASS. "cl_Typist DEFINITION

*----------------------------------------------------------------------*
* -> CLASS cl_typist IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_typist IMPLEMENTATION.

METHOD clone.

DATA : o_cl_typist TYPE REF TO cl_typist.

CREATE OBJECT clone_instance TYPE cl_typist.

TRY.

o_cl_typist ?= clone_instance.

MOVE : me->name TO o_cl_typist->name,
me->role TO o_cl_typist->role,
me->wordsperminute TO o_cl_typist->wordsperminute.

CATCH cx_sy_move_cast_error.

WRITE: / 'Up Cast Failed'.

ENDTRY.

ENDMETHOD. "clone

METHOD tostring.

DATA : v_msg TYPE string.

CONCATENATE : `Name = ` me->name
`, Role = ` me->role
`, Words Perminute = ` me->wordsperminute
INTO v_msg.

WRITE / v_msg.

ENDMETHOD. "tostring

ENDCLASS. "cl_typist IMPLEMENTATION

*----------------------------------------------------------------------*
* -> CLASS cl_Developer DEFINITION
*----------------------------------------------------------------------*
CLASS cl_developer DEFINITION INHERITING FROM cl_employee.

PUBLIC SECTION.

DATA : preferredlanguage TYPE string.

METHODS : clone REDEFINITION,
tostring REDEFINITION.

ENDCLASS. "cl_Developer DEFINITION

*----------------------------------------------------------------------*
* -> CLASS cl_Developer IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_developer IMPLEMENTATION.

METHOD clone.

DATA : o_cl_developer TYPE REF TO cl_developer.

CREATE OBJECT clone_instance TYPE cl_developer.

TRY.

o_cl_developer ?= clone_instance.

MOVE : me->name TO o_cl_developer->name,
me->role TO o_cl_developer->role,
me->preferredlanguage TO o_cl_developer->preferredlanguage.

CATCH cx_sy_move_cast_error.

WRITE: / 'Up Cast Failed'.

ENDTRY.

ENDMETHOD. "clone

METHOD tostring.

DATA : v_msg TYPE string.

CONCATENATE : `Name = ` me->name
`, Role = ` me->role
`, Preferred Language = ` me->preferredlanguage
INTO v_msg.

WRITE / v_msg.

ENDMETHOD. "tostring

ENDCLASS. "cl_Developer IMPLEMENTATION

************************************************************************
************************************************************************
* *
* PROGRAM FLOW LOGIC *
* *
************************************************************************

START-OF-SELECTION.

DATA : o_base TYPE REF TO cl_employee,
o_dev TYPE REF TO cl_developer,
o_devcopy TYPE REF TO cl_developer,
o_casterror TYPE REF TO cx_sy_move_cast_error.

CREATE OBJECT o_dev.

IF o_dev IS BOUND.

o_dev->name = 'Rafael Riso'.
o_dev->role = 'Team Leader'.
o_dev->preferredlanguage = 'ABAP OO'.

ENDIF.

TRY.

o_dev->clone( IMPORTING clone_instance = o_base ).

o_devcopy ?= o_base.

CATCH cx_sy_move_cast_error INTO o_casterror.

WRITE: / 'Up Cast Failed'.

ENDTRY.

IF o_devcopy IS BOUND.

o_devcopy->name = 'Johnnie Walker'.

ENDIF.

IF o_dev IS BOUND AND o_devcopy IS BOUND.

o_dev->tostring( ).

ULINE.

o_devcopy->tostring( ).

ENDIF.

22/09/2010

Factory Method Design Pattern

The factory method pattern is a design pattern that allows for the creation of objects without specifying the type of object that is to be created in code. A factory class contains a method that allows determination of the created type at run-time.


REPORT ZADN_SAMPLE.

*----------------------------------------------------------------------*
* -> Abstract - CLASS cl_car_base DEFINITION
*----------------------------------------------------------------------*
CLASS cl_car_base DEFINITION ABSTRACT.

PUBLIC SECTION.

METHODS : set_attributes IMPORTING p_color TYPE string
p_year TYPE c,

get_cartype RETURNING value(p_cartype) TYPE string.

PRIVATE SECTION.

DATA : color TYPE string,
year TYPE c LENGTH 4.

ENDCLASS. "cl_car_base DEFINITION

*----------------------------------------------------------------------*
* -> Abstract - CLASS cl_car_base IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_car_base IMPLEMENTATION.

METHOD set_attributes.

me->color = p_color.
me->year = p_year.

ENDMETHOD. "set_attributes

METHOD get_cartype.

ENDMETHOD. "get_cartype

ENDCLASS. "cl_car_base IMPLEMENTATION

*----------------------------------------------------------------------*
* -> Concrete - CLASS cl_vectra DEFINITION
*----------------------------------------------------------------------*
CLASS cl_vectra DEFINITION INHERITING FROM cl_car_base.

PUBLIC SECTION.

METHODS get_cartype REDEFINITION.

ENDCLASS. "cl_vectra DEFINITION

*----------------------------------------------------------------------*
* -> Concrete - CLASS cl_vectra IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_vectra IMPLEMENTATION.

METHOD get_cartype.

p_cartype = 'VECTRA'.

ENDMETHOD. "get_cartype

ENDCLASS. "cl_vectra IMPLEMENTATION

*----------------------------------------------------------------------*
* -> Concrete - CLASS cl_agile DEFINITION
*----------------------------------------------------------------------*
CLASS cl_agile DEFINITION INHERITING FROM cl_car_base.

PUBLIC SECTION.

METHODS get_cartype REDEFINITION.

ENDCLASS. "cl_agile DEFINITION

*----------------------------------------------------------------------*
* -> Concrete - CLASS cl_agile IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_agile IMPLEMENTATION.

METHOD get_cartype.

p_cartype = 'AGILE'.

ENDMETHOD. "get_cartype

ENDCLASS. "cl_agile IMPLEMENTATION

*----------------------------------------------------------------------*
* -> Concrete - CLASS cl_prisma DEFINITION
*----------------------------------------------------------------------*
CLASS cl_prisma DEFINITION INHERITING FROM cl_car_base.

PUBLIC SECTION.

METHODS get_cartype REDEFINITION.

ENDCLASS. "cl_prisma DEFINITION

*----------------------------------------------------------------------*
* -> Concrete - CLASS cl_prisma IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_prisma IMPLEMENTATION.

METHOD get_cartype.

p_cartype = 'PRISMA'.

ENDMETHOD. "get_cartype

ENDCLASS. "cl_prisma IMPLEMENTATION

*----------------------------------------------------------------------*
* -> Concrete - CLASS cl_fiesta DEFINITION
*----------------------------------------------------------------------*
CLASS cl_fiesta DEFINITION INHERITING FROM cl_car_base.

PUBLIC SECTION.

METHODS get_cartype REDEFINITION.

ENDCLASS. "cl_fiesta DEFINITION

*----------------------------------------------------------------------*
* -> Concrete - CLASS cl_fiesta IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_fiesta IMPLEMENTATION.

METHOD get_cartype.

p_cartype = 'FIESTA'.

ENDMETHOD. "get_cartype

ENDCLASS. "cl_fiesta IMPLEMENTATION

*----------------------------------------------------------------------*
* -> Concrete - CLASS cl_focus DEFINITION
*----------------------------------------------------------------------*
CLASS cl_focus DEFINITION INHERITING FROM cl_car_base.

PUBLIC SECTION.

METHODS get_cartype REDEFINITION.

ENDCLASS. "cl_focus DEFINITION

*----------------------------------------------------------------------*
* -> Concrete - CLASS cl_focus IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_focus IMPLEMENTATION.

METHOD get_cartype.

p_cartype = 'FOCUS'.

ENDMETHOD. "get_cartype

ENDCLASS. "cl_focus IMPLEMENTATION

*----------------------------------------------------------------------*
* -> Concrete - CLASS cl_ka DEFINITION
*----------------------------------------------------------------------*
CLASS cl_ka DEFINITION INHERITING FROM cl_car_base.

PUBLIC SECTION.

METHODS get_cartype REDEFINITION.

ENDCLASS. "cl_ka DEFINITION

*----------------------------------------------------------------------*
* -> Concrete - CLASS cl_ka IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_ka IMPLEMENTATION.

METHOD get_cartype.

p_cartype = 'KA'.

ENDMETHOD. "get_cartype

ENDCLASS. "cl_ka IMPLEMENTATION

************************************************************************
************************************************************************
* *
* FACTORY CLASSES DEFINITION *
* *
************************************************************************

*----------------------------------------------------------------------*
* -> Abstract - CLASS cl_car_factory DEFINITION
*----------------------------------------------------------------------*
CLASS cl_car_factory DEFINITION ABSTRACT.

PUBLIC SECTION.

METHODS : create_car IMPORTING p_cartype TYPE n
EXPORTING p_carinstance TYPE REF TO cl_car_base.

ENDCLASS. "cl_car_factory DEFINITION

*----------------------------------------------------------------------*
* Abstract - CLASS cl_car_factory IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_car_factory IMPLEMENTATION.

METHOD create_car.

ENDMETHOD. "create_car

ENDCLASS. "cl_car_factory IMPLEMENTATION

*----------------------------------------------------------------------*
* -> Concrete - CLASS cl_chevrolet_factory DEFINITION
*----------------------------------------------------------------------*
CLASS cl_chevrolet_factory DEFINITION INHERITING FROM cl_car_factory.

PUBLIC SECTION.

METHODS : create_car REDEFINITION.

ENDCLASS. "cl_chevrolet_factory DEFINITION

*----------------------------------------------------------------------*
* -> Concrete - CLASS cl_chevrolet_factory IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_chevrolet_factory IMPLEMENTATION.

METHOD create_car.

CASE p_cartype.

WHEN '100'.

CREATE OBJECT p_carinstance TYPE cl_vectra.

WHEN '200'.

CREATE OBJECT p_carinstance TYPE cl_agile.

WHEN '300'.

CREATE OBJECT p_carinstance TYPE cl_prisma.

ENDCASE.

ENDMETHOD. "create_car

ENDCLASS. "cl_chevrolet_factory IMPLEMENTATION

*----------------------------------------------------------------------*
* -> Concrete - CLASS cl_ford_factory DEFINITION
*----------------------------------------------------------------------*
CLASS cl_ford_factory DEFINITION INHERITING FROM cl_car_factory.

PUBLIC SECTION.

METHODS : create_car REDEFINITION.

ENDCLASS. "cl_ford_factory DEFINITION

*----------------------------------------------------------------------*
* -> Concrete - CLASS cl_ford_factory IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_ford_factory IMPLEMENTATION.

METHOD create_car.

CASE p_cartype.

WHEN '100'.

CREATE OBJECT p_carinstance TYPE cl_fiesta.

WHEN '200'.

CREATE OBJECT p_carinstance TYPE cl_focus.

WHEN '300'.

CREATE OBJECT p_carinstance TYPE cl_ka.

ENDCASE.

ENDMETHOD. "create_car

ENDCLASS. "cl_ford_factory IMPLEMENTATION

************************************************************************
************************************************************************
* *
* PROGRAM FLOW LOGIC *
* *
************************************************************************

START-OF-SELECTION.

PARAMETERS : p_type1 TYPE n LENGTH 3 OBLIGATORY DEFAULT '100',
p_type2 TYPE n LENGTH 3 OBLIGATORY DEFAULT '100'.

DATA : o1_chevrolet_factory TYPE REF TO cl_car_factory,
o2_ford_factory TYPE REF TO cl_car_factory.

DATA : o1_car TYPE REF TO cl_car_base,
o2_car TYPE REF TO cl_car_base.

DATA : v_type1 TYPE string,
v_type2 TYPE string.


CREATE OBJECT : o1_chevrolet_factory TYPE cl_chevrolet_factory,
o2_ford_factory TYPE cl_ford_factory.

o1_chevrolet_factory->create_car( EXPORTING p_cartype = p_type1
IMPORTING p_carinstance = o1_car ).

o2_ford_factory->create_car( EXPORTING p_cartype = p_type2
IMPORTING p_carinstance = o2_car ).

IF o1_car IS BOUND.

o1_car->set_attributes( EXPORTING p_color = 'BLACK'
p_year = '2010' ).

v_type1 = o1_car->get_cartype( ).

WRITE : / 'Car Type : ', v_type1.

ULINE.

ENDIF.

IF o2_car IS BOUND.

o2_car->set_attributes( EXPORTING p_color = 'BLACK'
p_year = '2010' ).

v_type2 = o2_car->get_cartype( ).

WRITE : / 'Car Type : ', v_type2.

ENDIF.

21/09/2010

Singleton Design Pattern


REPORT ZADN_SAMPLE.

*----------------------------------------------------------------------*
* CLASS cl_applicationstate DEFINITION
*----------------------------------------------------------------------*
CLASS cl_applicationstate DEFINITION CREATE PRIVATE.

PUBLIC SECTION.

DATA : hostname TYPE c LENGTH 128,
ip_addrs TYPE c LENGTH 15.

CLASS-METHODS : getstate EXPORTING p_instance TYPE REF TO cl_applicationstate.

PRIVATE SECTION.

METHODS : constructor.

CLASS-DATA : _instance TYPE REF TO cl_applicationstate.

ENDCLASS. "cl_ApplicationState DEFINITION


*----------------------------------------------------------------------*
* CLASS cl_applicationstate IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_applicationstate IMPLEMENTATION.

METHOD constructor.

ENDMETHOD. "constructor

METHOD getstate.

IF _instance IS NOT BOUND.

CREATE OBJECT _instance.

p_instance = _instance.

ELSE.

p_instance = _instance.

ENDIF.

ENDMETHOD. "getstate

ENDCLASS. "cl_ApplicationState IMPLEMENTATION

START-OF-SELECTION.

DATA : o1_cl_applicationstate TYPE REF TO cl_applicationstate,
o2_cl_applicationstate TYPE REF TO cl_applicationstate.

cl_applicationstate=>getstate( IMPORTING p_instance = o1_cl_applicationstate ).

IF o1_cl_applicationstate IS BOUND.

o1_cl_applicationstate->hostname = 'LOCALHOST'.
o1_cl_applicationstate->ip_addrs = '127.0.0.1'.

ENDIF.

cl_applicationstate=>getstate( IMPORTING p_instance = o2_cl_applicationstate ).

WRITE / : o1_cl_applicationstate->hostname,
o1_cl_applicationstate->ip_addrs.

ULINE.

WRITE / : o2_cl_applicationstate->hostname,
o2_cl_applicationstate->ip_addrs.

ULINE.

IF o1_cl_applicationstate EQ o2_cl_applicationstate.

WRITE / 'Objetos são iguais'.

ENDIF.

UI Output Options with Local Class


REPORT ZADN_SAMPLE.

*----------------------------------------------------------------------*
* CLASS cl_UI_manager DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_ui_manager DEFINITION.

PUBLIC SECTION.

METHODS : constructor,
set_field_options IMPORTING p_name TYPE c
p_required TYPE c
p_input TYPE c
p_output TYPE c,
commit_ui_changes.

PRIVATE SECTION.

DATA : it_screen TYPE SORTED TABLE OF screen WITH UNIQUE KEY name.

ENDCLASS. "cl_UI_manager DEFINITION

*----------------------------------------------------------------------*
* CLASS cl_UI_manager IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_ui_manager IMPLEMENTATION.

METHOD constructor.

LOOP AT SCREEN.

INSERT screen INTO TABLE me->it_screen.

ENDLOOP.

ENDMETHOD. "constructor

METHOD set_field_options.

FIELD-SYMBOLS : <fs_screen> TYPE screen.

READ TABLE me->it_screen ASSIGNING <fs_screen> WITH KEY name = p_name.

IF <fs_screen> IS ASSIGNED.

<fs_screen>-required = p_required.
<fs_screen>-input = p_input.
<fs_screen>-output = p_output.

ENDIF.

ENDMETHOD. "set_field_options

METHOD commit_ui_changes.

FIELD-SYMBOLS : <fs_screen> TYPE screen.

LOOP AT SCREEN.

READ TABLE me->it_screen ASSIGNING <fs_screen> WITH KEY name = screen-name.

IF <fs_screen> IS ASSIGNED.

MODIFY SCREEN FROM <fs_screen>.

ENDIF.

ENDLOOP.

ENDMETHOD. "commit_UI_changes

ENDCLASS. "cl_UI_manager IMPLEMENTATION

DATA o_cl_ui_manager TYPE REF TO cl_ui_manager.

PARAMETERS : p_1 TYPE c LENGTH 10,
p_2 TYPE c LENGTH 10.

PARAMETERS : ch_1 RADIOBUTTON GROUP xc USER-COMMAND selec,
ch_2 RADIOBUTTON GROUP xc.

INITIALIZATION.

CREATE OBJECT o_cl_ui_manager.

AT SELECTION-SCREEN OUTPUT.

IF o_cl_ui_manager IS BOUND.

o_cl_ui_manager->set_field_options( p_name = 'P_1'
p_required = '0'
p_input = '0'
p_output = '1' ).

o_cl_ui_manager->set_field_options( p_name = 'P_2'
p_required = '1'
p_input = '1'
p_output = '1' ).

o_cl_ui_manager->commit_ui_changes( ).

ENDIF.

17/09/2010

W3C DOM and the SAP iXML Library


REPORT ZADN_SAMPLE.

*----------------------------------------------------------------------*
* -> Local Class Definitions *
*----------------------------------------------------------------------*

CLASS lcl_dom_xmlprocessor DEFINITION.

PUBLIC SECTION.

CLASS-METHODS : class_constructor,
main.

METHODS : constructor,
add_partner IMPORTING im_id TYPE string
im_type TYPE i
im_name TYPE string
im_date TYPE d,
show_document.

PRIVATE SECTION.

CLASS-DATA : ixml_factory TYPE REF TO if_ixml.

DATA : partners_doc TYPE REF TO if_ixml_document,
partners_node TYPE REF TO if_ixml_element.

ENDCLASS. "lcl_dom_xmlprocessor DEFINITION

*----------------------------------------------------------------------*
* - > CLASS lcl_dom_xmlprocessor IMPLEMENTATION *
*----------------------------------------------------------------------*
* - > LOcal Class Implementation *
*----------------------------------------------------------------------*
CLASS lcl_dom_xmlprocessor IMPLEMENTATION.

METHOD class_constructor.

* Retrieve a reference to the iXML factory:
ixml_factory = cl_ixml=>create( ).

ENDMETHOD. "class_constructor

METHOD constructor.

* Create a new DOM-based XML document:
partners_doc = ixml_factory->create_document( ).

* Create the root "partners" element:
partners_node =
partners_doc->create_simple_element(
name = 'Partners'
parent = partners_doc ).

ENDMETHOD. "constructor

METHOD main.

* Method-Local Data Declarations:
DATA: lo_dom_processor TYPE REF TO lcl_dom_xmlprocessor.

* Create an instance of the test driver class:
CREATE OBJECT lo_dom_processor.

* Add a couple of partners to the list:
lo_dom_processor->add_partner( im_id = '12345'
im_type = 2
im_name = 'SAP Developer Network, SDN.'
im_date = '20060201' ).

lo_dom_processor->add_partner( im_id = '33589'
im_type = 1
im_name = 'ABAP Developer Network, Brasil.'
im_date = '20090911' ).

lo_dom_processor->add_partner( im_id = '23456'
im_type = 2
im_name = 'SAP Press, Books Online.'
im_date = '20090615' ).

* Display the resultant XML document on the screen:
lo_dom_processor->show_document( ).

ENDMETHOD. "main

METHOD add_partner.

* Method-Local Data Declarations:
DATA: lo_partner_node TYPE REF TO if_ixml_element,
lv_type TYPE string,
lv_creation_date TYPE string.

* Copy the parameters into string format:
lv_type = im_type.

CONCATENATE im_date+0(4) im_date+4(2) im_date+6(2) INTO lv_creation_date SEPARATED BY '-'.

* Create a partner node:
lo_partner_node = partners_doc->create_simple_element( name = 'Partner'
parent = partners_node ).

* Set the "type" attribute on the partners:
lo_partner_node->set_attribute( name = 'Type' value = lv_type ).

* Fill in the remaining information for the partner:
partners_doc->create_simple_element( name = 'PartnerId'
value = im_id
parent = lo_partner_node ).

partners_doc->create_simple_element( name = 'Name'
value = im_name
parent = lo_partner_node ).

partners_doc->create_simple_element( name = 'CreationDate'
value = lv_creation_date
parent = lo_partner_node ).

ENDMETHOD. "add_partner

METHOD show_document.

* Display the XML document on the screen:
CALL FUNCTION 'SDIXML_DOM_TO_SCREEN'
EXPORTING
document = partners_doc
EXCEPTIONS
no_document = 1
OTHERS = 2.

ENDMETHOD. "show_document

ENDCLASS. "lcl_dom_xmlprocessor IMPLEMENTATION

*----------------------------------------------------------------------*
* -> START-OF-SELECTION Event Module *
*----------------------------------------------------------------------*

START-OF-SELECTION.
lcl_dom_xmlprocessor=>main( ).



Source: SAP

16/09/2010

REGEX SAMPLE


REPORT ZRR_SAMPLE.

TYPE-POOLS: abap.

DATA: lt_html TYPE TABLE OF string,
lo_pattern TYPE REF TO cl_abap_regex,
lo_matcher TYPE REF TO cl_abap_matcher,
ls_match TYPE match_result,
lv_header TYPE string,
lv_header_txt TYPE string.

FIELD-SYMBOLS: <lfs_html> TYPE string,
<lfs_sub> TYPE submatch_result.

START-OF-SELECTION.

* Build the HTML document sample:
APPEND '<html><head></head><body>' TO lt_html.
APPEND '<H1>String Processing Techniques</H1>' TO lt_html.
APPEND '<h2>ABAP Character Types</h2>' TO lt_html.
APPEND '<H2>Developing a String Library</h2>' TO lt_html.
APPEND '<h3>Designing the API</h3>' TO lt_html.
APPEND '<h3>...</h3>' TO lt_html.
APPEND '</body></html>' TO lt_html.

* Extract a table of contents from the HTML document:
TRY.
* Parse the regex pattern:
CREATE OBJECT lo_pattern
EXPORTING
pattern = '<([h][1-6]).*>(.*)</\1>'
ignore_case = abap_true.

* Create a matcher to search the example HTML document:
lo_matcher = lo_pattern->create_matcher( table = lt_html ).

* Add each match to the table of contents:
WHILE lo_matcher->find_next( ) EQ abap_true.

* Retreive the next match found in the HTML document:
ls_match = lo_matcher->get_match( ).

READ TABLE lt_html INDEX ls_match-line ASSIGNING <lfs_html>.

* Since we are using backreferences, the captured text
* is actually stored in the submatch results:
LOOP AT ls_match-submatches ASSIGNING <lfs_sub>.

IF sy-tabix EQ 1.

lv_header = <lfs_html>+<lfs_sub>-offset(<lfs_sub>-length).

ELSEIF sy-tabix EQ 2.

lv_header_txt = <lfs_html>+<lfs_sub>-offset(<lfs_sub>-length).

ENDIF.

ENDLOOP.

* Output the table of contents record:
CASE lv_header.

WHEN 'H1' OR 'h1'.
WRITE: / lv_header_txt.
WHEN 'H2' OR 'h2'.
WRITE: / '##', lv_header_txt.
WHEN 'H3' OR 'h3'.
WRITE: / '####', lv_header_txt.

ENDCASE.

ENDWHILE.

CATCH cx_sy_regex.
"Invalid regular expression pattern...
CATCH cx_sy_matcher.
"Problem generating matcher instance...

ENDTRY.


Source: SAP

Comparing Strings


REPORT ZRR_SAMPLE.

TYPE-POOLS: abap.

PARAMETERS: p_str1 TYPE string,
p_str2 TYPE string.

DATA: lv_equal_flag TYPE abap_bool.

START-OF-SELECTION.

PERFORM check_char_is_equal USING p_str1
p_str2
CHANGING lv_equal_flag.

IF lv_equal_flag EQ abap_true.

WRITE: / 'Os valores são iguais...'.

ELSE.

WRITE: / 'Os valores não são iguais...'.

ENDIF.

*----------------------------------------------------------------------*
* -> FORM check_char_is_equal *
*----------------------------------------------------------------------*
* -> Realiza a verificação dos valores informados *
*----------------------------------------------------------------------*
FORM check_char_is_equal USING im_string1
im_string2
CHANGING ch_flag.

DATA: lv_string1 TYPE string,
lv_string2 TYPE string.

lv_string1 = im_string1.
lv_string2 = im_string2.

TRANSLATE lv_string1 TO UPPER CASE.
TRANSLATE lv_string2 TO UPPER CASE.

IF lv_string1 EQ lv_string2.

ch_flag = abap_true.

ELSE.

ch_flag = abap_false.

ENDIF.

ENDFORM. " FORM check_char_is_equal

14/09/2010

OpenSQL WHERE Clauses - Interactive and Dynamic


REPORT ZRR_SAMPLE.

PARAMETERS dbtab TYPE tabname DEFAULT 'SPFLI'.

TYPE-POOLS rsds.

DATA : field_tab TYPE TABLE OF rsdsfields,
table_tab TYPE TABLE OF rsdstabs,
cond_tab TYPE rsds_twhere.

DATA : table LIKE LINE OF table_tab,
cond LIKE LINE OF cond_tab.

DATA : tadir_wa TYPE tadir,
selid TYPE rsdynsel-selid.

DATA : dref TYPE REF TO data,
alv TYPE REF TO cl_salv_table.

FIELD-SYMBOLS <table> TYPE STANDARD TABLE.

SELECT SINGLE *
FROM tadir
INTO tadir_wa
WHERE pgmid = 'R3TR' AND
object = 'TABL' AND
obj_name = dbtab.

IF sy-subrc <> 0.

MESSAGE 'Tabela Não Encontrada' TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.

ENDIF.

table-prim_tab = dbtab.

APPEND table TO table_tab.

CALL FUNCTION 'FREE_SELECTIONS_INIT'
EXPORTING
kind = 'T'
IMPORTING
selection_id = selid
TABLES
tables_tab = table_tab
EXCEPTIONS
OTHERS = 4.
IF sy-subrc <> 0.

MESSAGE 'Erro ao Executar a Inicialização' TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.

ENDIF.

CALL FUNCTION 'FREE_SELECTIONS_DIALOG'
EXPORTING
selection_id = selid
title = 'Seleção Dinamica'
as_window = ' '
IMPORTING
where_clauses = cond_tab
TABLES
fields_tab = field_tab
EXCEPTIONS
OTHERS = 4.

IF sy-subrc <> 0.

MESSAGE 'Erro ao Definir as Condições de Seleção' TYPE 'I'.
LEAVE PROGRAM.

ENDIF.

READ TABLE cond_tab WITH KEY tablename = dbtab INTO cond.

IF sy-subrc <> 0.

MESSAGE 'Todos os Registros serão' TYPE 'I'.

ENDIF.

CREATE DATA dref TYPE TABLE OF (dbtab).

ASSIGN dref->* TO <table>.

TRY.

SELECT *
FROM (dbtab)
INTO TABLE <table>
WHERE (cond-where_tab).

CATCH cx_sy_dynamic_osql_error.

MESSAGE 'Erro no Open SQL Dinamico' TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.

ENDTRY.

TRY.

cl_salv_table=>factory( IMPORTING r_salv_table = alv
CHANGING t_table = <table> ).

alv->display( ).

CATCH cx_salv_msg.

MESSAGE 'Erro ao Criar o ALV' TYPE 'I' DISPLAY LIKE 'E'.

ENDTRY.

13/09/2010

Add Button in Report and Change Icon Image


REPORT ZRR_SAMPLE.

TYPE-POOLS: icon.

TABLES: sscrfields.

CONSTANTS: true TYPE true VALUE 'T',
false TYPE false VALUE 'F'.

DATA: g_use_pipe TYPE boole_d,
sc_functxt TYPE smp_dyntxt.

PARAMETERS: p_carrid TYPE s_carr_id,
p_cityfr TYPE s_from_cit.

SELECTION-SCREEN FUNCTION KEY 1.

INITIALIZATION.

g_use_pipe = true.

AT SELECTION-SCREEN.

CASE sscrfields-ucomm.
WHEN 'FC01'.
IF g_use_pipe = true.

g_use_pipe = false.

ELSE.

g_use_pipe = true.

ENDIF.
WHEN OTHERS.
ENDCASE.

AT SELECTION-SCREEN OUTPUT.

IF g_use_pipe = true.

sc_functxt-icon_id = icon_view_expand_horizontal.
sc_functxt-quickinfo = 'Change field separator'.
sc_functxt-icon_text = 'Use Tab delimiter'.
sscrfields-functxt_01 = sc_functxt.

ELSE.

sc_functxt-icon_id = icon_view_expand_vertical.
sc_functxt-quickinfo = 'Change field separator'.
sc_functxt-icon_text = 'Use PIPE delimiter'.
sscrfields-functxt_01 = sc_functxt.

ENDIF.

Expand- Collapse Button in Selection Screen


REPORT ZRR_SAMPLE.

DATA: wf_ucomm TYPE sy-ucomm.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
SELECTION-SCREEN PUSHBUTTON /01(30) but1 USER-COMMAND but1.
SELECTION-SCREEN PUSHBUTTON /01(30) but2 USER-COMMAND but2.
PARAMETERS: p_test TYPE c.
SELECTION-SCREEN END OF BLOCK b1.

INITIALIZATION.
CALL FUNCTION 'ICON_CREATE'
EXPORTING
name = 'ICON_EXPAND'
IMPORTING
RESULT = but1
EXCEPTIONS
OTHERS = 0.
CALL FUNCTION 'ICON_CREATE'
EXPORTING
name = 'ICON_COLLAPSE'
IMPORTING
RESULT = but2
EXCEPTIONS
OTHERS = 0.

AT SELECTION-SCREEN.

IF sy-ucomm EQ 'BUT1'.
wf_ucomm = 'BUT1'.
ELSEIF sy-ucomm EQ 'BUT2'.
wf_ucomm = 'BUT2'.
ENDIF.

AT SELECTION-SCREEN OUTPUT.

IF wf_ucomm IS INITIAL.
LOOP AT SCREEN.
IF screen-name CS 'P_TEST' OR
screen-name EQ 'BUT2'.
screen-active = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ELSEIF wf_ucomm EQ 'BUT1'.
LOOP AT SCREEN.
IF screen-name CS 'P_TEST' OR
screen-name EQ 'BUT2'.
screen-active = 1.
MODIFY SCREEN.
ENDIF.
IF screen-name EQ 'BUT1'.
screen-active = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ELSEIF wf_ucomm EQ 'BUT2' .
LOOP AT SCREEN.
IF screen-name CS 'P_TEST' OR
screen-name EQ 'BUT2'.
screen-active = 0.
MODIFY SCREEN.
ENDIF.
IF screen-name EQ 'BUT1'.
screen-active = 1.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDIF.

Expand- Collapse Button in Selection Screen


REPORT ZRR_SAMPLE.

DATA: wf_ucomm TYPE sy-ucomm.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
SELECTION-SCREEN PUSHBUTTON /01(30) but1 USER-COMMAND but1.
SELECTION-SCREEN PUSHBUTTON /01(30) but2 USER-COMMAND but2.
PARAMETERS: p_test TYPE c.
SELECTION-SCREEN END OF BLOCK b1.

INITIALIZATION.
CALL FUNCTION 'ICON_CREATE'
EXPORTING
name = 'ICON_EXPAND'
IMPORTING
RESULT = but1
EXCEPTIONS
OTHERS = 0.
CALL FUNCTION 'ICON_CREATE'
EXPORTING
name = 'ICON_COLLAPSE'
IMPORTING
RESULT = but2
EXCEPTIONS
OTHERS = 0.

AT SELECTION-SCREEN.

IF sy-ucomm EQ 'BUT1'.
wf_ucomm = 'BUT1'.
ELSEIF sy-ucomm EQ 'BUT2'.
wf_ucomm = 'BUT2'.
ENDIF.

AT SELECTION-SCREEN OUTPUT.

IF wf_ucomm IS INITIAL.
LOOP AT SCREEN.
IF screen-name CS 'P_TEST' OR
screen-name EQ 'BUT2'.
screen-active = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ELSEIF wf_ucomm EQ 'BUT1'.
LOOP AT SCREEN.
IF screen-name CS 'P_TEST' OR
screen-name EQ 'BUT2'.
screen-active = 1.
MODIFY SCREEN.
ENDIF.
IF screen-name EQ 'BUT1'.
screen-active = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ELSEIF wf_ucomm EQ 'BUT2' .
LOOP AT SCREEN.
IF screen-name CS 'P_TEST' OR
screen-name EQ 'BUT2'.
screen-active = 0.
MODIFY SCREEN.
ENDIF.
IF screen-name EQ 'BUT1'.
screen-active = 1.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDIF.

ZEBRA PRINTER - ZPL SAMPLE CODE

Necessidade: Imprimir etiqueta em impressora ZEBRA.

Solução: No exemplo abaixo podemos substituir os valores fixos por variaveis criadas em um smartform por exemplo.

Aqui o objetivo é simplesmente mostrar um exemplo sobre a codificação ZPL. Copie o arquivo cole no bloco de notas e mande imprimir na impressora ZEBRA, para visualizar o resultado.


^XA
^LL310
^PRA
^FO760,415^GB060,725,3^FS
^FO760,970^GB060,170,43^FS
^FO770,40^ADR,40,10^FR^FH_^FDRAFAEL RISO | ^FS
^FO770,235^ADR,40,10^FR^FH_^FD01^FS
^FO465,030^GB290,010,40^FS
^FO500,030^AR,25,60^FR^FH_^FDESTOQUE^FS
^FO730,070^GB025,1070,20^FS
^FO733,080^ADR,14,14^FR^FH_^FDNOSSO CODIGO^FS
^FO733,335^ADR,14,14^FR^FH_^FDDESCRICAO^FS
^FO665,070^GB090,250,3^FS
^FO665,319^GB090,820,3^FS
^FO640,070^GB025,1070,20^FS
^FO640,080^ADR,14,14^FR^FH_^FDLARGURA^FS
^FO640,280^ADR,14,14^FR^FH_^FDCOMPRIMENTO^FS
^FO640,490^ADR,14,14^FR^FH_^FDPECAS^FS
^FO640,700^ADR,14,14^FR^FH_^FDQUANTIDADE^FS
^FO640,975^ADR,14,14^FR^FH_^FDUND^FS
^FO575,070^GB090,200,3^FS
^FO575,269^GB090,210,3^FS
^FO575,478^GB090,190,3^FS
^FO575,667^GB090,300,3^FS
^FO575,966^GB090,173,3^FS
^FO550,070^GB025,1070,20^FS
^FO525,070^GB025,535,20^FS
^FO550,250^ADR,14,14^FR^FH_^FDUNIDADE METALICA^FS
^FO525,225^ADR,14,14^FR^FH_^FDORIGEM DESTINO^FS
^FO550,810^ADR,14,14^FR^FH_^FDETIQUETA^FS
^FO465,070^GB090,267,3^FS
^FO465,337^GB090,267,3^FS
^FO465,604^GB090,535,83^FS
^FO030,030^GB325,010,40^FS
^FO110,030^AR,25,60^FR^FH_^FDCLIENTE^FS
^FO440,030^GB025,1110,20^FS
^FO330,070^GB025,1070,20^FS
^FO333,080^ADR,14,10^FR^FH_^FDMATERIA PRIMA^FS3
^FO333,435^ADR,14,10^FR^FH_^FDPRODUTO ACABADO^FS
^FO333,795^ADR,14,10^FR^FH_^FDCODIGO SEGURANCA^FS
^FO275,070^GB080,356,3^FS
^FO275,425^GB080,356,3^FS
^FO275,780^GB080,359,3^FS
^FO250,070^GB025,1070,20^FS
^FO253,080^ADR,14,14^FR^FH_^FDNOTA^FS3
^FO253,275^ADR,14,14^FR^FH_^FDEMISSOR^FS
^FO195,070^GB080,200,3^FS
^FO195,269^GB080,870,3^FS
^FO170,070^GB025,1070,20^FS
^FO173,080^ADR,14,14^FR^FH_^FDPEDIDO^FS3
^FO173,275^ADR,14,14^FR^FH_^FDITEM^FS
^FO173,380^ADR,14,14^FR^FH_^FDCLIENTE^FS
^FO115,070^GB080,200,3^FS
^FO115,269^GB080,100,3^FS
^FO115,369^GB080,770,3^FS
^FO090,070^GB025,1070,20^FS
^FO093,080^ADR,14,14^FR^FH_^FDORDEM PRODUCAO^FS
^FO093,275^ADR,14,14^FR^FH_^FDCOD.EMB^FS
^FO093,380^ADR,14,14^FR^FH_^FDDATA ENTREGA^FS
^FO093,595^ADR,14,14^FR^FH_^FDEMISSAO ETIQUETA^FS
^FO093,890^ADR,14,14^FR^FH_^FDVOLUME^FS
^FO093,890^ADR,14,14^FR^FH_^FDREGIAO^FS
^FO030,070^GB060,200,3^FS
^FO030,269^GB060,100,3^FS
^FO030,368^GB060,213,3^FS
^FO030,580^GB060,300,3^FS
^FO030,880^GB060,139,3^FS
^FO030,880^GB060,260,33^FS
^FO770,425^ASR,20,20^FR^FD02^FS
^FO770,415^ASR,20,20^FR^FH_^FD03^FS
^FO670,080^ASR,20,15^FR^FH_^FD04^FS
^FO670,325^ASR,15,15^FD05^FS
^FO580,80^ASR,40,17^FR^FH_^FD06^FS
^FO580,280^ASR,40,17^FR^FH_^FD07^FS
^FO580,490^ASR,40,17^FR^FH_^FD08^FS
^FO580,690^ASR,50,60^FR^FH_^FD09^FS
^FO580,1000^ASR,40,40^FR^FH_^FD10^FS
^FO470,080^ASR,20,20^FR^FH_^FD11^FS
^FO470,380^ASR,20,20^FR^FH_^FD12^FS
^FO470,635^ASR,80,120^FR^FD13^FS
^FO280,080^ASR,30,14^FR^FH_^FD14^FS
^FO280,435^ASR,30,14^FR^FH_^FD15^FS
^FO118,080^ASR,30,30^FR^FH_^FD16^FS
^FO118,280^ASR,30,30^FR^FH_^FD17^FS
^FO118,380^ASR,20,20^FR^FH_^FD18^FS
^FO200,080^ASR,30,20^FR^FH_^FD19^FS
^FO200,290^ASR,30,15^FR^FH_^FD20^FS
^FO035,080^ASR,30,30^FR^FH_^FD21^FS
^FO035,280^ASR,30,30^FR^FH_^FD22^FS
^FO035,385^ASR,20,15^FR^FH_^FD23^FS
^FO035,590^ASR,15,15^FR^FH_^FD24^FS
^FO035,890^ASR,15,15^FR^FH_^FD25^FS
^FO035,890^ASR,40,40^FR^FH_^FD26^FS
^FO440,480^ADR,14,10^FR^FDETIQUETA EM CODIGO DE BARRAS^FS3
^FO390,90^BY2^BCR,45,Y,N,N^FD27^FS
^FO50,1150^BY2^BCN,35,Y,N,N^FD28^FS
^FO280,780^B7R,5,2,5,10,N^FD29^FS
^ISFIXO0001,Y^FS
^XZ

06/08/2010

How to Find a Screen Exit in a Given SAP Standard T-code


REPORT ZRRSAMPLE.

TABLES: modsap, modact, tstc.

PARAMETERS: input1 LIKE tstc-tcode DEFAULT ' ',
input2 LIKE modsap-typ DEFAULT ' '.

DATA: search1(6),
search2(3),
search3 LIKE modsap-member.

DATA : first_row VALUE 'Y'.

CONCATENATE: '%' input1 '%' INTO search1,
'%' input2 INTO search2.

SELECT * FROM tstc WHERE tcode LIKE search1.

first_row = 'Y'.

CHECK tstc-pgmna NE space.

CONCATENATE '%' tstc-pgmna '%' INTO search3.

SELECT * FROM modsap WHERE typ LIKE search2
AND member LIKE search3.

SELECT SINGLE * FROM modact WHERE member = modsap-name.

IF first_row EQ 'Y'.
WRITE: /0 tstc-tcode, 6 tstc-pgmna, 16 modsap-name, 32 modsap-typ,
45 modsap-member, 70 modact-name.
first_row = 'N'.
ELSE.
WRITE: /16 modsap-name, 32 modsap-typ, 45 modsap-member, 70 modact-name.
ENDIF.

CLEAR : modsap, modact.

ENDSELECT.

IF sy-subrc NE 0.
WRITE : /0 tstc-tcode, 6 tstc-pgmna, 30 'No exits found'.
ENDIF.

CLEAR tstc.

ENDSELECT.

END-OF-SELECTION.

CLEAR: search1, search2, search3.

Checkbox as a Radiobutton


REPORT ZRRSAMPLE.

PARAMETERS: p_check1 AS CHECKBOX USER-COMMAND check,
p_check2 AS CHECKBOX USER-COMMAND check,
p_check3 AS CHECKBOX USER-COMMAND check ,
p_check4 AS CHECKBOX USER-COMMAND check .

DATA: value TYPE char10.

AT SELECTION-SCREEN.

GET CURSOR FIELD value.

IF value = 'P_CHECK1'.
p_check2 = space.
p_check3 = space.
p_check4 = space.
ELSEIF value = 'P_CHECK2'.
p_check1 = space.
p_check3 = space.
p_check4 = space.
ELSEIF value = 'P_CHECK3'.
p_check1 = space.
p_check2 = space.
p_check4 = space.
ELSEIF value = 'P_CHECK4'.
p_check2 = space.
p_check3 = space.
p_check1 = space.

ENDIF.

Colors in REUSE_ALV_GRID_DISPLAY_LVC


REPORT ZRRSAMPLE.

*&---------------------------------------------------------------------*
* type pools
*----------------------------------------------------------------------*
TYPE-POOLS: slis.

*&---------------------------------------------------------------------*
* declarations for alv and internal tables
*----------------------------------------------------------------------*
DATA: it_fieldcat TYPE lvc_t_fcat,
wa_fieldcat TYPE lvc_s_fcat,
wa_layout TYPE lvc_s_layo,
v_position TYPE i ,
ls_cellcolor TYPE lvc_s_scol,
l_index TYPE sy-tabix.

DATA: BEGIN OF it_spfli OCCURS 0,
carrid LIKE spfli-carrid,
connid LIKE spfli-connid,
cellcolor TYPE lvc_t_scol,
END OF it_spfli.

*&---------------------------------------------------------------------*
* start of selection
*----------------------------------------------------------------------*
START-OF-SELECTION .

*---get data from db table
PERFORM get_data .

*---build layout for alv
PERFORM build_layout .

*---build fieldcat for alv
PERFORM build_fieldcat .

*---modify fieldcat for colors in alv
PERFORM modify_fieldcat .

*---display alv
PERFORM display_alv .

*&---------------------------------------------------------------------*
*& Form get_data
*----------------------------------------------------------------------*
FORM get_data .

SELECT carrid
connid
UP TO 25 ROWS
INTO CORRESPONDING FIELDS OF TABLE it_spfli
FROM spfli.

ENDFORM. " get_data
*&---------------------------------------------------------------------*
*& Form build_fieldcat
*----------------------------------------------------------------------*
FORM build_fieldcat .

wa_fieldcat-fieldname = 'CARRID'.
wa_fieldcat-reptext = 'CARRID'.

APPEND wa_fieldcat TO it_fieldcat.

CLEAR wa_fieldcat.

wa_fieldcat-fieldname = 'CONNID'.
wa_fieldcat-reptext = 'CONNID'.

APPEND wa_fieldcat TO it_fieldcat.

CLEAR wa_fieldcat.

ENDFORM. " build_fieldcat
*&---------------------------------------------------------------------*
*& Form build_layout
*----------------------------------------------------------------------*
FORM build_layout .

wa_layout-ctab_fname = 'CELLCOLOR'.
wa_layout-zebra = 'X'.

ENDFORM. " build_layout
*&---------------------------------------------------------------------*
*& Form modify_fieldcat
*----------------------------------------------------------------------*
FORM modify_fieldcat .

LOOP AT it_spfli.

l_index = sy-tabix.

IF l_index = 5 OR l_index = 15.

ls_cellcolor-fname = 'CARRID'.
ls_cellcolor-color-col = '6'.
ls_cellcolor-color-int = '1'.

APPEND ls_cellcolor TO it_spfli-cellcolor.

MODIFY it_spfli INDEX l_index TRANSPORTING cellcolor.

ENDIF.

IF l_index = 10 OR l_index = 20.

ls_cellcolor-fname = 'CONNID'.
ls_cellcolor-color-col = '4'.
ls_cellcolor-color-int = '1'.

APPEND ls_cellcolor TO it_spfli-cellcolor.

MODIFY it_spfli INDEX l_index TRANSPORTING cellcolor.

ENDIF.

IF it_spfli-carrid IS INITIAL .

DELETE it_spfli.

ENDIF.

ENDLOOP.

ENDFORM. " modify_fieldcat
*&---------------------------------------------------------------------*
*& Form display_alv
*----------------------------------------------------------------------*
FORM display_alv .

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
is_layout_lvc = wa_layout
it_fieldcat_lvc = it_fieldcat
TABLES
t_outtab = it_spfli.

ENDFORM. " display_alv

Icon on Selection Screen - 2


REPORT ZRRSAMPLE.

TYPE-POOLS: icon.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(17) fld_lab.
SELECTION-SCREEN COMMENT 18(5) icon1.
PARAMETERS: p_check.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK b1.

AT SELECTION-SCREEN OUTPUT.

WRITE icon_configuration AS ICON TO icon1.
fld_lab = 'This is the label'.

START-OF-SELECTION.