본문 바로가기

MiPlatform

MiPlatform - Chapter7. 고급기능 및 Tip(1)

 

>>고급기능

 

>Data통신의 고급기능 및 Data Format (tip_adpater.xml)


1) Async방식(권장사항)
    -. 잘된 Coding과 잘못된 잘못된 Coding
        // 잘된 Coding
        function btn_async1_OnClick(obj)
        {
            ds_adapter.Clear();
            Transaction( "tr", "SvcJsp::tip_adapter.jsp", "", "ds_adapter=output", "", "callback"); // 첫번째 Service 호출
        }
       
        // 잘못된 Coding
        function btn_async2_OnClick(obj)
        {
            var in_var;
            ds_adapter.Clear();
            Transaction( "tr", "SvcJsp::tip_adapter.jsp", "", "ds_adapter=output", "", "");
            in_var = ds_adapter.GetColumn(0, "col1");
            ds_adapter1.Clear();
            // 다음 Transcation()을 바로밑에 쓰면 안됩니다.
            Transaction( "tr1", "SvcJsp::tip_adapter1.jsp?in_var="+in_var, "", "ds_adapter1=output1", "", "callback");
        }
       
        function callback(trid, ErrorCode, ErrorMsg)
        {
            var in_var;
           
            if( trid == "tr" )
            {
                ds_adapter1.Clear();
                in_var = ds_adapter.GetColumn(0, "col1");
                // 2번째 Service는 CallBack에서 호출해야 합니다.
                Transaction( "tr1", "SvcJsp::tip_adapter1.jsp?in_var="+in_var, "", "ds_adapter1=output1", "", "callback");
            }
               
            alert(trid+":"+ErrorCode+":"+ErrorMsg);
        }

2) Sync방식
    (1) Adapter추가하여 처리방식
        Project Explorer의 Data tab - Protocols http더블클릭하면 Protocols 화면
        +추가
            [Id : httpsync] [Name : CyHttpAdp(기존http)]
            [Sync : True]
            [TimeOut : 5] Sync니까 Timeout줘야해

        DataGroup 추가 : SvcSync
            [Base URL : httpsync://demo.miplatform.com:8080/edu/service_jsp_U/]
           
            기본jsp처리하는 SvcJsp에서는
            [Base URL : http://demo.miplatform.com:8080/edu/service_jsp_U//]

            url은 똑같지만 앞부분을 sync adapter를 사용하게 바꿔줬군.

        즉, sync 전용 data group과 adpater를 만들어 사용하는 방식.

        사용방법은 똑같아

        var ErrorCode, ErrorMsg; // Sync방식에서는 ErrorCode, ErrorMsg를 사용치 못하므로 Error처리를 위해 변수를 선언합니다.
        // Adapter추가  처리방식
        function btn_sync1_OnClick(obj)
        {
            var in_var;
           
            ds_adapter.Clear();
            Transaction( "tr", "SvcSync::tip_adapter.jsp", "", "ds_adapter=output", "", ""); // 1번째 Service 호출
            alert("tr:"+ErrorCode+":"+ErrorMsg);     // Error처리 (바로 밑에 기술해도 됩니다.)
           
            ds_adapter1.Clear();
            in_var = ds_adapter.GetColumn(0, "col1");
            // 2번째 Service호출( 바로 밑에 기술해도 됩니다. )
            Transaction( "tr1", "SvcSync::tip_adapter1.jsp?in_var="+in_var, "", "ds_adapter1=output1", "", "");
            alert("tr1:"+ErrorCode+":"+ErrorMsg);   
        }

           
   

    (2) Script 처리방식 : Script 코딩으로 option을 바꾸는 방식

        function btn_sync2_OnClick(obj)
        {
            var in_var;
       
            global.http.sync = true; // Protocol Adapter의 Sync Property변경
            global.http.TimeOut = 5; // Protocol Adapter의 TimeOut Property변경
           
            ds_adapter.Clear();
            Transaction( "tr", "SvcJsp::tip_adapter.jsp", "", "ds_adapter=output", "", "");
            alert("tr:"+ErrorCode+":"+ErrorMsg);
       
            ds_adapter1.Clear();
            in_var = ds_adapter.GetColumn(0, "col1");
            Transaction( "tr1", "SvcJsp::tip_adapter1.jsp?in_var="+in_var, "", "ds_adapter1=output1", "", "");
            alert("tr1:"+ErrorCode+":"+ErrorMsg);
               
            global.http.sync = false; // Protocol Adapter의 Sync Property 원상복귀
            global.http.TimeOut = 60; // Protocol Adapter의 TimeOut Property 원상복귀
        }

        주의! 처리가 다 끝나면 sync를 false로 원상복귀시켜야해. 대부분 Async를 쓰다가 필요할 때 Sync쓰는거니까.

        component는 화면내리면 메모리상에서 내려가지만 adpater는 브라우저 닫을 때까지 계속 유지돼.


3) MiPlatform 통신 Format(XML/Binary/CSV)
    (1) XML
        -. PC --> Server : PC에서 format정하지
            PC에서 날라갈때는 Protocols-> hppt->[XmlFormat : True] 없으면 XML이 default

        function btn_xml_OnClick(obj)
        {
            ds_adapter.Clear();
           
            global.http.XmlFormat = true; // Protocol Adapter의 XmlFormat을 XML로 설정
       
            // Server - JSP : PlatformRequest.XML
            // Server - ASP : AspApi.iotype = "XML"
            Transaction( "tr", "SvcJsp::tip_adapter_format.jsp?format=XML", "", "ds_adapter=output", "", "callback1");
        }


        -. Server --> PC : Server에서 format만들어줘야지. jsp소스보면(D:\study\MiPlatform\Education(V3.2)-B(교육자료)\Education\Service\jsp\tip_adapter_format.jsp)
            pRes = new PlatformResponse(response, PlatformRequest.XML, char_set);
       

    (2) BIN (통상 대용량데이터 처리. 압축까지해서 사용)
        -. PC --> Server
            PC에서 날라갈때는 Protocols-> hppt->[XmlFormat : False] [Compress : True] [CompressMethod : ZLIB] (LZSS는 쓰지마)

        function btn_bin_OnClick(obj)
        {
            ds_adapter.Clear();
           
            global.http.XmlFormat = false; // Protocol Adapter의 XmlFormat을 Binary로 설정
            global.http.Compress = true; // 압축여부 설정   
            global.http.CompressMethod = "ZLIB"; // 압축방법 설정
           
            // Server - JSP : PlatformRequest.ZLIB_COMP
            // Server - ASP : AspApi.iotype = "BIN"
            Transaction( "tr", "SvcJsp::tip_adapter_format.jsp?format=BIN", "", "ds_adapter=output", "", "callback1");
        }

       
        -. Server --> PC : Server에서 format만들어줘야지. jsp소스보면(D:\study\MiPlatform\Education(V3.2)-B(교육자료)\Education\Service\jsp\tip_adapter_format.jsp)
            pRes = new PlatformResponse(response, PlatformRequest.ZLIB_COMP, char_set);
       
    (3) CSV (대용량 데이터 처리)
        서버단 라이브러리가 CSV지원안해.

        -. PC --> Server
        화면쪽에서는 특별한 처리없이 그냥 날리면 되고
       
        function btn_csv_OnClick(obj)
        {
            ds_adapter.Clear();
            Transaction( "tr", "SvcJsp::tip_adapter_format_csv.jsp", "", "ds_adapter=output", "", "callback1");
        }

        -. Server --> PC
        csv를 jsp에서 out.println해서 문자열로 만들어서 쏴.

        tip_adpter_format_csv.jsp
            CSV:utf-8

            ErrorCode=0,ErrorMsg=SUCC

            Dataset:output

            col1:String(20),col2:String(20),col3:String(20)

            col1_0,col2_0,col3_0

            col1_1,col2_1,col3_1


        이렇게.. 상세format은 생략


       
        function callback1(trid, ErrorCode, ErrorMsg)
        {
            alert(global.http.RecvHttpStr);   
        }

 

4) Http Error 발생시 Event 처리
    통신에러처리는 통신Adapter의 OnError이벤트로 처리.
    Protocols-http-[OnError : HttpOnError]
        코딩은 Global tab의 script에서..

        function HttpOnError(obj,strUrl,nErrorCode,strErrorMsg,nHttpCode,strLocation)
        {
            alert("Adapter 호출시 Error 발생\n"+
                  "strUrl=[" + strUrl + "]\n"+
                  "ErrorCode=[" + nErrorCode + "]\n"+
                  "ErrorMsg=[" + strErrorMsg + "]\n"+
                  "HttpCode=[" + nHttpCode + "]\n"+
                  "strLocation=[" + strLocation + "]");
        }   


5) FirstRow 처리 : 데이터가 너무 많아 한번에 받을 수 없을 때, 잘라서 받는 처리.

        function btn_firstrow1_OnClick(obj)
        {
            ds_adapter_firstrow.Load("SvcJsp::tip_adapter_firstrow.jsp");   
        }
       
        function ds_adapter_firstrow_OnLoadCompleted(obj,nErrorCode,strErrorMsg,nReason)
        {
            TRACE(nReason);
        }

        Education (3664): 1
        Education (3664): 20
        Education (3664): 20
        Education (3664): 20
        Education (3664): 0

    Server쪽에서 20건씩 잘라서 보내준거지. (tip_adapter_firstrow.jsp)

    특이한 사항은 Dataset ds_adapter_firstrow
        [FireFirstCount : 50] - 서버에서 20씩 잘라보내도 50건이 찰때까지 기다렸다 화면에 뿌려줘.
        [FireNextCount : 100] - 그다음부턴 100건차야 화면에 뿌려줘.

 


> Collection

1) Collection : 모아서 처리. array처럼 처리.
    (1) Components

    function btn_components_OnClick(obj)
    {
        var obj = Components["Static"]; // Static Component들을 얻어옵니다.
        for( i = 0 ; i < 3 ; i++ )
         obj[i].Text = "a"; // Static Component의 Text를 변경합니다.
        alert(obj.count); // Static Component들의 개수를 얻어옵니다.
    }
       

    (2) Globals : StartXML이 여러개일때 접근하는 Collection. 프로젝크 단위단위를 합칠 때 통상 StartXML도 하나로 합치기 때문에 거의 쓰지 않는다.

    function btn_globals_OnClick(obj)
    {
        alert(Globals.count); // StartXml의 개수를 얻어옵니다.
    }

    (3) Windows : 주로 팝업창이 여러개 떳을때 모든창 닫기에 쓸 수 있겠지.
    function btn_windows_OnClick(obj)
    {
      alert(Windows.count); // Popup된 Window의 개수를 얻어옵니다.
      alert(Windows[0]); // Popup된 Window중 첫번째 Window를 얻어옵니다.
    }

    (4) AllWindows : 나 포함한 모든 화면. 주로 MDI창 띄울때.
   
   
2) Script에서 사용할 수 있는 Object
   
    (1) This : 내가 포함된 화면
    function btn_this_OnClick(obj)
    {
        alert(This.Static0.Text); // 자기자신 화면의 Static Component의 Text를 얻어옵니다.
    }

    (2) Window :
    function btn_window_OnClick(obj)
    {
        Window.MoveWindow( 100, 100, 300, 300 ); // 화면을 이동합니다.
    }
    주의사항! 화면의 사이즈나 위치제어는 Form ID 쓰느게 아니라 Window object 사용해야해.
   
    tip-1 18:21

    (3) Global : StartXML 접근

    (4) Domain : Domain기능 사용할 때

    (5) Parent : Child 창에서 Parent 창에 접근할 때
        ex) tip_pc_popup (tip_pc_parent, tip_pc_child)
        // "Set Parent" Button
        function btn_set_parent_OnClick(obj)
        {
            // parent에 값 설정
            parent.edit_popup.Text = edit_popup.Text;

            //parent의 parent에 값 설정
            parent.parent.edit_parent.Text = edit_popup.Text;
        }

 

> Drag & Drop 처리 (tip_dragdrop)

모든 Component에는 DragMode(Drag 할쪽에서 True), DropMode(Drop 할 쪽에서 True) property와
OnDrag, OnDragEnter, OnDragLeave, OnDragOver,OnDrop event가 있어.

기능구현은 직접 코딩해야해.   
    // Drag처리
    function grid_drag_OnDrag(obj,nPosX,nPosY,varKeyState,nRow,nCell)
    {
        // Dataset의 Column ID얻어오기
        var col_id = Grid_drag.GetCellProp("body", nCell, "colid");
       
        // Grid의 위치 잡기
        Grid_drag.SetCellPos(nCell);
        ds_bind.Row = nRow;
       
        // Drag처리
        var drag_dataobj = CreateDataObject(); //Data를 보내기 위하여 Object 생성
        drag_dataobj.SetData("CF_TEXT", ds_bind.GetColumn(nRow, col_id)); // Data Object에 값설정
        return drag_dataobj; // DataObject를 반드시 Return해야 Drag/Drop 처리 수행됨
    }
   
    // Drop처리
    function edit_drop_OnDrop(obj,objDragObj,objDataObj,nX,nY,varKeyState)
    {
        // objDragObj : Drag발생 객체 ( Sample에서는 Grid )
        edit_drop.Text = objDataObj.GetData("CF_TEXT"); // Drag시 Return한 DataObject에서 값을 얻어옴
   
    }

주의사항! 생짜로 다 코딩해야해.. 갑에게 함부로 보여주지마!
아예 기능 없는척해.

 

> Excel 처리

1) Export
    (1) Grid.ExportExcel() : Grid 내용을 Excel로 보내 (Excel을 먼저 띄워놓고 그려)
        function btn_export1_OnClick(obj)
        {
            grid_export.ExportExcel("doc"); //doc는 sheet명
        }

    (2) Grid.ExportExcelEx() : Grid 내용을 Excel로 보내 (준비를 다하고 엑셀을 띄워. Grid 내용을 Excel로 보내. pregress bar)
        function btn_export2_OnClick(obj)
        {
            grid_export.ExportExcelEx("doc");
        }

    (3) Grid.SaveExcel() : 파일로 저장
        #include "ScriptLib::ScriptLib.js"
        function btn_export3_OnClick(obj)
        {
            // Excel File저장
            var path = GetStartXmlPath()+"File\\excel3.xls";
            grid_export.SaveExcel(path, "doc");
            alert(path+"를 확인해보세요");
        }

    (4) Grid.GetCSVData() : Grid내용을 CSV형태의 Data로 추출
        function btn_export4_OnClick(obj)
        {
            // CSV Data추출
            var csv_data;
            csv_data = grid_export.GetCSVData(true);
            alert(csv_data);
        }
    (5) Grid --> Clipboard --> Excel : Excel을 열어놓으 상태에서 Grid의 cell을 선택하여 복사한 후(ClipBoard에 저장) Excel에 붙여넣기
        function btn_export5_OnClick(obj)
        {
            // Grid Area --> Clipboard --> Excel
            var csv_data;
            ClearClipboard(); // 클립보드를 Clear합니다.
            csv_data = grid_export.GetCSVData(true); // CSV형태의 Data추출
            SetClipBoard("CF_CSV", csv_data); // 클립보드에 Data복사
           
            alert("Excel을 띄운후 붙여넣기 하십시오.");
        }

    (6) Grid --> Drag&Drop --> Excel : Grid의 Cell을 선택하여 Drag하여 Excel에 Drop하는 사용법
       
        //Grid의 OnDrag event
        function grid_export_OnDrag(obj,nPosX,nPosY,varKeyState,nRow,nCell)
        {
            var drag_dataobj = CreateDataObject(); // Drag용 Data object 생성
            var csv_data = obj.GetCSVData(true);    // Grid의 선택된 영역값 추출
            drag_dataobj.SetData("CF_CSV", csv_data);    // Drag용 Data Object에 값 설정
            if( obj.IsAboveSel() ) // 이 부분이 생략되면 정상동작 안됨
                return drag_dataobj;    // Drag용 Data object Return
        }

    (7) Multi Grid --> Excel(Multi Sheet) : 여러개의 Grid를 Excel의 여러개의 Sheet로 Export
        function btn_export7_OnClick(obj)
        {
            var ExpObj;
            var sXML;
           
            ExpObj = CreateExportObject();    // ExportObject를 생성합니다.
            ExpObj.ExportType       = "Excel";    // 현재 Excel만 가능합니다.
            ExpObj.ExportFileName   = "C:\\Education\\File\\test.xls";    // File명 지정
            ExpObj.ActiveSheetName  = "sheet1";    // Active Sheet지정
            ExpObj.MakeEmptyFileWhenNotExist = true;        // File이 없으면 새로 생성
           
            // “sheet1” Excel Sheet의 “A2” Cell로 “grid_export” Grid를 Export
            ExpObj.AddExportGrid("sheet1!A2", grid_export, true, false );   
            // “sheet1” Excel Sheet의 “A10” Cell로 “grid_export” Grid를 Export
            ExpObj.AddExportGrid("sheet1!A10", grid_export, true, false );
            // “sheet2” Excel Sheet의 “B2” Cell로 “grid_export” Grid를 Export
            ExpObj.AddExportGrid("sheet2!B2", grid_export, true, false );
            // “sheet2” Excel Sheet의 “B10” Cell로 “grid_export” Grid를 Export
            ExpObj.AddExportGrid("sheet2!B10", grid_export, true, false );
           
            ExpObj.Export();    // Excel로 Export실행
            ExpObj.Close();    // Excel을 내부적으로 Close
            ExpObj = null;    
        }

    (8) ExcelController 사용(Option Component)

2) Import
    Grid에 직접 값을 넣을 수는 없고 Dataset에 값을 넣은 후 Grid에 Binding해야 처리.
    CSV를 제외한 import관련함수를 기본제공하지 않으므로 Script로 구현하거나 Option Component를 사용해야 함)

    (1) Dataset.LoadCSV() (csv file --> Grid)
        function btn_import1_OnClick(obj)
        {
            var     buff;
           
            // File Read --> buff
            var path = GetStartXmlPath()+"File\\excel.csv";
           
            File.FileName = path;
            File.Open("r");
            buff = File.Read();
            File.Close();
       
            // buff --> ds_excel_imp
            ds_excel_imp.LoadCSV(buff, true);
        }

    (2) Excel --> Clipboard --> Dataset
        function btn_import2_OnClick(obj)
        {
            var buff;
           
            alert("Excel을 띄워서 내용을 먼저 복사하십시오.");
           
            // ClipBoard --> buff
            buff = GetClipboard("CF_CSV"); // ClipBoard내용 가져오기
           
            // buff --> ds_excel_imp
            Csv2Ds(buff, ds_excel_imp); // Import관련 Script Library호출
        }
       
        // Csv를 Dataset으로 처리
        function Csv2Ds(csv_buff, ds_obj)
        {
            var     row, col;
            var        arr_rec=array(-1);
            var        arr_col=array(-1);
       
            ds_excel_imp.ClearData();
            arr_rec = Split(csv_buff, "\r\n");
            for( row = 0 ; row < arr_rec.Length() ; row++ )
            {
                arr_col = Split(arr_rec[row], ",");
                ds_obj.AddRow();
                for( col = 0 ; col < arr_col.Length() ; col++ )
                {
                    ds_obj.SetColumn(row, col, arr_col[col]);
                }
            }
            ds_obj.Row = 0;
        }

    (3) ExtCommonApi 사용(기술지원 제공 dll)

    (4) ExcelController 사용(Option Component)