Month: April 2013

Home / 2013 / April

ASUG – Carolinas April 2013

We recently attended the regional ASUG in Greenville, SC.  This was our first round as being a sponsor and all and all, I think it turned it out pretty well.conference itself was fine.  The attendance was small, but having the ability to do a 45 minute presentation on one our products was awesome.

Mike gave a great presentation on our Proximity product, and due to that presentation, I think we might have got another lead.  There is one drawback, and that is that you cannot “overtly” solicit leads.  We’ll have to look into this further before October, to determine if we can still collect business cards in exchange for a prize.

In addition, there were also some good presentations on Data Archiving and some upgrade strategies for moving up to higher enhancement packages, as well as some other vendor presentations.  It really is worth a day of our time if you can make it to one, and plus, you could see me in person.  ha ha ha

As a fun side note, I even won a ZepplinAir at the end of the meeting.  Who can complain about that? =)

ABAP – Call transaction and skip first screen tricks

Well, in my current development tasks, I’m really pushing to reuse code in more and more of my applications.  You know, that whole object oriented approach that should be standard for everything =)  Well, one of the tricks I discovered lately is that if you can do a  call transaction and skip first screen from within an application.

It’s great, SAP even provides a statement that allows you to do this.  However, what I found is that there are limitations, as well as some “unforeseen” behaviors that result from using this statement.  So here’s what you need to know.
If you are using a custom transaction, in the “first” screen, you need to make sure that the “Next Screen” on the attributes tab points to another screen number.  Sounds easy enough, but what I discovered is that using this next screen has some weird impacts on running the transaction normally.  For example, my custom transaction has all of the controls in the PAI/PBO code to tell it what to do next.  When I manually pointed to another screen, suddenly my PAI behavior changed.  When I hit enter it moved to the next screen.  My original coding required pressing execute.  While this isn’t the end of world, when I was green arrowed out of the results screen it now left my transaction, instead of returning to the first screen.  This behavior was certainly unacceptable for the flow I wanted.

OK…  how do you get past this.  I took a very easy approach, and let me know out there if there is a better way to handle it.  I created a new screen (a copy of my first screen, and this time I changed the “Next Screen”)  I didn’t change anything else.  Then I created a new transaction code that started from the new screen.  So now I have 2 different transactions.  1 for on-line users, 1 to be called from a program.  This worked perfect for me, but of course it is extra data, that to me seems unneeded.

Thanks for reading, and I hope this can help you…

 

ABAP – SELECT Statement with a variable table name

I just figured out a cool trick last night, and this may be old hat to a lot of you.  I was working on the latest piece of Proximity, and I wanted to be able to re-use my code, but each place would call it’s own custom transparent table.  The structures were the same, so it was an easy change.  Well, turns out it was a pretty easy trick.  You can create a Select statement with a variable table name.  Check it out the specific details below.

DATA: L_TABNAME TYPE DD02L-TABNAME.
L_TABNAME = ‘Z_TABLE’.

        select single * from (L_TABNAME) into z_wa
where field  = field.

That’s it.  Again, a trick I could’ve used a long time ago, but finally did the research last night to implement it.  Hope you find this handy.

 

Web Dynpro – Challenges with Centering an Embedded View

Well, I spent way too much time trying to get this working just right, and I finally had to set it aside.  Maybe one of my great readers might be able to shed some clues on what I’m doing wrong, or perhaps you have the same issue 🙂  Anyway, I have redone my Rapier Application into ABAP Web Dynpro, and I really like the results.  The only problem is that when my browser is maximized, I can see that my embedded view isn’t centered properly on the screen.  It’s not a huge amount that it’s off, but enough to be noticeable.  What makes it even more maddening is that is seems to be related to whether the embedded view has one or 2 columns of data.  I can see a much greater shift if there’s only a single column…  Take a look…

blog-awdp layout-01

Now, I’m dynamically creating the elements in 2 columns.  The 2 columns will always be there.  I’m just generating what items show up and where in each column.  I mention that because the columns themselves are not dynamic…

 

 

blog-awdp layout-02

Now this one isn’t being generated dynamically, and it only has a single column of data to enter.  Not sure if either of these factors have to do with my issue, but you can see how the Login page is shifted further right than the create new user page.

Now, here’s some of the things I’ve tried… (and using this combination is what got me the closest to what I want…  but still room for improvement)

Main View (contains embedded views)
I have a transparent container with 2 subitems.  1 tree,1 view container.  It uses the gridlayout, and has 2 columns, I’m stretching it horizontally.  Layout-halign = beginofline.

Next, my view container underneath it spans 1 column and has the h-align = beginofline.

Next, the views.  I’ve made a point to set them all up the same way (especially these 2 that I’ve been using as my test case to get them both centered in the same spot).
In the RootUIElementContainer, is set to a single column and is NOT stretched horizontally.
For each of the elements below, I have both the element and layout for horizontal to be centered.  When I look at the screen, it looks exactly how I want it.  so it seems like the views are fine.  I just want this view to be centered on the open area in my screen.

So…  after all of that…  any ideas out there that I should try to see if I can get these centered?  or is this a limitation of AWDP?  I appreciate any help you might be able to lend me here 🙂

 

Business – Finding a CRM System for a small business

Well, one of my newest hats in the business experiment has been marketing.  If you’ve ready any of my previous posts, I’m sure you’ve figured out, it’s a work in progress.  Ha ha ha.  Short story if you’re new to my stuff, is that I’m engineer trying to run a business.  I have a partner, the problem is, he’s an engineer too.  So, I’m doing my best to learn how to market all this hard work I’ve done.  Now that there are two of us, it’s getting more and more important that we are on the same page.  We each have some email lists, and we “try” to keep eachother in the loop of what we’re doing, but it can be challenging.  So I’m thinking it might be time to start looking at a CRM system we can use.  The trick is finding a CRM system for a small business that gives us what we need, without too much fluff or too much cost.

Now, why on earth would I want another system to add to my workload?  Because marketing is the heart of our business.  If we can’t get the word out about how good our stuff is, well, then our business is doomed.  So it’s time to focusing the effort it deserves.  Now, I’ve got an access database of contacts that email on a semi-regular basis, and I have some opt-in contacts on MailChimp.  My partner, Mike, has the list from our manufacturing conference, as well his previous contacts.  So the challenge is how do we merge all this stuff together, and still maintain some segregation?

It seems like CRM is the answer.  But which one?  I’ve started doing some preliminary research, but then I realized, I first better figure out what I need to do with it.  The web based CRM programs can be free, $12/month/user (or more)…  so what is it worth…  and can the free version do what we need without limiting us.  So, what do I need it to do:

  1.  Import all of my current contacts.
    1. We need to keep them grouped by module/focus
    2. Consultant vs. prospect (customer vs. 2nd customer)
    3.  where we found them, etc.  conference/e-course/purchased list/colleague or customer.
    4. Prospect vs. partner
    5. Need to pull them in from excel, access & Mailchimp
    6. Need to keep track of our interactions with our contacts
      1. When is the last time they were emailed.

i.      What did we email them about?  E-course, specific product? Certification, etc.

  1. Have they ever responded to us
  2. Need to keep track of our customers
    1. Pretty easy right now, since we only have 1…  but that will change J
    2. What have they bought, what can we probably sell them
    3. Email Campaigns
      1. Integration with MailChimp

i.      Since I’m already using this, and have formats setup, this would be nice to have feature

  1. Built in features of its own to send professional emails to our contacts
  2. Metrics for those campaigns, including opens/clicks/responses etc.

i.      Mailchimp has this, but it would be nice to have everything in a single location.

  1. Needs to be on-line/accessable so both of us can enter in our data
  2. Reminders/tasks – options
    1. Nice to have a task list to email customers every 2 weeks

Now, those are the things I can think of off the top of my head.  My friend Jer put me on this path and originally suggested SugarCRM.  While it’s nice, it’s more expensive and probably more functionality than a 2 man show needs.  So, here’s my initial list that I’m going to inspect.  I’ll give you the pro’s and cons once I start playing with each one.  In the meantime, let me know if there’s anything else I should be factoring into my choice.  Especially, if I have any marketing guru’s out there J

  • SugarCRM
  • Xero
  • Capsule
  • FreeCRM
  • Any others you’d recommend???

As always, thanks for reading and I look forward to any feedback or ideas.

 

Variant Configuration – OEWB – Order Engineering Workbench

Lately, my life has been heavily involved with VC.  For those of you reading me for a while, or my friends that humor me by reading my ramblings J, you know that my loves are VC, SM & development.  I know, a weird combo, but it’s served me well, and I hope that JaveLLin Solutions will soon become my primary source of income…  Anyway, on a recent gig I was trying to “sell” VC to a company.  They have SAP, and do configuration, but all using excel, Access and other outside tools.  They are heavy on the ETO (engineer to order) side of the house, so naturally, I love VC and encouraged them it was the way to go.  They were very heavy into engineering change management, and often had many changes for a single order (even after production may have started).  So this brought up the good old Order Engineering Workbench (OEWB) again.  For those of you unfamiliar with this tool, it’s a much nicer tool for dealing with order BOM’s than the standard CU51 (which is just as ugly as CU50.  Ha ha ha).  It’s designed by SAP, but of course, you have to pay for it if you want to use it…

I am a fan of OEWB since I helped implement it a couple years back.  So I know it works and tends to make life much easier, especially if you have a lot of changes to make.  I’m currently working to try to get a copy of it in my dev system, but SAP in their infinite wisdom is making it difficult for me to try to help them sell (smart business right there, who wants a free sales force anyway).  Ok…  enough my whining…  I like the OEWB because it comes in a nice tree format, gives you clear visibility to what you have changed, allows you to do side by side comparisons of different order BOM’s.  It even gives you versioning ability, so in the case of the client I was at, would be a big bonus to quickly show what version or how many changes had occurred.  I’d love to show you some screenshots, but alas, I can’t add it to my system.  If I can get it eventually (without paying for it of course, I’ll post more about the functionality along with screen shots).

Now, one of the things I’ve been looking for (and If any of you have seen this, let me know) is an easy way to copy an order BOM.  In some of my recent contracts, I’ve seen a reoccurring theme of a customer wanting the exact same product that they ordered 2 week, 2 months, or 2 years ago.  Since it was an ETO product, there wasn’t a permanent part number.  The easiest way would be to copy from that order BOM to the new order BOM.  It’s easy to get the configuration copied… but not the BOM.   I’m toying around with the idea of adding some Order BOM tools to Velocity, and this would be one of them… if it doesn’t already exist.  Anyway…  that’s all for today.  Happy Configuring!

 

Web Dynpro – Dynamic Drop Down Lists

Now as promised, creating the dynamic drop down lists.  I mostly skipped these in my previous post just because there are some extra steps, and rather than cram everything together, it seemed like a good point to break it up.  Keep in mind, the concept is the same as my previous post, only for a dropdown list, you need to build the list as well.   (See my previous post for all of the other data declarations).

Hope you find this useful, and as always, if you have a better way to do it, please let  me know. J

DATA LV_BIND_DROP TYPE STRING.
*** check for dropdown fields
dyn_children = rootnode_info->get_child_nodes( ).
READ TABLE dyn_children with key name = field TRANSPORTING NO FIELDS.
CHECK sy-subrc <> 0.
* create sub node of structure (tablename)
* I created a tabletype/structure for DROPDOWNNODE.  If has fields of Key &

* value
cl_wd_dynamic_tool=>create_nodeinfo_from_struct(
parent_info = rootnode_info
node_name = dyn_attr_info-name
structure_name = ‘DROPDOWNNODE’
is_multiple = abap_true ).
*** the On_enter is only if you want something to happen when a value

*** is selected.  I used it to set another context variable.
CONCATENATE LV_BIND ‘.VALUE’ INTO LV_BIND_DROP.
CALL METHOD cl_wd_dropdown_by_idx=>new_dropdown_by_idx
EXPORTING
bind_texts = lv_bind_drop
id         = lv_bind
state      = lv_state
on_Select  = ‘ON_ENTER’
RECEIVING
control    = lr_drop.

*** first, build up the list any way you want and put it into a table with

*** 2 columns, 1 key, 1 value
lo_nd_app->bind_table(
new_items            =  value_list
set_initial_elements = abap_true ).

*** if you want to specifically set a value for the dropdown in advance, here

*** just use this.  The tabix is for the value_list you populated.

lo_nd_app->set_lead_selection_index( sy-tabix ).

Variant Configuration – Avenue Health Check

In my most recent contract, I’m working with a company called eSpline.  They are one of the more established players in the VC consulting community.  It’s funny, because I’ve met the people that run the company at the Configurator Work Group several times, but this is the first time our paths have crossed professionally.  Anyway, back to my point…  eSpline has a pretty handy little tool for performing a Health Check.  It seems to be relatively new, but it has some powerful features.  It’s called the Avenue Health Check Tool.

The idea behind it is that you dump a model (or group of models), kinda like a knowledge base, and then their tool goes through and figure out all the issues, warning and “less than best” practices.  For example, it will detect “Zombie” characteristics in a class.  This is anything that has no dependencies, tables or functions associated with it.  Now there are multiple explanations for this, sometimes you need an information cstic to pass down to manufacturing, but there are no rules around it.  Simply a selection made by order entry.  Or, it could be a characteristic that a change was started, then rethought, and finally left there to hang out, forgotten in a sea of other characteristics.  At least being able to simply identify these characteristics, gives the modeler an easy hit list to confirm or deny if there is a problem.  Some of the other things that are really handy include flags to tell you if anything won’t transfer to the IPC.  In a recent post, I talked about the long oss note for functionality that doesn’t work in the IPC, but does work in VC.  The Health Check will quickly flag all of those items for you.

The health check is in an HTML type format, so it’s easy to jump to things that are connected, and even has some fancy images to show you how classes are connected, or BOM structures work.  I was impressed by the features, so I wanted y’all to know about it.  If you happen to check out their stuff, be sure to let them know I sent you.  =)

 

Web Dynpro – Dynamically adding Screen Elements

Now, one of the big things I needed for Rapier is to have the screens be completely configurable.  In BSP, this accomplished mostly in the page fragments by doing some looping.  This concept doesn’t exist in ABAP Web Dynpro, so I needed to learn how to do it in Web Dynpro.  Here’s what I learned for dynamically adding screen elements to web dynpro view…

First and foremost, if you want to make dynamic elements in a view, you need to have an attribute to go along with it.  As I use Web Dynpro more and more, this is becoming clear to me why.  The easiest way to get a value onto a screen is using a bound attribute.  So you have 2 choices.  You can create every possible attribute in your view, and use some logic to call the correct one, or you can dynamically create the attributes you need.  While either option “could” work for me, I chose to do this dynamically.  Based on future testing/performance, I may change in the future, but regardless, a fun trick J  Once you have the attribute, you can create the element.  In my case, I needed 2 elements.  A label and something else (input field, longtext, etc…).  The process is same for either one.

Some of the groundwork for this.  I’m using matrixlayout to control the transparent container all of these elements are being put in. I’m skipping dropdowns for this post.  I’ll talk more about those in a separate post.  I’ve done my best to leave the data declarations in here, so you have something that is pretty close to working right here 🙂

It’s funny looking back, it’s not much code for as long as it took me to figure it out.  Ha ha ha.

DATA : rootnode_info TYPE REF TO if_wd_context_node_info,
dyn_node_info TYPE REF TO if_wd_context_node_info,
dyn_node TYPE REF TO if_wd_context_node,
dyn_attributes type WDR_CONTEXT_ATTR_INFO_MAP,
dyn_children TYPE WDR_CONTEXT_CHILD_INFO_MAP.
DATA : dyn_attr_info TYPE wdr_context_attribute_info.
DATA lr_container TYPE REF TO cl_wd_uielement_container.
DATA lr_input TYPE REF TO cl_wd_input_field.
DATA lr_check TYPE REF TO cl_wd_checkbox.
DATA lr_longtext TYPE REF TO cl_wd_text_edit.
DATA lr_drop TYPE REF TO cl_wd_dropdown_by_idx.
DATA lr_label TYPE REF TO cl_wd_label.
DATA lr_invisible TYPE REF TO cl_wd_invisible_element.
DATA lr_table TYPE REF TO cl_wd_table.
DATA lo_nd_sflight TYPE REF TO if_wd_context_node.
DATA lr_button TYPE REF TO cl_wd_button.
DATA lr_grid_data TYPE REF TO cl_wd_grid_data.
DATA lr_flow_data TYPE REF TO cl_wd_flow_data.
DATA lr_matrix_hd TYPE REF TO cl_wd_matrix_head_data.
DATA lr_matrix TYPE REF TO cl_wd_matrix_data.
DATA LV_BIND TYPE STRING.
DATA LV_bind_row TYPE STRING.
DATA lv_state(2) TYPE n.
DATA lv_pwd TYPE wdy_boolean.
DATA lv_label TYPE string.
DATA lo_el_context TYPE REF TO if_wd_context_element.
DATA ls_context TYPE wd_this->Element_context.

lo_el_context = wd_context->get_element( ).

*This will create a attribute at run time…
dyn_attr_info-name = field.
rootnode_info = wd_context->get_node_info( ).
dyn_attributes = rootnode_info->get_attributes( ).

* Check to make sure the attribute doesn’t already exist
READ TABLE dyn_attributes with key name = field TRANSPORTING NO FIELDS.
CHECK sy-subrc <> 0.

CALL METHOD rootnode_info->add_attribute( EXPORTING attribute_info = dyn_attr_info ).

*For Dynamically creating Input Field
*Note : Before that change the Layout of ROOTUIELEMENTCONTAINER to MATRIX LAYOUT
lr_container ?= l_view->get_element( CONTAINER ).
lv_bind = field.

case type.
when ‘TEXT’ OR ‘TIME’ or ‘DATE’.
CALL METHOD cl_wd_input_field=>new_input_field
EXPORTING
bind_value = lv_bind
id         = lv_bind
state      = lv_state
on_enter   = ‘ON_ENTER’
RECEIVING
control    = lr_input.
when ‘CHECK’.
CALL METHOD cl_wd_checkbox=>new_checkbox
EXPORTING
bind_checked = lv_bind
id         = lv_bind
state      = lv_state
RECEIVING
control    = lr_check.
when ‘LONGTEXT’.
CALL METHOD cl_wd_text_edit=>new_text_edit
EXPORTING
bind_value = lv_bind
bind_rows  = lv_bind_row
id         = lv_bind
state      = lv_state
RECEIVING
control    = lr_longtext.
ENDCASE.
CALL METHOD cl_wd_label=>new_label
EXPORTING
label_for = lv_bind
text      = lv_label
RECEIVING
control   = lr_label.

*** once the elements are created, they must assigned to the screen as either
*** a matrix head data or matrix data (head starts a new line)
lr_matrix_hd = cl_wd_matrix_head_data=>new_matrix_head_data( lr_label ).
lr_matrix_hd->set_v_align( ’01’ ).
lr_label->set_layout_data( lr_matrix_hd ).
CALL METHOD lr_container->add_child( lr_label ).
case wa_configrma-type.
when ‘TEXT’ OR ‘TIME’ or ‘DATE’.
lr_matrix = cl_wd_matrix_data=>new_matrix_data( lr_input ).
lr_input->set_layout_data( lr_matrix ).
CALL METHOD lr_container->add_child( lr_input ).
when ‘CHECK’.
lr_matrix = cl_wd_matrix_data=>new_matrix_data( lr_check ).
lr_check->set_layout_data( lr_matrix ).
CALL METHOD lr_container->add_child( lr_check ).
when ‘LONGTEXT’.
lr_matrix = cl_wd_matrix_data=>new_matrix_data( lr_longtext ).
lr_longtext->set_layout_data( lr_matrix ).
CALL METHOD lr_container->add_child( lr_longtext ).
ENDCASE.

Variant Configuration – Integration with the IPC

On my recent evaluational for variant configuration, I got to get back into the CRM world a little bit again.  It’s been a while, but this client is using CRM and is looking into using VC & IPC.  If the IPC isn’t familiar, it’s SAP’s Internet Pricing and Configuration.  It’s the CRM version of variant configuration.  It uses all of the standard VC componets (well, almost…).  In this post I want to talk about the Variant Configuration integration with the IPC.

If you have a VC model, and you want to use the IPC (which, by the way can also be used in ERP in your sales orders/CU50), there are some key limitation you need to be aware of for the integration with the IPC.  Because the IPC is written in java, and not ABAP, there will inevitably be some things that differ.  So, I wanted to capture what all those things were.

OSS: 1819856

http://help.sap.com/saphelp_crm700_ehp02/helpdata/en/e8/a3fc3739a25941e10000009b38f8cf/frameset.htm

Among the obvious things like functions, pricing requirements, and anything else ABAP must be rewritten in Java, there are pages of other little things that won’t work, or at least won’t work exactly the same way.  So if you’re looking at using the IPC, make sure to check this out.  If you are new to variant configuration, try to do all these things in your model from the get go, it’ll make your life much easier later on.  Happy configuring.