@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.
- package/dist/generators/fixer.js +153 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/schemas/mtsd.interface.ts +19 -19
- package/schemas/mtsd.schema.json +19 -19
package/dist/generators/fixer.js
CHANGED
|
@@ -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:
|
|
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 참조 보정,
|
|
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
|
@@ -115,7 +115,7 @@ export interface IDataSource {
|
|
|
115
115
|
ConnectionCode: string;
|
|
116
116
|
/** SQL 쿼리 암호화 여부 */
|
|
117
117
|
Encrypted: boolean;
|
|
118
|
-
/** 데이터소스 타입 (0
|
|
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,
|
|
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:
|
|
664
|
+
/** 키 타입 (0:None, 1:NotNull, 2:Nullable, 3:Primary) */
|
|
665
665
|
KeyType: number;
|
|
666
|
-
/** 데이터 타입 (0: String,
|
|
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:
|
|
1436
|
+
/** 필드 카테고리 (0: Default, 1: Dimension, 2: Measure, 3: Attribute, 4: Period) */
|
|
1437
1437
|
Category: number;
|
|
1438
|
-
/** 필드 영역 (0:
|
|
1438
|
+
/** 필드 영역 (0:Hidden, 1:Row, 2:Column, 3:Filter, 4:Data) */
|
|
1439
1439
|
Area: number;
|
|
1440
|
-
/** 요약 유형 (0:
|
|
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:
|
|
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:
|
|
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;
|
package/schemas/mtsd.schema.json
CHANGED
|
@@ -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
|
|
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:
|
|
1023
|
-
"Area": { "type": "number", "description": "영역 (0:
|
|
1024
|
-
"SummaryType": { "type": "number", "description": "요약 유형 (0:
|
|
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:
|
|
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:
|
|
1331
|
-
"DataType": { "type": "integer", "description": "데이터 타입 (0:
|
|
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" },
|