Month: February 2013

Home / 2013 / February

Web Dynpro – Matrix Data

Recently, I started to discover some of the nuances of setting up the layout in a web dynpro view.  The simple detail I discovered is the difference between the (matrix data) matrixdata & matrixheaddata is probably obvious to many, but I fumbled with it for a while trying to figure out what the heck I was doing wrong 🙂

So, here’s the situation, I needed a transparent container to hold a group of input fields and labels.  Because of some of the other things I’m doing dynamically, I chose to use the MatrixData layout.  I gave the Matrix Data 2 columns, assuming that things would automatically just fill in from one field to the next.  Initially, I set the labels and the input fields to be MatrixHeadData.

Everytime I executed the application, it put the label and the input field into the same column, never together in the same row.  After some digging, I finally found that MatrixHeadData will always start a new row, if you want to continue an existing row, you must use MatrixData.  So there’s my learning experience, that I’m passing on to all of you.

Thanks for reading, and hopefully I can save you some time when you start developing our own apps.

Variant Configuration – SCREEN_DEP

If you’ve been doing VC for any length of time, you’re probably very aware of this little trick.  But if you’re new to VC, you might not be aware that you can dynamically control your characteristics.  You can use object dependencies to set a characteristic to invisible, or set it to input or no input.

For me, when I model a product line, I often need to add characteristics that aren’t always available for the user to see or to input.  For this, I will create reference characteristics based on the following table:

Screen_DEP

INVISIBLE

YES

Makes characteristic Hidden (same as checking No display below)

INPUT

YES

Makes characteristic available for input (same as un-checking Not ready for input)

NO_INPUT

YES

Makes characteristic unavailable for input (same as checking Not ready for input)

RESET

YES

Resets all values set by Screen_DEP structure.

Simply create a new characteristic, and on the reference tab enter in the Screen_dep for the table, and one of the fields in the 2nd column as the field.

Now, in your object dependencies, you can simple use your standard logic:

$SELF.INVISIBLE = ‘MY_CSTIC’
IF….

now the only catch to this, MY_CSTIC must be spelled properly.  There is no syntax checking since it’s a literal.  But if you spell it correctly, and if the IF statement is met, MY_CSTIC will be made invisible.

It’s that easy.  Very slick and very powerful.  If you haven’t already, give it a try.

Screen_DEP

INVISIBLE

YES

Makes characteristic Hidden (same as checking No display below)

INPUT

YES

Makes characteristic available for input (same as un-checking Not ready for input)

NO_INPUT

YES

Makes characteristic unavailable for input (same as checking Not ready for input)

RESET

YES

Resets all values set by Screen_DEP structure.

Service Management – Reset Equipment Status

In a previous post I talked about the equipment status.  This field can be very powerful, but at times, it’s very painful.  I have run into issues the status doesn’t get set or reset properly after certain transactions.  Today I want to talk about how to reset equipment status.

blog2-01

Once inside of the equipment record, edit–>special serial number functions –>manual transaction.  The manual transaction is the equivalent of the equipment status reset.  It allows you to force the status (remember, this won’t impact the stock)

blog2-02

that will bring up this nice pop-up window that presents you with the following options:

To stock: ESTO
From Stock: add AVLBTo Customer: ECUS
From Customer: ESTO
Delete Assign to HU: Clears the handling unit
Delete Inv. Assign: clears inventory connection

Save, and should be able to continue with your transactions.
Good luck and thanks for reading.

Development – Staying Focused

This topic is especially relevant to me as I type this.  I’ve just spent the better part of 3 weeks focused on learning a new client’s business process for service management.  While things like this can be tedious, they are also tremendous opportunities for new ideas and new products.  That’s exactly where I am right now.  I’m in the middle of 2 rather large development projects, but I’ve just been struck with several ideas that people are asking for!!!

So, how do you balance that.  I’m struggling right now.  I just want to pull up one of my original products and begin adding some new features to it…  I want to start developing a brand new application that I see is a perfect fit for several customers I’ve recently talked to…  But, I’m in the 75% complete for one our brand new production offerings.  And I’m a third of the way done in converting my first product from BSP to ABAP Web Dynpro.  Both of these are already more than I should be trying to handle at one time…  but I need to shift gears from time to time to help avoid burnout.

So, here’s what I’m doing…  I’m taking really good notes and adding items to my to-do list.  I’m trying to get my head back in the game on what I need to finish first.  Why you might ask?  you have a request from a customer?  an actual need!!!  true.  But we also have a business plan…  and my partner and I agreed to it.  We believe this new production product can be huge.  And while the Service Management side of our offerings is starting to gain traction, we will never get the same traction on the Production Execution side if we don’t finish the offering.  Plus, several half finished products equal ZERO revenue =)

So just remember, you started with a plan…  stick with it unless there is reason to deviate.  And even then, work with your team.  It’s easy to get excited about “potential”, but until someone signs on the bottom of your contract, it doesn’t mean anything.  it’s just something that someone asked for, but might never be willing to pay for.  There will be time later to reset priorities…  and that’s exactly what I plan to do after the SAP MFG conference =)

Marketing – Who is your Competition?

Well, as I’m sure you’re aware, a lot of my effort is being spent on my new business.  One of the big pieces that I’ve had to spend a lot of time learning is the marketing aspect.  While to some of you, this might seem easy…  well, I have that engineering mentality.  For those you that ever read Dilbert, you know that engineers & sales or marketing have very different mindsets.  Almost opposite 🙂  so it’s been a challenge for me to overcome that and try to play both roles.

One of the challenges I’ve always faced is that my area is very niche, and thus it’s been difficult to find any competitors or similar products to my own.  You might be scratching your head right now thinking “that’s not a problem!!!  No competition means 100% of the market”.  Well, that’s what I originally thought.  What I quickly discovered is that there are 2 far more likely possibilities.

1.  There is no market, and that’s why no one else is doing this.
2.  No one knows that anyone offers what I offer, so no one is looking.

It’s like anything, if you don’t know there’s a product out there, you might not even consider looking for it.  I’m gambling my resources on #2.  I truly believe there is a market for what I’m designing, so that means I need to try to get the word out there that the service management tools can be purchased and out of the box solutions exist.  It’s part of the reason I write to you guys most every day.  It’s my form of advertising.  I’m hoping that providing you valuable information, you in turn will remember that I sell stuff, and if you run into a client that might need it, you’ll think of me and point them my way =)

Variant Configuration – Class Hierarchy Benefits

I just realized, it’s been a while since I talked VC.  Thought tonight would be a good time to add something new for those of you who enjoy the variant configuration posts.  Today I wanted to talk about the advantages of using the class hierarchy when you are modeling.  Often you may have multiple products that are all built on the same platform, but each has it’s own flavor.  In this situation, you will find that often a group of characteristics are shared among all of these product lines, and only a subset differ.  This is perfect for the class hierarchy.  To do this, you build a class with all of the “common” characteristics.  Then you create a second (or multiple) classes that contain the characteristics that are unique to the particular product line.  You then use transaction CL24N, enter in the “common” class, and assign the second class to it.  Now that second class contains all of the cstics of the upper level and the lower level.

Now,this sounds like a lot of work, but for maintenance purposes, whenever a new common characteristics needs to be added to all of the product lines, simply add it to the upper level class, it will automatically be added to everything that is below it.  The other huge benefit is that if use constraint nets, you can define the constraint to talk to the “Common class”, and thus you don’t even need to re-write the constraint for the lower level classes 🙂

There is a downside, and this is usually experienced the most in the development phase.  This is the ability to delete cstics from the common class becomes more challenging once they are inherited.  For that, you need to be sure to use transaction: CL6K to delete a cstic from the common class.  Typically, you don’t encounter this once you move the model to production, but often in the development phase you change your mind or find that you picked a characteristic that doesn’t belong or is replaced with something else.

But in my opinion, the upside far outweighs the downside.  Happy Configuring and Thanks for reading.

Website – Adding a youtube video to your page

Well, since I’ve been busy updating all my materials for the big upcoming conference, I thought i’d do a quick post of how to add a youtube video as an embedded object into your web pages.  All and all, it’s pretty simple, but I’m glad someone else gave me the first one, so I could just mimic it going forward 🙂

<object width=”640″ height=”360″ classid=”clsid:d27cdb6e-ae6d-11cf-96b8-444553540000″ codebase=”http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0″><param name=”allowFullScreen” value=”true” /><param name=”allowscriptaccess” value=”always” /><param name=”src” value=”http://www.youtube.com/v/XXXX?version=3&amp;hl=en_US” /><param name=”allowfullscreen” value=”true” /><embed width=”640″ height=”360″ type=”application/x-shockwave-flash” src=”http://www.youtube.com/v/XXXX?version=3&amp;hl=en_US” allowFullScreen=”true” allowscriptaccess=”always” allowfullscreen=”true” /></object>

Now the important pieces are the width, height and the src parameter.  You need to make sure you update each of these in BOTH places they show up.  in addition, when you upload your video to youtube, you get a full address, but here you just need the last piece of it.  in the code above, you see XXXX.  Replace XXXX with the last portion of the YouTube web address (everything after the last /).  And magically, you get a nice embedded youtube player directly in your webpage.

It’s not rocket science, but for a web novice like me, tricks like this are invaluable.

Thanks for reading.

Recharge your Batteries

Well, maybe you noticed, I disappeared for a week (at least I hope you might have noticed).

I took a week away from work (mostly) and enjoyed some time on the beach with my family.  It’s an important lesson, that I’m not really that good at obeying.  I have this tendency to get so focused on work, that I forget to relax and have a social life.  Thank goodness for my wife.  If she didn’t push me, I might not leave my computer screen.

Many of you know me, but I need to get a bit obsessive about my projects.  I get so wrapped up that I spend my nights, free time and Alex’s nap time often coding something, writing some marketing material, or at least jotting down notes.  It’s good to a point, but if you don’t step away, you get burned out.

So take it from me…  don’t forget to enjoy life.  it is after all, why you’re doing this.  I want to launch this business so I can stop traveling and enjoy my family.  I need to be reminded from time to time who I’m doing this for…  and spend time with them 🙂

Service Management – Intercompany Billing

I recently learned a cool trick when dealing with inter-company in-house repairs.  One of the scenarios in service management I’m seeing more often is having one facility bill for a repair while another company performs the repair.  There are 2 common ways of transacting this intercompany billing in the system.

1.  Create a repair sales order in both the billing and the repairing facility.  While this method provides the greatest flexibility, it also requires the greatest amount of transactional data to be entered.

2.  Create a single repair order with the main line item in the billing plant, and the receiving/repairing lines in the repair facility.

The biggest challenge with option 2 is billing the “billing plant” for the repair.  Sounds simple, but with only a single sales order, how can you invoice the customer and the “billing plant”.

That’s where I discovered this SAP provided report: RVIVAUFT that generates an inter-company invoice from the customer invoice.  it’s pretty simple and pretty slick.  there is however one drawback to this approach.  You can’t invoice the “billing plant” until after you invoice the customer.  Typically this shouldn’t be an issue, but depending on your business process it is something to be aware.

Hope you find this as useful as I did.

Basis – Debug Authorization

Here’s another chance for me to add to my notebook.  Adding debug authorization is a trick I often have to do in my development projects.

When you have your own system, one of the first things to figure out is how can I get the authorization to debug a program, or in my case a Web Dynpro application.  Now, you can certainly assign yourself the role of SAP_ALL.  But what happens when you want to test with a real user???  Well, you need to narrow down that Authorization.

So, simply add this authorization:
S_DEVELOP
Then fill in the following attributes…
OBJTYP: DEBUG
ACTIVITY: 1 & 2 & 3

I know, not really exciting, but I never know if it might help you…  it certainly is something I’ve used multiple times.