1 1 1 1 1 Rating 0% (0 Votes)
Access this URL (http://abapblog.com/files/nugg/ZAB_MB51_CALL.nugg)ZAB_MB51_CALL.nugg
I've got method to get selection screen parameters to table so I can call MB51 by submitting program RM07DOCS. Of course if I do that without any changes of parameters then I would get not this list which I want (ALV kind) and MB51 would display its results on screen. That's why I need to export to memory some flags, first two must be set to be able to achieve form process_list in RM07DOCS and to get the output table for ALV, last one is my own flag which I will use in implicit enhancement to check if I should proceed with my own code and close MB51 after I'll get the results.
  • export no_list from m_flag to memory id 'MB51_NOLIST'

  • export flag from m_flag to memory id  'MB51_FLAG'.

  • export flag from m_flag to memory id 'ZMB51_FULLLIST_EXPORT'.

After submitting MB51 I'm importing results to table mt_list which is used then to move data into corresponding fields of ct_list.
  • import export to mt_list from memory id 'ZMB51_FULLLIST_EXPORT'.
Read more ...

1 1 1 1 1 Rating 0% (0 Votes)
Access this URL (http://abapblog.com/files/nugg/ZAB_MB51_CALL.nugg)ZAB_MB51_CALL.nugg
As I have needed types I can start to create methods which I need. Firstly fast method the read select-option data from any program which will call our class. I will use here FM RS_REFRESH_FROM_SELECTOPTIONS . If you're thinking about it's restrictions to keep only 40 characters from screen parameters then please check your system as for some of the new versions this FM contains a table parameter of structure RSPARAMSL_255 which allows to store up to 255 characters.

i_progname type sy-repid


it_seltab type rsparams_tt


method get_selection_screen_criteria.

    call function 'RS_REFRESH_FROM_SELECTOPTIONS'     
      curr_report     i_progname
      selection_table it_seltab
      not_found       1
      no_report       2
      others          3.
    case sy-subrc.
    when 0.
    when 1.
      "raise not_found.
    when 2.
      "raise no_report.
    when others.
      "raise other_error.


1 1 1 1 1 Rating 0% (0 Votes)
Access this URL (http://abapblog.com/files/nugg/ZAB_MB51_CALL.nugg)ZAB_MB51_CALL.nugg
I've decided which way should I go, so now time to do it. I need to do following things to get what I desired:
  • Create a function group or class to be able to reuse the solution in other programs also
  • Create implicit enhancement in MB51 to be able to export it's results and stop MB51 if it's called from outside
  • Create a program with selection screen fields from MB51 + my own desired additional filters. This program should call standard MB51 and display some additional fields in ALV Grid.
I prefer to create a class in which I will store all needed methods to call MB51 with selection-options filled and to get back the results. 
I will need a type for the structure which will be used as a base type to all copy / move functions from MB51 to class and program. Bellow you'll find a type t_list which contains most of the fields which are available in MB51 (structure list in RM07DOCS). Just after t_list you'll find type tt_list which is just table type for t_list.
Read more ...

5 1 1 1 1 1 Rating 100% (2 Votes)
It think that some of you involved in MM or PP had already a request or need to add some fields to MB51 or to call it directly with ALV grid instead of old style view. I also had such request and it contained both needs - additional fields and direct display of ALV grid. So I started to dig and debug to see what is possible to do and these possibilities I found:
  1. Copy program RM07DOCS (MB51) to Z-one and to the changes there - but I don't like such solutions so I didn't want to do that way
  2. Create own program which selects data from MKPF and MSEG and display it like MB51 do - but this would be to time consuming to prepare same logic like in MB51 and in case of any changes in oryginal transaction I would need to adjust program again
  3. Do implicit enhancement in RM07DOCS to add missing fields to the field catalog and then fill them during the call of MB51 - this would solve the first part of the request but users will have to do additional two clicks to go to ALV grid which as you may know already is sometimes to much :) Nevertheless if someone of you would like to go this way then you should do two implicit enhancements in RM07DOCS:
Read more ...

1 1 1 1 1 Rating 0% (0 Votes)
It may happen that you'll need to do select or loop on a base of the field which is kept in lower case, but you don't know exactly what's the value o field. In such case you may want to build a range of the possible values to be able to fulfill the task. Here is how to do it quite fast by doing FM:

function z_ab_prep_val_for_case_search.
*"*"Local Interface:
  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.
  dataf_times type i.
  dataf_text type string.
  dataf_textnew type string.
  dataf_insidel type i.
  dataf_insidel2 type i.
  dataft_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 strlenf_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(1ca '*+' and i_option eq 'CP' or i_option eq 'NP' ).

        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.
    append lines of <tab> to er_range.
    refresh <tab>[].


Read more ...

5 1 1 1 1 1 Rating 100% (1 Vote)
Access this URL (http://abapblog.com/files/nugg/ZAB_RESET_RUNTIME.nugg)ZAB_RESET_RUNTIME.nugg
When you create a report or transaction that handles a lot of data with multiple selects and functions that are doing some manipulation of the data, or you have to call in this report a function module thousand times and you want to be sure that no matter how long it takes it should be done but your system administrators have put some restrictions for time limit then you have to use one of this methods:
  1. 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)
  2. 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.
  3. 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.
Both of the methods will make that the counter for application runtime will be reset, but be careful this can make you application run really long. Also if you got one select statement which takes more than maximum runtime for your system then it will not help so you have to prepare your coding to be able to use any of this method, like spliting the selects statements to parts or to select single in the loop.

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.

Examples: (run the program and look into SM50 to see the runtime)
Read more ...

1 1 1 1 1 Rating 0% (0 Votes)
In article Delete Routing - piece of cake I've shown you how to use FM from CEWB transaction to delete routings. If you go through all FM that are inside function groups of CEWB then you'll see that there is a lot of possibilities there. For example creation of a new routing, you can do it step by step or create a routing on a base of existing one. Today I'll show how to copy existing routing to new one with usage of FM CP_CC_S_LOAD_COMPLEX_BY_TSK to load source routing to memory , CP_CC_S_COPY_BY_TSK to copy areas we want and CP_CC_S_SAVE to save new routing to database. In my example I will copy completely source routing to target but in any case you can also omit some of the areas and create them after save (like material allocation or components assignment ).
Read more ...

5 1 1 1 1 1 Rating 100% (11 Votes)
I think that any of us had meet the situation when we needed to create an Excel output from internal table in background. There is a really nice project called ABAP2XLSX which gives you to possibility to do all you need but in some case you won't be allowed to install ABAP2XLSX at you SAP instance. Don't worry there is a way to do it, but in older SAP version we will be allowed only to save the file as MHTML excel (like in ALV->Export to Spreadsheet). In newest version we're able save the file directly to XLSX also. In a method shown bellow you can see that to create Excel file you need to only pass internal table, the rest of the parameters are option which gives you opurtinity to pass the settings you've made in your program to the output file. 

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?

Read more ...
Page 3 of 4