@bimatrix-aud-platform/aud_mcp_server 1.1.19 → 1.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -56,7 +56,9 @@ export function fixMtsd(filePath) {
56
56
  fixOlapGridFields(doc, datas, fixes);
57
57
  // Rule 2-2: OlapGrid Fields 내 CreateType=1 (Measures) 필드 보정
58
58
  fixOlapMeasuresField(doc, fixes);
59
- // Rule 3: DataSource Params에 Value 누락 보정
59
+ // Rule 3: Enum/Range 범위 초과 보정
60
+ fixEnumAndRangeValues(doc, datas, fixes);
61
+ // Rule (disabled): DataSource Params에 Value 누락 보정
60
62
  //fixParamsMissingValue(datas, fixes);
61
63
  // Rule 4: DataSource Columns에 Type 누락 보정
62
64
  //fixColumnsMissingType(datas, fixes);
@@ -308,6 +310,156 @@ const BORDER_DEFAULTS = {
308
310
  // });
309
311
  // }
310
312
  // }
313
+ // ---- Rule 3: Enum/Range 값 범위 초과 보정 ----
314
+ // string enum 검증: 허용값에 없으면 기본값으로 보정
315
+ function fixStringEnum(obj, key, allowed, defaultVal, path, fixes) {
316
+ if (!(key in obj))
317
+ return;
318
+ const val = obj[key];
319
+ if (typeof val !== "string" || !allowed.includes(val)) {
320
+ obj[key] = defaultVal;
321
+ fixes.push(`[Rule3] ${path}.${key}: "${val}" → "${defaultVal}" 보정 (허용값: ${allowed.join(", ")})`);
322
+ }
323
+ }
324
+ // integer 범위 검증: min~max 범위 밖이면 기본값으로 보정
325
+ function fixIntRange(obj, key, min, max, defaultVal, path, fixes) {
326
+ if (!(key in obj))
327
+ return;
328
+ const val = obj[key];
329
+ if (typeof val !== "number" || !Number.isInteger(val) || val < min || val > max) {
330
+ obj[key] = defaultVal;
331
+ fixes.push(`[Rule3] ${path}.${key}: ${val} → ${defaultVal} 보정 (범위: ${min}~${max})`);
332
+ }
333
+ }
334
+ // integer enum 검증: 허용 값 집합에 없으면 기본값으로 보정 (비연속 enum용)
335
+ function fixIntEnum(obj, key, allowed, defaultVal, path, fixes) {
336
+ if (!(key in obj))
337
+ return;
338
+ const val = obj[key];
339
+ if (typeof val !== "number" || !allowed.includes(val)) {
340
+ obj[key] = defaultVal;
341
+ fixes.push(`[Rule3] ${path}.${key}: ${val} → ${defaultVal} 보정 (허용값: ${allowed.join(", ")})`);
342
+ }
343
+ }
344
+ // RGBA 색상 clamp (0~255)
345
+ function clampColorRGBA(obj, path, fixes) {
346
+ if (!obj || typeof obj !== "object")
347
+ return;
348
+ for (const key of ["R", "G", "B", "A", "ColorR", "ColorG", "ColorB", "ColorA"]) {
349
+ if (!(key in obj))
350
+ continue;
351
+ const val = obj[key];
352
+ if (typeof val !== "number")
353
+ continue;
354
+ if (val < 0) {
355
+ obj[key] = 0;
356
+ fixes.push(`[Rule3] ${path}.${key}: ${val} → 0 보정 (범위: 0~255)`);
357
+ }
358
+ else if (val > 255) {
359
+ obj[key] = 255;
360
+ fixes.push(`[Rule3] ${path}.${key}: ${val} → 255 보정 (범위: 0~255)`);
361
+ }
362
+ }
363
+ }
364
+ function fixEnumAndRangeValues(doc, datas, fixes) {
365
+ // ── 1. ReportInfo ──
366
+ const ri = doc.ReportInfo;
367
+ if (ri) {
368
+ fixIntRange(ri, "TabPosition", 0, 2, 0, "ReportInfo", fixes); // 기본값: 1(None)
369
+ fixIntRange(ri, "RefreshType", 0, 1, 0, "ReportInfo", fixes); // 기본값: 0(All)
370
+ }
371
+ // ── 2. DataSources ──
372
+ for (const ds of datas) {
373
+ const dsPath = `DataSource("${ds.Name || ds.Id || "?"}")`;
374
+ fixIntRange(ds, "DSType", 0, 5, 2, dsPath, fixes); // 기본값: 2(DataSource)
375
+ }
376
+ // ── 3. FormStyle ──
377
+ const forms = doc.Forms || [];
378
+ for (const form of forms) {
379
+ if (form.Style) {
380
+ fixIntRange(form.Style, "Type", 0, 2, 0, `Form("${form.Name}").Style`, fixes); // 기본값: 0(Skin)
381
+ }
382
+ }
383
+ // ── 4. Elements (walkElements 순회) ──
384
+ for (const form of forms) {
385
+ const elements = form.Elements || [];
386
+ walkElements(elements, (el, path) => {
387
+ // ---- Style.Border.LineType ----
388
+ const border = el.Style?.Border;
389
+ if (border) {
390
+ fixStringEnum(border, "LineType", ["none", "solid", "dashed", "dotted"], "solid", // 기본값: "solid"
391
+ `${path}.Style.Border`, fixes);
392
+ clampColorRGBA(border, `${path}.Style.Border`, fixes);
393
+ if (border.Color)
394
+ clampColorRGBA(border.Color, `${path}.Style.Border.Color`, fixes);
395
+ }
396
+ // ---- Style.Font.HorizontalAlignment / VerticalAlignment ----
397
+ const font = el.Style?.Font;
398
+ if (font) {
399
+ fixStringEnum(font, "HorizontalAlignment", ["left", "center", "right"], "left", // 기본값: "left"
400
+ `${path}.Style.Font`, fixes);
401
+ fixStringEnum(font, "VerticalAlignment", ["top", "middle", "bottom"], "middle", // 기본값: "middle"
402
+ `${path}.Style.Font`, fixes);
403
+ if (font.Color)
404
+ clampColorRGBA(font.Color, `${path}.Style.Font.Color`, fixes);
405
+ }
406
+ // ---- Style.Background Color ----
407
+ const bg = el.Style?.Background;
408
+ if (bg) {
409
+ clampColorRGBA(bg, `${path}.Style.Background`, fixes);
410
+ if (bg.Color)
411
+ clampColorRGBA(bg.Color, `${path}.Style.Background.Color`, fixes);
412
+ }
413
+ // ---- DataGrid / TreeGrid Columns ----
414
+ if ((el.Type === "DataGrid" || el.Type === "TreeGrid") && Array.isArray(el.Columns)) {
415
+ for (let i = 0; i < el.Columns.length; i++) {
416
+ const col = el.Columns[i];
417
+ const colPath = `${path}.Columns[${i}]("${col.Name || ""}")`;
418
+ fixStringEnum(col, "HeaderPosition", ["left", "center", "right", "start", "end"], "center", // 기본값: "center"
419
+ colPath, fixes);
420
+ fixStringEnum(col, "TextPosition", ["left", "center", "right", "start", "end"], "left", // 기본값: "left"
421
+ colPath, fixes);
422
+ // 0:None, 1:Text, 2:CheckBox, 3:NumberBox, 4:ComboBox, 5:DateTime, 6:MaskEdit, 8:Image, 9:MultiLineText, 10:TrendLine, 11:SingleBarChart, 12:ColorPicker, 15:Time
423
+ fixIntEnum(col, "ColumnType", [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 15], 1, colPath, fixes); // 기본값: 0(None)
424
+ fixIntRange(col, "KeyType", 0, 3, 2, colPath, fixes); // 기본값: 2(Nullable)
425
+ fixIntRange(col, "DataType", 0, 2, 0, colPath, fixes); // 기본값: 1(String)
426
+ }
427
+ }
428
+ // ---- OlapGrid Fields ----
429
+ if (el.Type === "OlapGrid") {
430
+ const fields = el.iOLAPView?.Fields;
431
+ if (fields && Array.isArray(fields)) {
432
+ for (const field of fields) {
433
+ const fPath = `${path}.Fields["${field.Key || "?"}"]`;
434
+ fixIntRange(field, "Category", 0, 4, 1, fPath, fixes); // 0:Default, 1:Dimension, 2:Measure, 3:Attribute, 4:Period
435
+ fixIntRange(field, "Area", 0, 4, 3, fPath, fixes); // 0:Hidden, 1:Row, 2:Column, 3:Filter, 4:Data
436
+ // 0:None, 1:Sum, 2:Min, 3:Max, 4:Average, 5:Count, 9:Calculate, 13:DistinctCount, 14:Text
437
+ fixIntEnum(field, "SummaryType", [0, 1, 2, 3, 4, 5, 9, 13, 14], 0, fPath, fixes);
438
+ fixIntRange(field, "TotalSummaryType", 0, 5, 0, fPath, fixes); // 0:None, 1:SumOfChild, 2:MinOfChild, 3:MaxOfChild, 4:AverageOfChild, 5:CountOfChild
439
+ // 0:None, 1:Absolute, 2:Percent, 3:PercentOfColumn, 4:PercentOfRow, 5:SubTotalPercentOfColumn, 6:SubTotalPercentOfRow, 7~12:Running*, 15:FirstPeriod, 16:LastPeriod, 17:PeriodIncrease, 18:PeriodIncreaseRate
440
+ fixIntEnum(field, "SummaryVariation", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 16, 17, 18], 0, fPath, fixes);
441
+ fixIntRange(field, "GroupByType", 0, 8, 0, fPath, fixes); // 0:Auto ~ 8:AlwaysGroupBy
442
+ fixIntRange(field, "SortType", 0, 5, 0, fPath, fixes); // 0:None, 1:Asc, 2:Desc, 3:Custom, 4:MeasureAsc, 5:MeasureDesc
443
+ fixIntRange(field, "CreateType", 0, 3, 0, fPath, fixes); // 0:Default, 1:Measures, 2:DimensionGroup, 3:HierarchyGroup
444
+ fixIntRange(field, "KeyType", 0, 3, 2, fPath, fixes); // 0:None, 1:NotNull, 2:NullAble, 3:Primary
445
+ fixIntRange(field, "DataType", 0, 5, 0, fPath, fixes); // 0:Numeric, 1:String, 2:DateTime8, 3:DateTimeNow, 4:UserCode, 5:CLOB
446
+ fixIntRange(field, "SaveMode", 0, 2, 0, fPath, fixes); // 0:All, 1:InsertOnly, 2:UpdateOnly
447
+ // ---- FilterInfo (IOlapFilter) ----
448
+ const fi = field.FilterInfo;
449
+ if (fi && typeof fi === "object") {
450
+ const fiPath = `${fPath}.FilterInfo`;
451
+ fixIntRange(fi, "FilterType", 0, 7, 0, fiPath, fixes); // 0:In, 1:NotIn, 2:Like, 3:NotLike, 4:BetWeen, 5:StartWith, 6:EndWith, 7:Equals
452
+ fixIntRange(fi, "FilterKind", 0, 1, 0, fiPath, fixes); // 0:Dimension, 1:Measure
453
+ fixIntRange(fi, "MeasureFilterTypeA", 0, 5, 0, fiPath, fixes); // 0:Equals, 1:Greater, 2:GreaterOrEquals, 3:Less, 4:LessOrEquals, 5:NotEquals
454
+ fixIntRange(fi, "MeasureFilterTypeB", 0, 5, 0, fiPath, fixes); // 0:Equals, 1:Greater, 2:GreaterOrEquals, 3:Less, 4:LessOrEquals, 5:NotEquals
455
+ fixIntRange(fi, "MeasureAndOrOperator", 0, 2, 2, fiPath, fixes); // 0:None, 1:Or, 2:And (기본값: 2)
456
+ }
457
+ }
458
+ }
459
+ }
460
+ });
461
+ }
462
+ }
311
463
  // ---- 유틸: Element 트리 순회 ----
312
464
  function walkElements(elements, callback, parentPath = "") {
313
465
  for (const el of elements) {
package/dist/index.js CHANGED
@@ -545,7 +545,7 @@ const tools = [
545
545
  },
546
546
  {
547
547
  name: "fix_mtsd",
548
- description: "MTSD 파일을 읽어 자동 보정 규칙을 적용하고 파일을 덮어씁니다. DataSource Name→Id 참조 보정, Params Value 누락 보정, Columns Type 누락 보정, Docking/Border 필수 속성 보정을 수행합니다.",
548
+ description: "MTSD 파일을 읽어 자동 보정 규칙을 적용하고 파일을 덮어씁니다. [Rule1] DataSource Name→Id 참조 보정, [Rule2] OlapGrid DataSource 기반 Fields 자동 생성, [Rule2-2] OlapGrid Fields 내 CreateType=1 중복 보정 (#MEASURES_HEADER#만 허용), [Rule3] Enum/Range 값 범위 초과 보정 (Border.LineType, Font 정렬, Color RGBA clamp, GridColumn 속성, OlapField 속성 등), Params ParamType 누락 보정을 수행합니다.",
549
549
  inputSchema: {
550
550
  type: "object",
551
551
  properties: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bimatrix-aud-platform/aud_mcp_server",
3
- "version": "1.1.19",
3
+ "version": "1.1.21",
4
4
  "description": "MCP Server for i-AUD MTSD document validation and generation",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -115,7 +115,7 @@ export interface IDataSource {
115
115
  ConnectionCode: string;
116
116
  /** SQL 쿼리 암호화 여부 */
117
117
  Encrypted: boolean;
118
- /** 데이터소스 타입 (0: DataSource, 1: MetaData, 2: Template, 3: ServerDataSource) */
118
+ /** 데이터소스 타입 (0:메타 템플릿,1:메타 쿼리, 2:일반 SQL,3:OLAP Drill to Detail,4:공통데이터소스,5:메타 필터) */
119
119
  DSType: number;
120
120
  /** 실행할 SQL 쿼리문 */
121
121
  SQL: string;
@@ -657,13 +657,13 @@ export interface IGridColumn {
657
657
  Resizable?: boolean;
658
658
  /** 내보내기 포함 여부 */
659
659
  UseExport?: boolean;
660
- /** 컬럼 타입 (0: Text, 1: CheckBox, 2: ComboBox ) */
660
+ /** 컬럼 타입 (0:None, 1:Text, 2:CheckBox, 3:NumberBox, 4:ComboBox, 5:DateTime, 6:MaskEdit, 8:Image, 9:MultiLineText, 10:TrendLine, 11:SingleBarChart, 12:ColorPicker, 15:Time) */
661
661
  ColumnType?: number;
662
662
  /** 커서 타입 */
663
663
  CursorType?: string;
664
- /** 키 타입 (0: None, 1: Primary, 2: Foreign 등) */
664
+ /** 키 타입 (0:None, 1:NotNull, 2:Nullable, 3:Primary) */
665
665
  KeyType: number;
666
- /** 데이터 타입 (0: String, 1: Number, 2: Date ) */
666
+ /** 데이터 타입 (0:Numeric, 1:String, 2:DateTime8(yyyyMMdd), 3:DateTimeNow, 4:UserCode, 5:CLOB, 7:UUID) */
667
667
  DataType?: number;
668
668
  /** 헤더 텍스트 정렬 */
669
669
  HeaderPosition: 'left' | 'center' | 'right' | 'start' | 'end';
@@ -1433,17 +1433,17 @@ export interface IOlapField {
1433
1433
  ToolTipField?: string;
1434
1434
  /** 툴팁 텍스트 */
1435
1435
  ToolTipText?: string;
1436
- /** 필드 카테고리 (0: Dimension, 1: Measure, 2: Attribute, 3: Period, 4: Datas) */
1436
+ /** 필드 카테고리 (0: Default, 1: Dimension, 2: Measure, 3: Attribute, 4: Period) */
1437
1437
  Category: number;
1438
- /** 필드 영역 (0: None, 1: Row, 2: Column, 3: Data, 4: Filter) */
1438
+ /** 필드 영역 (0:Hidden, 1:Row, 2:Column, 3:Filter, 4:Data) */
1439
1439
  Area: number;
1440
- /** 요약 유형 (0: Sum, 1: Count, 2: Average, 3: Min, 4: Max ) */
1440
+ /** 요약 유형 (0 : None, 1: Sum, 2:Min, 3:Max, 4:Average, 5:Count, 9:Calculate, 13:DistinctCount, 14:Text) */
1441
1441
  SummaryType: number;
1442
- /** 합계 요약 유형 */
1442
+ /** 합계 요약 유형 (0:None, 1:SumOfChild, 2:MinOfChild, 3:MaxOfChild, 4:AverageOfChild, 5:CountOfChild) */
1443
1443
  TotalSummaryType?: number;
1444
- /** 요약 변형 (0: None, 1: PercentOfGrandTotal ) */
1444
+ /** 요약 변형 (0:None, 1:Absolute, 2:Percent, 3:PercentOfColumn, 4:PercentOfRow, 5:SubTotalPercentOfColumn, 6:SubTotalPercentOfRow, 7:RunningAverage, 8:RunningCount, 9:RunningMax, 10:RunningMin, 11:RunningProduct, 12:RunningSum, 15:FirstPeriod, 16:LastPeriod, 17:PeriodIncrease, 18:PeriodIncreaseRate) */
1445
1445
  SummaryVariation?: number;
1446
- /** 그룹 함수 유형 */
1446
+ /** 그룹 함수 유형 (0:Auto, 1:Sum, 2:Count, 3:Max, 4:Min, 5:Average, 6:DistinctCount, 7:None, 8:AlwaysGroupBy) */
1447
1447
  GroupByType?: number;
1448
1448
  /** 표시 포맷 */
1449
1449
  Format?: string;
@@ -1459,7 +1459,7 @@ export interface IOlapField {
1459
1459
  Unit?: string;
1460
1460
  /** 생성 유형 (0:Default, 1:Measures(특수필드로 다른 Measure필드의 집합, Files내 1개만 자동 생성됨), 2:DimensionGroup, 3:HierarchyGroup) */
1461
1461
  CreateType?: number;
1462
- /** 정렬 유형 (0: None, 1: Asc, 2: Desc) */
1462
+ /** 정렬 유형 (0:None, 1:Asc, 2:Desc, 3:Custom, 4:MeasureAsc, 5:MeasureDesc) */
1463
1463
  SortType?: number;
1464
1464
  /** 측정값 정렬 기준 필드 */
1465
1465
  MeasureSortField?: string;
@@ -1479,11 +1479,11 @@ export interface IOlapField {
1479
1479
  AllowColumn?: boolean;
1480
1480
  /** 데이터 허용 여부 */
1481
1481
  AllowData?: boolean;
1482
- /** 키 유형 */
1482
+ /** 키 유형 (0:None, 1:NotNull, 2:NullAble, 3:Primary) */
1483
1483
  KeyType?: number;
1484
- /** 데이터 유형 */
1484
+ /** 데이터 유형 (0:Numeric, 1:String, 2:DateTime8, 3:DateTimeNow, 4:UserCode, 5:CLOB) */
1485
1485
  DataType?: number;
1486
- /** 저장 모드 */
1486
+ /** 저장 모드 (0:All, 1:InsertOnly, 2:UpdateOnly) */
1487
1487
  SaveMode?: number;
1488
1488
  /** 다국어 코드 */
1489
1489
  LanguageCode?: string;
@@ -1572,17 +1572,17 @@ export interface IOlapDimensionGroupItem {
1572
1572
  * @see src/control/olapgrid/iOLAP.Model.ts - OlapFilter.Serialize()
1573
1573
  */
1574
1574
  export interface IOlapFilter {
1575
- /** 필터 유형 */
1575
+ /** 필터 유형 enOlapFilterType (0:In, 1:NotIn, 2:Like, 3:NotLike, 4:BetWeen, 5:StartWith, 6:EndWith, 7:Equals) */
1576
1576
  FilterType?: number;
1577
- /** 필터 종류 */
1577
+ /** 필터 종류 enOlapFilterKind (0:Dimension, 1:Measure) */
1578
1578
  FilterKind?: number;
1579
1579
  /** 측정값 필터 존재 여부 */
1580
1580
  HasMeasureFilter?: boolean;
1581
- /** 측정값 필터 유형 A */
1581
+ /** 측정값 필터 유형 A enOlapMeasureFilterType (0:Equals, 1:Greater, 2:GreaterOrEquals, 3:Less, 4:LessOrEquals, 5:NotEquals) */
1582
1582
  MeasureFilterTypeA?: number;
1583
- /** 측정값 필터 유형 B */
1583
+ /** 측정값 필터 유형 B enOlapMeasureFilterType (0:Equals, 1:Greater, 2:GreaterOrEquals, 3:Less, 4:LessOrEquals, 5:NotEquals) */
1584
1584
  MeasureFilterTypeB?: number;
1585
- /** 측정값 AND/OR 연산자 */
1585
+ /** 측정값 AND/OR 연산자 enAndOrOperator (0:None, 1:Or, 2:And) */
1586
1586
  MeasureAndOrOperator?: number;
1587
1587
  /** 측정값 필터 값 A */
1588
1588
  MeasureFilterValueA?: number;
@@ -102,7 +102,7 @@
102
102
  "UseCache": { "type": "boolean", "description": "쿼리 결과 캐싱 사용 여부" },
103
103
  "ConnectionCode": { "type": "string", "description": "연결된 DB 커넥션 코드" },
104
104
  "Encrypted": { "type": "boolean", "description": "SQL 쿼리 암호화 여부" },
105
- "DSType": { "type": "integer", "enum": [0, 1, 2, 3], "description": "데이터소스 타입 (0:DataSource, 1:MetaData, 2:Template, 3:ServerDataSource)" },
105
+ "DSType": { "type": "integer", "enum": [0, 1, 2, 3,4,5], "description": "데이터소스 타입 (0:메타 템플릿,1:메타 쿼리, 2:일반 SQL,3:OLAP Drill to Detail,4:공통데이터소스,5:메타 필터)" },
106
106
  "SQL": { "type": "string", "description": "실행할 SQL 쿼리문" },
107
107
  "Params": {
108
108
  "type": "array",
@@ -1019,12 +1019,12 @@
1019
1019
  "Caption": { "type": "string", "description": "필드 캡션" },
1020
1020
  "ToolTipField": { "type": "string", "description": "툴팁 필드 키" },
1021
1021
  "ToolTipText": { "type": "string", "description": "툴팁 텍스트" },
1022
- "Category": { "type": "number", "description": "카테고리 (0:Dimension, 1:Measure, 2:Attribute, 3:Period, 4:Datas)" },
1023
- "Area": { "type": "number", "description": "영역 (0:None, 1:Row, 2:Column, 3:Data, 4:Filter)" },
1024
- "SummaryType": { "type": "number", "description": "요약 유형 (0:Sum, 1:Count, 2:Average, 3:Min, 4:Max )" },
1025
- "TotalSummaryType": { "type": "number", "description": "합계 요약 유형" },
1026
- "SummaryVariation": { "type": "number", "description": "요약 변형" },
1027
- "GroupByType": { "type": "number", "description": "그룹 함수 유형" },
1022
+ "Category": { "type": "number", "description": "카테고리 (0: Default, 1: Dimension, 2: Measure, 3: Attribute, 4: Period)" },
1023
+ "Area": { "type": "number", "description": "영역 (0:Hidden, 1:Row, 2:Column, 3:Filter, 4:Data)" },
1024
+ "SummaryType": { "type": "number", "description": "요약 유형 (0 : None, 1: Sum, 2:Min, 3:Max, 4:Average, 5:Count, 9:Calculate, 13:DistinctCount, 14:Text)" },
1025
+ "TotalSummaryType": { "type": "number", "description": "합계 요약 유형 (0:None, 1:SumOfChild, 2:MinOfChild, 3:MaxOfChild, 4:AverageOfChild, 5:CountOfChild)" },
1026
+ "SummaryVariation": { "type": "number", "description": "요약 변형 (0:None, 1:Absolute, 2:Percent, 3:PercentOfColumn, 4:PercentOfRow, 5:SubTotalPercentOfColumn, 6:SubTotalPercentOfRow, 7:RunningAverage, 8:RunningCount, 9:RunningMax, 10:RunningMin, 11:RunningProduct, 12:RunningSum, 15:FirstPeriod, 16:LastPeriod, 17:PeriodIncrease, 18:PeriodIncreaseRate)" },
1027
+ "GroupByType": { "type": "number", "description": "그룹 함수 유형 (0:Auto, 1:Sum, 2:Count, 3:Max, 4:Min, 5:Average, 6:DistinctCount, 7:None, 8:AlwaysGroupBy)" },
1028
1028
  "Format": { "type": "string", "description": "표시 포맷" },
1029
1029
  "Formula": { "type": "string", "description": "수식" },
1030
1030
  "Formula2": { "type": "string", "description": "수식 2" },
@@ -1032,7 +1032,7 @@
1032
1032
  "Width": { "type": "number", "description": "필드 너비" },
1033
1033
  "Unit": { "type": "string", "description": "단위" },
1034
1034
  "CreateType": { "type": "number", "description": "생성 유형 (0:Default, 1:Measures(특수필드로 다른 Measure필드의 집합, Files내 1개만 자동 생성됨), 2:DimensionGroup, 3:HierarchyGroup)" },
1035
- "SortType": { "type": "number", "description": "정렬 유형 (0:None, 1:Asc, 2:Desc)" },
1035
+ "SortType": { "type": "number", "description": "정렬 유형 (0:None, 1:Asc, 2:Desc, 3:Custom, 4:MeasureAsc, 5:MeasureDesc)" },
1036
1036
  "MeasureSortField": { "type": "string", "description": "측정값 정렬 기준 필드" },
1037
1037
  "SortBaseField": { "type": "string", "description": "정렬 기준 필드" },
1038
1038
  "MoveAble": { "type": "boolean", "description": "이동 가능" },
@@ -1042,9 +1042,9 @@
1042
1042
  "AllowRow": { "type": "boolean", "description": "행 허용" },
1043
1043
  "AllowColumn": { "type": "boolean", "description": "열 허용" },
1044
1044
  "AllowData": { "type": "boolean", "description": "데이터 허용" },
1045
- "KeyType": { "type": "number", "description": "키 유형" },
1046
- "DataType": { "type": "number", "description": "데이터 유형" },
1047
- "SaveMode": { "type": "number", "description": "저장 모드" },
1045
+ "KeyType": { "type": "number", "description": "키 유형 (0:None, 1:NotNull, 2:NullAble, 3:Primary)" },
1046
+ "DataType": { "type": "number", "description": "데이터 유형 (0:Numeric, 1:String, 2:DateTime8, 3:DateTimeNow, 4:UserCode, 5:CLOB)" },
1047
+ "SaveMode": { "type": "number", "description": "저장 모드 (0:All, 1:InsertOnly, 2:UpdateOnly)" },
1048
1048
  "LanguageCode": { "type": "string", "description": "다국어 코드" },
1049
1049
  "UseChartSource": { "type": "boolean", "description": "차트 소스 사용" },
1050
1050
  "VisibleSubTotal": { "type": "boolean", "description": "소계 표시" },
@@ -1096,12 +1096,12 @@
1096
1096
  "type": "object",
1097
1097
  "description": "OLAP 필터",
1098
1098
  "properties": {
1099
- "FilterType": { "type": "number", "description": "필터 유형" },
1100
- "FilterKind": { "type": "number", "description": "필터 종류" },
1099
+ "FilterType": { "type": "number", "description": "필터 유형 enOlapFilterType (0:In, 1:NotIn, 2:Like, 3:NotLike, 4:BetWeen, 5:StartWith, 6:EndWith, 7:Equals)" },
1100
+ "FilterKind": { "type": "number", "description": "필터 종류 enOlapFilterKind (0:Dimension, 1:Measure)" },
1101
1101
  "HasMeasureFilter": { "type": "boolean", "description": "측정값 필터 존재 여부" },
1102
- "MeasureFilterTypeA": { "type": "number", "description": "측정값 필터 유형 A" },
1103
- "MeasureFilterTypeB": { "type": "number", "description": "측정값 필터 유형 B" },
1104
- "MeasureAndOrOperator": { "type": "number", "description": "측정값 AND/OR 연산자" },
1102
+ "MeasureFilterTypeA": { "type": "number", "description": "측정값 필터 유형 A enOlapMeasureFilterType (0:Equals, 1:Greater, 2:GreaterOrEquals, 3:Less, 4:LessOrEquals, 5:NotEquals)" },
1103
+ "MeasureFilterTypeB": { "type": "number", "description": "측정값 필터 유형 B enOlapMeasureFilterType (0:Equals, 1:Greater, 2:GreaterOrEquals, 3:Less, 4:LessOrEquals, 5:NotEquals)" },
1104
+ "MeasureAndOrOperator": { "type": "number", "description": "측정값 AND/OR 연산자 enAndOrOperator (0:None, 1:Or, 2:And)" },
1105
1105
  "MeasureFilterValueA": { "type": "number", "description": "측정값 필터 값 A" },
1106
1106
  "MeasureFilterValueB": { "type": "number", "description": "측정값 필터 값 B" },
1107
1107
  "Values": { "type": "array", "description": "필터 값 배열" }
@@ -1325,10 +1325,10 @@
1325
1325
  "Mergeable": { "type": "boolean" },
1326
1326
  "Resizable": { "type": "boolean" },
1327
1327
  "UseExport": { "type": "boolean" },
1328
- "ColumnType": { "type": "integer", "description": "컬럼 타입 (0:Text, 1:CheckBox, 2:ComboBox)" },
1328
+ "ColumnType": { "type": "integer", "description": "컬럼 타입 (0:None, 1:Text, 2:CheckBox, 3:NumberBox, 4:ComboBox, 5:DateTime, 6:MaskEdit, 8:Image, 9:MultiLineText, 10:TrendLine, 11:SingleBarChart, 12:ColorPicker, 15:Time)" },
1329
1329
  "CursorType": { "type": "string" },
1330
- "KeyType": { "type": "integer", "description": "키 타입 (0:None, 1:Primary, 2:Foreign)" },
1331
- "DataType": { "type": "integer", "description": "데이터 타입 (0:String, 1:Number, 2:Date)" },
1330
+ "KeyType": { "type": "integer", "description": "키 타입 (0:None, 1:NotNull, 2:Nullable, 3:Primary)" },
1331
+ "DataType": { "type": "integer", "description": "데이터 타입 (0:Numeric, 1:String, 2:DateTime8(yyyyMMdd), 3:DateTimeNow, 4:UserCode, 5:CLOB, 7:UUID)" },
1332
1332
  "HeaderPosition": { "type": "string", "enum": ["left", "center", "right", "start", "end"] },
1333
1333
  "TextPosition": { "type": "string", "enum": ["left", "center", "right", "start", "end"] },
1334
1334
  "GridColumnWidthType": { "type": "integer" },