Groovy Cheatsheet
This section is meant as a quick library of copy/paste code snippets. For details on functions, refer to the API Documentation.
Calculated Field Set
Get the current processed item (e.g., product):
api.currentItem()
Sometimes this does not work in the debug mode; then you can use:
if (!api.isDebugMode()) { return api.currentItem() }
def currentItem = api.currentItem() != null ? api.currentItem() : api.getProduct(api.product("sku"))
- Get the attribute of the current product:
- formula:
Product("MatNr. 8 Stellen")
- Groovy:
api.product("MatNr. 8 Stellen")
- formula:
- Get the parameters for CFS:
return api.option("Add Products to Price Grid","Yes","No")?:"Yes"
Track the progress when running:
Admin > Job/TaskTracking > find CFS by its ID
Products Table
Iterate through products:
def prods = api.find("P", Filter.equal("attribute20", sku8)) for (p in prods) { api.trace("Marking for recalculation", null, p.sku) api.update("P", [ "sku" : p.sku, "attribute30" : "X" ]) }
Price Parameter
- To look up a certain row:
- formula:
VLookup(“<PP table name>", “<key of the desired row>")
- Groovy:
api.vLookup("Cockpit_Teile", "Value", "Teile")
- formula:
Iterate through all rows:
def values = api.findLookupTableValues("Reaktivierte_Stati") if (values) { for (v in values) { def a = v.name def b = v.attribute1
Product Extension
This code shows how to get a value of the attribute name. It is not possible by default from Groovy because getExtension returns a list of records that contain original names "attribute1, attribute2....".
def px1 = api.productExtension("L1_L2_prices") if (px1) { def meta = api.find("PXAM", Filter.equal("name", "L1_L2_prices"), Filter.equal("label", "RCH1001")) def attrName = meta[0].fieldName def value = px1[0].get(attrName) return value } return null
Date Time Functions
def lastUpdate = api.product("lastUpdateDate") api.trace("lastUpdate", null, lastUpdate) def date = '12/01/2014 00:00:00' def myDateTime = Date.parse( 'dd/MM/yyyy HH:mm:ss', date) api.trace("myDateTime", null, myDateTime) return lastUpdate > myDateTime
Debug:
api.trace("Product", null, product)
Global API Variables
If you use global variables, you need to check the settings of api.retainGlobal.
If the option 'api.retainGlobal defaults to TRUE' is enabled, then using api.global is enough.
If it is disabled, the calculation engine resets this variable to false
in the beginning of each record calculation and that causes that the api.global map with all gathered data is lost. If you want to enable it for a particular logic, set api.retainGlobal = true in the first element in the first line of code!
api.retainGlobal = true //optional (see above) api.global.<variable> = “hello"
CRUD Operations
Add
def map = [ pricelistId: plId, sku: item.sku, resultPrice: item.resultPrice, label: item.label, unitOfMeasure: item.unitOfMeasure, currency: item.currency, comment: item.comment ] api.add("PLI", map)
Add or Update
def product = [:] product["sku"] = “Product1" product["label"] = “The Best Product" api.addOrUpdate("P", product)
api.addOrUpdate("PX", ["name": "Scoring_MM", "sku": sku])
api.addOrUpdate("PGI", ["priceGridName" : "LifeCycleMonitor", "sku" : currentItem.sku, "label" : currentItem.label])
def large = ["lookupTableId": pp.id, "lookupTableName": pp.uniqueName, "name": "L", "attribute1": percentileHigh, "attribute2": "999999999"] api.addOrUpdate("MLTV", large)
- When debugging a logic using Test Drive, this function will NOT perform the write operation – it will skip it. However, there is a checkbox (in Test Drive) to allow execution of write operations.
- This operation will ONLY work in contexts that allow object modification (CFS, CalculationFlow and direct logic execution via JSON API).
Read Data and Search Any Table
api.find("PLI", Filter.equal("sku", mySku))
Iterate over Results of FIND Operation
As the Find operation may not give you all the results, but only 100 items or so, you can use this code:
def startRow = 0 while ( products = api.find("P", startRow, <filters>) ) { startRow += products.size() for(def product : products){ //……... } }
Update
// update the LAST_PROCESSED_ID in PricingParameters def lt = api.findLookupTable("CopyCFS") api.update("LTV", [ lookupTableId : lt.id, name : "LAST_PROCESSED_ID", value : id ])
Delete
api.delete("PX", [ name: "PMIntegration", id: id ])
Set Values in Extra Info Columns Attributes
This sample shows how to set values in additionalInfo[1,2,3] attributes (Extra Info columns) on Quotes and Agreements/Promotions via the header logic.
//Contract header logic (PromotionManager) cProcessor.updateField("ROOT", "additionalInfo3", "some text") //Quote header logic (QuoteConfigurator) quoteProcessor.updateField("ROOT", "additionalInfo3", "some text")
Get Value of Another Element of the Pricing Logic
api.getElement("<element_name>")
Get Attribute Value by Name
api.getPropertyByElementName(pgi, "SomeLabel")
Syntax Check Hack
Sometimes the syntax check is ok but you still cannot save the logic. Then use:
api.isSyntaxCheck()
This will check if your code is ok, even if the validator does not evaluate it this way. See also How to Save Logic that Is Evaluated as Erroneous by Syntax Checker.
Custom Monitoring
def grafanaMetrics = [:] grafanaMetrics["myCSFfinished"] = 1 api.sendMetrics()
Found an issue in documentation? Write to us.