Introdução
Este tutorial mostra como implementar um script Groovy que valida a entrada de dados em relação aos intervalos permitidos armazenados em um cubo de driver.
Histórico
Neste exemplo, você criará um script que será executado quando os usuários salvarem atualizações nos salários e bônus dos funcionários a partir de um formulário de entrada de dados. O script carrega dados de nível do funcionário (salário mínimo/máximo permitido e bônus mínimo/máximo permitido) de um cubo de driver em uma grade temporária na memória e, em seguida, valida os valores de salário e bônus informados em relação aos intervalos permitidos.
Pré-requisitos
Os Tutoriais Práticos do Cloud EPM podem exigir que você importe um instantâneo para sua instância do Cloud EPM Enterprise Service. Para poder importar um instantâneo de tutorial, você deve solicitar outra instância do Cloud EPM Enterprise Service ou remover seu aplicativo e processo de negócios atuais. O instantâneo do tutorial não será importado sobre seu aplicativo ou processo de negócios existente, nem substituirá ou restaurará automaticamente o aplicativo ou processo de negócios com o qual você está trabalhando no momento.
Antes de iniciar este tutorial, você deve:
- Tenha acesso do Administrador de Serviço a uma instância do Cloud EPM Enterprise Service.
- Faça upload e importe este instantâneo para sua instância do Planning. Se você já tiver feito upload do instantâneo para outro tutorial do Groovy, poderá continuar usando o mesmo instantâneo.
Observação:
Se você encontrar erros de migração importando o snapshot, execute novamente a migração excluindo o componente HSS-Shared Services, bem como os artefatos Segurança e Preferências do Usuário no componente Principal. Para obter mais informações sobre upload e importação de snapshots, consulte a documentação Administrando a Migração para o Oracle Enterprise Performance Management Cloud.Dica:
Os scripts necessários para este tutorial são vinculados como arquivos de texto em cada seção.Criando o script
- Abra o Calculation Manager e crie uma regra chamada Groovy Validate Employee Data no cubo Plan1.
- No Editor de Regras, altere a opção Designer para Editar Script e defina o Tipo de Script como Script Groovy.
- Copiar este script e colá-lo no editor.
- Na barra de ferramentas, clique em
(Salvar) para salvar o script e clique em
(Validar e Implantar) para validar e implantar o script. Clique em OK quando solicitado. Fechar o Calculation Manager.


class GradeData { Integer Grade DataGrid.DataCell minSalary DataGrid.DataCell maxSalary DataGrid.DataCell minBonus DataGrid.DataCell maxBonus public String toString() { return "minSalary: ${minSalary?.formattedValue}, maxSalary: ${maxSalary?.formattedValue}, minBonus: ${minBonus?.formattedValue}, maxBonus: ${maxBonus?.formattedValue}" } } // Create a resource bundle loader containing localized messages needed by this rule. def mbUs = messageBundle( ["validation.missingmember.grade":"No Grades found on the Grid."] ) def mbl = messageBundleLoader(["en" : mbUs]) Cube lookupCube = operation.application.getCube("Plan1") DataGridDefinitionBuilder builder = lookupCube.dataGridDefinitionBuilder() builder.addPov(['Years', 'Scenario', 'Currency', 'Period', 'Version', 'Entity'], [['FY16'], ['Current'], ['USD'], ['BegBalance'], ['BU Version_1'], ['No Entity']]) builder.addColumn(['Account'], [ ['Min Salary', 'Max Salary', 'Min Bonus', 'Max Bonus'] ]) builder.addRow(['Grades'], [ ['ILvl0Descendants("Grades")'] ]) DataGridDefinition gridDefinition = builder.build() // Load the data grid from the lookup cube DataGrid dataGrid = lookupCube.loadGrid(gridDefinition, false) // Create a map of grade data (Min/Max Salary and Bonus) by grade name from the data grid. def gradeDataMap = new HashMap() if(dataGrid) { println("dataGrid is not null") dataGrid.dataCellIterator('Min Salary').each { def gradeData = new GradeData() gradeData.minSalary = it gradeData.maxSalary = it.crossDimCell('Max Salary') gradeData.minBonus = it.crossDimCell('Min Bonus') gradeData.maxBonus = it.crossDimCell('Max Bonus') gradeDataMap[(it.getMemberName('Grades'))] = gradeData println(it.getMemberName('Grades') + ": " + gradeData) } } DataGrid grid = operation.grid // Construct an iterator that iterates over all data cells containing the Grade member. GridIterator itr = grid.dataCellIterator('Grade') // Throw a veto exception if the grid has at least one cell but does not contain any cells containing the Grade member. if(!grid.empty && !itr.hasNext()) { // Found 0 cells with Grade throwVetoException(mbl, "validation.missingmember.grade") } // Validate the values in the grid being saved against the values in gradeDataMap. itr.each { GradeData gradeData = gradeDataMap[it.DataAsSmartListMemberName] if(gradeData == null) { println("Unable to locate grade data for grade: ${it.DataAsSmartListMemberName}, with data value: ${it.formattedValue}" ) } else { println(it.getMemberName('Employee') + ": " + gradeData.toString()) DataCell salary = it.crossDimCell('Salary') if(salary == null) println("Unable to locate Salary") else if(salary.data < gradeData.minSalary.data || salary.data > gradeData.maxSalary.data) { salary.addValidationError(0xFF0000, "Salary is outside of the allowed range.") } DataCell bonus = it.crossDimCell('Bonus') if(bonus == null) { println("Unable to locate Bonus") } else if(bonus.data < gradeData.minBonus.data || bonus.data > gradeData.maxBonus.data) { bonus.addValidationError(0xFF0000, "Bonus is outside of the allowed range.") } } }
Explicando a lógica do script
Nesta seção, descreveremos a lógica do script uma seção por vez.
-
Criar uma classe.
class GradeData {
Integer Grade DataGrid.DataCell minSalary DataGrid.DataCell maxSalary DataGrid.DataCell minBonus DataGrid.DataCell maxBonus public String toString() { return "minSalary: ${minSalary?.formattedValue}, maxSalary: ${maxSalary?.formattedValue}, minBonus: ${minBonus?.formattedValue}, maxBonus: ${maxBonus?.formattedValue}"
} }
Crie uma classe,
GradeData
, para armazenar os dados de nível do funcionário (salário mínimo/máximo permitido e bônus mínimo/máximo permitido) de um cubo de driver.O método
toString()
retorna uma representação de string do objetoGradeData
. O método usa o operador seguro nulo (?.
) fornecido pelo Groovy. Se a variável antes do ponto de interrogação for nula, ela não prosseguirá e retornaráNULL
. Por exemplo,{minSalary?.formattedValue}
é avaliado como valorNULL
em vez de gerar uma exceçãoNullPointerException
seminSalary
for nulo. - Criar um carregador de bundle.
- Carregue a grade de dados do cubo de pesquisa para a região definida pelo objeto DataGridDefinition.
- Crie um mapa de dados de faixa (Salário Mín/Máx e Bônus) por nome de faixa a partir da grade de dados.
def gradeDataMap = new HashMap<String, GradeData>()
if(dataGrid) { println("dataGrid is not null") dataGrid.dataCellIterator('Min Salary').each {
def gradeData = new GradeData() gradeData.minSalary = it gradeData.maxSalary = it.crossDimCell('Max Salary') gradeData.minBonus = it.crossDimCell('Min Bonus') gradeData.maxBonus = it.crossDimCell('Max Bonus') gradeDataMap[(it.getMemberName('Grades'))] = gradeData println(it.getMemberName('Grades') + ": " + gradeData) } }
Crie um mapa chamado
gradeDataMap
de dados de nível (Salário Mín./Máx. e Bônus) por nome de nível.Preencha o mapa
gradeDataMap
com os dados de nível para cada Nível. Faixa é a chave e o objeto GradeData preenchido com o Salário Mín./Máx. e Bônus é o valor. - Construa um iterador que itere todas as células de dados que contêm o membro Grau na grade de entrada atual.
- Lançar uma exceção de veto.
- Valide os valores da grade.
// Create a resource bundle loader containing localized messages needed by this rule. def mbUs = messageBundle( ["validation.missingmember.grade":"No Grades found on the Grid."] )def mbl = messageBundleLoader(["en" : mbUs]) Cube lookupCube = operation.application.getCube("Plan1")
DataGridDefinitionBuilder builder = lookupCube.dataGridDefinitionBuilder()
builder.addPov(['Years', 'Scenario', 'Currency', 'Period', 'Version', 'Entity'], [['FY16'], ['Current'], ['USD'], ['BegBalance'], ['BU Version_1'], ['No Entity']]) builder.addColumn(['Account'], [ ['Min Salary', 'Max Salary', 'Min Bonus', 'Max Bonus'] ]) builder.addRow(['Grades'], [ ['ILvl0Descendants("Grades")'] ]) DataGridDefinition gridDefinition = builder.build()
![]()
Crie um carregador de pacote de recursos contendo mensagens localizadas necessárias para esta regra.
Obtenha o cubo do driver/pesquisa.
Obtenha um DataGridDefinitionBuilder para o cubo. Use o construtor para construir uma região a partir da qual carregar os dados adicionando os membros do PDV, os membros da coluna e as linhas.
Crie o objeto DataGridDefinition.
DataGrid dataGrid = lookupCube.loadGrid(gridDefinition, false)
DataGrid grid = operation.grid GridIterator itr = grid.dataCellIterator('Grade')
// Throw a veto exception if the grid has at least one cell but does not contain any cells containing the Grade member. if(!grid.empty && !itr.hasNext()) {// Found 0 cells with Grade throwVetoException(mbl, "validation.missingmember.grade") }
Validar se a grade de entrada tem pelo menos uma célula que contém o membro Nota. Caso contrário, gere uma exceção de veto com a mensagem localizada.
// Validate the values in the grid being saved against the values in gradeDataMap. itr.each {GradeData gradeData = gradeDataMap[it.DataAsSmartListMemberName] if(gradeData == null) { println("Unable to locate grade data for grade: ${it.DataAsSmartListMemberName}, with data value: ${it.formattedValue}" ) } else { println(it.getMemberName('Employee') + ": " + gradeData.toString()) DataCell salary = it.crossDimCell('Salary')
if(salary == null) println("Unable to locate Salary") else if(salary.data < gradeData.minSalary.data || salary.data > gradeData.maxSalary.data) { salary.addValidationError(0xFF0000, "Salary is outside of the allowed range.") } DataCell bonus = it.crossDimCell('Bonus')
if(bonus == null) { println("Unable to locate Bonus") } else if(bonus.data < gradeData.minBonus.data || bonus.data > gradeData.maxBonus.data) { bonus.addValidationError(0xFF0000, "Bonus is outside of the allowed range.") } } }
Valide os valores na grade de entrada que está sendo salva em relação aos valores em gradeDataMap. O nível na grade de entrada é uma conta do tipo lista inteligente que é derivada da hierarquia de Nível definida no cubo de pesquisa. Chamar
it.DataAsSmartListMemberName
obtém o nome do membro do qual o valor da lista inteligente da célula atual é derivado, que pode ser usado como a chave no mapa para obter os dados do nível.
Vincule a célula Salário e valide o Salário em relação ao Salário permitido nos dados de faixa.
Atravesse a célula Bônus e valide o Bônus em relação ao Bônus permitido nos dados de nota. Se o Salário ou Bônus não estiver dentro dos limites permitidos, defina a cor de fundo da célula como vermelha e adicione um erro de validação na célula chamando a API
addValidationError()
. A mensagem de erro será definida como a dica de ferramenta da célula e também será exibida nas Mensagens de Validação de Grade. Além disso, se essa regra estiver sendo executada Depois de Salvar, o sistema vetará a operação de salvamento.
Testando o script
- No Gerenciador de Formulários, edite o formulário ManageEmployees e associe a regra Groovy Validate Employee Data a ser executada Após o Carregamento e Antes de Salvar (talvez você precise selecionar Plan1 na lista de Cubos primeiro).
- Salve o formulário e feche a janela Gerenciador de formulários.
- Abra o painel Funcionários. Adicione um Bônus de 1000 para o Funcionário 1, aumente o Salário do Funcionário 2 para 65000. Na barra de ferramentas do formulário, clique em
(Salvar).
- Na caixa de diálogo Mensagem de erro, clique em OK.
- Passe o mouse sobre as células vermelhas para ver as mensagens de erro detalhadas como dicas de ferramenta.
- Feche o painel de controle e abra a console Jobs.
- Clique em Validar Dados do Funcionário do Groovy para exibir os detalhes do job. Clique no status Concluído para ver os dados do nível carregados do cubo de pesquisa e os dados do nível de cada nível do funcionário.





Links Relacionados
Mais Recursos de Aprendizagem
Explore outros laboratórios em docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal do Oracle Learning YouTube. Além disso, acesse a Oracle University para ver os recursos de treinamento disponíveis.
Para obter a documentação do produto, visite o Oracle Help Center.
Validando Valores de Entrada de Dados com Groovy
G44683-01
2025 de outubro