Range to search in lower case fields
function z_ab_prep_val_for_case_search.
*"--------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(I_TEXT) TYPE CSEQUENCE
*" VALUE(I_SIGN) TYPE CHAR1
*" VALUE(I_OPTION) TYPE CHAR2
*" EXPORTING
*" REFERENCE(ER_RANGE) TYPE STANDARD TABLE
*"--------------------------------------------------------------------
field-symbols: <low> type any.
field-symbols: <sign> type any.
field-symbols: <opt> type any.
field-symbols: <line> type any.
field-symbols: <linenew> type any.
field-symbols: <lownew> type any.
field-symbols: <tab> type standard table.
data: f_times type i.
data: f_text type string.
data: f_textnew type string.
data: f_insidel type i.
data: f_insidel2 type i.
data: ft_data type ref to data.
"create temp table and assign it to FS
create data ft_data like er_range.
assign ft_data->* to <tab>.
f_text = i_text.
"get lenght
f_times = strlen( f_text ).
"translate to upper case so we have always same start
translate f_text to upper case.
"append initial line to range and put first value into table
append initial line to er_range assigning <line>.
check sy-subrc eq 0.
assign component 'LOW' of structure <line> to <low>.
check sy-subrc eq 0.
<low> = i_text. "all in uppercase
assign component 'SIGN' of structure <line> to <sign>.
check sy-subrc eq 0.
<sign> = i_sign.
assign component 'OPTION' of structure <line> to <opt>.
check sy-subrc eq 0.
<opt> = i_option.
translate <low> to upper case.
"create entries for each other combination of cases
do f_times times.
f_insidel2 = sy-index - 1.
loop at er_range assigning <line>.
assign component 'LOW' of structure <line> to <low>.
check sy-subrc eq 0.
if f_text+f_insidel2(1) ca '*+' and ( i_option eq 'CP' or i_option eq 'NP' ).
else.
append initial line to <tab> assigning <linenew>.
check sy-subrc eq 0.
assign component 'LOW' of structure <linenew> to <lownew>.
check sy-subrc eq 0.
assign component 'SIGN' of structure <linenew> to <sign>.
check sy-subrc eq 0.
<sign> = i_sign.
assign component 'OPTION' of structure <linenew> to <opt>.
check sy-subrc eq 0.
<opt> = i_option.
<lownew> = <low>.
f_textnew = <lownew>+f_insidel2(1).
translate f_textnew to lower case.
<lownew>+f_insidel2(1) = f_textnew.
endif.
endloop.
append lines of <tab> to er_range.
refresh <tab>[].
enddo.
endfunction.
Extend allowed runtime of a program
- Call commit work whenever you want to reset the counter of running time for your transaction (especially if you haven't done any update into database tables)
- If commit work doesn't work or you don't want to use it at the moment then you could use FM TH_REDISPATCH with the check_runtime parameter equal to 0.
- You could also you FM SAPGUI_PROGRESS_INDICATOR for the same purpose but keep in mind that showing indicator too often can slower your program.
Although it's nice to know this possibility my advice is to not to use it very often as the less time you have for program run the more optimized code you can provide, so it's really something that you use if you do not have other choice and you agreed that with your system admins.
Copy routing (create on a base of existing one)
Create XLSX/MHTML file from internal table in background
So what am I doing here.... firstly I check if the fieldcatalog was passed. If not then I create it on a base of internal table with usage of cl_salv_table and cl_salv_controller_metadata=>get_lvc_fieldcatalog. After I finally have the fieldcatalog I create result table with sort and filter criteria if they were passed. To do that I use class cl_salv_ex_util. At the end result table is transformed to xstring with method cl_salv_bs_tt_util=>if_salv_bs_tt_util~transform. So you're receiving at the end of the method an xstring file so you can do what you want with it, for example send via mail to the user, or save it on local PC (like in the example found at the end). The most important is that you can use this method in a background so you can prepare some jobs for your programs and send results of them to the users!
it_fieldcat type lvc_t_fcat optional -> field catalog for list viewer control
it_sort type lvc_t_sort optional -> alv control: table of sort criteria
it_filt type lvc_t_filt optional -> alv control: table of filter conditions
is_layout type lvc_s_layo optional -> alv control: layout structure
i_xlsx type flag optional -> create xlsx file?
Subtotal lines of ALV GRID OO as content separator
1st) Add empty line after each part you want to separate and color it differently;
Adding empty lines will force you to delete all of them each time you'll do changes inside table displayed in grid and you'll have to do the calculation of position again, that's why today I will show you the second option.
Refresh ALV GRID and keep position and current cell
When you use CL_GUI_ALV_GRID in edit mode or you change your internal table used to display data on ALV grid it may happen that after refreshing the grid using refresh_table_display your cursor or scroll goes to the begining of the grid. Users feels little lost in such situation but there is an easy solution for that.
data: is_stable type lvc_s_stbl.
is_stable-row = 'X'.
is_stable-col = 'X'.
"or
is_stable = 'XX'.
grid->refresh_table_display(
exporting
is_stable = is_stable " With Stable Rows/Columns
* i_soft_refresh = i_soft_refresh " Without Sort, Filter, etc.
exceptions
finished = 1
others = 2
).
if sy-subrc <> 0.
* message id sy-msgid type sy-msgty number sy-msgno
* with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
endif.
EDIT: Method of mine which can be found bellow doesn't have to be used to achieve your goal. To be honest I can't remember why I created separate version of it as only the cursor act a bit different than oryginal one. I must have had mind eclipse at the time :-) . Excuse me for that.
So to keep scroll position and current cell we will need to use following methods of CL_GUI_ALV_GRID:
get_scroll_info_via_id - gets current scroll information
get_current_cell - gets current cell, we will use that data to set the cursor at the end
get_selected_rows - gets selected rows
get_selected_cells_id - if we didn't select any rows, we check for the selected cell information
refresh_table_display - then simple refresh of grid
set_selected_cells_id - after refresh it's time to set back all information, so set selected cell
set_selected_rows - or set seleted rows (depanding what we received at the begining)
set_scroll_info_via_id - set scroll position back
set_current_cell_via_id - set cursor back.
There is no special coding here, just standard ALV grid methods used in proper order.
Method definition, Importing parameters:
I_SOFT TYPE CHAR01 DEFAULT 'X'
I_SET_CURRENT TYPE CHAR01 DEFAULT SPACE
I_SET_SELECTED TYPE CHAR01 DEFAULT SPACE
Changing parameters:
GRID TYPE REF TO CL_GUI_ALV_GRID
Add a commentSave message with attachment in Outlook's Drafts
In previous post I've shown how to zip file directly on PC without using CL_ABAP_ZIP, this time I will show you how easy is to use OLE2_OBJECT to create an MS Outlook message with attachment and save it in Outlook's Drafts folder. OLE2_OBJECT in fact can be used with any application that allows it, but today I will only show a hint how to work with MS Outlook.
I know that most of us use CL_BCS to create and send the message directly from SAP, but in a situation when you're working on local files then It may be better to do it with Outlook. This is of course just a short sample of the possibilities, all functions for OLE & MS you can find in MSDN documents.
Here is the code with f_path parameter which is used to pass path of local file to attach to message:
Zipping in IZArc with ABAP directly on PC
From time to time you have to work on files that are stored in user PC, like when you're working with SOI (SAP Office Integration) for example. All operations that are done are save directly to a file which is stored on PC so if you would like to zip it with cl_abap_zip class then you would need to copy file to ABAP memory, then zip it using cl_abap_zip and then save back file to PC. Sometimes this is not the best solution, especially when working on slow connections via VPN or similar. So with help there goes cl_gui_frontend_services=>execute. This method allows you to run every file on PC directly - also a program with proper parameters. In my example I will use IZArc (it's free and fast).
So what I'm doing here is:
- passing full path to the file which will be zipped
- call cl_gui_frontend_services=>environment_get_variable to check program files directories
- concatenate file path with parameter of IZArc "-ad"
- concatenate program files directories with 'IZArc\IZArc.exe'
- check if IZArc exists with cl_gui_frontend_services=>file_exist
- if yes then I'm executing it with cl_gui_frontend_services=>execute.
Here is the full code for such function:
Add a comment