ABAP Coding

Home / SAP / Archive by category "ABAP Coding" (Page 4)

ABAP – BDC ABAP Code

Well, we’ve created a program, and done the BDC recording.  Now, all that’s left is the BDC ABAP Code to make it all useful.  So, let’s jump right into it.

First off, you’ll need 2 FORMS and some standard data declarations:

DATA:   BEGIN OF bdcdata OCCURS 100.

INCLUDE STRUCTURE bdcdata.

DATA END OF bdcdata.

DATA: mess TYPE TABLE OF bdcmsgcoll WITH HEADER LINE.

*———————————————————————*

*       FORM BDC_DYN                                                  *

*———————————————————————*

*       start a new screen in the BDC table                           *

*———————————————————————*

*  –>  PROGRAM                                                       *

*  –>  DYNPRO                                                        *

*———————————————————————*

FORM bdc_dyn USING program dynpro.

CLEAR bdcdata.

bdcdata-program = program.

bdcdata-dynpro = dynpro.

bdcdata-dynbegin = ‘X’.

APPEND bdcdata.

ENDFORM.                    “bdc_dyn

*———————————————————————*

*       FORM BDC_FLD                                                  *

*———————————————————————*

*       add a field to the BDC table                                  *

*———————————————————————*

*  –>  FNAM                                                          *

*  –>  FVAL                                                          *

*———————————————————————*

FORM bdc_fld USING fnam fval.

CLEAR bdcdata.

bdcdata-fnam = fnam.

bdcdata-fval = fval.

APPEND bdcdata.

ENDFORM.                    “bdc_fld

 

Now, the actual transactional stuff that will change with every transaction…

FORM load_cnf.

REFRESH: BDCDATA, MESS.

 

PERFORM bdc_dyn USING ‘SAPLCORU’ ‘3000’.

PERFORM bdc_fld USING CORUF-AUFNR ‘ ‘4000100’.

PERFORM bdc_fld USING CORUF-VORNR ‘ ‘0010’.

PERFORM bdc_fld USING ‘BDC_OKCODE’ ‘=ENTR’.    ” ENTER

PERFORM bdc_dyn USING ‘SAPLCORU’ ‘3200’.

PERFORM bdc_fld USING AFRUD-ISMNW_2 ‘ ‘2’.

PERFORM bdc_fld USING AFRUD-LEARR ‘ ‘SRV’.

PERFORM bdc_fld USING AFRUD-AUERU ‘ ‘’.

PERFORM bdc_fld USING AFRUD-LEKNW ‘ ‘’.

PERFORM bdc_fld USING ‘BDC_OKCODE’ ‘=MB03’.    ” ENTER

PERFORM bdc_dyn USING ‘SAPLCOWB’ ‘0130’.

PERFORM bdc_fld USING ‘BDC_OKCODE’ ‘=WEIT’.    ” ENTER

* runs transaction defined above, mode ‘A’ goes step by step, use this

* to prototype code, mode ‘N’ runs automatically, use this in

* production, mode ‘E’ generates errors only, use this for debug

COMMIT WORK AND WAIT.

CALL TRANSACTION ‘IW41’ USING bdcdata

MODE ‘A’         ” mode ‘A’,’N’,’E’

UPDATE ‘S’

MESSAGES INTO mess.

endform.                    “load_cnf

Now, the biggest piece to remember is the MODE.  In the code above, it’s set to A, which means that it will go through step by step. When you execute, it will look something like this.
blog01-12

Beyond that, it’s all about translating the recording into the steps.  You’ll notice that every screen must start with the bdc_dyn.  The bdc_fld will be all the steps within that screen.  At the end of each screen, you will add a BDC_OKCODE.  This will be like hitting enter, or pressing a button.  After ever BDC_OKCODE, you will do a bdc_dyn (even if you don’t leave the screen).

Beyond that, it’s all about entering in the data to populate the screen.  Now something to keep in mind, it won’t always be sufficient to use the same data type as the screen field.  For example, I did transaction IW41, and you have to enter in a number of time units (hours/mins/etc).  I used the same data type, but when I executed the transaction, it told me that the values didn’t fit in the field…  WTF?”.  So i changed it to a text field to enter in the number, and magically it worked.  Keep in mind, you may need to do tricks like that from time to time.

Hope you found this useful and thanks for reading,

ABAP – BDC Recording

Well, since I’ve been talking about BDC, seems logical that I should actually show you how to get a BDC Recording.  It’s easier than you might expect, but reading the results can take some effort.

blog01-01

Use this menu path to start the BDC recorder.

blog01-02

Start a new recording.

blog01-03

Enter in your transaction, and a description.  Then press Start Recording.  Just to give you an idea, let’s walk through a simple recording.

blog02-01

Now, the biggest thing to keep in mind is to know the steps of your transaction, eliminate extra steps (don’t randomly hit enter) and make sure to populate every field you want to be able to populate in your program.

blog02-02

Fill in the values you want, and then press the Goods Movement Button.

blog02-03

Finally, press Save.

Now, you will get your results:

Now, the recording will give you this result:

 

                                               0000                T                      IW41

SAPLCORU                                                       3000                X

                                                0000                                       BDC_CURSOR                                                                                                                                                   CORUF-VORNR

                                                0000                                       BDC_OKCODE                                                                                                                                                  =ENTR

                                                0000                                       CORUF-AUFNR                                                                                                                                                 4000100

                                                0000                                       CORUF-VORNR                                                                                                                                                 10

SAPLCORU                                                       3200                X

                                                0000                                       BDC_CURSOR                                                                                                                                                   AFRUD-LEKNW

                                                0000                                       BDC_OKCODE                                                                                                                                                  /00

                                                0000                                       AFRUD-ARBPL                                                                                                                                                  SERVICE

                                                0000                                       AFRUD-WERKS                                                                                                                                                1100

                                                0000                                       AFRUD-ISMNW_2                                                                                                                                                   28

                                                0000                                       AFRUD-ISMNU                                                                                                                                                H

                                                0000                                       AFRUD-LEARR                                                                                                                                                  srv

                                                0000                                       AFRUD-BUDAT                                                                                                                                                12/06/2013

                                                0000                                       AFRUD-AUERU

                                                0000                                       AFRUD-LEKNW

                                                0000                                       AFRUD-OFMNU                                                                                                                                               H

                                                0000                                       AFRUD-ISDD                                                                                                                            01/11/2013

                                                0000                                       AFRUD-ISDZ                                                                                                                            07:00:00

                                                0000                                       AFRUD-IDAUE                                                                                                                                                 H

                                                0000                                       AFRUD-IEDD                                                                                                                            12/06/2013

                                                0000                                       AFRUD-IEDZ                                                                                                                            23:31:37

                                                0000                                       AFRUD-PEDZ                                                                                                                          24:00:00

SAPLCORU                                                       3200                X

                                                0000                                       BDC_CURSOR                                                                                                                                                   AFRUD-ARBPL

                                                0000                                       BDC_OKCODE                                                                                                                                                  =MB03

                                                0000                                       AFRUD-ARBPL                                                                                                                                                  SERVICE

                                                0000                                       AFRUD-WERKS                                                                                                                                                1100

                                                0000                                       AFRUD-ISMNW_2                                                                                                                                                   28

                                                0000                                       AFRUD-ISMNU                                                                                                                                                H

                                                0000                                       AFRUD-LEARR                                                                                                                                                  SRV

                                                0000                                       AFRUD-BUDAT                                                                                                                                                12/06/2013

                                                0000                                       AFRUD-OFMNU                                                                                                                                               H

                                                0000                                       AFRUD-ISDD                                                                                                                            01/11/2013

                                                0000                                       AFRUD-ISDZ                                                                                                                            07:00:00

                                                0000                                       AFRUD-IDAUE                                                                                                                                                 H

                                                0000                                       AFRUD-IEDD                                                                                                                            12/06/2013

                                                0000                                       AFRUD-IEDZ                                                                                                                            23:31:37

                                                0000                                       AFRUD-PEDZ                                                                                                                           24:00:00

SAPLCOWB                                                      0130                X

                                                0000                                       BDC_OKCODE                                                                                                                                                  =WEIT

                                                0000                                       BDC_SUBSCR                                                                                                                          SAPLCOWB                                0806HEADER

                                                0000                                       BDC_SUBSCR                                                                                                                          SAPLCOWB                                0510TABLE

                                                0000                                       BDC_CURSOR                                                                                                                                                   COWB_COMP-ERFMG(01)

Now, this will translate into the following ABAP code.   In a future post, I’ll give you the simple bdc_dyn and bdc_fld form code.

PERFORM bdc_dyn USING ‘SAPLCORU’ ‘3000’.

PERFORM bdc_fld USING CORUF-AUFNR ‘ WA_CNF-AUFNR.

PERFORM bdc_fld USING CORUF-VORNR ‘ WA_CNF-VORNR.

PERFORM bdc_fld USING ‘BDC_OKCODE’ ‘=ENTR’.    ” ENTER

PERFORM bdc_dyn USING ‘SAPLCORU’ ‘3200’.

PERFORM bdc_fld USING AFRUD-ISMNW_2 ‘ WA_CNF-TIME.

PERFORM bdc_fld USING AFRUD-LEARR ‘ WA_CNF-LEARR.

PERFORM bdc_fld USING AFRUD-AUERU ‘ WA_CNF-AUERU.

PERFORM bdc_fld USING AFRUD-LEKNW ‘ WA_CNF-LEKNW.

PERFORM bdc_fld USING ‘BDC_OKCODE’ ‘=MB03’.    ” ENTER

PERFORM bdc_dyn USING ‘SAPLCOWB’ ‘0130’.

PERFORM bdc_fld USING ‘BDC_OKCODE’ ‘=WEIT’.    ” ENTER

* runs transaction defined above, mode ‘A’ goes step by step, use this

* to prototype code, mode ‘N’ runs automatically, use this in

* production, mode ‘E’ generates errors only, use this for debug

COMMIT WORK AND WAIT.

CALL TRANSACTION ‘IW41’ USING bdcdata

MODE ‘N’         ” mode ‘A’,’N’,’E’

UPDATE ‘S’

MESSAGES INTO mess.

That’s it for today.  The recording is pretty easy.  Using it, well, I’ll get to that soon 🙂

Thanks for reading,

 

ABAP – Copying a program

Continuing on my training of an intern, one of the things I need is a series of BDC programs to automatically generate data within my test systems.  While, there are a lot of ways to make transactional data, I need something that I can “fire and forget”.  So that means I need programs with either a BAPI or BDC.  In my opinion, for this, I want simple and I want quick, so I’ve gone down the BDC path.  So…  I’m using it as a training opportunity for my intern.  Today, I’m going to focus on simply copying an existing program.  I know it sounds simple, but hey, not everyone is an ABAP expert.  That’s what I”m going to be sharing with y’all today 🙂

blog01-01

Now, since I’ve already developed a few of these (I’m working my way through the in-house repair process), the easiest way is to copy from an existing one.

blog01-02

This program will be to generate service order confirmations.

blog01-03

Now, the next question is if you want to copy all the attached pieces of the program.  In general, I say yes, but obviously, this depends on your goal.

blog01-04

Now, the transport portion.  This may depend on your system and your plans.  For me, I want to make sure I can transport this forward, but perhaps you’re just playing.  In that event, skip the package, and just select Local Object

blog01-05

But, if you choose a transportable object, you’ll need to create a transport.

blog01-06

Give it a description, press Save.

blog01-07

Now your transport is listed, press the green check to accept it.

blog01-08

Finally, we just need to make some minor updates, like the program title.  Select Attributes and Press Change.

blog01-09

Change the title and press Save.

blog01-10

Normally, I’ll change the boilerplate as well.

blog01-11

Once I add the information to boiler plate, you can activate it, and even execute it if you choose (granted, it’ll execute the program you copied, but at least you can be sure syntax is good to go).

There you go…  how to properly copy an ABAP program.

Thanks for Reading,

 

ABAP – Finding Field and Type

Well, it occurred to me.  I have a new intern, and he knows nothing about SAP or ABAP.  So I’m having to go back to the beginning to try to get him in the swing of things.  So, I thought I’d start throwing some of the things I’m teaching him out here.  Who knows?  maybe it’s useful to some of you out there too 🙂  Today I’m going back to the very basics.  Finding field and type from a screen.

For this example, I’m using transaction IW41

blog03-01

Highlight the field you want information on.

blog03-02

Press the technical details button.

blog03-03

This magical screen gives you quite a bit of information.  Typically, Field Name and Data Type are the most valuable.  Occasionally, you can even get the Table name.  In a future post, I’ll talk about digging further when this screen only gives you a structure (which happens quite often).

Thanks for reading,

ABAP Web Dynpro – ALV Table Columns

Ok…  now I finally got to the really important stuff for me.  I have a configuration table that tells how columns are available, and how they sequenced by default.  So obviously, if I’m going to use the ALV simple table versus the “standard” Table Class, I need to control the ALV Table Columns, this includes sequence, visibility and column header text.

So, again, I’m doing all of this in the WDDOINIT method, since it’s a one time read.  Here’s how you can do it yourself.

  data lo_cmp_usage type ref to if_wd_component_usage.
DATA lo_INTERFACECONTROLLER TYPE REF TO IWCI_SALV_WD_TABLE .
DATA lv_value TYPE ref to cl_salv_wd_config_table.

*** instantiate the component
lo_cmp_usage =   wd_this->wd_cpuse_alv_comp( ).
if lo_cmp_usage->has_active_component( ) is initial.
lo_cmp_usage->create_component( ).
endif.
lo_INTERFACECONTROLLER =   wd_this->wd_cpifc_alv_comp( ).
*** get the ALV table
lv_value = lo_interfacecontroller->get_model( ).

** first, get all of the columns from the table.
lt_cols = lv_value->if_salv_wd_column_settings~get_columns( ).
READ TABLE lt_cols INTO ls_cols with key ID = <TABLE FIELD NAME>.
*** For visibility, you the following values
*      WHen ‘VISIBLE’
lv_vis = ’02’.
*     when ‘INVISIBLE’.
lv_vis = ’01’.
ls_cols-r_column->set_visible( lv_vis ).

*** set the sequence of the columns
lv_seq = lv_sequence.
ls_cols-r_column->set_position( lv_seq ).

*** Set the header text and tooltip
ls_col_hdr = ls_cols-r_column->get_header( ).
lv_col_text = lv_text.
ls_col_hdr->set_text( lv_col_text ).
ls_col_hdr->set_tooltip( lv_col_text ).

Of course, you can loop through and find your values from anywhere.  The important thing to notice is that it’s pretty simple.  Especially in comparison to the process I was using that had to delete a column and re-add it in order to sequence it properly.  This is a lot less involved.  So far, I haven’t found anything that I do that would force me away from the ALV Table.  I guess I’ll see what happens, but I may start converting my SM Portal to the ALV Tables.  The processing time doesn’t seem bad, so if you happen to know why the “standard” vs SALV table is preferable, I’d love to hear from you.

As always, Thanks for reading,

ABAP Web Dynpro – ALV Table Settings

Well, the next phase of my journey was the ABAP Web Dynpro ALV Table Settings.  I wanted to control things like the number of rows to display, what buttons should be available etc…

So after a little more research, I found that is pretty easy to do too.

Again we go to the WDDOINIT and add the follow code (or something like it ).

  data lo_cmp_usage type ref to if_wd_component_usage.
DATA lo_INTERFACECONTROLLER TYPE REF TO IWCI_SALV_WD_TABLE .
DATA lv_value TYPE ref to cl_salv_wd_config_table.

*** instantiate the component
lo_cmp_usage =   wd_this->wd_cpuse_alv_comp( ).
if lo_cmp_usage->has_active_component( ) is initial.
lo_cmp_usage->create_component( ).
endif.
lo_INTERFACECONTROLLER =   wd_this->wd_cpifc_alv_comp( ).
*** get the ALV table
lv_value = lo_interfacecontroller->get_model( ).

*** Set Table Buttons and attributes
lv_value->IF_SALV_WD_TABLE_SETTINGS~SET_SCROLLABLE_COL_COUNT( value = 10 ).
lv_value->IF_SALV_WD_STD_FUNCTIONS~SET_EXPORT_ALLOWED( value = abap_false ).
lv_value->IF_SALV_WD_STD_FUNCTIONS~SET_PDF_ALLOWED( value = abap_false ).

this particular example turns off the print button (PDF Allowed), turns off the Export button (Export_Allowed), and sets the scrollable column count = 10.  Just because my particular table could be 100 columns wide.  So I want it to render nicely, and 10 is a pretty good number of columns.  In addition, I’m leaving the settings button available, so a user can make his own settings if he doesn’t like my default.  I really like this ALV stuff 🙂

Alright, back to it.  Thanks for reading,

ABAP Web Dynpro – ALV Table Button

Well, after my last post, I realized, this is cool.  Now it’s time to make it better.  So the first objective is to add an ALV table button for refresh.  It turns out, it’s pretty easy to accomplish this.  Here’s what you need to do.

So, go into your WDDOINIT and add the following code (or some variation).

*** initial ALV table
data lo_cmp_usage type ref to if_wd_component_usage.
DATA lo_INTERFACECONTROLLER TYPE REF TO IWCI_SALV_WD_TABLE .
DATA lv_value TYPE ref to cl_salv_wd_config_table.
DATA: lr_btui_refresh TYPE REF TO cl_salv_wd_fe_button.
DATA: lr_bt_refresh TYPE REF TO cl_salv_wd_function.

*** instantiate the component
lo_cmp_usage =   wd_this->wd_cpuse_alv_comp( ).
if lo_cmp_usage->has_active_component( ) is initial.
lo_cmp_usage->create_component( ).
endif.
lo_INTERFACECONTROLLER =   wd_this->wd_cpifc_alv_comp( ).
*** get the ALV table
lv_value = lo_interfacecontroller->get_model( ).
*** create the button object
create OBJECT lr_btui_refresh.
*** set icon
lr_btui_refresh->set_image_source( ‘ICON_REFRESH’ ).
lr_bt_refresh = lv_value->if_salv_wd_function_settings~create_function( ID = ‘BT_REFRESH’ ).
lr_bt_refresh->set_editor( lr_btui_refresh ).

Now you can also add text to the button instead of just the image source.  If you drill into the cl_salv_wd_fe_button class to see the methods available.

I’ll have more tomorrow as I keep learning.  Thanks for reading,

Web Dynpro – The ALV Table

Well, with all the work that I did for my Customer SM Portal, I thought I knew what I was doing with the ABAP Web Dynpro, especially around tables and dynamically changing them.  I recently started working on a new application that is more scaled back.  One of the requirements is to have the same sort of functionality as an ALV Table in the ABAP.  So we want to have the filter, sorting, and flexibility to play with your layout and settings.  Well, I started to look at the current tables I’d been using, and realized I had to implement each of those functions myself.  Well, that looked like a rather big task to undertake, so I went to my buddy, the internet and looked up Web Dynpro ALV Table and quickly found that SAP was nice enough to provide a way to implement the ALV Table.  Of course, it meant another change to the way I was doing things… but hey, I learned something new.

First of all, thanks that Sankar.  If you like to see exactly how to do this in video format, check out this like.  Sankar does a great job in demonstrating exactly how to code this stuff.  My only problem is that sometimes it was hard to read the code and class names (which is why I’m going to cover this in text form). https://www.youtube.com/user/sankar1bhatta?feature=watch

So, let me walk you through the steps of how to create an ALV Table.  The first step is to add a new Web Dynpro Component. blog01-01

So, go to your top level, and add a Used Web Dynpro Component.  You can name the Component Use whatever you like, the component itself is SALV_WD_TABLE.  This is the magic that will allow you to use all of the ALV functions. I’m not going to cover this in depth, but the next step will be to add a context node + attributes that will be the structure for the table you want to create.  Be sure to create this in the componentcontroller, and not directly in a particular view. This next part was new to me.  I believe it’s called external component mapping.  So let me walk you through this next part.

blog01-02

First, drill down into the component usuages until you find the ALV component you defined above (mine is ALV_COMP).  Next, you need to drag your context (table you want to create in ALV) from the right side, over to the Data node on the left side above.  You have now linked that table structure to the ALV components. Finally, we need to add this to the layout so you can actually see the table.  So, go to your layout and add a ViewContainerUIElement.  Wherever you place this is where your table will come in. We have one final step, and then you’re ready to test.

blog01-03

So, go to your window, and find the VCUI element that you just created, and drill down and then right click to Embed View.

blog01-04

Select the Table interface, and you’re ready to go.  Just fire up your application.  In some future posts, I’ll discuss how you can customize this, but for many applications, this might be enough.

Thanks for reading,

Web Dynpro – wda_ls_main.js Error in IE

Well, here’s something new I just ran into.  Last night, my system crashed, which by itself was no big deal.  I just had to restart my virtual server.  But then I went to do some testing in Rapier and suddenly I couldn’t even get the login page to show up.  All I got was an error in IE (internet Explore) talking wda_ls_main.js  Well, this sounded cryptic and unhelpful.  So I went to SDN, and quickly found that it’s a browser issue, not anything with my code.  Which was good, since it worked last night and I hadn’t changed anything.

The solution was simple, go to the internet options, delete all the browsing history.  Apparently, from time to time, something strange gets cached and it won’t reload.  I wasn’t able to really get any more info than that (that I understood at least.  ha ha ha).

so if you run into this error on you AWDP page, try just clearing out the history.

Thanks for reading,

ABAP – 4.6C code differences

Like I mentioned yesterday, we have a potential sale, if we can make WMigo work in a 4.6C system.  Sounds easy, right?  Well, it’s all part of my latest adventure.  First I had to figure out a way to convert my 6.0 Unicode system transport to go to 4.6C.  Check my post from yesterday if you want to know more about that.  Now, back to my story.  After overcoming the obstacle of getting the 4.6C system to accept my transport then I started to find code issues.  It turns out that a system more than 10 years old doesn’t have all the tools that I”m used to.  Today I want to talk about some of the 4.6C code differences I’m experiencing.

1.  Line length has a max of 72.  sounds simple, but I had about 20 + errors just on this.  When you get the nice word wrap type features, you don’t notice when you get to 75 or 80 chars, but it just rolls onto the next line.  Simple fix, but still a fix.

2.  is not INITIAL doesn’t work in 4.6C.  Instead, you need to change it to NOT <variable> is INITIAL.  it’s subtle, but again, I had a lot of instances that needed to change.

3.  some methods have changed parameters.  on_data_changed for example did not have the parameter e_ucomm.

4.  some methods need to be called “differently”.  for example: cl_gui_cfw=>set_new_ok_code( new_code = ‘OK’ ), needs to be
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = ‘OK’.
subtle, but necessary if you want to run in 4.6C