PROGRAMMING WORKSHOP

VB.Net |
System.Data.DataSet...데이타의 분석

앞페이지들 중에 특히 마지막 페이지
여러개의 테이블이 연결되어 하나의 입력폼을 구성하는데 있어서
한 참 헷갈리셨을 것이다
테이블간의 관계구성을 잘 이해하면 문제가 없는데
테이블간의 관계에 별 흥미가 없었다면 왕짜증 나는 페이지들이였을 것이다
데이타의 관리는
데이타를 수집하고 보관한다는 과정(DB의 설계)과
수집된 데이타를 갖고 분석하고 보고서를 만드는 두가지로 크게
나눌 수 있을 것이다
앞의 페이지는 데이타를 수집하는 과정, 그리고 보관하는 과정에
대한 이야기들이였으므로 엑셀을 좋아하는 분들에게는 좀 골에 지진이
나는 분야가 될 수 있었을 것이다
그러나 개념적으로 이해는 하고 있어야 분석을 한다는 점에서
도움이 많이 될 것이라서 용을 썼다
설명을 드리면서도..아휴..이것 이해가 되고 있을까??!!
왜냐면 우노도 처음 접했을때 많이 헷갈렸었으니까..아무튼!!

이제 우리의 본래의 분야로 돌아 와서 이미 보관된 데이타를 분석하는 일에
즐거운 시간을 갖여 보도록 하자

데이타는 이미 ERP나 회사시스템에 있다치고..
엑셀고수들은 그곳에 있는 정보들을 갖여다가 다양한 요리를
해먹으면 된다
이제는 엑셀 즐기는 시간으로 돌아 오셨다고 생각하시면 좋겠다
이곳에서 얻는 이야기가 엑셀에도 당연히 도움이 되는
그런 이야기가 시작되는 셈이다
Visual Stuio버전도 다시 2008로 돌아와서..
엑세스화일을 DataSet로 손작업으로 만드는 과정에서 2008이 버벅거려서
2010으로 몇페이지를 진행 했었다..이제 다시 2008로 표현하자

DAO..엑셀에서 데이타베이스를 다룰때 사용하던 것이 DAO였다
이제 ADO를 엑셀에서 사용해 보자
VBA편집기에서 ADO를 아무버전이나 참조시킨후
아래와 같이 작성하고 실행하시면

Sub getDatas() Dim oRst As New ADODB.Recordset Dim oCon As New ADODB.Connection Dim oCom As New ADODB.Command Dim sConn As String Dim sFile As String sFile = ThisWorkbook.path & "\northwind.mdb" sConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sFile oCon.ConnectionString = sConn oCon.Open oCom.CommandText = "SELECT * FROM Products" oCom.CommandType = adCmdText oCom.ActiveConnection = oCon oRst.ActiveConnection = oCon oRst.Open oCom Dim rX As Range Set rX = Worksheets.Add.Range("A1") rX.CopyFromRecordset oRst oCon.Close End Sub

상품테이블의 내용이 시트에 뿌려질 것이고
DAO를 사용하는 것 보다는 ADO를 사용하면 .Net FrameWork의
ADO.Net으로 전환하는데 좋은 습관이 될 것이다
위의 것은 ADO로 한 것이고
이것을 ADO.Net으로 하면 아래와 같이 될 것이다
ADO.Net을 윈도우폼에서 해보면..
윈도우프로젝트를 하나 만들고, 이번에는 northwind.mdb를
프로그램에 내장시키지 말고 직접 사용자가 지정하게 하여
윈도우 콘트롤중 FileOpenDialog를 사용하여 보도록 하자



윈도우폼에 버튼 하나만 달랑 달고 이 버튼의 Click이벤트프로시져에
아래와 같이 작성하자

'OpenFileDialog콘트롤을 생성하고

Dim oFileOpen As New OpenFileDialog
Dim sFilePath As String = ""

'화일열기 대화상자의 휠터를 억세스화일로 해주고

oFileOpen.Filter = "Access (*.mdb)|"

' northwind.mdb 화일을 선택하고 확인 버튼을 크릭하면

If oFileOpen.ShowDialog() = DialogResult.OK Then
  sFilePath = oFileOpen.FileName
	If InStr(sFilePath, "northwind.mdb") = 0 Then Exit Sub
Else
	Exit Sub
End If

'라벨개체하나 만들어서 폼상에 붙이고
'화일 경로를 라벨의 Text에 주어서 현재작업화일을 알도록 하고

Dim oLabel As New Label
oLabel.Text = sFilePath
oLabel.AutoSize = True
oLabel.Font = New Font("맑은 고딕", 9)
oLabel.Top = 10
oLabel.Left = Me.Button1.Left + Me.Button1.Width + 5

'아래가 ADO.Net작업

Dim sConnectionString, sSQL As String
sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sFilePath
sSQL = "SELECT * FROM Products"
Dim conn As New System.Data.OleDb.OleDbConnection(sConnectionString)
conn.Open()
Dim cmd As New System.Data.OleDb.OleDbCommand(sSQL, conn)
Dim oAdapter As New System.Data.OleDb.OleDbDataAdapter
Dim oDataSet As New DataSet
oAdapter.SelectCommand = cmd
oAdapter.Fill(oDataSet)

'위에서 DataSet에 Fill시켜주었다, 즉 DataSet상의
'디폴트로 만들어지는 최소 한개의 DataTable에 정보가 채워진것이다
'DataSet.Tables(0) 으로 접근된다
'이것을 DataGridView의 DataSource속성에 달아주면 되겠지

Dim oGridView As New DataGridView
oGridView.DataSource = oDataSet.Tables(0)

'이제 DataGridView를 윈도우폼에 올려 놓으면 된다
'그리고 DataGridView의 서식을 해준다

With oGridView
  .Font = New Font("맑은 고딕", 8)
  .Anchor = AnchorStyles.Left Or AnchorStyles.Top
  .Top = 50
  .Width = Me.Width - 20
  .Height = Me.Height - 90
  .ScrollBars = ScrollBars.Both
End With
Me.Controls.Add(oGridView)

'그리고 ADO.Net 연결개체 닫고
conn.Close()
conn = Nothing

프로그래밍적으로 처리하니까..좀 프로그래밍하는 재미가 난다
이전 페이지에서 일부러 개념을 보여드리느라고 손작업이
참으로 지루했었다,그림찍어서 붙이고 올리고..휴!#@
몇번 이야기했지만 거의 모든 것은 코딩으로 처리하여 만들어질 수
있다고 했었다..그 것을 즐기시는 것이 흥미롭고 지루하지 않다

엑셀에서 처리한 ADO와 윈도우에서 ADO.Net으로 처리한 것을
비교하여 보시면 거의 비슷하다고 볼수 있다..
ADO.Net의 대표적인 것이 DataAdapter!!라고 하는 개체의 역할이다
참..눈썰미가 있으시면 ..어라.앞페이지에서는 TableAdaper라고 해는데
여기에서는 DataAdapter라고 하네..
TableAdapter는 내부적으로 DataAdapter를 갖고 있는
DataSet손작업상의 개체라고 보시면 된다
그러니까..하는 짓은 같은 것이다
대신에 ADO에는 Recordset개체가 있다

프로그래밍적으로 개체를 만들고 추가하고 붙이고 하는 것과
도구상자에서 이런 저런 콘트롤을 끌어다 놓는 것과 뭐가 다른가..
프로그래밍은 본래가 코드를 줄줄줄 두들기는 것이 흥미로운 것이다
콘트롤을 끌어다 놓고 하는 것은 좀 초보들을 위한 것이라고 보면 된다
위도우폼을 하나 삽입하고 그 위에 이런 저런 콘트롤을
도구상자에서 끌어다가 아래와 같이 놓았을때



해당윈도우개체의 Designer.vb를 보면 모두 자동으로 작성된 것을 볼수있다
초보님들은 공연히 이것을 잘못건드려서 다시 작성하곤 한다
이것은 자동작성되는 것이고 건드려서 득볼 것이 없다
마치 엑셀에서 매크로 돌리고 이런 저런 작업을 하면
자동작성되는 것이나 마찬가지다
버튼을 끌어다 놓으면 개체변수가 선언되고 생성되고

Me.Button1 = New System.Windows.Forms.Button

위치혹은 기타 기본속성정보가 작성되고

Me.Button1.Location = New System.Drawing.Point(13, 13)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(75, 23)
Me.Button1.TabIndex = 0
Me.Button1.Text = "Button1"
Me.Button1.UseVisualStyleBackColor = True

최종적으로 UserForm에 대한 것이 정리 되면서
위에서 만든 버튼이 UserForm의 Controls집합체에 추가된다

Me.AutoScaleDimensions = New System.Drawing.SizeF(7.0!, 12.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(284, 264)
Me.Controls.Add(Me.Button1)

이런 식으로 엑셀의 UserForm에서도 하는 습관이 좋다
속성같은 것이 이름이 헷갈린다면 UserForm에 해당 콘트롤을 끌어다 놓고
위의 자동작성된 코드를 살펴보고 활용하면 편리할 것이다

예를 들어서 개체의 위치를 VBA에서 하듯이

Me.Button1.Left=1
Me.Button1.Top=1

과 같이 처리하지 않고 아래와 같이 처리하는 것을 살펴볼수 있는
좋은 학습도구라고도 할 수 있다

Me.Button1.Location = New System.Drawing.Point(13, 13)

Point개체가 활용된다는 점..
즉 Location속성은 값을 Point개체값을 받는 셈이다

아래와 같이 런타임으로 만들어서 사용하는 것이 좋은 프로그래밍습관이다



사용자가 시트를 몇장을 더 추가할지 모르니까..
프로그래밍적으로 항상 최신 시트 갯수에 맞게 만들어 주게 되는
보다 적극적 자동화가 되는 셈이다
아래는 엑셀 쌤플화일과 VB.Net화일

***[LOG-IN]***

프로그래밍적으로 접근하는 습관을 갖도록 하자