Skip to Main Content

General Development Discussions

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Interested in getting your voice heard by members of the Developer Marketing team at Oracle? Check out this post for AppDev or this post for AI focus group information.

Groovy Rules - Setup Scenario Period

Diegoffr31Apr 20 2025 — edited Apr 21 2025

Hello,

I have my Groovy script for scenario and year changes, similar to the EPBCS Planning financial module. I have a form with the "run before save" function associated with my Groovy form, in which you select parameters using a smartlist. I have a condition where if the start of the budget year or the end of the budget year is less than the current year, I get a warning message. However, if I try to update it instantly without refreshing the form, it won't let me, even if I find the correct data. It seems to be blocked.

Example:
Current Year: FY24
Budget - Beginning Year: FY23 (Error message: "The Budget Year cannot be less than the Actual Year")
Budget - Ending Year: FY34

Current Year: FY24
Budget - Beginning Year: FY25 (Won't let me update)
Budget - Ending Year: FY34

Is there any way to do it?

//***********************************************************************//

// Define dimension, create an object
Cube cubeMain = operation.application.getCube("Main")
DataGridDefinitionBuilder builder = cubeMain.dataGridDefinitionBuilder()

// Define POV
builder.addPov(['Years','Period','Entity','Scenario','Version','Custom1','Currency','HSP_View','Cost Center'],
[['No Year'],['BegBalance'],['E70'],['No Scenario'],['No Version'],['No Custom1'],['CAD'],['BaseData'], ['No Cost Center']])

// Define Column
builder.addColumn(['Data Type'], [ ['Input']])

// Define Row
builder.addRow(['Account'], [ ['ILvl0Descendants("Period Stats")']])

// Build the grid
DataGridDefinition gridDefinition = builder.build()

// Load the grid
DataGrid dataGrid = cubeMain.loadGrid(gridDefinition, false)

// Message bundles for error handling
def mbUs = messageBundle([
"validation.missingmember.SmartVariables": "The following required fields are empty: {0}",
"validation.budgetyear.invalid": "The Budget Year cannot be less than the Actual Year",
"validation.incomplete.form": "Complete all required fields before saving"
])
def mbl = messageBundleLoader(["en" : mbUs])

// List of months
List months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']

// 1. COLLECTION PHASE - Collect all values ​​first
Map<String, String> smartListValues = [:]
boolean allFieldsPresent = true

dataGrid.dataCellIterator.each { DataCell cell ->
String accountName = cell.getMemberName('Account')
String smartListValue = cell.DataAsSmartListMemberName?.trim()
smartListValues[accountName] = smartListValue

// Check if the required fields are present
if(['Period_Fiscal', 'Current_Fiscal Year', 'BegBudget_Fiscal Year', 'EndBudget_Fiscal Year'].contains(accountName) && !smartListValue) {
allFieldsPresent = false
}
}

// If not all fields are present, exit without error
if(!allFieldsPresent) {
println("Formulario incompleto - esperando que se llenen todos los campos requeridos")
return
}

// 2. VALIDATION PHASE - Check required fields only when all are present
List requiredAccounts = ['Period_Fiscal', 'Current_Fiscal Year', 'BegBudget_Fiscal Year', 'EndBudget_Fiscal Year']
List missingFields = requiredAccounts.findAll { !smartListValues[it] }

if(missingFields) {
throwVetoException(mbl, "validation.missingmember.SmartVariables", missingFields.join(', '))
}

// 3. CALCULATION PHASE - Process the collected values

// Process Fiscal Period (Current Month)
String mesActual = smartListValues['Period_Fiscal']
int currentMonthIndex = months.indexOf(mesActual)
int nextMonthIndex = (currentMonthIndex + 1) % months.size()
String MonthFcst = months[nextMonthIndex]

// Process Current Fiscal Year
String añoActual = smartListValues['Current_Fiscal Year']
String currentYearStr = añoActual.replaceAll("[^0-9]", "")
int currentYearNum = currentYearStr.toInteger()
String priorYearFormatted = "FY" + String.format("%02d", currentYearNum - 1)
String nextYearFormatted = "FY" + String.format("%02d", currentYearNum + 1)
String fcstYear = mesActual == "Dec" ? nextYearFormatted : añoActual

// Process Budget Years
String añoBegBudget = smartListValues['BegBudget_Fiscal Year']
String añoEndBudget = smartListValues['EndBudget_Fiscal Year']
int yearBegBudgetNum = añoBegBudget.replaceAll("[^0-9]", "").toInteger()
int yearEndBudgetNum = añoEndBudget.replaceAll("[^0-9]", "").toInteger()

// Validate that budget years are not less than the fiscal year
if(yearBegBudgetNum < currentYearNum || yearEndBudgetNum < currentYearNum) {
throwVetoException(mbl, "validation.budgetyear.invalid")
}

String BegBudgetYearFormatted = "FY" + String.format("%02d", yearBegBudgetNum)
String EndBudgetYearFormatted = "FY" + String.format("%02d", yearEndBudgetNum)

// Process Annual Years
String AnnualYears = smartListValues['Annual_Years'] ?: "No Year"
String EndMthlyYrsFormatted = AnnualYears == "No Year" ? EndBudgetYearFormatted : "FY" + String.format("%02d", AnnualYears.replaceAll("[^0-9]", "").toInteger() - 1)

…………

//***********************************************************************//

Best regards,

Diego Fuentes

Comments
Post Details
Added on Apr 20 2025
0 comments
61 views