Best Method Directive to use in BPM for Quote Line level required fields

We want to add some additional required fields on our Quotes to ensure that we are capturing good data.

We have tried Extended Properties on QuoteDtl, but this appears to break our ability to paste/insert multi-lines into the quote. Even if the field we have defined as “required” is included in the excel lines that we are pasting in, the notice pops up that the field is required. It seems like the Extended Properties is looking for the required field before reading in all the data included on the line. So Extended Properties does not seem to work, based on our testing.

So I think using a BPM to make fields required may be the best way to do this. I have tried to use a Pre-Processing directive firing on Erp.Quote.Update. This gave similar results to when we made fields required with Extended Properties (breaking paste insert or update to add multiple lines). When I used a Post-Processing directive firing on Erp.Quote.Update, I was allowed to save and close, leaving the designated required fields null.

Is there a better method that would occur much later (like when you try to close the Quote window with the required fields null)?

I have looked at the Trace Log, but I am not really sure what I am looking at. The XML version of the trace log seems to be better organized (easier for me to follow). I have started the trace just before clicking the quoted check box, then moving to the next record. If I could get the required field BPM condition check to fire when someone tries to move to a different record or tries to close the quote window and then raise an exception when the required field is null.

In the trace I see the following methods:
GetNewOrGetByID
Update (3 times)
GetRows (6 times)
GetByID (6 times)
GetDatasetForTree (4 times)
GetList(6 times)
GetQuotedInfo
GetRowsKeepIdleTimeWithBallonInfo

Is there a good method directive to run my directive from (pre or post processing)?

  1. You could do a BPM when a Quote Line is marked as Engineered. Dont allow them to engineer it until its all fixed.

  2. You can also use something called DataTag or Hold in BPM and mark the rows with issues and then when you try to Engineer or Save the QuoteHed, you could look for DataTags or holds and ask for issues to be fixed. Then you would of course need to monitor to take the hold or tag off.

  3. On the form you can also in Customization Mode setup Row Rules to mark the row or column red.

  4. You can also on the form listen on ToolClick Save and throw error.

WARNING… I may be way off base here, but maybe it’s worth a shot.

When you’re copy/pasting something as complex (from a BO standpoint) as a QuoteDtl line, it might be necessary to change the sequence of the fields you’re uploading. You may want to try moving your Required Fields to the LEFT of the PartNum field on the grid…

Why not make an In-Trans DATA Directive for QuoteDtl, and check for the field population there… that way it will be required no matter what business object tries to add the record.

I added an In-Trans DATA Directive for QuoteDtl, but when pasting multiple lines, I still get the attached error after every line. There are 103 columns (the list view of the line items on Quotes) and the required column that gives the error is the 15th column. I would have thought that the check would occur after all of the details on the line are populated, but it seems to check before that happens.

The Sales Category is valid in the excel file, so after I say OK to each of the Business Logic Errors, the lines are in (without pricing). If I paste update (the same exact excel file) then no errors occur and the prices are brought into the list view of lines on the Quotes.

How can I verify that the required data is in, while paste/inserting multiple lines without the error code popping up?

Would it make sense to check for required fields when the “Quoted” check box gets ticked?
If so, how would that be triggered? I ran a trace while checking the “Quoted” check box and it resulted in 4 business objects:

Ice.Proxy.BO.UserTracingImpl GetNewOrGetByID
Ice.Proxy.BO.UserTracingImpl Update
Erp.Proxy.BO.QuoteImpl GetQuotedInfo
Ice.Proxy.BO.RepotMonitorImpl GetRowsKeepIdleTimeWithBallonInfo

When I tried a Method Directive, I did not see the BO QuoteImpl .
I did try Erp.Quote.GetQuotedInfo, put a pre-processing directive on, but It did not seem to run when I checked the Quoted checkbox. I am very new to BPMs and I am not sure what I am doing wrong.

I used the in-trans DATA Directive as recommended by @timshuwy, but still got the errors. Then I moved the columns around on the Line List view as recommended by @Ernie. I did not need the required columns to be left of the Part number, but I needed it to be positioned at the 10th column (or further left) in the line list view. I moved the Part Number and Description columns further left (to see if it was a proximity to the main field), but when I moved any of the required columns to the 11th position or further right (on the line list view) then my exception message pops up.

I then disabled that in-trans data directive and tried using extended properties (adjusting the the column position in the Line List view) and for any required field being in column position 11 or higher (in the line list view) I get the standard Business Logic Error message popping up.

So, whether using Extended Properties or an in-trans Data Directive, any required fields must appear in column 10 (for further left) on the line list view or an exception is thrown when pasting in multi-lines into the line list view.

So… if you are pasting into a grid view… there are some methods that fire in field number sequence… example, if you paste a line in, the PART value will trigger any part number change BPMs… they fire in the sequence of the field columns. Quotes & Sales have many business methods that are called/triggered on change sof Part, Class, Qty, price, REv, etc.

So the paste insert has been resolved (any required field must be on the line list view in the first 10 columns or Epicor stops looking to see if the required field is populated). You can personalize your line list view so that whatever fields you make required, appear in the first 10 columns.

@timshuwy was right stating that I should use an In-Trans DATA directive for QuoteDtl to verify that the required fields are populated. The first condition that I used was ttQuoteDtl.Quoted field of the changed row is equal to true. For this to condition to trip, a user need to check the Quoted box and then Save (or attempt to move to another record, which gives you a popup to save). If you try to save and do not have one of the required fields populated, my exception is raised. What I try to do after that is to Uncheck Quoted (with a Field Setter), but it does not uncheck. If Quoted stays checked, then it keeps raising exceptions and making it more difficult to make the proper selection of the field.

How do I force Quoted to go unchecked?

1 Like

My colleagues and I are having the same issue / stuck in the same conundrum regarding trying to get the Quoted Checkbox to UNCHECK via BPM (post-proc Method Directive in our case) but for a different business purpose. Any updates on this request? I am running into all of the same road blocks. Not sure how you uncheck this box via BPM code-- can never get it to save as Quoted=False etc.

-Dylan

So My solution was to include a message in the “Raise Exception” widget. I instruct the user to uncheck the quoted button and then enter the required information.
image

1 Like

Thank you for the quick reply BKen,

This is our worst-case scenario if we absolutely cannot get the Quoted checkbox to UNCHECK via BPM code.

So far what we have tried is using standard BO Service Contracts to run the usual Update method with the Quoted field set to FALSE. Did not work. Tried the Set Field widget. Did not work. Tried running the GetQuotedInfo method before running the Update() with the service contract and that did not work. Not sure what we’re missing-- I can tell there is quite a bit of background business logic that runs when this box is checked/unchecked, and we did run a trace on it but have not been able to crack this egg. It seems like Db.Validate() is essentially cancelling out our BPM at the end because it doesn’t like what we are trying to do haha.