VC

Home / SAP / Archive by category "VC" (Page 9)

Variant Configuration – Using the Save Temporary

I’ve been spending a lot of time lately doing VC related stuff, which I’m sure you’ve guessed by my posts =)  My latest discovery has been the save temporary when you are inside of CU50 or a sales document.  This functionality allows you take a configuration you’ve entered, and copy the whole thing into another order, or another CU50 screen.  Rather handy, especially if you’re dealing with large models like I have been lately.

Now, the functionality is a bit temperamental, at least on the system that I’ve been working on, so if you haven’t used it before, here are something to keep in mind.

1.  When you save the configuration, I recommend going right back to display it.  Just to make sure it really saved a copy (I use the save as variation, so I can tell what I’m copying).

2.  After you create your saved configuration, save your quote or sales order.  It doesn’t seem to keep your saved copy, unless you save the document you were working in.

3.  Be sure the KMAT’s match, or you won’t see your saved configuration.

4.  I can’t really tell how long the saved configurations will last.  It seems to only stick around long enough to add it to a single document (now if you have multiple lines on a quote for example, you’ll be able to add it to all those lines).  But it seems that upon saving whatever you copied it to, the saved configuration is gone.  I guess that’s why it’s temporary 🙂

In any event, don’t be surprised if you need to go back to the original document you want to copy from multiple times before you get it “just right”.  And as always, if anyone can give me some better ideas of how to use this, please comment.  I love to learn new tricks 🙂
thanks for reading,

Mike

Variant Configuration – Using the Interface Design

Well, much of my consulting life has revolved around the Variant Configuration interface design functionality.  While, I’ll be the first to admit, that I am extremely happy it now exists (life was a lot uglier back in 3.0F when it wasn’t there).  I am very annoyed with the lack of functionality.  Take my current mission.  I’m working with a very large model (400+ characteristics) and i”m trying to arrange it into a more useful structure.  This can only be done with the interface design, especially since I’m using the class hierarchy to inherit cstics (I have at least 2-3 levels in every class).

So, what I’ve done is using a combination of tabs and sequence, I’ve arranged the cstics the way I want them.  This is great.  What sucks is that it took me a couple of days to do it.  Mainly because of some missing functionality.  Part of this post is a call for help if you know a better way to handle it :).

1.  There is no way to search for a specific characteristic when building the interface design.  You have to page through until you find it.
2.  When you get the cstics onto the design, you can only select and move one characteristic at a time.  this causes me headaches when I want to move 4 cstics a few pages up, I have to do them 1 at a time.

3.  if I’ve used a cstic in another interface design (like a tab for example), I still see the characteristic in my list for the sequence.  So I have to remember that it’s been used elsewhere.  Not the end of the world, but still a hassle.

One little thing I have found is that if you use the class hierarchy, the interface will at least list them by class (now the order you’ll have to figure out), but everything for one class will be listed, then the next class, and so on.

So, this has been my little venting on the interface design.  I hope someone can comment on something I missed 🙂

Thanks for reading.

Mike

Variant Configuration – Poor Man’s Variant Configuration Iteration

Well, one of the obstacles I’ve recently had to tackle is to handle variant configuration iteration within a model.  If you’ve done VC for a while, I’m sure you’ve heard about the advanced mode modeling, and it’s ability to have rules talk to different line items etc.  Well, short story, I don’t have that option.  So that means I have to go old school.  While it’s uglier than I’d prefer, it does still work.  So I wanted to go over my method and either give you a new idea, or perhaps hear of a better way to accomplish the same thing.

Here’s my situation.  I have a multiple level KMAT.  Inside of the second level (which is a cabinet), I have different types of shelves that needs to be iterated.  The business has said that the customer can choose up to 5 different types of shelves to go into a single cabinet.  Originally, the model was designed to use a single type of shelf.  So we need to adjust the current design.  What follows is my method to accomplish this.

1.  Create a Class that contains all of the shelf related characteristics.  This class needs to contain all the attributes that the Bill of Material will require to run all the object dependencies.  This can be an opportunity to do some cleanup work.  In my current project, we were able to do some characteristic consolidation.  This becomes especially important because of my next task.

2.  Duplicate all the necessary characteristics.  This is the part I really hate.  Having to make copies of existing characteristics always frustrates me because it creates needless work.  If I make a change to one cstic, I now need to change it 5 times (one for each duplicate).  My problem is that I don’t know of a better way to handle it.

3.  Create a KMAT material master that will handle the shelves.  Pretty straight forward.  Make the material, then create the configuration profile, and attach the class we created in step 1.

4.  Bill of Material Creation/Change.  First, find all the components of the shelves and add them to the new KMAT you created in step 3.  Be sure to move the object dependencies along with them.  If it was already modeled, like it was in my case, you need to go into the cabinet BOM and remove those same components so you don’t add them twice to your finished BOM.  In addition, you need to add your KMAT to the cabinet BOM.  In my case, I added it 5 times and included a selection condition on each item.  One more note.  you now have the option to maintain the qty at the KMAT level, or you can leave it at the component level.  You’ll need to review the qty procedures existing on your components and make that choice for yourself.  Initially, I’m just moving the qty procedures as they currently exist to the lower level.  If time permits, I may come back and adjust them.

5.  Create a Constraint for each position.  Now, here’s where the magic comes in (at least I think it’s pretty cool).  Since I intend to use a single KMAT for the 5 iterations, I still need a way to make sure I pass the correct cstic values to each position.  For that, I use a constraint with the RESTRICTIONS section and the PART_OF command.  This syntax allows me to look at a specific BOM position.  Since I chose to put shelf 1 at 500, shelf 2 at 501, etc. I know where they will be, so I can pass all the shelf 2 characteristics to position 501.  You get the idea.  If you haven’t already, be sure that the constraint net has been attached the cabinet configuration profile.

6.  Be sure all the new characteristics are passed to the lower levels.  Depending on how deep your model currently goes, you need to make sure that all the new duplicated characteristics get pass down to the cabinet.  In my model, I’m utilizing some phantom levels, plus nested KMATs, etc.  so I needed to do a procedure/CNET to pass those values down to the cabinet level where the Shelf KMAT’s exist.

Finally, test your work.  make sure the components are all showing up like you expect, then hand it over to the business.  In my case, we are using order BOMs, so we’ll need to pass an example down to production to make sure that the planned/production orders explode the same way that CU50/CU51 explode.  If you’ve dealt with order BOM’s you’re already familiar with some of those hassles.

Anyway, that’s been my latest adventure.  I hope to hear back that someone has found a better way, or if not, I hope this may help in your own iteration adventures.

As always, if there’s anything we can do for you, please click contact us above, and let us know how we can help,

Thanks for reading,

Mike

 

Variant Configuration – Using a Parameter ID in a Dependency

Another fun tidbit I learned from my friends at Elogic.  Have you ever needed the model to change based on who is running it???  I know it sounds unusual, but I ran into this scenario.  We had a group that was constantly updating the bill of materials, however the business had begun a round of testing.  They needed to have the BOM locked down, but we didn’t want to have the modeler’s doing weird things just to test the new things they created.  For this, we used a Parameter ID in a dependency to handle this issue.

So, we created a copy of the BOM that was consistent.  This would provide the business with a bill of materials that wasn’t constantly adding new materials that would change the MRP results, or costing amounts, or introduce new errors.  Then, in our test environment, we added both BOM’s and used a parameter ID to determine who would see each bill of material.

Now for the new part, using a PFUNCTION, we called an ABAP function that would check for a specified user parameter.

* Read the user setting for this parameter
CALL FUNCTION ‘G_GET_USER_PARAMETER’
EXPORTING
parameter_id    = l_parid
IMPORTING
parameter_value = l_parva
rc              = l_rc.

l_parid is the paremeter ID to look for, and l_parva is the value returned from that parameter.  Using this function, you can define the cstics you want to use.  then you can assign this PFUNCTION exactly like any selection condition.

While I admit, it won’t be common, you never can tell when this could come in handy.  If you need more code around the PFUNCTION, just ask, but it’s pretty easy stuff.

Happy configuring…
As always, if there is anything we can help you with, please press the contact us button above, and let us know what we can do for you.

Mike

Variant Configuration – Exploding Variant Configuration BOM Completely

Recently, I learned a new trick from my friends at Elogic, and I since I didn’t want to forget it, the easiest way is to share it with all of you 🙂  I had a request from the business to know every components, exploded all the way down to the lowest level, so they knew what materials would need to be created in the new test system.  Initially, I couldn’t think of a good way aside from looking at the planned/production orders.  Then Lawrence showed me this trick for exploding variant configuration BOM completely…

  1. Ensure that your configuration profile does not explode only configurable assemblies.
  2. Go to  transaction CAVC_TEST transaction and click on the CAVC_O_ORDER_BOM_INIT button.  Fill in the sales order and item.  Click Execute.
  3. Click on the highlighted button below, then click the Execute button.
  4. Click on the highlighted button below:
  5. Press Shift-F8 when the List screen (below) appears.
  6. Save the Component list wherever you want.

 

Well, hope you find this useful.  this is brand new transaction to me, so I’ll have to continue playing with it.

In the meantime, if you need more in depth help, press the contact us button above and let us know what we can do to help you.

thanks for reading,

Mike

 

Variant Configuration Performance Tuning

This lesson is timely because I’m dealing with this issue right now at my current client.  Their model uses class nodes in the bill of material VERY heavily, so we’ve been noticing awful performance in CU50.  SAP does provide some solutions for variant configuration performance, take a look at the following note to get some additional ideas:

Note 917987 – General performance in variant configuration

Now, we have done a few things in an attempt to improve the performance.  First, we were using class type 200 with a reference characteristic.  I learned, for class nodes this is actually a no no, unless you check a box in configuration to redundantly store the characteristic value.  Here’s what SAP’s help says about it:

Class Maintenance

Using Reference Characteristics Only

This constellation cannot access the database directly to read the assignment records. All classified objects are processed sequentially.

In order to change it, you must check that little box up top for redundant storage.  Now the drawback of this approach is twice as many table entries.  For that reason, we chose to move the characteristic to be NOT a reference cstic.  The only issue this causes is that value for material number (in our case) will not be populated automatically.  Not a huge deal.

Now, we changed all of that stuff, and still no change.  this was disappointing.  After some debugging, we (using transaction SE30 for performance tuning) we found that the issue was with table KSSK.  Surprise, Surprise, it holds the class connections.  So we handed it off to basis.  They began by running statistics on all of the tables listed in the above OSS note.  Still no help…  finally, we needed basis to reorganize the tables and indexes for KSSK & INOB.  This may sound like a lot of mumbo jumbo, but if you ask your basis person it will make sense to them =)

Short story is that sometimes you can get performance without changing your model.  Now I don’t regret the changes we did, they will still be beneficial, but don’t forget about the technical aspects.

As always, if you need further help in variant configuration, please press the contact us button above and let us know how we can help,

thanks for reading,

Mike

Variant Configuration – Delete Class Assignment

After yesterday’s post, I thought I’d throw this one in there too.  In your Development environment you may find that you need to delete class assignment of a class or another material inside of CL24N or CU42.  It could be you need a smaller class, or just accidentally linked a material that shouldn’t have been connected.  Why isn’t the issue.  You got yourself in a pickle, it’s dev, so you’re willing to live with the potential inconsistencies in order to get your model right.  After all, like we discussed yesterday, you absolutely, positively do NOT do this in production.  Then you use ECM or make a new material and replace it like any other engineering type change.  Ok… now that I have that out of the way, let’s get to the good stuff =)  You can use SE38 to put the breakpoint here straightway (it’s by far the fastest way).

Program: LCLFMF2D

Form: LOESCHEN

          if sysubrc is initial.
call function l_check_function
exporting
cucp_var_class_type       
allksskklart
cucp_root_object_key      
allksskobjek
cucp_root_object_table    
sobtab
cucp_datuv                
rmclfdatuv1
cucp_aennr                
rmclfaennr1
exceptions
deletion_allowed          
1
deletion_allowed_with_ecm 
2
others                    3.
case sysubrc.

 

Set sy-subrc = 1

Then execute the remainder of the code (F8).  That’s all there is to it 🙂

it’s scary that it could be that easy to delete class assignment, even though SAP transactions won’t let you do it =).

If you ever need more help in VC or SM, please use the contact us button above and let us know what we can do to help.

thanks for reading,

Mike

Variant Configuration – Deleting Class with Assignments

Just recently run into a fun little challenge, and my newest VC mentor pointed me in the right direction.  (Thanks Lawrence =) ).  In the dev system, you will often create models, do some testing, and then realize you did the wrong thing (sometimes a simple change, sometimes an epic failure.  ha ha ha).  If you reach the epic failure and need to perform deleting class that is assigned to some orders or materials, you can override the system.  This the little tidbit can help you get rid of stuff in your model that should no longer be there.

DISCLAIMER.  Do not do this in production.  This is an ugly way to make this happen, so it should only be done in development.  It will likely leave sales order line items/production orders in an inconsistent state.  So please use this technique as a last resort.

Go to transaction CL6M (delete class with assignment).

enter in the data you want to delete, but before pressing execute, go to the transaction box and enter /H then hit enter.  This will drop you into debug.  As an alternative, you can place these breakpoints using SE38.

Program: RMCLKDEL
Form: CLASS_ALLOCATION

find the line:
IF NOT VERWKZ IS INITIAL.

You will need to change the variable: verwkz =to initial.

NEXT:

Find the following code in the listed form:

Form: VERWENDUNG_KLASSE_KONF

* Verwendung in Konfiguration
CALL FUNCTION ‘CUCP_CONFIGURATIONS_EXIST’                 “051516
EXPORTING  CUCP_VAR_CLASS_TYPE   = KLART     “051516
CUCP_CLASS            = KLAH-CLASS”051516
CUCP_DATE             = DATUV     “051516
EXCEPTIONS USED_IN_CONFIGURATION = 1.        “051516
IF SY-SUBRC GT 0.                                         “051516

You will need to change the variable sy-subrc to 0 or initial

* ÄNDERUNG AUF DIREKZUGRIFF AUF ANWEISUNG DURCH DIE STÜCKLISTEN  3.1H
* Grund: tote Positionen
CALL FUNCTION ‘CLEX_BOM_CHECK_USAGE_CLASS_DIR’
EXPORTING
CLASS_NAME = KLAH-CLASS
CLASS_TYPE = KLART
EXCEPTIONS
NOT_USED   = 1
OTHERS     = 2.

*… Fehlernachricht ausgeben, falls Klasse verwendet wird.
CHECK SY-SUBRC NE 1.

Finally, change the variable sy-subrc = 1.

now you can execute (F8) the remainder of the program and your class will be deleted.  If you have open sales orders you wish to continue using/testing with, you should go in change mode and visit the configuration.  You may show an inconsistency depending on the class and it’s location in the structure.  Be sure to delete any inconsistencies and validate the cstics and values you still need in the configuration.

Once again, if you need any VC help, please use the contact form above and let us know how we can help,

Thanks for reading,

Mike

Variant Configuration – CU60E – Uploading to a Variant Table

Hey everyone, I figured it was about time I drifted back to VC for a while.  I’ve been posting about business and service a lot lately, so here’s a little tidbit that has come in very handy for me.  Often time when you’re loading in a variant table, there can quite a few entries.  So SAP built in a pretty little cool utility.  It’s CU60E.  The only problem with it is that isn’t intuitive exactly how it works, so here’s how you can make use of it.

1.    The characteristics in your file must be listed in the same order as they appear in the variant table.

2.    The file must be saved in a ‘;’ delimited file (Use CSV, and then do a find a replace).

3.    Validate the CSV file to make sure there are no quote marks included.  If there are, they need to be deleted.

4.    The upload should only be done for the initial load of the table.   When it runs, it wipes out the existing contents, and uploads the file.  You cannot append to an existing table using this transaction.

If you follow those 4 simple steps, you’ll be able to upload to any variant table using CU60E.

happy configuring!

Remember, if you need any help with variant configuration, service management or production planning, please use the contact us button above, and let us know how we can help,

thanks,

Mike

1.    the variant table.

2.    The file must be saved in a ‘;’ delimited file (Use CSV, and then do a find a replace).

3.    Validate the CSV file to make sure there are no quote marks included.  If there are, they need to be deleted.

4.    The upload should only be done for the initial load of the table.   When it runs, it wipes out the existing contents, and uploads the file.  You cannot append to an existing table using this transaction.

Variant Configuration – $Root, $Parent and $Self

If you didn’t know better, you’d think this was some strange post about psychotherapy.  Well, it’s just one of the underlying concepts you need to understand for variant configuration.  this is one of the concepts that is easier to describe with a picture.  So let’s start with one.  $ROOT, $PARENT and $SELF are the different ways to refer to the characteristics in your model.  Each of them works a little differently.

Now, what you’ll notice is that we have several nested KMATS at multiple different levels.  Now to start this conversation, we’re talking procedures.  Using the picture, let’s do a simple table to show you

Configuration $SELF $PARENT $ROOT
Level 4 Level4 Level 3 Level 1
Level 3 Level 3 Level 2 Level 1
Level 2 Level 2 Level 1 Level 1

Now, if you look at the picture, we only call out the BOM level at the bottom.  In reality, there is a BOM level for each configurable material, but it would be redundant to go through that.  The important things to realize is that $ROOT and $SELF always points to the same place.   Only $PARENT changes.

there is an exception to this rule, and because of that, I suggest avoiding $ROOT.  The exception is when you take a KMAT that was not part of another configuration, and suddenly add it to the BOM.  As soon as you do this, $ROOT suddenly points to a new level.  Personally, it’s not a method I like to use.  Prefer to use $PARENT, and then I make sure to pass the values from level to level if needed.

This pic comes straight out of SAP help.  It’s a little bonus for this blog post to help explain how constraints can deal with the separate levels.  In a constraint, the concept of $SELF, $ROOT and $PARENT don’t exist.  Everything is about classes and if they are part of each other.

I hope this make sense,

If you need more help, click the contact button above, and let us know how we can help you,

Mike