Archive for the 'SAP' Category

SAP: Dynamic Sapgui Progress Indicator

It is very easy to apply a progress indicator on your abap programs. This will enable the

user to determine how much long will he wait until the program finish its processing.

This is done by simply calling the function module SAPGUI_PROGRESS_INDICATOR.

[codesyntax lang="abap" lines="no" title="CODE #1"]
CALL FUNCTION ‘SAPGUI_PROGRESS_INDICATOR’
EXPORTING
VALUE(PERCENTAGE) DEFAULT 0
VALUE(TEXT) DEFAULT SPACE
[/codesyntax]

PERCENTAGE is where you indicate the percentage of processing time and the TEXT is

where you indicate the text to be displayed on the status bar. This parameters can be

set with static values. But if you want, you could also add a few line of codes to make your

progress indicator dynamic and based on the actual number of records being process. This tip

is applicable when you are querying and processing a record from a database.

First you have to declare three decimal variables, see example below.

[codesyntax lang="abap" lines="no" title="CODE #2"]
DATA: v_percent TYPE p DECIMALS 4, “holds the actual percentage of process time
v_increment TYPE p DECIMALS 4, “holds the increment value per single loop
v_mod TYPE p DECIMALS 4. “used as indicator
[/codesyntax]

Now refer to the lines below for the rest of the codes.

[codesyntax lang="abap" lines="no" title="CODE #2"]
****Your select statement goes here******

* this will determine the increment value based on the result of the select statement
v_increment = 100 / sy-dbcnt.

LOOP AT it INTO wa.
*calculate the progress percentage on every single loop
v_percent = v_percent + v_increment.

*this codes indicates that I want to update my progress indicator every 5% increase
*in percentage. you can change this anytime you want.
v_mod = v_percent MOD 5.
IF v_mod < 1.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = v_percent
text = 'Processing, please wait.'.
ENDIF.
[/codesyntax]

Creative Commons License

SAP: Setting Up Logon Rules

Go to transaction code RSPFPAR_LOGIN. It will give you a complete list of parameters for Logon Rules. Just refer to the Comment field for the parameter definition.

These parameters can be maintain through Profile Maintenance (RZ10). When SAP startup process reads a profile parameter, it checks first on the Instance Profile. If the parameter cannot be found on the instance profile then it will look on the Default profile. If neither profile contains the parameter, the default value is taken out of the startup program coding. With that, I suggest you to create or maintain parameters in Default Profile. Just ensure that a particular parameter appears only in the default and not in the instance profile.

For the profile to take effect, you have to restart your application server.

Creative Commons License

SAP: Clickable Icon Button in ALV fields


Adding a button inside an ALV fields is a very simple task to do which needs only a few line of codes. what I always do is I create a field on ALV and populate that field with an Icon of my choice and declare it as a Hotspot so it will react on a single click and it works perfectly just like a button.

First Thing to do is to specify a field in our internal table that we will use to hold the Icon(refer to code #1).

[codesyntax lang="abap" lines="no" title="CODE #1"]
TYPES: BEGIN OF t_alvbutton,
icon TYPE string, “icon field
kunnr LIKE kna1-kunnr,
name1 LIKE kna1-name1,
END OF t_alvbutton.

DATA: it_alvbutton TYPE STANDARD TABLE OF t_alvbutton,
wa_alvbutton TYPE t_alvbutton.
[/codesyntax]

Proceed to the data retrieval and populate the it_alvbutton. I assume you know how to retrieve data from database so there’s no need to show you the select statement for our example. After that, loop on every records of it_alvbutton to specify the Icon that we want to display(refer to code #2).

[codesyntax lang="abap" lines="no" title="CODE #2"]
LOOP AT it_alvbutton INTO wa_alvbutton.
wa_alvbutton-icon = ‘@0X@’.
MODIFY it_alvbutton FROM wa_alvbutton.
ENDLOOP.
[/codesyntax]

@0X@ is the code for print icon. For the complete list of icons, check it out here.

Now the important part is to define a field in ALV that will hold the icon. To show you how simple it is to do that, please refer to code #3.

[codesyntax lang="abap" lines="no" title="CODE #3" escaped="true"]
DATA: ls_fieldcat TYPE slis_fieldcat_alv,
lt_fieldcat TYPE slis_t_fieldcat_alv.

DEFINE m_fieldcat.
add 1 to ls_fieldcat-col_pos.
ls_fieldcat-fieldname = &1.
ls_fieldcat-seltext_l = &2.
ls_fieldcat-outputlen = &3.
ls_fieldcat-hotspot = &4. “X to declare the field as a hotspot
ls_fieldcat-icon = &5. “X to declare the field as an icon
append ls_fieldcat to lt_fieldcat.
END-OF-DEFINITION.

m_fieldcat 'ICON' 'Print' '20' 'X' 'X'. “this specific field is a hotspot and an icon
m_fieldcat 'KUNNR' 'Customer No.' '10'.
m_fieldcat 'NAME1' 'Customer Name' '35'.
m_fieldcat . . .
m_fieldcat . . .

CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
. . .
. . .
[/codesyntax]

The figure below shows an example of print icon as a button.

Icon Button in ALV

Now refer to code #4 to handle the command when a user clicks on the icon button.

[codesyntax lang="abap" lines="no" title="CODE #4" escaped="true"]
FORM f_user_command USING ucomm LIKE sy-ucomm
v_selfld TYPE slis_selfield.

IF ucomm = '&IC1' AND v_selfld-fieldname = 'ICON'.
“code goes in here when user clicks on our print button
ENDIF.
[/codesyntax]

Creative Commons License

SAP: List of Icons

I could show you here the complete list of icons with its corresponding code but I rather show you a couple line of codes that will provide you the list of icons. So please refer to the code #1.

[codesyntax lang="abap" lines="no" title="CODE #1" container="div"]
TABLES: icon.
DATA: icontext(4) TYPE c.

SELECT * FROM icon.
WRITE: / icon-id+1(2).
CONCATENATE ‘@’ icon-id+1(2) ‘@’ INTO icontext.
WRITE: 10 icontext AS ICON, icon-name.
ENDSELECT.
[/codesyntax]

Create a blank program on transaction SE38 and add the code above. Just activate it and execute. You now have your own list of icons for your reference whenever you need it.

SAP: Basic of Lock Objects

Data inconsistency occurs when two or more users are editing/changing the same record on the same table at exactly the same time. To avoid this, we use Lock Objects.

Lock Objects enables the user to request a lock on a specific record before accessing it. In this way, changing/editing of records is only possible one at a time, thus avoiding data inconsistency.

There are three different lock modes:

exclusive lock/Write Lock (Mode ‘E’)
allow you to prevent data from being changed while you are changing it yourself. An exclusive lock, as its name suggests, locks an application object for exclusive use by the program that sets it. No other program can then set either a shared lock or an exclusive lock for the same application object.

Shared Lock/Read Lock (Mode ‘S’)
allow you to prevent data from being changed while you are reading it. They prevent other programs from setting an exclusive lock (write lock) to change the object. It does not, however, prevent other programs from setting further read locks.

Enhanced write lock (Mode ‘X’)
works like a write lock but are not accumulated while a program is being executed. It protects from further accesses within the same transaction.

To create a Lock Object, got to transaction SE11, click on Lock Object radio button and enter any name that starts with EZ or EY. (Example EZSAMPLE_LOCK)

When you activate a lock object, the system generates an ENQUEUE_ and a DEQUEUE_ function module that you can use on your ABAP programs.

ENQUEUE_<lockobject name> - adds the requested object in a queue(lock)
DEQUEUE_<lockobject name> - remove the requested object from being queued(unlock).

The basic procedure on requesting a lock:
1. Enqueue and lock the object for editing.
2. Read/write the data from the database.
4. dequeue and release the object.

To implement Lock Objects in ABAP programs, please refer to this post.

SAP: How to use Lock Objects in ABAP

Let say we have a customized table ZCUST_INFO that holds a specific customer information with MANDT(client number) and KUNNR(customer number) as the key field.

So let’s create a Lock Object for our customized table:
1. Go to transaction SE11
2. Click on Lock Object radio button and type-in EZCUST_INFO on name field and click on create button.
3. On Tables Tab, type-in ZCUST_INFO on name field and choose Write Lock on Lock Mode.
4. Go to Lock Parameter Tab and on the first row, type-in mandt on lock parameter, zcust_info on
table, and mandt on field.
5. On second row, type-in custnum on lock parameter, zcust_info on table, and kunnr on field.
6. Click save and activate.

Now let say we also have a dialog program for managing this the content of this table. We have screen 100 for our selection screen with customer number as selection parameter, screen 200 for editing screen, and screen 300 for display screen.

On the PBO of screen 200, let’s add the code below.

  CALL FUNCTION ‘ENQUEUE_EZCUST_INFO’
    EXPORTING
    MODE_ZCUST_INFO = ‘X’
    MANDT = sy-mandt
    CUSTNUM = <customer number from screen 100>
  EXCEPTIONS
    FOREIGN_LOCK = 1
    SYSTEM_FAILURE = 2
    OTHERS = 3.
  IF sy-subrc = 1.
    MESSAGE ‘This record is currently locked by another user!’ type ‘I’.
leave to screen 300.
  ENDIF.

The code above will request for lock on the table zcust_info specifically on the record specified on
the mandt and custnum parameter. If the record is already locked by another user, the user will be
prompted and will be redirected to screen 300 which is the display screen.

Lastly, on the PAI of screen 200, add the code below to release and unlock the object queued on the PBO:

  CALL FUNCTION ‘DEQUEUE_EZCUST_INFO’
    EXPORTING
    MODE_ZCUST_INFO = ‘X’
    MANDT = sy-mandt
    CUSTNUM = <customer number from screen 100>
  EXCEPTIONS
    FOREIGN_LOCK = 1
    SYSTEM_FAILURE = 2
    OTHERS = 3.

SAP: Changing ALV Row Color

Changing the color of an ALV row is very simple. First you have to add a field on your internal table that will holds the color attribute (Refer to the sample code below).

TYPES: BEGIN OF t_rowcolor,
column1 TYPE string,
column2 TYPE string,
column3 TYPE string,
rowcolor(4) TYPE c,
END OF t_rowcolor.

DATA:  it_rowcolor TYPE STANDARD TABLE OF t_rowcolor,
wa_rowcolor TYPE t_rowcolor.

Next step is to Set the layout field for color attributes. In our case, that field is “rowcolor” (Refer to the sample code below).

DATA: gd_layout TYPE slis_layout_alv.

gd_layout-info_fieldname = ‘ROWCOLOR’.

Lastly, you have to populate the rowcolor field with the color attributes of your choice. You can do this when you loop at your internal table into your work area table (Refer to the sample code below).

LOOP AT it_row INTO wa_row.
wa_row-rowcolor = ‘C100′
MODIFY it_row FROM wa_row.
ENDLOOP.

In the code above, ‘C100′ is the color attribute. For the complete list of different color attributes, please refer to the figure below.

ALV color attributes

SAP: How to Create and Use the Authorization Objects in ABAP

Authorization Objects are used to manipulate the current user’s privileges for specific data selection and activities from within a program.

We could always create our own authorization objects and implement it in our own abap programs. As an example, we will create our own authorization field similar to TCD used in S_TCODE Authorization object (see #3 in figure 1).

Figure 1
Figure 1

Steps to create authorization field
1. Go to transaction code SU20
2. Click the create new button on the application toolbar.
3. Enter “ZTCODE” in the Field Name and “TCODE” in the Data Element, then hit Enter.
4. Click the save button on the system toolbar.

Next step is to create the authorization class(see #1 in figure 1) and authorization object(see #2 in figure 1).

Steps to create authorization class
1. Go to transaction code SU21
2. Click on the Create button’s drop down icon and select “Object Class”.
3. Enter “ZTRN” on the Object Class field.
4. Give it a description and save it.

Steps to create authorization object
1. Again in SU21, in the list of authorization class(folder icon), click the one that we’ve created(ZTRN).
2. Click on the Create buttodrop down, this time selecting “Authorization Object”.
3. Enter “Z_TCODE” on the Object field and give it a description.
4. On the authorization fields section, enter ACTVT and ZTCODE. ACTVT is used to set and limit the activity of the user, while the ZTCODE is the authorization field that we’ve created earlier which is
responsible for holding a list of tcodes.
5. On the Further Authorization Object Settings, click on “Permitted activities” button. Here we will select the specific activities that we want to be available for our authorization object.
6. As an example, we will select 01(Create), 02(Change), and 03(Display).
7. Save and Exit.

Now we’re done creating our own authorization object, let us now use and assign it to a user.

Steps to create a role(see figure 2)
1. Go to transaction code PFCG.
2. Enter “ZAUTHTEST” on Role field and click the “Single Role” button.
3. Now give it a description, click the save button and click the Authorization tab.
4. Click the “Change Authorization Data” button inside the authorization tab.
5. Then click the “Manually” button on the application toolbar and type in the name of the authorization object that we’ve created earlier(”Z_TCODE”) and press enter.
6. Expand all the nodes, double click on the input field of the Activity and select activity 01 and 02.
7. Enter the tcode of our own abap program in ZTCODE field, in our example I used “ZCOMM” .
8. And also don’t forget to add the S_TCODE authorization object and enter ZCOMM on it’s field.
9. Now Click on the Generate button in the application toolbar and press enter on the pop-up screen.
10. press the back button and assign a specific user on the user tab and click User Comparison button.
11. Now create another role by repeating steps 1 to 9 but this time select activity 03 on step 6.
12. Then assign this 2nd role to another user.

Figure 2
Figure 2

Now let’s implement this authorization in our ABAP program. Let say we have a dialog program(ZCOMM) wherein we have a button on the screen that when clicked, the user will go to the Create/Edit screen(1000) if he’s authorized. On the other hand, he will go to display only screen(2000) if he’s not authorized. To do that, simply add the code below on your program.

  AUTHORITY-CHECK OBJECT ‘Z_TCODE’    “authorization object that we’ve created
      ID ‘ACTVT’ FIELD ‘01′                        “Activity = 01, authorized to create
      ID ‘ZTCODE’ FIELD ‘ZCOMM’.            “tcodes that we wants to check for authorization
  IF sy-subrc EQ 0.
      CALL SCREEN 1000.        “The user is authorized to create
  ELSE.
      CALL SCREEN 2000.        “User is not authorized to create (Display only)
  ENDIF.

SAP: How to disable SAP Menu and User Menu

There are two ways to disable/enable the SAP menu and the User menu.

1. Configuration for all SAP users.

Go to transaction code SM30(Maintain Table Views) and maintain SSM_CUST table. Set ALL_USER_MENUS_OFF = YES if you want to disable the user menu for all SAP users and set it to NO to enable it again. For the SAP Menu, set SAP_MENU_OFF = YES to disable it or NO to enable it.

2. Configuration for individual specific SAP user

Again go to transaction code SM30(Maintain Table Views) and this time maintain USERS_SSM table. Initially there will be no data for this table. Now Click the “New entries” button on the application toolbar. The User Name field should be now editable. Now type in the user name that you want to configure. As you can see, there’s another four columns (User Menu, SAP Menu, Web Menu and Company Menu) with checkboxes on all of its rows. Just check it if you want to enable that menu or uncheck it to disable it.

SAP: ALV Auto Refresh through Function Module

I created a simple ALV report displaying the data of my customized table through Function Module REUSE_ALV_GRID_DISPLAY. I also created a screen for the details view when you double click on a record from ALV. On this screen you could change the record details as you want and save it. When the user clicked on the save button, he will be automatically return to the ALV screen.

Now, what I want is when the user returns back from details view to ALV screen, I want the ALV to refresh automatically without clicking the refresh button on the application toolbar.

When I googled for the solution, I mostly came up with OOP(Object Oriented Programming) codes, wherein you declare an object with reference to the CL_GUI_ALV_GRID to create an ALV. In my case this is not applicable since I’ve already started my ALV code through function module. Fortunately I stumbled upon http://www.sap-basis-abap.com/abap/auto-refresh-alv-list.htm that provides a simple code for ALV auto refresh every 5 seconds.

In my case, I only have to add a a single line of codes in the form i used for the i_callback_user_command parameter of the REUSE_ALV_GRID_DISPLAY function module.

Below is my code for calling the REUSE_ALV_GRID_DISPLAY function module.

CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
  EXPORTING
    i_callback_program = gd_repid
    i_callback_pf_status_set = ‘F_STATUS’
    i_callback_user_command = ‘F_USER_COMMAND’
    is_layout = ls_layout
    it_fieldcat = lt_fieldcat
    i_callback_top_of_page = ‘TOP_OF_PAGE’
  it_sort = lt_sort
  TABLES
    t_outtab = it_comm.

And below is the code for the form F_USER_COMMAND:

FORM f_user_command USING UCOMM LIKE SY-UCOMM v_selfld TYPE slis_selfield.

  some codes here for processing the user command

  PERFORM f_get_data. “codes for retrieving data for ALV

  v_selfld-refresh = ‘X’. “codes I added for auto refresh

ENDFORM.