As part of the gATP implementations, I found some additional flexibility in terms of BOP processing. If you take a look at the list of BOP filter fields, they are pretty much limited and they may not fit into the business requirements of different industries as some might be interesting in deciding the BOP confirmations to happen at a restricted list like Shipping point, Sales order level, ATP group level, Customer group etc., or a combination of these.
To achieve this functionality SAP has provided couple of structures which can be enhanced as shown below and to account them to work with BOP, you need to implement couple of user exits as the underlying filtering has to be done for the field that has been added.
Now, let us consider a business scenario where in a user wants to run BOP only for a selected list of Sales orders and the reason why he wants to select only these set of orders could be due to many reasons and varies from business to business :-
As a first step, enhance the following structures with the new field “Sales order number”
Once the above filters are added, you can see that the newly added field is part of the filter selection and it can be added to your filter as shown below.
You can also see that the field is available now in the BOP filter as shown below.
Now, to make it work and to run the BOP only for those selected list of sales orders, you need to make sure that you implement the following user exit and exclude all the POSGUIDs ( order lines ) which are to be excluded and select only the ones that are required.
In the above mentioned user exit, you have a parameter called CT_BUFFER which actually contains the list of documents that are selected to undergo BOP check and you can find all those GUIDs there. As a first step, you need to read the sales orders that were entered in the selection screen by using the function modules ( First you need to read if the sales order has been extended in the filter using FM /SAPAPO/BOP_FILTER_GET_DETAIL – Pass BOP_FILTER as program class, second you need to read the variant details of the filter using FM RS_VARIANT_CONTENTS )
Once the list of POSGUIDs is retrieved for the sales orders that were entered in the selection screen, you just need to implement a piece of code that reads the above mentioned internal table CT_BUFFER and set the status as “D” in the field “STATUS_ITM” for those which doesn’t match with the selection screen relevant POSGUIDs.
Once the above user exit is implemented, system works in such a way that unnecessary documents are not ATP checked in BOP, however those documents are still displayed in the BOP results screen, which remains to be an incomplete solution. Hence, to achieve the same you need to implement the following user exit to restrict the unnecessary documents from displaying.
In the above mentioned exit, read the entries in the internal table CT_BUFFER_DISPLAY that has the status as “D” or “Unchecked” and restrict them from displaying by deleting them from the internal table.
This ensures that BOP gets executed only for the relevant set of documents that you’ve entered in the selection screen.