들어가며

이번 강좌에서는 피벗화면을 구성하는 행, 열, 값 필드들을 개발자의 의도에 맞게 정렬하는 방법에 대해 알아보도록 하겠습니다.

이론

피벗으로 표시된 데이터들을 원하는 순서대로 보여주기를 원한때 정렬 기능을 사용하여 볼 수 있습니다.
RealPivot에서 정렬 하는 방법은 4가지 방법이 있습니다.

정렬하는 방법 4가지

  • setFieldMapping()에 지정하는 PivotField의 sortDir속성에 정렬방향을 지정하는 방법
  • setPivotFields()에 지정하는 columns, rows 속성에 지정하는 방법
  • sort() 함수로 정렬하는 방법
  • 피벗내 Setup UI를 이용한 방법

이전 강좌에서 setPivotFields()를 사용하여 정렬하는것을 잠깐 언급하였었습니다. 이번 강좌에서는 해당 내용을 포함하여 Setup UI를 이용한 방법을 제외한 3가지 방법에 대해 배워 보도록 하겠습니다.

실습

  1. setFieldMapping()를 사용하여 고객사 descending, 제품명 ascending, 영업년도 descending, 영업분기 ascending 정렬을 해보도록 하겠습니다.

     pivot.setFieldMapping([{
         name: "CustomerID",
         sourceField: "CustomerID",
         fieldHeader: "고객사",
         valueEnable: false,
         sortDir: "descending"  
     }, {
         name: "ProductName",
         sourceField: "ProductName",
         fieldHeader: "제품명",
         valueEnable: false,
         sortDir: "ascending"          
     }, {    
         name: "OrderYear",
         sourceField: "OrderDate",
         dateType: "year",            
         fieldHeader: "영업년도",
         valueEnable: false,
         sortDir: "descending"  
     }, {
         name: "OrderQuarter",
         sourceField: "OrderDate",
         dateType: "quarter",            
         fieldHeader: "영업반기",
         valueEnable: false,
         displayLabels: {
             1: "1사분기",
             2: "2사분기",
             3: "3사분기",
             4: "4사분기"
         },
         mustValues: [1, 2, 3, 4],
         sortDir: "ascending"        
     }, {
         name: "UnitPrice",
         sourceField: "UnitPrice",
         fieldHeader: "판매액 합",
         numberFormat: "#,##0",      
         labelEnable: false   
     }]);
    
     pivot.setPivotFields({
         columns: [{
             name: "OrderYear"
         }, {
             name: "OrderQuarter"
         }],
         rows: [{
             name: "CustomerID"
         }, {
             name: "ProductName"
         }],
         values: [{
             name: "UnitPrice"
         }]
     });
    
     pivot.drawView();
  2. setPivotFields()를 사용하여 고객사 ascending, 제품명 descending, 영업년도 ascending, 영업분기 descending 정렬을 해보도록 하겠습니다.

     pivot.setFieldMapping([{
         name: "CustomerID",
         sourceField: "CustomerID",
         fieldHeader: "고객사",
         valueEnable: false
     }, {
         name: "ProductName",
         sourceField: "ProductName",
         fieldHeader: "제품명",
         valueEnable: false
     }, {    
         name: "OrderYear",
         sourceField: "OrderDate",
         dateType: "year",            
         fieldHeader: "영업년도",
         valueEnable: false
     }, {
         name: "OrderQuarter",
         sourceField: "OrderDate",
         dateType: "quarter",            
         fieldHeader: "영업반기",
         valueEnable: false,
         displayLabels: {
             1: "1사분기",
             2: "2사분기",
             3: "3사분기",
             4: "4사분기"
         },
         mustValues: [1, 2, 3, 4]
     }, {
         name: "UnitPrice",
         sourceField: "UnitPrice",
         fieldHeader: "판매액 합",
         numberFormat: "#,##0",      
         labelEnable: false   
     }]);
    
     pivot.setPivotFields({
         columns: [{
             name: "OrderYear",
             direction: "ascending"
         }, {
             name: "OrderQuarter",
             direction: "descending"
         }],
         rows: [{
             name: "CustomerID",
             direction: "descending"
         }, {
             name: "ProductName",
             direction: "descending"        
         }],
         values: [{
             name: "UnitPrice",
             expression: "sum"
         }]
     });
    
     pivot.drawView();
  3. sort()를 사용하여 고객사 descending, 제품명 ascending, 영업년도 descending, 영업분기 ascending 정렬을 해보도록 하겠습니다.

     pivot.sort({
         column: {
             method: "label",
             labels: [  
               { name: "OrderYear", direction: "descending"},
               { name: "OrderQuarter", direction: "ascending"}
           ]
         },
         row: {
             method: "value",
             labels: [
               { name: "CustomerID", direction: "descending"},
               { name: "ProductName", direction: "ascending"}
            ]
         }
     });
  4. sort()를 row value로 descending 정렬. 값에 따라 행 정렬이 일어납니다.

     pivot.sort({      
         row: {
             method: "value",
             fieldName: "UnitPrice",
             direction: "descending"
         }
     });
    
     pivot.drawView();
  5. sort()를 colum, row value로 descending 정렬, 값에 따라 행과 열의 정렬이 일어납니다.

     pivot.sort({
         column: {
             method: "value",
             fieldName: "UnitPrice",
             direction: "descending"
         },            
         row: {
             method: "value",
             fieldName: "UnitPrice",
             direction: "descending"
         }
     });
    
     pivot.drawView();

실행화면

피벗 설정이 완료되지 않은 상태이기 때문에 버튼을 누르기 전까지는 빈 화면만 보입니다.

  1. 고객사 descending, 제품명 ascending, 영업년도 descending, 영업분기 ascending 정렬
  2. 고객사 ascending, 제품명 descending, 영업년도 ascending, 영업분기 descending 정렬
  3. 고객사 descending, 제품명 ascending, 영업년도 descending, 영업분기 ascending 정렬
  4. row value로 descending 정렬
  5. column, row value로 descending 정렬

전체 소스코드

SCRIPT
<link rel="stylesheet" type="text/css" href="css/default_blue.css">
<script type="text/javascript" src="scripts/realgridjs-lic.js"></script>
<script type="text/javascript" src="scripts/realgridjs_eval.1.1.27.min.js"></script>
<script type="text/javascript" src="scripts/realgridjs-api.1.1.27.js"></script>
<script type="text/javascript" src="messages/realpivot-messages.js"></script>
<script type="text/javascript" src="scripts/realpivot_eval.1.0.0.min.js"></script>
<script type="text/javascript" src="scripts/jszip.min.js"></script>

<script>
var pivot;
var dataProvider;

$(document).ready( function(){
    RealGridJS.setRootContext("/script");
    
    dataProvider = new RealGridJS.LocalDataProvider();

    var fields = [{
            fieldName: "OrderID"
        }, {
            fieldName: "CustomerID"
        }, {
            fieldName: "EmployeeID"
        }, {
            fieldName: "OrderDate",
            dataType: "datetime",
            datetimeFormat: "yyyy-MM-dd a hh:mm:ss",
            amText: "오전",
            pmText: "오후"
        }, {
            fieldName: "CompanyName"
        }, {
            fieldName: "Country"
        }, {
            fieldName: "Phone"
        }, {
            fieldName: "ProductName"
        }, {
            fieldName: "QuantityPerUnit"
        }, {
            fieldName: "Quantity",
            dataType: "number"
        }, {
            fieldName: "UnitPrice",
            dataType: "number"
        }];     
    dataProvider.setFields(fields);

    var datas = [{
        "OrderID":"10248",
        "CustomerID":"VINET",
        "CustomerID2":"VINAC",
        "EmployeeID":"5",
        "OrderDate":"1996-01-04 오전 12:00:00",
        "RequiredDate":"1996-08-01 오전 12:00:00",
        "ShippedDate":"1996-07-16 오전 12:00:00",
        "ShipVia":"3",
        "Freight":"32.3800",
        "ShipName":"Vins et alcools Chevalier\r\nVins et alcools Chevalier\r\nVins et alcools Chevalier",
        "ShipAddress":"59 rue de l\u0027Abbaye",
        "ShipCity":"Reims",
        "ShipRegion":null,
        "ShipPostalCode":"51100",
        "ShipCountry":"France",
        "CompanyName":"Vins et alcools Chevalier\r\n",
        "Country":"France",
        "Shipping":"True",
        "SmallFlag":"http://dev.demo.realgrid.net/img/demo/smallflag/fr.png",
        "NormalFlag":"http://dev.demo.realgrid.net/img/demo/normalflag/fr.png",
        "Phone":"26.47.15.10",
        "ProductName":"Queso Cabrales",
        "QuantityPerUnit":"1 kg pkg.",
        "Quantity":"1200",
        "UnitPrice":"14.0000"
    }, {
    ....
    }];

    dataProvider.fillJsonData(datas);

    $("#btnSort1").click(function () {
        pivot.setFieldMapping([{
            name: "CustomerID",
            sourceField: "CustomerID",
            fieldHeader: "고객사",
            valueEnable: false,
            sortDir: "descending"  
        }, {
            name: "ProductName",
            sourceField: "ProductName",
            fieldHeader: "제품명",
            valueEnable: false,
            sortDir: "ascending"          
        }, {    
            name: "OrderYear",
            sourceField: "OrderDate",
            dateType: "year",            
            fieldHeader: "영업년도",
            valueEnable: false,
            sortDir: "descending"  
        }, {
            name: "OrderQuarter",
            sourceField: "OrderDate",
            dateType: "quarter",            
            fieldHeader: "영업반기",
            valueEnable: false,
            displayLabels: {
                1: "1사분기",
                2: "2사분기",
                3: "3사분기",
                4: "4사분기"
            },
            mustValues: [1, 2, 3, 4],
            sortDir: "ascending"          
        }, {
            name: "UnitPrice",
            sourceField: "UnitPrice",
            fieldHeader: "판매액 합",
            numberFormat: "#,##0",      
            labelEnable: false 
        }]);

        pivot.setPivotFields({
            columns: [{
                name: "OrderYear"
            }, {
                name: "OrderQuarter"
            }],
            rows: [{
                name: "CustomerID"
            }, {
                name: "ProductName"
            }],
            values: [{
                name: "UnitPrice"
            }]
        });

        pivot.drawView();       
    });        


    $("#btnSort2").click(function () {
        pivot.setFieldMapping([{
            name: "CustomerID",
            sourceField: "CustomerID",
            fieldHeader: "고객사",
            valueEnable: false
        }, {
            name: "ProductName",
            sourceField: "ProductName",
            fieldHeader: "제품명",
            valueEnable: false
        }, {    
            name: "OrderYear",
            sourceField: "OrderDate",
            dateType: "year",            
            fieldHeader: "영업년도",
            valueEnable: false
        }, {
            name: "OrderQuarter",
            sourceField: "OrderDate",
            dateType: "quarter",            
            fieldHeader: "영업반기",
            valueEnable: false,
            displayLabels: {
                1: "1사분기",
                2: "2사분기",
                3: "3사분기",
                4: "4사분기"
            },
            mustValues: [1, 2, 3, 4]
        }, {
            name: "UnitPrice",
            sourceField: "UnitPrice",
            fieldHeader: "판매액 합",
            numberFormat: "#,##0",      
            labelEnable: false   
        }]);

        pivot.setPivotFields({
            columns: [{
                name: "OrderYear",
                direction: "ascending"
            }, {
                name: "OrderQuarter",
                direction: "descending"
            }],
            rows: [{
                name: "CustomerID",
                direction: "ascending"
            }, {
                name: "ProductName",
                direction: "descending"        
            }],
            values: [{
                name: "UnitPrice",
                expression: "sum"
            }]
        });

        pivot.drawView();   
    });    


    $("#btnSort3").click(function () {
        pivot.sort({
            column: {
                method: "label",
                labels: [  
                  { name: "OrderYear", direction: "descending"},
                  { name: "OrderQuarter", direction: "ascending"}
                ]
            },
            row: {
                method: "label",
                labels: [
                  { name: "CustomerID", direction: "descending"},
                  { name: "ProductName", direction: "ascending"}
                ]
            }
        });

        pivot.drawView(); 
    });    

    $("#btnSort4").click(function () {
        pivot.sort({      
            row: {
                method: "value",
                fieldName: "UnitPrice",
                direction: "descending"
            }
        });

        pivot.drawView();         
    });    

    $("#btnSort5").click(function () {
        pivot.sort({
            column: {
                method: "value",
                fieldName: "UnitPrice",
                direction: "descending"
            },            
            row: {
                method: "value",
                fieldName: "UnitPrice",
                direction: "descending"
            }
        });

        pivot.drawView();     
    });             

      
});     
</script>
HTML
<div id="realpivotDiv" style="width: 100%; height: 500px;"></div>
<p></p>
1. <button type="button" class="btn btn-primary btn-xs" id="btnSort1">setFieldMapping()</button>고객사 descending, 제품명 ascending, 영업년도 descending, 영업분기 ascending 정렬 
2. <button type="button" class="btn btn-primary btn-xs" id="btnSort2">setPivotFields()</button>고객사 ascending, 제품명 descending, 영업년도 ascending, 영업분기 descending 정렬 
3. <button type="button" class="btn btn-primary btn-xs" id="btnSort3">sort()</button>고객사 descending, 제품명 ascending, 영업년도 descending, 영업분기 ascending 정렬 
4. <button type="button" class="btn btn-primary btn-xs" id="btnSort4">sort()</button>row value로 descending 정렬 
5. <button type="button" class="btn btn-primary btn-xs" id="btnSort5">sort()</button>column, row value로 descending 정렬