PROGRAMMING WORKSHOP

자재관리 | 청구서관리에서 DB 열고, 활용하기

STEP_10 ---------------------------------

DB에 데이타를 저장해 놓은후
이것을 읽거나, 원하는대로 분석하거나 하는 일을 하지 않는다면
DB는 헛일이다
이제 저장된 내용을 불러내 보도록 한다
어떻게 불러들일까? 화일을 여는 Log시트에서 더블크릭할때
어떤때는 화일을 열게 하고
또 어떤때는 DB에서 해당화일의 내용을 시트로 갖여 오도록 하면 좋겠다
그럼 어디엔가 표시를 해야지..
어떤때는 DB,어떤 때는 [청구서]화일을 열도록..
Log시트를 만들때 유효성검사 목록을 셀에 하나 만들어서
선택에 따라서 두가지 작업중 하나를 실행하게 하자


Sub writeLogSheet(sFileName As String, datRequestDate As Date, _
                    datSupplyDate As Date, iItemNum As Integer, iTotal As Integer)
                    
                    ...
                    ...
                    로그시트가 없으면 로그시트를 만들때
                    특정셀에 유효성검사셀을 만드는 구문을 
                    추가하도록 하자
                    '############################## STEP 10
		    '# DB를 열것인지 화일을 열것이지 표시하는
		    '# 유효성검사 목록을 특정셀에 만든다
		    '######################################################
		    With shtLog.Range("I3")
		        .Validation.Add xlValidateList, , , "화일열기,DB열기"
		        .Resize(2).Merge
		        .Interior.ColorIndex = 3
		        .Font.ColorIndex = 2
		        .Font.Size = 12
		        .Font.Bold = True
		        .Value = "화일열기"
		    End With
		    ...
		    ...
		    ...
						        
End Sub

위와 같이 하여 두가지 일을 하나의 이벤트프로시져(BeforeDoubleClick)에서
하게 하면 될 것이다
하나는...화일열기
다른 하나는 DB의 해당화일의 내역을 불러들여서 보기
일일이 DB화일을 열어서 볼 것없이
내역을 불러서 볼수 있으니 소루션이 소루션 다와 지는 셈이다
그 작업을 하도록 한다

소루션을 계속 개선하다 보면
코드를 누덕누덕 추가해 나간다
이럴때 위와 같이 코드 사이에 기능을 줄줄이 작성하는 것은
바람직 하지 않다
하나의 새로운 기능이 추가된다..
으흠..이 기능은 다른 어떤 작업에서도 별도로 필요하겠군!!
이라는 생각이 든다면 이것은 별도의 프로시져로 독립시킬 가치가
있다는 판단기준이 된다

다른 곳에 필요한 기능이 아니더라도 가독성이 떨어지는 누덕누덕은
피하는 것이 좋다

또 변경하여야 할 것이 있다
당초에는 DB를 고려하지 않고 만든 로그시트라서
DB의 정보를 갖여올수있는 변수하나를 로그시트에 추가하여야 하겠다
그래야 이 정보를 주고 DB에서 해당되는 정보를 쿼리해 올수 있을 것이니까..



이렇게 누덕,누덕 변경을 해나가면서 각자 경험하게 되는 것은..
아하..상수를 그래서 사용하는 구나..
값을 상수로 해두면 필요할때 일일이 수정하지 않고
상수값만 바꾸면 된다는 것을 경험하게 되는 것이다

이 소루션시리즈를 보실때는 처음 부터 스텝바이스텝으로 주욱
심도있게 보시는 것이 실력을 쌓는데 훨씬 빠르다
특히 처음 문제의 제시부분에서 문제를 제시한 분의 컨셉을
같이 갖고 출발하셔야 한다
문제를 푸는 관점을 같이 갖고 한스텝,한스텝 보셔야 한다
중간에서 화일하나 받아서 보려고 하면 지진이 날 것이고
금방 지루하고 포기하는 지름길이 된다
정말 VBA의 고수가 되고 싶다면 문제의식을 품고 한스텝,한스텝
즐기셔야 한다


[청구서]DB테이블에 가서 [청구ID]를 얻어서
이 값으로 [청구내역]DB테이블의 관련 내역을 갖여 오는 것이 지만
이미 Log시트에 [청구서]의 내용이 있으므로 그냥
직접 [청구내역]DB테이블에서 갖여 오는 것이 좋겠다

아래 한 줄이면 DB내용을 갖여 온다

oRST.Open "SELECT * FROM [청구내역$] WHERE [청구ID]='" & sID & "'", oCon

위의 굵은 체의 내용이 SQL언어라고 하는 것이다
말 그대로이다
[청구내역]테이블에서 [청구ID]휠드값이 sID이면
몽땅 Recordset에 담어라!!!
Recordset은 ADO라이브러리에서 제공해주는 메모리상의
테이블인 것이다..
이 메모리상의 테이블을 워크시트의 범위에 옮기면 된다
가장 간단한 방법은

Range("A1").CopyFromRecordset oRST

그럼 시트에 신기하게 , 눈깜짝할사이에 뿌려진다
그런데 휠드명이 나타나지 않는다..
요기까지...
다음 스텝에서 좀더 개선하도록 하자

아래화일에서 지난 스텝과 같은 작업을 하면
Log시트가 만들어진다
Log시트의 휠드가 좀 변경되였을 것이고
시트 오름쪽에 빨강색으로 DB열기로 할 것인지, 화일열기로 할 것인지
유효성목록상자가 있다
DB열기로 선택후 더블 크릭하면 DB의 내용이 옮겨진다..
하나, 하나 실행하면서 따져 보시기를..

무언가 중복되는 것이 있다는 것을 감지 하시면 성장진행중..
DB가 있다면 실은 너저분한 Log시트가 필요없게 된다..
그런 문제의식을 갖으시고..

***[LOG-IN]***

STEP_11 ---------------------------------

CopyFromRecordset 메소드는 그냥 DB테이블의 내용을 메모리상의
Recordset에 담은 내용중 휠드명없이 내용만 덜렁 갖여온 것이다
테이블을 구성하는 정보의 타입이 별 따져볼일이 없다면
그냥 갖여 오면 된다
휠드명은 아래와 같이 갖여 오고..한셀 밑으로 내려서
CopyFromRecordset메소드를 사용하면 될것이다

Dim oFld As ADODB.Field
Dim iX As Integer
With Range("A1")
For Each oFld In oRST.Fields
    .Offset(, iX) = oFld.Name
    iX = iX + 1
Next
.Offset(1).CopyFromRecordset oRST
End With

어떤 개체가 있다면 대개의 개체는 개체를
집합적으로 관리하는 집합체개체가 있다는 점을 항상 염두에
두신다면 되는 것이다
Field개체는 열을 말하는 것이다
그러니 열은 당연히 있을 것이고 그렇다면 여러개의 열을
관리하는 개체..집합체개체 Fileds
가 있을 것이고 이 집합체는 관련된 상위개체가 갖고 있을 것이고
그러니..oRST.Fields 라고 접근하면 되고
집합체는 순환하면..하나,하나 접근한다는 프로그래밍상식만
갖고 있다면 VBA뿐 아니라 어느 세상의 언어도 통하는
컨셉이다

아래의 그림과 같이 DB에서 갖여온 내역과 청구서기본정보를
하나의 보고서 시트에 예쁘게 뽑아 내도록 하자



이렇게 DB내용은 워드문서에 뿌릴수도 있고, 엑셀에
뿌릴수도 있고, 웹페이지에 뿌릴수도 있고 마음대로다
DB라는 정보의 블랙박스만 잘 관리하면
짜장면,짬뽕,탕수육 마음대로 뽑아낸다

엑셀프로그래밍 잘하는 사람과 못하는 사람의 차이는..
호텔고급요리사와 집에서 라면도 잘 못끓여 먹거나
주어도 못먹는 사람과 같다

***[LOG-IN]***

이제 기능이 많아 졌다
무언가 전체의 그림을 재정비 할 단계가 되었다
엑셀소루션을 만들때는 처음 생각과 다르게 점점 진화하기때문에
수시로 변경이 될수 있으므로 어느 정도 단계에서 정리정돈이
필요하게 된다
처음 목록같은 것은 이제 군더더기가 될 수 도 있고
중복되는 작업도 이곳 저곳에 숨어 있고
이런 것들을 정리하는 작업이 다음 단계를 좀더 원활하게 진행할수 있게된다