Does the headline in this blog confuse you? Sorry, that is noit my intention. I just want to pint out a not-so-well-known fact.



When you set a safety stock level in the MRP2 screen of the material master it is subtracted from available inventory in the MD04 stock / requirements list. Therefore the MRP run ignores that part of the inventory. Imagine the following situation: There is a forecast of 50 pieces for next month and you have maintained a safety stock of 30 pieces. The system will plan to have an inventory of 80 pieces in stock at the beginning of next month. As we are approaching the next month and actual customer orders drop in, the forecast is replaced by actual orders. Should the actual order exceed the forecast - lets say that customers demand 60 pieces instead of 50 - the MRP run will generate a new replenishment proposal for an extra 10 (instead of using the safety stock) and you end up with 90 pieces in inventory, even though you only need 60.


This type of behavior creates dead stock and misses the purpose of using a safety stock as a buffering strategy. The situation worsens if you have a rounding value or a fixed lot size.



So what can you do? Use a range of coverage profile that drives a dynamic safety stock if the situation allows for it. In a range of coverage profile you have a target safety coverage and a minimum safety coverage (in days of coverage). The MRP run can 'see' the safety levels and ONLY generates a replenishment order when the minimum safety coverage is broken. Therefore you have to make sure that the minimum safety coverage is set to 1 day and the target is higher. In that case the MRP planning run uses all the days in the target coverage as a buffer to counter demand variability.



By the way... the range of coverage also has a maximum safety coverage to keep the inventory from blowing up, should the forecast be too high.

Business Requirement:

We know we can get all types of purchase report from ME2N/ME2M/ME2L etc. But these all reports are considering as per line item. These reports will show you result line item wise when you run with your criteria (like as Selection parameter).

When you want to get a report for completed POs with consider all line items. When you want a report only for these PO numbers, whose are having delivery complete for all line items. You will not consider these POs as complete if GR will be pending (or partial GR) for any line item.

In short, you want a report with the indicator as “Fully Delivered” in Header – Status tab.

As an example,

You have a PO with 2 line items, GR has fully completed for first line item but your second line item has the partial GR. So when you will consider this PO as incomplete PO as second line item has some GR pending.

You will find more information in this discussion List of completed POs with compare all line items. I had posted the query but didn’t find any standard solution. Experts says, I have to go with development. Somehow, I’ve prepared this report with the field delivery complete indicator (EKPO) and Ms Excel.

I want to share my experience so that it can be helpful for others.

Actually my boss had given the task to me. We have one vendor and we are doing invoice when the PO for this vendor will be totally completed. My boss asked me to give the all completed PO numbers with open invoices, so that he can calculate the quantity for open invoices.

But before doing this you might have to know some important notes:

You will need to make this report when you will agree to pay invoices only when all line items of a single PO number are totally completed.

As you can see the report will be made by some work which is outside from SAP (as MS excel), so if you are agreed with to do an extra work analysis outside SAP.

If your PO is containing multiple line items, since if your some data (like as material, plant etc) are not same for multiple line items, then you can’t combine these lines into one.

You can’t do this when your vendor will give you invoice as per line item and vendor says you will not get rest material until you pay his sent invoices for another line item (which has completed).

You can’t do this when your vendor says he will give you some discount if you pay him for another line item which has completed and you will not able to get this discount if you will wait for the whole PO complete (all line items). Then it is suggestible to make the invoice and payment as per line item.


PO number 4500013608 contains 3 line items.

PO number 4500013609 contains 2 line items.

GR pending only for 3rd line item for PO number 4500013608. Hence I just need the report which will contain only PO number 4500013609 because only this PO number get fully completed.




Create a selection parameter as delivery complete tick indicator and delivered = Ordered. So that we can get all these line items whose are having filly GR completed.

IMG path : SPRO-IMG-Materials Management-Purchasing-Reporting-Maintain Purchasing Lists-Selection Parameters-Define Selection Parameters.

It will be much better to create your own selection parameter. You can create by coping a standard, then you have to make the changes as below:



Save the selection parameter.

Then take the all completed PO numbers (completed as per line item) with from ME2N with selection parameter ZDEV and ALV layout. It brings 4 entries (2 line items for PO number 4500013608 and 2 line items for PO number 4500013609)



Export it to excel.


Then copy these PO numbers and take the DCI indicator from EKPO table (DCI will be flagged only for these line items which has GR completed and also be sure your system has the option set delivery indicator automatically activated).



Export it into another excel sheet and replace the blank with value A (You can use A to W - alphabetically below than X). Then sort the DCI field. You can see the A will be appeared first.



You can see my one PO number has two DCI indicator as A and X. I have sorted this because we know excel will take the first value for formula V-Lookup when source contain different value.

Now I have two excel sheets. First is exported from ME2N and second is exported from EKPO table. I've done V-Lookup and take the DCI indicator from second excel to first excel.

Now our first excel will look like as below:



Now here, delete the line item which will contain the value A in DCI field.

After delete the line items, you will get the line item which will contain only value X for the field DCI.

It is the report for all PO numbers which has completed GR in header status.



It means I get the PO number which are having GR as fully cleared for all line item.

I can compare this PO in SAP system as Header – Status as “Fully Delivered”



Here, in your excel sheet, you've got these PO numbers which are having GR fully delivered.

Now if you want to check the Invoice has already done yet or not for these PO numbers, then just go to ME2N report and filter these PO numbers with selection parameter “RECHNUNG”. You will get the result for all PO numbers with header status as “Fully Delivered” and “Not yet invoice”.

From some for us yet unknown reason, suddenly, all the quick views (SQVI) from one of our productive system disappeared. Hundreds of quick views (3400 in total).


After short investigation we found a strange phenomenon. SQVI Usergroups were recreated. Before the incident the Usergroups were from the range SYSTQV000001 - SYSTQV000852. And now the range started at SYSTQV000853:


What we could get in the first moment, at least, was a list of reports (table TRDIR), that were generated out of all the quick views:


By searching the table AQLQCAT (Query Catalog) for the query name (right side of the program name from the 17th character), we could find the name of the Infoset:


We went to SQ03 to check, whether the Infoset is still known to the system, and whether we could re-assign the abandoned Infoset (authorization) to the new QV Usergroup of the given user:


Apparently it was possible :-):




Still the quick view did not appear for the user in SQVI.


After a bit of testing we found a way: to copy the query from the old user group into the new one.

First in the SQ01 we selected the new user's Usergroup: How to find and execute or work with other users quick views (or quick views created with old user-id)?

Then in the menu select Query => Copy. Here we put the old usergroup and the query name twice:


After the copy, the query appeared again in the SQVI:


And this we may repeat (in our case) 3400 times :-)

To default the GL account while creating the Service PO's, we need to follow the below configuration’s.


1. Create a Service Material Group in T-code OMSF.


MSG 1.png


2. Create a Valuation class by using T-code OMSK and then link to Account Category reference of service.




3. Use the T-code OMQW to map the Service Material Group  (STEST) to Valuation Class (STES).


MSG 3.png


4. Once the above steps are completed , we need to use T-code :OBYC to map the valuation class STES to GL in Transaction Key GBB- Offsetting entry for inventory posting to the Account Modifier VAX,VBR and VKP. Also similarly to Transaction Key WRK-GR/IR clearing account with respect to your chart of account.


MSG 4.png


MSG 5.png


5. After that we have try to create a PO for the new service material group and it is defaulting the GL account which we have mapped in T-code: OBYC.


MSG 6.png




We can use the table T023 for Material Group mapping to Valuation Class and T030 for Valuation class mapping to GL account based on the Transaction Key and account modifier.


I believe this document is useful those who are new to SAP MM.




During the Implementation we come across many requirements around free goods, minor consumable, one time purchase items etc. Many of the time Client does not want to follow the whole SAP procurement process or does not want either value or quantity or both to be updated. Many of the time these requirements come in very vague terms, complicated terminologies ,or sometime using many legal/confusing terms. At the end MM Consultant ends up creating customized material times or other workaround custom solutions for the same.

However SAP has provided 2 Standard Material Types to cover many of these requirements,


SAP provides two options for Non Valuated Materials

     1. NLAG - neither quantity nor value is updated (non-stock material)


     2. UNBW - only quantity updated and not value.(non-valuated materials)


During Procurement they behave as below:


1)NLAG is material that is not held in stock because it is consumed immediately. (Office supplies such as stationary. You need to create purchase order and accounting document for payment but the stock balance is always zero as it is issued out immediately to the various department.)


2) If the material is set to quantity update but no value update and it is included in a Purchase Order with account assignment, a goods receipt will increase the stock.


3) For UNBW, accounting documents are created only at the time of goods receipt, i.e where we are liable to pay the vendor. However when we issue this material for consumption or any other transaction accounting documents are not generated.Important feature of UNBW is that it can't be expensed without receiving in stock.


4) All non-stock  material  will be immediately consumed upon goods receipt. These are charged to a cost element such as Account Assignment, Work Order, or Work Breakdown Structure. As a result, the non-stock will not be charged to inventory.

one of the critical success factors in supply chain management is the correct translation of a supply chain strategy into materials planning policies. Take as an example a directive to provide a certain service level to the customers. Management might say "we want to achieve a 98% fill rate on our most valuable products" (usually A items).


What usually happens then, is that every materials planner figures out how much inventory they need to hold and what replenishment policy to use to achieve that. If you want to standardize this kind of directive and develop a system to have everybody use the same calculation, I suggest you use the field 'service level' in MRP2 and calculate the safety stock setting for each material using the variables lead time, mean absolute deviation and a safety factor.


You can do this on the forecasting screen of the material master. Depending on how you configured your MRP type, the forecast run can calculate  safety stock level for you. However, you have to kind of doing this for every material and you can only simulate exactly one service level.


A better solution is the SAP Add-On Tool 'Safety Stock and Reorder Point Simulator'. With it you;re also getting a new KPI: safety stock value! You can also simulate many service levels and compare the results in terms of quantity and value. On top of everything else, the safety stock calculation gives you two more - very important - parameters: the variation in replenishment lead time and a variation in demand.


Let's say management desires a service level to the customer of 95%. In that case you would pull all those materials into the simulator, set 95% nd your variation in lead time demand and click the 'calculate button. The simulator then calculates all safety stock individually for each materials and totals the value. This way you can determine what a 95% service levels means compared to your current master data settings or to other service levels. In our example, all materials currently have a service level of 96% which, with the manual calculation the materials planner was using, produced a value of $7,342 in safety stocks. However, the safty stock simulator produces a value that's higher with a lesser service level... and that calculation is using the same variables for each material across the board and therefore probably much more accurate than what the planner ever can come up with - possibly applying different methods and being totally overwhelmed doing this for hundreds, if not thousands of materials.



In the end, you push the save button and safety stock and service level are being updated into the MRP2 screen for each and every material in the list.



Management changes their mind tomorrow? no problem!

Are you missing a functionality in SAP ERP MM & SD joint process and functions, and you think it should be included in the standard product?


Do you want to improve SAP MM directly and influence the SAP Development?


Now is your chance!





Currently we are running the Customer Connection Program in SAP, and I would like to have you - our customers - to be part of our brain for innovation and improvement!

Customer Connection is directed at incrementally enhancing and improving products and solutions in mainstream maintenance. It offers you, our customers, the opportunity to suggest small enhancements and improvements to those products and solutions (“Improvement Requests”). The Improvement Requests selected for development will be delivered through SAP support notes or support packages.

This is a unique opportunity for you to influence development at SAP, and to submit requests for functionality which you have been waiting for. If you are interested, the following is our working scope:



Link: SAP SD and MM joint process and functions



Scope of project:

Improvement of functions and processes that are integrative between ERP SD Sales and ERP MM Purchasing or are commonly used cross industries and regions.For more details of the Project Scope, you can find it in the above SAP SD and MM joing process and functions link!








You can navigate to the THE REQUEST PAGE and submit the improvement request, or contact me at if you have any question.



For more information, please visit: OUR Customer Connection SCN PAGE and SAP Improvement Finder



Sometimes I wonder how many implementations you completed, one needs to brush up on designing of material master before getting into a new implementation project, no matter his/her of experience level.


Every time a transaction run with financial postings, financial account determined based on valuation class in material master, triggered by a movement type with automatic account determination process.

So, here's a simple explanation -Who is the owner of material master in spite of the same material number/code used by business in a module/in all modules.
Who is the owner 1.jpg

Material Master!!!!!!!!!!!
Very well in default attracted to Material Management module where it is comprises with other modules data too as required by business scenarios ie….Finance  & Controlling , Sales & Distribution, Quality Management, Production Planning and Warehouse Management etc. Based on material properties with different characteristics and how material behave to business on inventory and accounting, the material type determined to use with standard material type or custom material type.

Precisely material master available with user departments like Basic data , Purchasing, Sales, Work scheduling, Accounting, Classification, MRP(For Materials planning and control), Production resources/tools, Costing, Storage, Forecasting, Quality management, Warehouse management, Plant stocks, Storage location stocks  and based on material properties to business these user departments on material type and later material are created.

In our day to day business consulting, materials are created with standard transaction code MM01 or materials are created through uploading tools by business. I refer back with my previous involvement for a large project where material creations have following process
1. Business end user search material list or catalog for his/her daily usage for transaction.
2. If material not available, then he /she fill the material request form
3. Material request form sends to central material creation officer with his/her manager approval.
4. On appropriate check and verification by central material creation officer and if he is happy, then he /she can new material code or upload file with custom transaction code for new material code.
5. Once new material code created in system, central material creation officer convey message to business end user.


Since different departments in a business work with the same material, but each department uses different information on the material, the data in a material master record is subdivided by user department. As we all know, material created by a user and material used by all different department users but, the question is who is the material owner in business – those who created material or those who use material on department wise or MRP controller or Buyer (purchaser).

Who is the owner 2.jpg


History of this blog:
In the last few years I happened to meet project managers, procurement business heads & business users of different organizations and tried to find the answer “who is the material owner” in your business. There is no satisfactory answer, so this blog is the result and inspiration for not getting the real answer. The few answers are:
I am SCM lead, so I am the material owner
I am creating material master, so I am the material owner
I am managing material procurement, so I am the material owner
I am managing material inventory, so I am the material owner
I am managing sales of material, so I am the material owner
I am managing payment for material, so I am the material owner


I tried and explained on the how business can deal to work by deciding material owner by using field 
“Lab/Office (MARA-LABOR)” in material master in Basis data-1 view. Individuals are blinking with this concept and difficult to believe by them, unless one is to work and use this field!


Decision process in an organization to find the owner of a material:
Every department in the business has a stake in one or more processes for a material. Groups of individuals for each department usually share in—and "own"—the activities for each department which make up a process. Single individual who is ultimately responsible and accountable for the effective working of the process is known as the process owner but not material owner. The process owner is the immediate supervisor or leader who has control over the assigned process to his/her but entire processes from beginning to end are controlled by material owner.

Is the owner of a raw material different to an owner of a spare part-different to a finished material? Why is it different?
It is the organization question and decision who own the material master. It may be depends material types where a material are stored in a physical location with significant naming conversion or based on a particular process where all materials go through it. To complete a particular process, business may needs all material in one physical place/plant where raw material required for production process, spare part required for maintainace for equipment’s and finished material obtained. Later to complete the process, business needs packaging materials. So material owner decides based on to complete a process or material stored in stored in a physical destination.

What is the benefit of having a data owner?
Master data is an organization's lifeblood, flowing through all vital departments. Bad master data is poison and managing bad master data without ownership creates poisonous environment with clogging operations, confusion on handling, prompting poor decisions and in the worst-case scenario, leading to jail time for business leads/business executives/end users. To avoid poisonous environment, a material master data owner is required for effective management of material master.

What does the data owner do?
Data owner will design and plan the approach with the activities which are necessary to attain the desired organizational objectives where business can have science of managing material flow including procurement, production, marketing, transporting, processing, handling, storing and distributing the materials.


With referring to the above information’s, business system can deal to work  by deciding material owner by creating  “Lab/Office(MARA-LABOR)” and assigning to material master in Basis data-1 view. The field Lab/Office in material master is known as Laboratory/design (engineering) office where this Key represents for the design office, laboratory or laboratory worker responsible.

Who is the owner 3.jpg

For certain case, the field “Lab/Office “in the material master record is used if the material is a chemical component but also the same field can be used for design and engineering purpose defining ownership of material master.


We have remarkable products like MDM and MDG - why just reduced a conclusion with one single field?

Universally, MDM (SAP Enterprise MDM) or MDG(SAP MDG/ECC or ECC-integrated MDG)  is an integrated data management tool for the maintenance, validation and distribution of master data where SAP MDG best suited for central master data management of SAP standard objects and fields which need to be distributed to SAP ERP, SCM& other systems of the SAP Business Suite and SAP MDM best suited for highly flexible data modeling capabilities allow for creating various data consolidation, harmonization and central data management scenarios within a heterogeneous system landscape.

Master Data Management is a technology/ application packages/tools enabled discipline of actively 'Managing' or ‘Staging” the data rather than 'Maintaining' it in each transactional system across the business organization where no individual carry the ownership of material master data!


Conclusion fiction:

Before concluding, the “Lab/Office “field will be used on the Material Master to identify the ownership of the material. The ‘Lab/Office’ field will be used for this purpose only and this is at Client level. If new ‘Lab/Office’ field values will be identified by Business Lead Users and given to the Supply Chain Team. The Supply Chain Team will add the new values to the system and may delete previous entries which are not required by business.


Thanks for your time to read my 3rd Blog. Also I would like to thank all my present project team members for their great encouragement and strong motivation.

Biju K

It is time to clear up a widely mistaken belief, although it became almost established as truth due to the massive wrong answers given in a high disproportion when someone failed to search or is seeking for a new answer to the question "How to make error message & a warning?" or "Changing warning message to error not working" 

It is really interesting to see how attractive such questions are. Within a few minutes several answers are pointing to the customizing. Some mention the IMG path others are giving the transaction code to the same customizing. I wonder from where these suggestions are taken. Did they look up older questions and just repeat the answer? Or do they just believe that any system message can be customized, one only has to know the right customizing transaction.

So the typical discussion goes like this:

"I want to make message MM 081 to become an error"

"no problem - execute OMT4 and add this message and maintain an E for error"



Why was he shocked?


OMT4 does not even have a "New Entry"-Button




No issue at all, now the Techies jump in and inform that this is all stored in table T160M and suggest to maintain this table directly with SM30 transaction


: not possible  I get and error "The maintenance dialog for T160M is incomplete or not defined"


: Click the message, it takes you to the long text. Here you have the option to generate a maintenance dialog


: Thank you.


: Hi, I have one more question. I added the message as said. But it does not work, can you help me.


All are going now, leaving a desert with an unanswered question, and one more thread about how and where to maintain flexible system messages



Have you ever tried to start a car that you see in a parking space with your own keys? Why not? Probably because you know that you cannot use any key to drive any car. Why are you assuming it for any message in SAP?

Just imagine the car is transaction where you expect the warning or error according to your entry (the key) in table T160M (ignition lock). You already smashed the window to open the door (SM30, because OMT4 did not let you in)

Still the motor does not start. Are you disappointed?

Like the ignition lock needs the right key, your SAP transaction needs the right ABAP that recognize your entry.

If SAP has not foreseen a variable message in its ABAP coding, then you enter as much as you want in T160M, it will just not work.

SAP's system messages are all stored in table T100, a small subset is foreseen to be customized, these are stored in table T160M.

T160M entries are delivered by SAP. Some more messages can be added because the programs have been prepared for this. Those new entries are usually communicated via OSS notes.

How to know if a message is customizable which is not yet in T160M?

  • Search SCN, if you find a "Hooray, it works" then you got already a good indication.
  • search SAP Support Portal
  • Check it from transaction SE91 Message Maintenance, you should know some basics in ABAP language.
    • In SE91 enter your message class and message number and click the Where-used button. SAP gives you a list of programs. double click the description on the right and SAP takes you into the ABAP directly to the place where the message is processed. Here you can see whether it is just a message with a hardcoded message attribute, like this

      •    MESSAGE W388(11).

      • ENDIF.

    • or if there is some coding which is looking into T160M table to get your customized attribute:
      • PERFORM enaco_2 USING 'ME' '040'.

      •               CASE sy-subrc.

      •                 WHEN 1.

      •                   MESSAGE w040 INTO gl_dummy.

      •                   mmpur_message 'W' 'ME' '040' '' '' '' ''.

      •                 WHEN 2.

      •                   MESSAGE e040 INTO gl_dummy.

      •                   mmpur_message 'E' 'ME' '040' '' '' '' ''.

      •                 WHEN 3.

      •                   MESSAGE w040 INTO gl_dummy.

      •                   mmpur_message 'W' 'ME' '040' '' '' '' ''.

      •               ENDCASE.

By the way, there are message customizing where you can add new entries, still the above said is valid for them too.

Sorry for killing a dream

Trigger to this story can be read in Application area MM and Changing warning message to error message - Entry Sheet and many many more discussions in SCN and elsewhere.

Yes, you can use a reorder point procedure for inter-plant stock transports, but be careful what you put into the lead time.


When you source materials from one of your own plants, your lead time (in the field Planned Delivery Time  (in the delivering plant) should be the time it takes from the issue in the delivering plant until it arrives at the receiving plant. The only question is: Can the delivering plant issue right out of available stock?


If the delivering plant does not keep the product in stock but has to procure it also, then the total lead time until it arrives in the receiving plant will increase dramatically. But if you put that total time into the PDT, you will ask the delivering plant to issue way too early. Unfortunately the TLRT in MRP3 does not work with procurement indicator 'F', so what can you do?


I know people have played around with source lists and info records but if you want to use an automatic reorder point calculation (VM or V2) you need to put the total replenishment lead time into the PDT, because that is what the reorder point calculation uses. So you are stuck with a manual reorder procedure (VB or V1) and you will have to include the entire total replenishment lead time in your spread sheet calculation.


The SAP Add-On Tools (MRP Monitor and Reorder Point Simulation) give you added possibilities: Since the MRP Monitor also performs an EFG classification for lead time - and lets you pick the TRLT from the MRP3 screen - you can build a list of items which are feasible for an auto-reorder procedure (X - consistent consumption, C - low consumption value, E - short lead times). The Safety Stock and Reorder Point Simulator then lets you calculate and simulate various service levels for optimized reorder points and safety stock settings... and allows for a mass update of the policy.


for more info on the SAP Add-On Tools refer to the website or check out my YouTube channel.

Driving through the long road of MM world, I heard similar questions many times from consultants, customer and colleagues asking how to overcome error of
unrealistic stock value at SAP System.


Well, different customers, different business scenarios, different behaviours. But, I would say that in most of cases we can use some workarounds to avoid errors from this nature.


Especially talking about error messages 'M7 304' and 'M7 308'.
M7304 - Stock value and quantity unrealistic: & / &
M7308 - Stock value and qty are unrealistic: & / & -> see long text


Let's talk about these above errors in details:




This error is raised in the following piece of code:

     IF ( w-salk3 < 0 AND NOT w-lbkum < 0 ) OR
         ( w-salk3 > 0 AND NOT w-lbkum > 0 ).
        WRITE w-salk3 CURRENCY i_waers TO l_salk3_message.
        WRITE w-lbkum UNIT i_meins TO l_lbkum_message.
        MESSAGE e304 WITH l_salk3_message l_lbkum_message.
If the field MBEW-SALK3 (Total value on stock) is becoming lower than zero and then error is raised.


- Common reason:
If the Tax condition is customized as non-deductible taxes, then the amounts are added to the material value and - during goods movement -
and subtracted from the stock value. If the same material was previously posted to the stock with deductible taxes, a negative balance can result.


- Comment:
A negative stock balance cannot be prevented by allowing negative stock in the material master. A negative stock value is only tolerated in
conjunction with negative stock quantity but not with zero stock quantity.


- General solution:
A withdrawal of stock material should be posted with the same tax settings as the placement of material into the stock, i.e., in both cases 'deductible' or in both cases 'non-deductible'. The non-deduct. taxes that are due are to be added to the material value on the receiving-plant side, at goods receipt thus.


- Workaround:
A possible way to overcome the error in this particular case is to increase the stock temporarily (movement type 561), so the stock amount is not zero after goods issue, and to correct for the stock increase after the goods issue (movement type 562).


- Another possibility is MR22 transaction.
Use the function "Debit/credit material" (contained in Valuation menu) to post a correspondingly high material debit (if value is negative) or
material credit (if value is positive) for the material. Then carry out the goods movement. When you use this procedure, the system creates a
revaluation document.




Error 'M7 308' is usually caused by a rounding issue.
In case, it is because the total quantity on stock is not matching to the total value on stock.

In order to solve this error we should recalculate the total value.

And to do that we have to post and re-post a price change in transaction MR21.


- go to MM03 transaction and check the price in Accounting 1 view.

-  then, go to MR21 transaction and post a price change by increasing the price in 0,01. For example, if price is 100,00 USD change to 100,01

- open MR21 transaction once again and then post a price change by reducing the price in 0,01. For example, from 100,01 USD to 100,00.


Once these price changes have been posted the total value on stock will be adjusted and then you should be able to make any necessary goods
movements for this material.


See the following notes as reference:
1026379 - MB5K: Misleading error message 045 due to rounding
1708261 - Error 'M7 308' is raised when trying to post a goods movement


Best Regards,
Fábio Almeida
SAP Consultant - ERP MM

A lot of times you see people in forums asking questions about OBYC, on why account X was determined when the system should be determining account Y. Instead of trying the forums, where it is extremely hard to get help because people don't have access to your system, you can debug the call and see for yourself.


"Debug? But I'm a functional consultant!" - You're a "consultant" and a consultant should understand a language as basic as ABAP. You don't have to write it, you have to read parts of it, so don't whine. Trust me, it will make your life much easier.


There are two transactions you should know about: ST05 and SE37, but first lets use MIGO to provide an example. Go to MIGO and create a document with a 201 movement (consumption to cost center) and stop before saving the document.


Go to ST05. Select "Buffer Trace" (SQL Trace should already be pre selected). Press "Activate Trace". Go to MIGO, save the document, and then back in ST05 press "Deactivate Trace" and "Display Trace". Execute.


In the object name column set a filter for T030. It depends if your hit is in the buffer or SQL, but you should see something like this (in this case it's blue because it hit the buffer):



So my 201 movement is hitting BSX with valuation class 1100 and GBB with VBR 1100. That provides some valuable information about how SAP is reading OBYC, namely you see it is using VBR and 1100.


If you want more detail you have to go SE37 and debug (and I seriously recommend you at least learn to debug). Select function module MR_ACCOUNT_ASSIGNMENT and look for the following code (I knew I had to debug this FM because if you double click SAPLKONT on the previous picture, you navigate to the code where the SELECT is made):




The important one is the SELECT to T030. If you set a break point you will be able to see (when you post a new document) the various selections to your OBYC configuration, and can see in T030-KONTS and T030-KONTH which accounts were determined (this way you can see if your account determination is standard or if the account is being changed in a substitution further down the line).


Above the SELECT you can see the various configurations:

  • XKOMO - Relevant for account modification
  • XBWMO - Valuation modification relevant
  • XBKLA - Relevant for evaluation class


I hope this helps you understand what is wrong with your account determination, and helps you understand how SAP works.

The outcome of Materials Planning depends to a very large part on the policies you set for the individual materials. Supply chain optimizers teach a lot about policy... should you use a reorder point procedure, a PD pr maybe a material forecast to tell MRP when to order how much? They also go into what lot size procedure is fitting and how to determine a safety stock and in some other cases they suggest a dynamic safety stock calculation with a range of coverage profile.


Those are all valid and absolute necessary teachings, but the question is: what do you do with your portfolio once you understand all that and know what to set up? If someone tells you to go to the LIS to find out - for each material individually - if there is consistency in consumption, go to document evaluations to run a dead stock report that takes up hours, look in the material master what the replenishment lead time is and expects you to then set up policy for every one of your 5,000 materials... run! You should certainly not pay for that because as soon as they're gone you will find out that the materials controllers will give up on that impossible task.


Unfortunately, in SAP you can not perform an XYZ analysis for consumption consistency or a life cycle classification. And unfortunately, in SAP you can not update a group of materials with a common policy (except with the MRP Group on the MRP1 screen. But that record has only a limited amount of fields available and does not allow for the setting of a complete policy). So you would have to go to many different transactions to carry out your analysis and some things you would have to do in Excel.


The solution is the SAP-developed MRP Monitor. It doesn't come with the standard sofware, but it is developed within SAP by SAP. The MRP Monitor runs every month and classifies your entire portfolio into six dimensions - ABC for consumption value, XYZ for consumption consistency, EFG for lead time, UVW for price, LMN for volume or size and life cycle class. Once the segmentation / classification is done, you hit a button and the class is saved in every material.




What a materials planner can do now, is to pick all the materials in one class and give it a fitting policy - to all of them at once. You can do that manually by filling in the according fields in MRP1 to MRP4, the work scheduling screen and the forecasting screen, or you save the policy in the provided table and let the system do the work. Following you can see the table with pre-configured policies that the MRP Monitor uses to update entire groups of materials


Now, you'll have to go slow with this type of mass update and make sure you understand everything that's happening here. In my engagements I sometimes suggest to break down the portfolio into three buckets:

- XX3 where you can put all materials with no consumption over the past 12 months - I then update these with the policy "PD with no safety stock" so that we don't hold inventory on any of them

- then there is bucket 2 - XX2 - in which all active items remain. You can the run the MRP Monitor and pick a class for which you know the policy. as an example pick all C (low risk), X (high consistency in the past) and E (short lead times) and provide all of them with the policy "V2 (auto reorder), FX (fixed lot size), forecast data (for reorder and saftey stock calculation) and MRP Controller XX1". That will update all these materials with a fitting policy and puts all of them into the bucket XX1

- now you can update the policy for the XX1 bucket automatically by saving previously mentioned "V2" policy in the table. as long as the criteria remains the same - C,X, E - we can calmy watch how the automatic policy update does its magic.


This way you can gradually move from manual activity (without the MRP Monitor), to focused analysis and  manual policy updates for groups (in bucket XX2) to fully automated and effective materials planning in bucket XX1.

In this blog I am going to share the invoice tolerance limits learning and understanding which would help to understand  invoice blocking techniques and provide a base to apply in real time situations depending on the client's need.


This document will help consultant who is going to implement Open Text Vendor Invoice Management (VIM)


In the Procure to Pay(P2P) life cycle procurement part ends when Account Payable(AP) processor/Invoice clerk posts the vendor invoice in SAP using MIRO transaction which is also called Logistics Invoice Verification(LIV). It is tedious job for invoice clerk manually to verify each and every invoice line item is conforming to agreed price or quantity in PO. SAP provides systemic way of verifying this kind of discrepancies and block the invoice for payment using the 2 digit key called "Tolerance key".

Lower & upper tolerance limits for all possible discrepancies can be maintained in tolerance key. I would try to explain all the invoice tolerance keys in this blog with possible examples.

There are 2 kinds of invoice matching in SAP which are controlled by tolerance keys.

  • 3 way match:

Invoice line item is checked against corresponding purchase order and good receipt documents item for price & quantity matching


  • 2 way match:

Invoice is checked against only to PO price/qty if there is no goods receipt planned


Let us understand the how the automatic block is working via tolerance keys. In SAP we have many tolerance keys, I am going to discuss only below keys in this part AN,AP,BD,BR,BW,DQ,DW.

Tolerance Limits:

    • SAP tolerance limits work only for MIRO transaction
    • Invoice posted in FB60 is not subject to tolerance keys limit check
    • Tax amount is not included during tolerance check
    • It is stored in table T169G


Invoice blocking ways:

In SAP vendor invoice can be blocked for payment by anyone of the following way.

  1. Automatic block:

Only if there is a discrepancy due to price or quantity or date variance in an invoice.
If the item amount is exceeded from the limit maintained in the tolerance key.

   2.Manual block:

Invoice processor could manually block an invoice either at item level or header level

   3.Blocking through payment term:

Invoice can be blocked always with a particular payment term even if there is no variance

   4.Stochastic blocking:

Random blocking of invoices without any variance

   5.Blocking at vendor master level:

Invoice can be blocked always for a particular vendor if specific blocking key is maintained at vendor master level

Blocking indicators:

       Blocking indicators are available both at header and item level of invoice document. System set this indicator in the document wherever and whenever it is appropriate.

Header level:

Table: RBKP_BLOCKED                      Field: MRM_ZLSPR

Possible values:


Automatically blocked due to existence of blocking reasons


Stochastically blocked


Manual payment block set in header - no blocking reasons


Automatically blocked due to entry via Web Invoice


Item level:

Table: RSEG                                                  Value = X



Blocking reason price


Blocking reason quantity


Blocking reason date


Blocking reason OPQ


Blocking reason Project


Manual blocking reason


Blocking reason amount


Blocking reason: Quality



1.AN – Amount for an item without order reference


“System checks every line item in an invoice with no order reference against the absolute upper limit defined.”

Without order reference means direct posting to G/L or Material.


System behavior:

If only the invoice line item is greater than absolute upper limit the invoice would be blocked.

Let us understand with below example.


It updates RBKP table without a header Block – R. But updates table RBKP_BLOCKED with payment block – ‘A’.

No entries in RSEG table as it is directly posted to G/L or Material


Tolerance Key




Auto release


No blocking indicator update(ZLSPR)

A-     Auto block

No update

(item amount block)

Not possible


2.AP – Amount for an item with order reference


“System checks every line item in an invoice with order reference against the absolute upper limit defined.”


  • Item amount check must be activated at company code level – OMRH
  • Item amount check must allowed for item category and GR indicator - OMRI

System behavior:

Let us understand with below example


No blocking indicator at header table RBKP but RBKP_BLOCKED table has blocking indicator ‘A’.

Blocking indicator RSEG- SPGRS (Blocking reason item amount) is set at item level.

Item amount block must be released manually. There is no automatic release possible even if we perform any one of the following activities

  • Post subsequent credit
  • Adjust AP tolerance limit


Tolerance Key




Auto release


No blocking indicator update(ZLSPR)

A-Auto block


(item amount block)

Not possible


3.BD – Form small differences automatically


“The system checks the balance of the invoice against the absolute upper limit defined. If the upper limit is not exceeded, the system automatically creates a posting line called Expense/Income from Small Differences, making the balance zero and allowing the system to post the document”


System behavior:

Let us understand with below example

Small difference within tolerance limit:

As per the PO reference the invoice amount is 1000 USD.

But vendor actual invoice copy has amount of 1002 USD.

AP invoice processor enters the invoice amount as per the vendor’s invoice copy which is 2 USD higher than PO price.


Since small difference is within the tolerance limit, invoice would be posted without block. Small difference amount would be debited to small difference G/L account maintained for the transaction event key DIF in OBYC.

               Same rule is applied in the lower side as well

Small difference above the tolerance limit:

PO price: 1000 USD

Vendor invoice amount: 1003 USD


If the small difference above the tolerance limit then system would not allow to post the invoice with hard error “ Balance is not zero”. Still AP invoice processor could able to post invoice via menu bar option Edit -> Accept and Post provided if he/she has authorization object M_RECH_AKZ allowed.


If we post with above option then system would behave as below.

  • Invoice will be posted without block
  • Small difference G/L account (DIF) get posted
  • RBKP – MAKZN (net amount accepted manually) field will get updated with small diff. amount : 3.00



Tolerance Key





Auto release


Within range

No blocking indicator update(ZLSPR)

No update

No blocking reason update




No blocking indicator update(ZLSPR)

MAKZN field updated with diff. amount

No update

No blocking reason update



4.BR: Percentage OPUn variance (IR before GR)


The system calculates the percentage variance using below formula and compares the variance with the upper and lower percentage tolerance limits.


Pre-requisite to simulate this scenario:

  1. No GR based IV
  2. Variable order unit is activated at material level
  3. Maintain tolerance key DW with “Do not check” active




Material master:



‘CRT’ is maintained as order unit

‘EA’ is maintained as order price unit in info record 1 EA = 100 USD

PO Details:

PO has been created with CRT as Order unit and EA as Order price unit

Po quantity: 2 CRT = 24 EA

Invoice details:

Invoice is simulated before GR as below

Scenario 1:

Order unit quantity – 2 CRT

Order price unit quantity – 22 EA and amount 2200 USD

Observation: There is no warning message on the variance.

Let us use the above formula to find the variance percentage.


Difference is 100 – 91.6 = 8.9 % which is within the BR tolerance limit 10% maintained

Scenario 2:

Order unit quantity – 2 CRT

Order price unit quantity – 21 EA and amount 2100 USD


Observation: There is a warning message as below.


Let us use the above formula to find the variance percentage.


Difference is 100 – 87.5 = 12.5 % which is more than the BR tolerance lower limit 10%. Hence we are seeing the above warning message which will block the invoice for payment.


Tolerance Key




Auto release


No blocking indicator update(ZLSPR)

A- Auto block


(item amount block)

Not possible

5.BW: Percentage OPUn variance (GR before IR)


“The system calculates the percentage variance using below formula and compares the variance with the upper and lower percentage tolerance limits.


Let us understand with same master data

PO Details:

PO quantity in order unit – 2 CRT

Po quantity in order price unit – 24 EA


GR Details:

GR quantity in order unit – 2 CRT

GR quantity in order price unit – 22 EA


IR Details:

Scenario 1:

IR quantity in order unit – 2 CRT

IR quantity in order price unit – 20 EA

Observation: There is no warning message on the variance.


Variance % = (20/2) / (22/2) *100

                     = 90.9%

Difference is 100 – 90.9 = 9.1 % which is within the BR tolerance limit 10% maintained

Scenario 2:

IR quantity in order unit – 2 CRT

IR quantity in order price unit – 19 EA

Observation: There is a warning message as below


Variance % = (19/2) / (22/2) *100

                     = 86.4%

Difference is 100 – 86.4 = 13.6 % which is more than the BR tolerance limit 10% and invoice posted with payment block.


Tolerance Key




Auto release


No blocking indicator update(ZLSPR)

A- Auto block


(item amount block)

Not possible


6.DQ: Exceed amount: quantity variance

This tolerance key has both absolute and percentage limits.


If a goods receipt has been defined for an order item and a goods receipt has already been posted, the system multiplies the net order price by (quantity invoiced - (total quantity delivered - total quantity invoiced)).


If no goods receipt has been defined, the system multiplies the net order price by (quantity invoiced - (quantity ordered - total quantity invoiced)).


System behavior:

Absolute limits:

Let us see the system behavior if only absolute values are maintained and percentage limits are marked as “Do not check”.


Upper limit: 100.00                                                       Lower limit: 100.00


Test data :- (GR has been defined)

PO quantity = 100 EA

PO price      = 100 USD

GR quantity = 50 EA

      a) System behavior when invoice quantity is 51

Variance   = PO price x   (quantity invoiced - (total quantity delivered - total quantity invoiced))

                 = 100 * (51 – (50-0))

                 = 100 * (1)

                 = 100

Variance 100 is equal to upper limit 100 and there will not be any warning message.


      b) System behavior when invoice quantity is 52 

Variance = PO price x   (quantity invoiced - (total quantity delivered - total quantity invoiced))

                 = 100 * (52 – (50-0))

                 = 100 * (2)

                 = 200

Variance 200 is more than upper limit 100 and there will be a warning message as below.



When we post invoice with above variance it will get blocked for payment.


It updates tables as below

Tolerance Key




Auto release


No blocking indicator update (ZLSPR)

A- Auto block


(Quantity block )



Automatic release possible if the blocking reason RSEG- SPGRM is deleted when we post GRN for the balance quantity or credit memo for the excess invoiced quantity.

Same rules apply on the lower side as well

Test data :- (GR has not been defined)

PO quantity = 100 EA

PO price      = 100 USD

GR not possible

     a)System behavior when invoice quantity is 51

     Variance = PO price x   (quantity invoiced - (total quantity ordered - total quantity invoiced))

                 = 100 * (51 – (50-0))

                 = 100 * (1)

                  = 100

     Variance 100 is equal to upper limit 100 and there will not be any warning message.


     b)System behavior when invoice quantity is 52

     Variance = PO price x   (quantity invoiced - (total quantity ordered - total quantity invoiced))

                 = 100 * (52 – (50-0))

                 = 100 * (2)

                 = 200

     Variance 200 is more than upper limit 100 and there will be a warning message as below. Invoice will be blocked for payment and same tables will be updated as above.


Percentage limits:

“We can also configure percentage limits for the quantity variance check. In this case, the system calculates the percentage variance from the expected quantity, irrespective of the order price, and compares the outcome with the percentage limits configured.”


Let us see the system behavior with same example if only percentage limits are maintained and absolute values are marked as “Do not check”.


Upper % limit: 10.00                                                     Lower % limit: 10.00


Test data :- (GR has been defined)

PO quantity = 100 EA

PO price = 100 USD

GR quantity = 50 EA

     a)System behavior when invoice quantity is 55

     Variance = (quantity invoiced - total quantity delivered)/ (quantity expected)*100 %

                 = (55-50)/50 * 100 %

                 = (5/50)*100 %

                  = 10 %

     Variance 10% is equal to upper limit 10 % and there will not be any warning message.


     b)System behavior when invoice quantity is 56

     Variance = (quantity invoiced - total quantity delivered)/ (quantity expected)*100 %

                    = (56-50)/50 * 100 %

                    = (6/50)*100 %

                    = 12 %

     Variance 12% is more than upper limit 10% and there will be a warning message as below. Invoice will be blocked for payment and same tables will be updated as above.



Both Variances active:

If both absolute & percentage variance are active the system would block which ever tolerance is first breached.

Quantity check for Delivery cost:

The system also carries out a quantity variance check for planned delivery costs when we post only planned delivery cost.

Tolerance key not maintained:

If the tolerance key DQ is not maintained for a company code when we perform the same transactions discussed earlier, system considers this as zero tolerance and block the invoice for the payment for any deviation.


7.DW: Quantity variance when GR quantity = zero


If a goods receipt is defined for an order item but none has as yet been posted, the system multiplies the net order price by (quantity invoiced + total quantity invoiced so far).

The system then compares the outcome with the absolute upper tolerance limit defined.

System behavior:

This tolerance key works only for PO based invoice verification because GR based invoice verification will not allow IR without GR.

DW absolute upper limit as 100:

PO quantity = 100 EA

PO price       = 10 USD

No GRN posted

     a)If the IR quantity is 10 then system calculates variance as below

     Variance = Net order price * (quantity invoiced + total quantity invoiced so far)

                    = 10 *(10+0) = 100

     This value is equal to DW limit hence there is no warning message and system will not block the invoice.

     b)If the IR quantity is 11 then system calculates variance as below and block the invoice.

     Variance = 10 *(11+0) = 110


This value is more than DW tolerance absolute upper limit hence invoice got blocked.

It updates tables as below

Tolerance Key




Auto release


No blocking indicator update (ZLSPR)

A- Auto block


(Quantity block )


Automatic release possible if the blocking reason RSEG- SPGRM is deleted when we post GRN for the balance quantity or credit memo for the excess invoiced quantity

DW absolute upper limit as “Do not check”:

PO quantity = 100 EA

PO price       = 10 USD

No GRN posted

If the IR quantity is 112 then also system would not block even though this is beyond the DQ tolerance since it has been maintained as “Do not check” and there is no GR has been done.


“One should be very careful to use this option as this would by-pass quantity variance DQ block if there is no GR posted where GR has been planned”


DW tolerance key is not maintained:

If this key is not maintained for a company code it would always blocks the invoice for PO based invoice verification when there is no GR has been posted.



* SAP IMG documentation

Hello SAP Practitioners,

Greetings for the day,


In my last project I've encountered an issue and I've noticed that many people are still finding difficulty in getting the exact answer for their question in SCN and Google as well. As I've identified the cause for the issue, thought of creating this document by intending it would help them to understand their issue and resolve the same.


Summary of the Issue:

When I click on print preview button for a particular purchase order, the currency format was displaying incorrectly but the other purchase orders were displaying accurately, as it is displayed in change/display mode of purchase order screen.


Example: For the purchase order 4500002417 I've entered amount as USD 1,000,000.00 and when I click on print preview it has displayed the same as in the purchase order change/display screen. But for the other purchase order 4500002416, I've entered amount as QAR 1,000,000.00 but when I click on print preview, it has displayed as 1.000.000,00. I wonder how come it is displaying differently from the change/display screen of the same purchase order! Decimal was getting separated by a ‘Comma’ (,) Instead of a ‘Dot’ (.).


Please find the below screen shots for your better understanding.

PO 4500002417.JPGPO 4500002416.JPG

From the functional point of view I've analyzed a lot to identify the cause for the issue but couldn't succeed. Then I went Google's help but I didn't get a clear answer as I was seeing many responses were talking about only 'Decimal Format Settings @ User Profile' - SU3. Finally I took an ABAPer help to fix the issue as I did not find the right answer in Google.


Settings for Decimal Format in ‘User Profile’ (SU3): Before moving further I would like to make you clear that, decimal format which we are maintaining in ‘User Profilewouldn't be having any impact on purchase order print preview, instead It would be having impact on only purchase order creation/change/display screen, so for the above issue, no need of checking the user profile-decimal format.



Cause for the Issue:

When I found the cause for the issue I came to know that, the actual system behavior is correct. You might ask me how the system is behaving correctly, when it is showing the decimals wrongly? The answer is, the currency format in the 'PO Print Preview' is derived with the combination of 'Vendor' & 'Vendor Country'. Few countries are separating decimals with comma (,) and few are with period/dot (.).

Example: If we are raising a purchase order to a British Vendor, usually he reads his PO value in his local currency, so system would check the vendor & his country and based on that it would display the currency format in the print preview. As shown in the below table, the currency format for British vendor would be displayed like 1,234,567,890.00.


As per the above purchase order 4500002416, we are sending the PO to a German vendor, so his currency format is different than the other PO 4500002416, hence it is showing as 1.000.000,00 instead 1,000,000.00.


Note: Not all the countries in world are using the same decimal format, different countries officially designate different symbols for the decimal mark. Please see the below table as an example, how the decimal notations are different between the countries.


Excel 2.jpg.png

Please go through the below link to know more about the 'Decimal Notation'.

Decimal mark - Wikipedia, the free encyclopedia


Where can I see/maintain the currency format for the respective countries?

The standard SAP practice is, while implementing SAP, Finance Team and Business Team will have a discussion on maintaining the currency format for each countries. As it is having major impact on all the financial transaction, they will take a call at the time of implementation itself. Changing the currency format at the later stage is not advisable.


You can see the settings in OY01 as shown in the below screen shot.


How this functionality works only for the 'PO Print Preview' not for the 'PO Create/Change/Display Screen'?

As per the standard SAP, the purchase order forms contains a function called ‘Set Country’. This function will check the purchase order vendor and country of the vendor, then it goes to the table T005X (Countries – Decimal point and date format (SET COUNTRY)) --> pass the country name and gets the currency format for the country and updates the same in purchase order print preview.


This functionality works at the smart form program level not at the purchase order create/change/display program level, so we will not be facing any 'Decimal Notation' issue in the purchase order screen. PO screen works as we set the decimal notation in the user profile.



How to check whether my PO form has this function?

You can go to NACE settings find the smart form name--> and then go to smart form - Initialization tab--> search for term 'set country', if you find an entry as shown below, that means your PO form is calling this function and your decimal notation works based on this logic.

Smart Form 1.jpg


Clarified the cause of the issue to the business team and advised them to not to make any changes to the function as it working fine as per the standard practice. But based on the business requirement we have given them one more output type 'ZNEU', so that whenever they want to have a print with  country specific currency format they can use 'NEU' output type and whenever they want as per the normal currency format they can use 'ZNEU' output type.


In order to fulfill the customer requirement, we have created a new Z smart form, created 'ZNEU' output type and assigned the standard PO print program & Z-Smart Form in NACE settings--> and then maintained 'Output-Condition Record for Purchase Order' in MN04. Now whenever he clicks on print preview, he will get two output types, so that he can select whatever he wants.


Hope, I've clearly explained you the scenario to the best of my knowledge. Do let me know, if anything is not clear for u, so that I can explain in detail.


Thank you so much for reading the blog.



Narayana N


Filter Blog

By author:
By date:
By tag: