PROGRAMMING WORKSHOP

Skip Navigation Links. Skip Navigation Links.

Access와 Excel의 연동_7|
여러개의 테이블에서 관련된 정보를 가져오기

앞페이지에서는 진료테이블, 애완동물테이블,진료타입테이블을 각각의
콘트롤에 가져다 넣었다
이제 애완동물의 주인은 누구인지, 주인의 전화번호는 어떻게 되는지등의
관련정보를 테이블의 각각의 키값을 참조하여 가져오는 SQL문을 작성하도록 하자

그런데 SQL문을 작성하려면 테이블이름, 휠드명등의 족보를 알고 있어야 하고
참 불편하다, 쉬운 방법이 없을까??
논리적으로 정보를 이해하고 있다면 누워서 떡먹기다
SQL문이 복잡해 보이지만 요령만 알면 정말 누워서 떡먹기 인 것이다
Access의 쿼리디자인창을 활용하면 된다
자기가 만든 정보의 관계를 이해하지 못하고 있다면 문제다..
어떤애완동물이 진료를 몇번이나 받았지???
어떤고객이 어떤 애완동물의 주인이지??
어떤 애완동물의 주인의 전화번호는 어떻게 되지???
이런 질문을 하는 것이 Query 라는 단어의 역활이다
그래서 SQL이라는 것은 Structured Query Language 의 약자인것이다
질문(Query)를 구조적으로 패턴화시킨 언어인 것이다
이것을 외워야 하나
하다 보면 기본적인 키워드는 알게 되고,
그냥 Access의 쿼리디자인창을 활용하면 된다

그림과 같이 현재엑셀화일이 폼을 띄우면서 만들어 놓은 DB를 열고
그림과 같이 만들기탭/쿼리디자인 메뉴를 크릭하면 쿼리디자인창이 열리고
사용할 테이블을 선택하라는 대화상자가 나타난다
모두 선택추가한다



추가하면 모든 테이블이 쿼리디자인창에 자리를 잡는다
이때 보고 싶은 필드만 마우스로 끌어서 아래 창으로 가져다 놓으면 된다



이제 이렇게 보겠다고 한 쿼리의 결과를 보면..



그림과 같이 테이블(쿼리결과테이블)이 만들어지게 된다
사용자들에게는 의미없는 ID는 모두 빼고 실제 의미있는 정보값만 불러 온 것이다
프로그램을 망가뜨리려고 해도 망가지지 않으니 실험정신을 갖고
이런 휠드 저런휠드를 끌어서 놓고 결과를 보면서 해보시면 좋을 것이다

Query테이블은 실제 테이블이 아니다
Query테이블은 SQL문을 보관하고 있는 것이고 테이블은 순간적으로 SQL문이 실행되면서
만들어진 시각적으로 보여주는 임시 테이블이다
우리가 엑셀에서 가상의 쌤플DB를 만들면서 만든 테이블들이 진정한 테이블들이다
그런데 이렇게 만든 Query는 DB상에 저장을 해도 좋고(이것이 쿼리테이블)
그냥 작성된 SQL문만 복사하여 가져다가 엑셀의 코딩에 사용하여도 된다
우리의 목적은 SQL문을 얻기 위한 것이였지,DB에 쿼리테이블을 만들기 위한 것이 아니였다

그럼 SQL문을 어디에서 가져 오나..
그림과 같이 SQL보기를 크릭하면 자동작성된 SQL문을 얻게 된다



SELECT 진료진행테이블.WorkID, 진료진행테이블.WorkDate, 진료진행테이블.WorkTime,
진료타입테이블.TreatName,진료타입테이블.Price, 애완동물테이블.PetName,
애완동물테이블.BirthDay,애완동물테이블.State, 고객테이블.CustomerName,
고객테이블.Phone FROM ((고객테이블 INNER JOIN 애완동물테이블 ON
고객테이블.CustomerID = 애완동물테이블.CustomerID) INNER JOIN 진료진행테이블 ON
애완동물테이블.PetID = 진료진행테이블.PetID) INNER JOIN 진료타입테이블 ON
진료진행테이블.TreatID = 진료타입테이블.TreatID;

이것을 복사하여 VBA코드에 사용하면 되는 것이다
그런데..이것은 어떤 검색조건이 없이 전체테이블을 모두 보여주는 것이다
지금 원하는 것은 엑셀의 UserForm상에서 진료테이블목록상자에서 어떤 진료작업을 선택하면
해당 진료작업 ID에 해당되는 모든 정보를 보고 싶은 것이다
그렇다면 위에서 작성된 SQL문에 어디엔가 조건을 주어야 한다
쿼리디자인창에서 조건을 어디에 넣는지 알아 보도록 하자
예를 들어서 WorkID가 3인경우의 정보만 가져오라!! 라고 하고 싶은 것이다

쿼리디자인창을 다시 열고
WorkID열의 조건행에 1을 입력하고 쿼리결과를 실행시키면 그림과 같이 WorkID가 1인 행만
쿼리결과가 된 것을 알수 있다



이제 이럴 경우 SQL문이 어떻게 작성되었는지 위에서와 같은 요령으로 SQL보기에서
복사하여 가져 오면 된다

SELECT 진료진행테이블.WorkID, 진료진행테이블.WorkDate, 진료진행테이블.WorkTime,
진료타입테이블.TreatName, 진료타입테이블.Price, 애완동물테이블.PetName,
애완동물테이블.BirthDay, 애완동물테이블.State, 고객테이블.CustomerName,
고객테이블.Phone FROM ((고객테이블 INNER JOIN 애완동물테이블 ON
고객테이블.CustomerID = 애완동물테이블.CustomerID) INNER JOIN 진료진행테이블 ON
애완동물테이블.PetID = 진료진행테이블.PetID) INNER JOIN 진료타입테이블 ON
진료진행테이블.TreatID = 진료타입테이블.TreatID
WHERE (((진료진행테이블.WorkID)=1));

WHERE 절이 하나 더 붙었고, 이것이 조건을 주는 절(Clause)이다
아하...조건을 줄때는 WHERE라는 키워드를 붙이는구나...
이 시리즈를 마칠때가 되면 SQL의 키워드들이 낯섫지 않게 될것이다(문제의식을 갖고 달려드시면..)
이제 위의 조건이 들어 있는 SQL문을 엑셀의 VBA에 붙여 넣고 편집을 좀하면 된다
아래의 그림과 같이 진료진행테이블의 목록상자의 목록을 선택할때마다
관련된 모든 정보를 폼의 라벨의 Caption속성에 작성해주고 싶은 것...



위의 억세스의 쿼리디자인창에서 만들어 온 SQL문의 아래와 같이 WorkID를 어떤값을 줄지
상수를 목록상자의 목록에서 일어서 전달 하면 되는 것

WHERE 진료진행테이블.WorkID=1

Sub writeAllData(iID As Integer)
Dim oRST As ADODB.Recordset
Dim sSQL As String
Dim iRow As Integer
Dim iCol As Integer
Dim iColNums As Integer
아래와 같이 Access에서 얻어온 SQL문의 문자열을 조금 편집하여 
sSQL이라는 문자열타입변수에 적용하고, getRecordset 함수에 전달하면 RecordSet을 가져오면 된다

sSQL = "SELECT 진료진행테이블.WorkID, 진료진행테이블.WorkDate, 진료진행테이블.WorkTime," & _
          "진료타입테이블.TreatName, 진료타입테이블.Price, 애완동물테이블.PetName," & _
          "애완동물테이블.BirthDay, 애완동물테이블.State, 고객테이블.CustomerName," & _
          "고객테이블.Phone FROM ((고객테이블 INNER JOIN 애완동물테이블 ON " & _
          "고객테이블.CustomerID = 애완동물테이블.CustomerID) INNER JOIN 진료진행테이블 ON " & _
          "애완동물테이블.PetID = 진료진행테이블.PetID) INNER JOIN 진료타입테이블 ON " & _
          "진료진행테이블.TreatID = 진료타입테이블.TreatID " & _
          "WHERE 진료진행테이블.WorkID=" & iID
          
Set oRST = getRecordset(sSQL)

Dim sWrite As String
RecordSet의 열을 순환하면서 열의이름(휠드명)과 해당휠드의 값을 알아서 문자열로
연결하여 라벨의 Caption속성에 주었다
For iCol = 0 To oRST.Fields.Count - 1
    sWrite = sWrite & oRST.Fields(iCol).Name & " = " & oRST(iCol).Value & vbNewLine
Next
Me.lblAll.Caption = sWrite
oRST.Close
Set oRST = Nothing
End Sub



 

아래화일로 위의 내용을 확인해 보시고
억세스에서 가져온 문자열 정보를 변수에 담을 때 문자열의 콤마,따옴표등을
어떻게 조심해야 하는지 직접 똑같이 해보시는 것이 좋을 것이다
문자열에 능숙하지 않으면 에러를 많이 발생시키는 경우가 이런 경우이다
그래서 프로그래밍은 배열,순환,조건,변수,함수의 활용...
그리고 다른 중요한 하나는
문자열정보 처리의 능숙함이다

***[LOG-IN]***