< 출처 : 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 |