ABAP Coding

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

ABAP – Create an ABAP Custom Header Automatically for all your Programs

I found this cool post that showed me a way to have my own ABAP custom header default into every new program I created.  I thought I’d share it with you all (and add it to my note book :> ).

It’s really pretty easy.  Simply go to table: TSE05 (use SE16N, since no table maintenance has been defined).

If you want to update a program, use the following:
APP_OBJ = ADDM
KEYWORD = REPORT

Next up, just make the changes as you’d like.  Feel free to add additional lines, move around what’s there, etc.  Now you don’t even need to paste your header into every program, just set up your boilerplate once, then you only need to populate in the information.  Just like that you have your own ABAP custom header that will populate every time you create a new program.

Happy Hacking,

Mike

Idiot Proofing your Software

Today I just want to talk about something that is pretty obvious to most people, but I hope to give you a few new ideas on it anyway.  The topic today is idiot proofing your application.  Now, let me go on record by saying idiot proofing your software is pretty much impossible, however, you still need to you best.  I had a friend that used to tell me, “you can monkey proof your software all you want, but they just hiring better monkeys”.

So do you just run through it once, and call it good since you know it’ll be broken anyway?  of course not.  For me, this has always been a challenge.  I’m part of a small business, and I’m the lone developer.  That means, I’ve gotten really good at fixing the things I know will happen, but it also means that I tend to get tunnel vision.  I believe it a common thing among developers, but the key is to avoid that trap.  So here are some of the ways I’m trying to improve my own products…

1.  Get someone that knows nothing about product to play with it.  If I could get her interested, my wife would be a perfect test subject.  She doesn’t use SAP, she knows nothing about service, but she does understand IT and software.  By getting someone with no idea what is supposed to happen means that they will push all the buttons you never expected anyone to push.  They will also look at it from a purely aesthetic perspective, something that I don’t do as well.

2.  Next, if you can, get someone that isn’t good with software, but understands the business.  this will give you the true test if you got the right info.  If someone looks at the information generated, and says “this would help me run my business”, then you’re onto something.

3.  finally, get another developer to look at your stuff.  they’ll look at some of the ways you’ve done things and ask “why?”  Often, we know a way to do something, so we don’t look for better ways.  Often I’ll go to someplace like tech-ed or even a blog post and notice a strange piece of code.  I look at it closer, next thing you know, I’ve found a better way to do something 🙂  The problem is that I don’t have the time to reveiw everything, and I’m biased, so I don’t see anything wrong with my approach.  But…  if someone else asks why did I do this, instead of that? well, it forces me to look at my stuff and either explain why it had to be done this way, or I may say…  hmmmm, that’s a better way.  Now I know a new way to do it.  ha ha ha

The last point is to do this early and often in your development cycle.  Point #2 is really something you should get before you even start programming.  Sketch what you’re thinking, and show it to a business person.  Ask if it would help… if not, why bother?

Anyway, this has been on my mind lately, so if you have some other good ideas, or are interested in playing with anything I’ve done, I’m always interested in having another set of eyes look at my stuff.

thanks,

Mike

ABAP – Screen Elements Naming Convention

It’s been a while since I put a post out about code, and since I’ve been spending a lot of time creating screens lately, I thought I’d drop a quick tidbit out there for any of you programmers out there.  Lately, I’ve been creating screens to work as a configuration screen for one of our applications.  What this means is that there are lots of screen elements, radial buttons, etc in order to make it look good.  I have a table behind the scenes to hold all the information, but like normal screen design, you don’t make a table that goes 1 to 1 with the screen, it’s too inefficient.

Why do you care about any of this? Well, by following a standard naming convention, you can make life really easy on yourself.  Let me give you an example.  I have a screen with about 100 radial buttons (30 rows, some with 2 options, some with 3, some with 4).  Well, by following a naming convention with a standard prefix, putting the field name in the same spot, and adding the occasional suffix, you can dynamically read the field name and make it work for everything you put on the screen without having to read every line.

In your PBO, you can do something like this:
LOOP AT SCREEN.
CLEAR: FIELD, VIS, I, Z_CONFIG_WA.
if screen-input = 0.
continue.
endif.
CASE SCREEN-NAME+0(3).
WHEN ‘CH_’.
FIELD = SCREEN-NAME+3(4).
READ TABLE Z_CONFIG INTO Z_CONFIG_WA WITH KEY FIELD = FIELD GRPNAM = GRP.
IF SY-SUBRC <> 0.
READ TABLE Z_CONFIG INTO Z_CONFIG_WA WITH KEY FIELD = FIELD.
ENDIF.
IF Z_CONFIG_WA-FIELD IS NOT INITIAL.
ASSIGN (SCREEN-NAME) TO <FIELD>.
CASE Z_CONFIG_WA-VISIBLE.
WHEN ‘3’.
<FIELD> = ‘X’.
WHEN ‘4’.
<FIELD> = ”.
ENDCASE.
ENDIF.

ENDCASE.
ENDLOOP.

Now, some of the key things to notice, one is that the loop continues if you can’t input anything.  this is purely to speed things up.  Next, by using the position, you can check for the prefix.  In this example, it’s CH_

Next, it finds the key field name to plug into the configuration table.  Next up, it checks to make sure that the table entry exists in the custom configuration table.  As long as it finds an entry, we use a field symbol to assign the value to the screen field.

The awesome part of this is that as long as you maintain a consistent naming scheme, you can set the values for multiple screens and reuse the code.

anyway, I hope this is useful for you.

If there’s anything we can do to help you out, please use the Contact Us Button above and let us know what we can do for you .

Thanks for reading,

Mike

Big Development Projects – Don’t Get Discouraged

I’ve been working on the latest piece of software for JaveLLin Solutions, and recently hit that frustrated/burned out point on it.  This piece is called Proximity, and the basics have already been designed for the transactions.  However, we are doing a major overhaul, adding some additional functionality and adding a configuration screen to give the user flexibility.  Now, I’ve been working on the redesign for the past few weeks.  Yesterday, I thought I had it wrapped up except for minor tweaks.  I handed it off to my partner (he’s done the specifications for this one), and he came back with a rather extensive list of things to add/update.  While is great, we are getting a better product, more robust solution, and just an overall system that should be easy to sell…  so how could this possibly be a problem???

The problem comes in purely from the amount of time I’ve spent, and of course, the disappoint of not being complete with something I thought was finally completed.  So, how do you avoid this letdown?  Let’s start with a few simple things you can do to get refreshed…

1.  Take some time away from this project.  While normally I recommend single tasking everything, sometimes when you’ve been working on the same initiative for weeks, you need to recharge the batteries.  Take me for example.  After I got the news, I almost picked up the keyboard again and angrily started hacking out the updates.  While this could work, my head isn’t in the game.  This would lead to not doing my best work.  So I’m taking the day off and doing some marketing stuff.  In fact, that’s why I’m blogging right now 🙂

2.  Try not to get too invested in your work.  For me, this is nearly impossible, but I’m trying really hard.  After spending weeks doing some great work and fun new enhancements, so suddenly get broadsided with a big new list of things to work on, can hit you personally.  Go back to number point 1…  and then review the changes.  Remember that this isn’t personal, it’s all about making the best product possible.

3.  Review the changes and determine what needs to happen right now, compared to what can wait.  Often things are nice to have, compared to required.  it’s important as a small shop to properly prioritize what needs to happen.  This means looking at what is currently being used by a customer (something you’ve already sold), what has “legitimate” leads for purchase (actual customer interest in the product, have looked at the product so far and decided they will purchase given some additional cleanup/functionality), then what is just something you “believe” customers will want.  Now I am very guilty of doing everything in that third bucket.  While this belief that customers will want it is important to brainstorm new ideas, the important thing is what customers REALLY want.  Of course, this becomes more challenging if you don’t have any actual customers yet.  Regardless, prioritize…  development time is a vital resource, be sure to use it wisely…

4.  Finally, find a way to re-energize yourself about the project.  Get excited about you’ve done, and how these little tweaks will make it even better.  Convince yourself, in any way that it takes, that this is the best use of your time =)

5.  Make the changes, and finish the project =)

I’m certainly open to additional methods you have any.  I’d love to hear from you.

Mike

Web Dynpro Browsers – Not everything is available

One of the biggest frustrations I’m encountering with Web Dynpro (and especially BSP’s) is that they don’t work on web browsers.  So far, I’ve been able to get my simple applications working just fine on Internet Explorer (version 9), but nothing works on Firefox (version 15), I can’t get anything to work on Safari (5.1.7), and only my BSP has been able to run on Google Chrome.  So today I wanted to discuss some of my finding when it comes to Web Dynpro browsers and what is supported.  There are numerous OSS Notes that I’m still sorting through, including:

0999995
1000000
1098009
1296463
1296464
1634749
In addition:  service.sap.com/PAM talks about the availability matrix.  If you navigate to the netweaver, and punch in your specific version (7.01, etc), you’ll see the web browsers that are supported.

I’m still sorting through all these notes, but to provide an application that can be given to your customer is increasingly difficult.  How do I tell a customer, please use my web application, but you can only use internet explorer.  In addition, there are a number of people (myself included) that upgrade to the latest browser when it comes up.  So this means, there will always be a percentage of time that someone won’t be able to access my application.  I welcome any experiences that people have had with this.  Maybe I just don’t have the right support parks.  For example, I’m using ERP 6.0 EHP4, on Netweaver 7.01.  So far, this states that I can use Internet explorer (up to version 9), and Firefox (up to version 10).  Now, if I was using Netweaver 7.3, EHP1, I’d have access to safari & chrome.  Again, this is subject to being on the latest netweaver support pack.  Short story, I’m a little concerned  with selling a Web Dynpro application, because I’m afraid I’ll spend all of my time troubleshooting what releases are supported for the given clients.

Just to throw it out there…  BSP’s are even worse.  Since SAP has stopped supporting the technology.  My Rapier application works fine in internet explorer and Google chrome, but apparently the functionality is too complicated and Firefox & Safari do not support it.  My problem is that I don’t even know what functionality isn’t supported.  I do a lot of dynamic things in my BSP, so it’s a lot areas to focus on.  The question for me becomes, do I focus on correcting the old technology, or just convert it to web dynpro (easier said than done… but that’s another story).

Oh well, gotta do it, but at least I’m getting a better idea of what is and what isn’t supported.

Web Dynpro – Select-Options – Putting Select Options on Multiple Tabs in the Same Window

Well, after spending some actual working on my Web Dynpro application, I’ve already come across my first little challenge.  In my selection screen, I have multiple tabs, each with a set of select-options.  So this ran into my first extension of my skills…

So, it’s not rocket science, but why not share it, just in case it might be able to help you in your endeavors.
So, for more details, check out my other posts on Web Dynpro.  They talk about using select-options, and how to setup the basics.

Building on this concept, I’m going to walk you through the process of adding multiple selection blocks.
First step, go back to the web dynpro component and add multiple component usages.
Now the biggest change is that we will use multiple views.  We will setup one view for each tab (or each selection option).  We will still do all of the same steps, however, the steps take place at a view that will dropped into the main view.
In my example, I have a view for selection screen that contains multiple tabs.  I then have a view for each of the tabs.  This allows me to use a separate component usage in each tab.  This allows me to put different fields on each one and still keep the functionality I want.
Now, the last of the work happens again at the Window.  Now, instead of just embedding the WDN_SELECTION_SCREEN, we will be embedding the single tab view into the ViewContainer, then the WDN_SELECTION_SCREEN inside of that view.

It’s actually pretty slick.  I’m enjoying the flexiblity of Web Dynpro and what it lets me do.  Now if I could just figure out how to get it working in Firefox & Safari.  I have a feeling it has to do with the version of each of those browsers being relatively new.  Either way, I’m still researching, and you can be sure when I figure it out, I’ll let you know…

of course, if you already know the answer, I don’t “need” to struggle… I’ll happily learn from your hard work.  ha ha ha.

Thanks again for reading,

Mike

Web Dynpro – Select-Options – writing the code

Here’s the code to do  SELECT-OPTIONS in ABAP Web Dynpro:

* Adding a block (type Tray) to the select-options
wd_this->go_so_com->add_block(
i_id         = `COM2`
i_block_type = if_wd_select_options=>mc_block_type_tray
i_title      = `Sales Selection` ).

As promised, I’ll talk about what I leaned in doing the actual method to put the select-options together for a full screen.  Everything I talk about deals with the add_selection_fields (notice the plural).  I had a bunch of fields, so I chose to do them all at once.

Here’s the basics, based on the name of the usage component.  I don’t know all the details on this portion…  but trust me, it works.  it came from SAP.  =)

DATA:
* reference to the item table for multiple lines.
lt_fields TYPE IF_WD_SELECT_OPTIONS=>TT_SELECTION_SCREEN_ITEM,
wa_fields TYPE IF_WD_SELECT_OPTIONS=>T_SELECTION_SCREEN_ITEM,
* reference to the select option usage controller
lo_ref_cmp_usage TYPE REF TO if_wd_component_usage.

* instantiate the usage component, if necessary
lo_ref_cmp_usage = wd_this->wd_cpuse_usage_so_comm( ).
IF lo_ref_cmp_usage->has_active_component( ) is INITIAL.
lo_ref_cmp_usage->create_component( ).
ENDIF.

* determine referece to the interface controller
wd_this->go_ic_so_com = wd_this->wd_cpifc_usage_so_comm( ).
* initialize selection screen
wd_this->go_so_com = wd_this->go_ic_so_com->init_selection_screen( ).

If you want to turn off the default buttons that show up for select options.  I wasn’t a fan, but I may change my mind in the future.  Either way, you can turn it off with the following code:

* Hide the standard select-options components.
wd_this->go_so_com->set_global_options(
i_display_btn_cancel = abap_false
i_display_btn_execute   = abap_false
i_display_btn_check  = abap_false
i_display_btn_reset  = abap_false ).

If you want to add a block, here’s the code to do so.  One of the things to note, be sure to capitalize all the letters.  I also found that it worked better being 4 digits.  I tried comsel_1, and it failed, then comsel1, and it also failed.

* Adding a block (type Tray) to the select-options
wd_this->go_so_com->add_block(
i_id         = `COM2`
i_block_type = if_wd_select_options=>mc_block_type_tray
i_title      = `Sales Selection` ).

This little code snippet shows you the basics of adding a field.

*** begin building selection screen
*This is the field name
wa_fields-m_id = ‘SRV_MAT’.
* generate range table for data element.  Be sure to make this equal to the data element.
wa_fields-mt_range_table = wd_this->go_so_com->create_range_table(
i_typename = ‘MATSV’ ).
* if you choose to embed the field inside of a context block (box) you can add it here.
wa_fields-m_within_block = ‘COM1’.
* use this line to turn on the drop down for the field
wa_fields-m_value_help_type = if_wd_value_help_handler=>co_prefix_searchhelp.
* here is the search help to use for the field
wa_fields-m_value_help_id = ‘MAT1’.
append wa_fields to lt_fields.
CLEAR wa_fields.

Finally, once you have all of your fields entered, you can call the method.  If you followed all of the steps in my previous post, you should be able to see your select options showing up on the screen.

* generate field in selection screen
wd_this->go_so_com->add_selection_fields(
it_fields = lt_fields ).

Next up, I’ll talk about adding multiple Select-Options onto the same screen (if you have multiple tabs, this could come in handy).

Thanks for reading,

Mike

Web Dynpro – Select-Options – Overview of the process

Finally, I get around to my first post about Web Dynpro.  I’m starting simple and replicating the selection screen for Broadsword, my service dashboard.  So any good selection screen usually has some select options.  So I wanted to pass along my lessons learned and a little bit of code too.  For starters, how do you create the select-options.  There isn’t an object that you can drop onto the screen for SELECT-OPTIONS.  You need to put a little more effort into adding it.

1. Create a create a component on the Used Component Tab of the Web Dynpro Component.  component use:  usage_so (for example) Component: WDR_SELECT_OPTIONS
2. Add the component to the view (properties tab).  Be sure to add both options (one with the controller, one without the controller).
3.  On the layout of the View, add a ViewContainerUIElement to the screen where you want to place it.
4.  Create a method for the View, INIT_SELECT_OPTIONS.  this method is where you will define the actual fields and layout.  We’ll discuss this in more detail tomorrow.  You can use the following methods:  add_selection_field or add_selection_fields.
5.  Update the WDDOINIT method, add the line:    wd_this->init_select_options( ).
6.  Attach the component to the ViewContainerUIelement in the window.  You will embed the WND_SELECTION_SCREEN to the ViewContainer in order to make the connection.

Alright, that’s enough for this post.  Tomorrow I’ll talk about the code for INIT_SELECT_OPTIONS.  Hope this information on SELECT-OPTIONS is useful.

 

Configuring Web Dynpro in SAP ERP

Well, since creating my new EHP4 system, I’ve had to do a lot of activities.  For me, the most important was getting Web Dynpro working.  I created this whole system with the intent of using it for webdynpro development.  Anyway, again, no straightforward documentation that talks about what needs to happen.  So, here’s my notes on configuring web dynpro in SAP.
First, you need to implement an OSS note:
After applying the note, go to transaction SICF and activate the following services.
/sap/public/myssocntl
/sap/bc/wdvd
/sap/public/bc/icons
/sap/public/bc/icons_rtl
/sap/public/bc/webicons
/sap/public/bc/webdynpro/*
/sap/public/bc/pictograms
/sap/bc/webdynpro
Now, you can use the layout designer for Web Dynpro.  It’s that easy.
Hope this helps,
Mike

WMIGO is ready for the next phase – MIGO + WM is a winning combination

For anyone that’s been reading, you’ll know that I started a tool that would allow you to do a material movement and create the transfer order in a single step.  Well, I’m excited because last night, I put the finishing touches on that tool.  I still need to do some full scale testing and create the documentation for it, but round one is done.  It uses the idea of transaction MIGO and incorporates the WM pieces into it.

Some of the lessons I learned while building this, don’t clone transactions, and even be careful cloning screens.  I ran into this when I began to set up the serial number entry screen.  At first, I started by just copying the screen from MB1B.  Nice and easy, right?  not so much.  I quickly  came to the same realization as I did when I copied the MB1B transaction completely.  It works, but it opens the door to a lot of potential headaches.  So, like the main transaction, I looked at what was happening in MB1B, and took the important pieces.  Now there may still be things that will need to be added into future releases.  For example, at this time I’m not covering the user exits and enhancement points that the standard material movement have built into them.  This may be a requirement for some of my future customers, and if so, at that time I’ll work on building those into my solution.  IN the meantime, the functionality works, and I’ve created a pretty slick tool.

Finally, big thanks go out to Jeff Bass, without whom none of this would’ve been possible.  Jeff is quite possibly the best WM teacher out there.  Certainly the best I’ve ever met.  I knew very little about WM before sitting down with Jeff for an hour.  After that, I have a very solid grasp of how it works (and at least enough to set up a simple WM configuration).  So thanks Jeff…  couldn’t have done it without you…

as always, I keep learning the hard way so you don’t have to.