# 수식

## Content

**테이블 시트** 는 데이터 소스 스키마에서 계층형 데이터와 함께 사용할 수 있는 내장 수식을 지원합니다.
필드에 대한 수식을 지정하려면 데이터 소스 스키마의 `hierarchy` 옵션 내에서 **summaryFields** 옵션을 사용할 수 있습니다.
**summaryFields** 속성은 [GC.Data.IHierarchySummaryFieldCollection ](https://developer.mescius.com/spreadjs/api/modules/GC.Data#ihierarchysummaryfieldcollection)인터페이스로부터 상속됩니다.
다음 섹션에서는 계층 기반 데이터 수식의 다양한 유형을 설명합니다.

### CHILDREN

**CHILDREN** 수식은 부모 레코드에서 `levelOffset` 단계 떨어진 자식의 `fieldName`으로 지정된 값을 가져올 때 사용됩니다. 자식과 부모 간의 단계 수는 `levelOffset` 값으로 나타냅니다.
만약 `levelOffset`이 현재 레코드와 가장 낮은 자식 간의 거리보다 크면 데이터를 가져올 수 없습니다.
수식 정의는 다음과 같습니다:
`CHILDREN(levelOffset, fieldName)`

### ONLYCHILDREN

**ONLYCHILDREN** 수식은 부모가 아닌 자식의 `fieldName`으로 지정된 값을 가져올 때 사용됩니다.
수식 정의는 다음과 같습니다:
`ONLYCHILDREN(fieldName)`

### PARENT

**PARENT** 수식은 현재 레코드에서 `levelOffset` 단계 떨어진 부모의 `fieldName`으로 지정된 값을 가져올 때 사용됩니다.
부모와 현재 레코드 간의 단계 수는 `levelOffset` 값으로 나타냅니다.
만약 `levelOffset`이 현재 레코드와 최상위 부모 간의 거리보다 크면 데이터를 가져올 수 없습니다.
수식 정의는 다음과 같습니다:
`PARENT(levelOffset, fieldName)`

### LEVEL

**LEVEL** 수식은 현재 레코드의 계층 레벨을 가져오는 데 사용됩니다.
수식 정의는 다음과 같습니다:
`LEVEL()`

### LEVELROWNUMBER

**LEVELROWNUMBER** 수식은 현재 레코드가 부모 범위 내에서 몇 번째 행인지 가져오는 데 사용됩니다.
수식 정의는 다음과 같습니다:
`LEVELROWNUMBER()`

다음은 다양한 계층형 데이터 수식을 설정하는 코드 샘플입니다:

```JavaScript
window.onload = function () {
    var spread = new GC.Spread.Sheets.Workbook(_getElementById('ss'), { sheetCount: 0 });
    initSpread(spread);
};

function initSpread(spread) {
    spread.options.autoFitType = GC.Spread.Sheets.AutoFitType.cellWithHeader;
    spread.clearSheets();
    var dataManager = spread.dataManager();
    initHierarchyFormulas(spread, dataManager);
}
function initHierarchyFormulas(spread, dataManager) {
    var table = dataManager.addTable("Table", {
remote: {
    read: {
url: getBaseApiUrl() + "/Hierarchy_Formula"
    }
},
schema: {
    hierarchy: {
type: 'Parent',
column: 'parent',
summaryFields: {
    'budget': '=SUM(CHILDREN(1,"budget"))'
}
    },
    columns: {
id: {
    isPrimaryKey: true,
},
    },
}
    });

    var sheet = spread.addSheetTab(0, "HierarchyFormula", GC.Spread.Sheets.SheetType.tableSheet);
    sheet.setDefaultRowHeight(40, GC.Spread.Sheets.SheetArea.colHeader);
    sheet.options.allowAddNew = false;

    table.fetch().then(function () {
var myView = table.addView("myView", [
    { value: '=CONCAT([@department]," (L",LEVEL(),"-",LEVELROWNUMBER(),")")', caption: 'Department', width: 265, outlineColumn: true },
    { value: "budget", width: 100, caption: 'Budget' },
    { value: '=IF(LEVEL()=0,"",[@budget]/PARENT(1,"budget"))', width: 120, caption: 'Percentage', style: { formatter: '0.00%' } },
    { value: "location", width: 100, caption: 'Location' },
    { value: "phone", width: 150, caption: 'Phone' },
    { value: "country", width: 100, caption: 'Country' },
]);
spread.suspendPaint();
sheet.setDataView(myView);
spread.resumePaint();
    });
```

위 코드를 실행하면 다음과 같은 출력 결과가 표시됩니다:
![formulas-sjs.png](https://gcdocumentsitekrblob.blob.core.windows.net/document-site-files/images/df1fe1ee-eb3c-4da7-8c20-a0d8d2b7e734/formulas-sjs.63ff1e.png)