Saturday, February 18, 2017

Viewing BML print statements in log

While working with complex BML, I have always been wondering if I can see print statements for debugging that we write in BML code in some log file during quote process. Finally, found there is a way to do it and its released in 2016 R1 release.

How to enable?
Admin > General Site Options  > Enable BML Print Logging = Yes

Where to see?
Admin > Error Logs > bm.log

Use it for debugging or performance monitoring purpose. Very useful!

Don't forget to disable logging in production, it affects performance. Conditionalize your print statements using some debug flag variable in BML code.

Happy BMLing!

Saturday, February 11, 2017

Oracle CPQ - Debug Configuration rule which is using Commerce transaction data

Oracle Metalink has created a very good note on how to use commerce transaction data in Configuration rules.

How To Query Transaction Data from Commerce Into a Configuration Rule (Doc ID 1660743.1)

But it has one important not-so-highlighted point which can be very useful for debugging purpose in Configuration rule. If you want to debug such kind of rule, you can specify your transaction id in context parameters key/value pair as below and it will set this transaction in context for your bmql query.

Some snippet from above metalink note:
To test the code in the debugger, get a transaction ID from an existing quote first. Then in the debuggers Context Parameters:field, enter the following key=value pair:
bsId = (your transactionID)

Example query code from metalink note. Here quote_process is a commerce process variable name.

ret = "";

records = bmql("select quoteNumber_quote, quoteDescription_quote from commerce.quote_process");

print records;

for record in records {
     ret = ret + get (record, "quoteDescription_quote") + " " + get(record, "quoteNumber_quote") + "|^|";

records = bmql("select _group_sequence_number from commerce.line_process");

for record in records {
     print "_group_sequence_number: " + get(record, "_group_sequence_number");

return ret;