Web/ASP & ASP.NET2009. 4. 11. 00:05

< 출처 : korea.internet.com, 지은이 : 최현진 >

Data Shaping은 Recordset 개체의 특정 필드에 또 다른 Recordset 개체를 연결할 수 있는 기능이다.

이 기능을 사용하면 간단한 OLAP 성 데이터 조회 프로그램을 작성할 수 있다.

이 기능을 사용하려면 Provider를 "msdatashape"로 설정하고 Data Provider를 "sqloledb"로 설정해야 한다.

Pubs 데이터베이스의 테이블들을 Shape로 구현하는 예를 작성해 본다.

비주얼 베이직에서 새로운 프로젝트를 시작하고, 폼을 추가해서 다음과 같이 디자인한다.



[그림] Data Shaping 예제 화면


개체 속성
Form Name frmShape
Caption Data Shaping
CommandButton Name cmdShaping
Caption Shaping
CommandButton Name cmdChild
Caption Child Recordset
MSHFlexGrid Name Grid


폼의 코드 모듈에 다음과 같이 코드를 작성한다.

Option Explicit

Dim adoCn As New ADODB.Connection
Dim adoRs As New ADODB.Recordset

Private Sub cmdShaping_Click()
  adoCn.Open "Provider=msdatashape;Data Provider=sqloledb;" & _
    "Data Source=Chris;Initial Catalog=Pubs;User id=sa;Password="

  adoRs.Open "SHAPE {SELECT au_id, au_fname, au_lname FROM Authors} " & _
    " APPEND " & _
    " ({SELECT au_id, title_id, royaltyper FROM TitleAuthor} " & _
    " RELATE au_id TO au_id) As rsTitleAuthor", adoCn

  Set Grid.DataSource = adoRs
End Sub

Private Sub cmdChild_Click()
  Dim adoRsChild As ADODB.Recordset

  Debug.Print adoRs(0).Value

  Set adoRsChild = adoRs("rsTitleAuthor").Value

  MsgBox "Child Recordset(0) : " & adoRsChild(0).Value
End Sub

코드를 실행하고 Shaping 버튼을 클릭하면, Shape 구조로 반환되는 데이터들을 볼 수 있다. Child Recordset 버튼은 하위 레코드 집합의 내용을 조회하는 예이다.

다음 표는 Pubs 데이터베이스에서 사용할 수 있는 Shape 문장의 예제들이다.


기능 Shape 문장
일대 다대 다 계층 구조 Shape {Select * from Customers} rsCust Append (( SHAPE {Select * from Orders} rsOrders Append (( SHAPE {Select * from [Order Details]} rsOrderDetails Append Calc(int(unitprice * quantity * ( 1- discount))) as itemcharge) relate orderid to orderid), sum(rsOrderdetails.itemcharge ) As BillTotal) relate CustomerID to CustomerID )
Country에 의한 그룹화 Shape rsCust Compute Count(rsCust.customerid) As Customers, rsCust by Country
Aggregate 함수로 그룹화 Shape (Shape rsOrders Compute Sum(rsOrders.BillTotal) As TotalPurchases, avg(rsOrders.BillTotal) As AveragePurchase, rsOrders by customerid ) As rsOrdersGrp
Aggregate 함수로 그룹화한 합계 Shape rsOrdersGrp Compute Sum(rsOrdersGrp.TotalPurchases) As TotalSales, max(rsOrdersGrp.TotalPurchases) As BiggestAcct, rsordersGrp


Posted by Huikyun