>>고급기능
>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)
'MiPlatform' 카테고리의 다른 글
MiPlatform - Chapter7. 고급기능 및 Tip(3) (0) | 2012.08.08 |
---|---|
MiPlatform - Chapter7. 고급기능 및 Tip(2) (0) | 2012.08.08 |
MiPlatform - Chapter6. Component별 주요기능(2-3) (0) | 2012.08.07 |
MiPlatform - Chapter6. Component별 주요기능(2-2) (0) | 2012.08.07 |
MiPlatform - Chapter6. Component별 주요기능(2-1) (0) | 2012.08.07 |