在 Financial Consolidation and Close 表單中輸入和顯示年初至今 (YTD) 資料時,通常需要在表單設計中包含兩個「檢視」成員:YTD_Input 和 YTD。這種規定會使表單設計變得複雜。以下範例利用 Groovy 指令碼避開上述規定,而且表單中只包含「YTD 檢視」成員,然後 Groovy 指令碼會正確管理輸入資料。使用這種方法可以實現更易於管理的表單設計和顯示。
若要建立 Groovy 規則來直接向 FCCS_YTD 成員輸入資料:
在名為 "PreFormLoad" 的 Calculation Manager 中新增隨需規則。
將隨需規則的指令碼類型變更為「Groovy 指令碼」。
將以下程式碼新增至 "PreFormLoad" 規則:
operation.grid.dataCellIterator("FCCS_YTD").each { DataCell cell -> if (!cell.crossDimCell("FCCS_YTD_Input") && cell.isReadOnly())cell.forceEditable=true}
儲存並驗證 "PreFormLoad" 規則。
為 "PreFormLoad" 規則提供預設的「執行時期提示」值,如下所示:
Consolidation: "Entity Input"
Currency: "Entity Currency"
Entity: "FCCS_Global Assumptions"
Period: "Jul"
Scenario: "Actual"
Years "FY19"
勾選 "PreFormLoad" 規則所有六個「執行時期」提示的已隱藏和作為置換值選項。
儲存、驗證和部署 "PreFormLoad" 規則。
在名為 "PreFormSave" 的 Calculation Manager 中新增隨需規則。
將隨需規則的指令碼類型變更為「Groovy 指令碼」。
將以下程式碼新增至 "PreFormSave" 規則:
def app = operation.application Cube cube = operation.cube Member ytdInputMember = app.getDimension(DimensionType.VERSION).getMember("FCCS_YTD_Input") Collection<DataCell> pendingYtdCells = operation.grid.dataCellIterator("FCCS_YTD").findAll {DataCell ytd -> if (ytd.edited) { def ytdInput = ytd.crossDimCell(ytdInputMember.name) ytdInput?.formattedValue = ytd.formattedValue ytd.setEdited(false) return ytdInput == null } } if (pendingYtdCells) { DataGridBuilder builder = cube.dataGridBuilder("MM/DD/YYYY") Set<String> allDimNames = set(app.getDimensions(cube)*.name) List<String> rowDimNames = set((allDimNames - operation.grid.pov*.dimName) - [ytdInputMember.dimension.name]) as List builder.addPov(operation.grid.pov.findAll({it.dimName != ytdInputMember.dimension.name})*.uniqueMbrName as String[]) builder.addColumn(ytdInputMember.name) pendingYtdCells.each {DataCell cell -> builder.addRow(rowDimNames.collect {cell.getMemberName(it, MemberNameType.UNIQUE_NAME)}, [cell.formattedValue])} DataGridBuilder.Status status = new DataGridBuilder.Status() builder.build(status).withCloseable {grid -> cube.saveGrid(grid)} } Set<String> set(Collection<String> names) { Set<String> set = new TreeSet<>(String.CASE_INSENSITIVE_ORDER) set.addAll(names) return set }
儲存並驗證 "PreFormSave" 規則。
為 "PreFormSave" 規則提供預設的「執行時期提示」值,如下所示:
Consolidation: "Entity Input"
Currency: "Entity Currency"
Entity: "FCCS_Global Assumptions"
Period: "Jul"
Scenario: "Actual"
Years "FY19"
勾選 "PreFormSave" 規則所有六個「執行時期」提示的已隱藏和作為置換值選項。
儲存、驗證和部署 "PreFormSave" 規則。
新增一個名為 "YTD_Test_1" 的表單並在各列上新增 "FCCS_Periodic" 和 "FCCS_YTD",如下所示:
YTD 表單範例
按一下商業規則頁籤,將 "Consol – Rule – PreFormSave" 和 "Consol – Rule – PreFormLoad" 移至右側。為 "Consol – Run – PreFormSave" 規則勾選儲存前執行,然後為 "Consol – Run – PreFormLoad" 規則勾選載入後執行。畫面應顯示如下:
商業規則範例
儲存並按一下完成。
注意:這些步驟會將 "Actual"/ "FY19" "Jul" "FCCS_Global Assumptions" 資料標記為「已變更」。確定整個程序單元已啟動並處於「已解除鎖定」狀態。這僅適用於此原型。真正的實作不會有這些限制。
開啟「YTD_Test_1 表單」,並將值新增至 FCCS_YTD,如下所示:
YTD 值範例
儲存表單。FCCS_Periodic 會被植入相應的「定期」值,如下所示:
植入的 YTD 表單範例