PROGRAMMING WORKSHOP

Access와 Excel의 연동_12|참조테이블 편집하기
참조테이블을 좀더 이해하자..

앞페이지에서 기본참조테이블인 [애완동물테이블],[고객테이블],[진료타입테이블]의 편집을
위한 인터페이스를 만들었다
이제 새로운 동물,고객,진료타입이 발생할때마다 입력할수 있도록 버튼에 코딩하자



그림과 같이 [진료진행관리]탭의 [애완동물추가등록]버튼을 크릭하면
[참조테이블]탭이 활성화되고 ,
이곳의 [애완동물추가]를 하려고 하니, 새로운 애완동물이고,
기존등록된 고객의 애완동물이 아닌 새로운 고객이면
고객의 신규등록이 우선 선행되어야 할 것이다
이럴 경우 [고객신규등록]버튼을 크릭하여 [고객명]추가 부분이 활성화된다
고객테이블 편집

이 곳에서 고객신규등록을 DB의 해당테이블에 저장하자



작은 테이블이던 큰테이블이던 저장하고,수정하고 ,삭제하는등의 편집과정은 모두 마찬가지다
휠드의 갯수가 다를뿐...
그러니 하나,하나 차근 차근 만들어 가는 것
고객콤보상자를 선택하면 기존의 고객이 선택이 되는 셈이고
그러면 선택된 기존고객의 주소와 이름을 각각의 텍스트상자에 옮겨주고
저장버튼은 [수정저장]으로 캡션을 바꿔준다
고객의 이름은 콤보상자의 이름으로 하고..여기에서는 수정을 하더라도 고객의
이름은 수정하지 못하게 한셈이다
만약 이름도 수정하고 싶으면 텍스트박스 하나 더 추가하면되지만,여기에서는
이름은 수정하지 않도록 하자
주소와 전화번호만 수정가능하게 하자
그리고 신규고객인 경우 콤보상자의 텍스트값을 새로운 고객명으로 바꾸면
주소와 전화번호 텍스트상자값이 비워지고, 저장버튼은 [신규저장]으로 바뀌게 한다
위의 내용을 콤보상자의 Change이벤트에서 처리한다

Private Sub cboCutomerList_Change()
If Me.cboCutomerList.ListIndex = -1 Then
    Me.txtPhone.Text = ""
    Me.txtAddress.Text = ""
    Me.cmdAddNewCustomer.Caption = "신규저장"
Else
    Me.txtPhone = Me.cboCutomerList.List(Me.cboCutomerList.ListIndex, 3)
    Me.txtAddress = Me.cboCutomerList.List(Me.cboCutomerList.ListIndex, 2)
    Me.cmdAddNewCustomer.Caption = "수정저장"
End If
End Sub

이제 [수정저장]이던 [신규저장]이던 하나의 버튼..이것을 크릭하면
버튼의 캡션을 읽어서..수정하던,신규저장하던 하면 될 것이다

Private Sub cmdAddNewCustomer_Click()
 
''정보를 모두 입력하지 않았다면 당연히 작업취소...
If Trim(txtAddress.Text) = "" Or Trim(txtPhone.Text) = "" Or Trim(cboCutomerList.Text) = "" Then
    MsgBox "텍스트상자에 값을 입력하시고 하세요": Exit Sub
End If

If Me.cboCutomerList.ListIndex > -1 Then
    ''수정저장
Else
    ''신규저장
End If 
''아래와 같이 버튼의 캡션을 읽어도 좋겠지만
''위와 같이 콤보상자의 ListIndex값을 읽어서 값이 -1이면 기존정보가 아닌 것을
''알수 있으니..-1이면 신규저장, 그렇지 않고 값이 0이상이면 기존정보를 선택한 것이고
''기존정보의 수정으로 보면 되겠지
'If cmdAddNewCustomer.Caption = "수정저장" Then
'    MsgBox Me.cboCutomerList.List(Me.cboCutomerList.ListIndex, 0)
'Else '' [신규저장]
'    MsgBox "new"
'End If
End Sub

신규저장이던, 수정저장이던 이미 사용하던 editDB프로시져를 활용하면 되겠지만,
매개변수다시 추가하고 귀찮으니 DB편집을 복습할겸 별도로 하나 더 만들자

DB편집의 가장 중요한 것은
대상이 되는 DB테이블의 족보를 모듈시트어딘가에 중요 정보로
항상 보관해두면 편리하다..
그렇지 않으면 휠드명이 뭐였지???테이블명이 뭐였지???찾아보고 머리가 어수선하다

수정하는 SQL과 신규입력하는 SQL을 작성하여
DB와 작업을 하는 프로시져에 매개변수로 전달하면 끝난다..

iCustomerID = Me.cboCutomerList.List(Me.cboCutomerList.ListIndex, 0)
If Me.cboCutomerList.ListIndex > -1 Then
        sSQL = "UPDATE " & CUSTOMERS & _
                    " SET Address_1= '" & Trim(txtAddress.Text) & "',Phone='" & Trim(Me.txtPhone.Text) & "' " & _
                    " WHERE CustomerID=" & iCustomerID
                    
Else
        sSQL = "INSERT INTO " & CUSTOMERS & "(CustomerName,Address_1,Phone)" & _
                " VALUES('" & Trim(cboCutomerList.Text) & "','" & Trim(Me.txtAddress.Text) & "','" & Trim(Me.txtPhone.Text) & "')"
End If


'' DB작업 프로시져에 SQL을 매개변수로 전달..작업완료
editDB_ sSQL

'' 작업이 끝나면, 텍스트상자를 비워주는 것이 예의...시작후 뒷정리..
''콘크롤의 값을 바꿔줄때는 혹시 이벤트가 발생하는 값의 변경이 아닌지 항상
''주의 하시고!!!
txtPhone.Text = ""
txtAddress.Text = ""
cboCutomerList.Text = ""

'' DB를 바꾸었으면 해당 테이블을 보관하는 콤보상자 두개를 모두 갱신해주어야..
''이것은 이미 사용했던 프로시져를 호출하면 되고...
fillCombo Me.cboCustomer, CUSTOMERS
fillCombo Me.cboCutomerList, CUSTOMERS


'' 아래의 프로시져에 위에서 작성한 SQL문을 매개변수로 호출하면
Sub editDB_(sSQL As String)
Dim oConn As New Connection
oConn.ConnectionString = "Provider=" & PROVIDER_ & ";Data Source=" & sFileAndPath
oConn.Open
oConn.Execute sSQL
oConn.Close
Set oConn = Nothing
End Sub

애완동물테이블 편집

애완동물을 추가하려고 하다 보니까..
새로운 고객명이 필요하여 위와 같이 새로운 고객을 입력하였었다
(기존의 고객명이 새로운 애완동물을 사서 등록을 한다면 고객추가는 필요없지만)
새로운 고객명이 [애완동물]을 추가하기 위한 인터페이스의 콤보상자에 갱신되었으니
애완동물을 편집할수 있다
아래와 같이 애완동물 편집을 한다

Private Sub cmdPetEdit_Click()
''관련된 테이블명이나, 콘트롤,테이블구조등을 메모해두는 습관이 좋다
''관련콘트롤
''txtPetName --동물이름
''txtBirthDate--동물생일
''cboPetState-- 동물상태 -- 새로운 상태가 필요하면 콤보상자에 직접입력
''cboPetType-- 동물타입 -- 새로운 상태가 필요하면 콤보상자에 직접입력
''cboCustomer -- 동물의 주인
''lstPets -- 새로 갱신후 동물목록상자
'' 테이블 구조...
'' PetID|CustomerID|PetName|BirthDay|State|Type

Dim sPetName As String
Dim datBirthDay As Date
Dim sPetState As String
Dim sPetType As String
Dim lCustomerID As Long
Dim sErr As String
Dim sSQL As String

On Error Resume Next

sPetName = Trim(txtPetName.Text)
datBirthDay = CDate(Trim(txtBirthDate.Text))
sPetState = Trim(cboPetState.Text)
sPetType = Trim(cboPetType.Text)
If cboCustomer.ListIndex < 0 Then sErr = "고객명": GoTo X

lCustomerID = cboCustomer.List(cboCustomer.ListIndex, 0)

If sPetName = "" Then sErr = "[동물명]를 입력하시고 하세요": GoTo X
If datBirthDay = 0 Then sErr = "[동물생일]을 입력하시고 하세요": GoTo X
If sPetState = "" Then sErr = "[동물상태]를 입력하시고 하세요": GoTo X
If sPetType = "" Then sErr = "[동물타입]을 입력하시고 하세요": GoTo X
If datBirthDay > Date Then sErr = "[동물생일]이 오늘날짜보다 늦습니다": GoTo X

sSQL = "INSERT INTO " & PETS & " (CustomerID,PetName,BirthDay,State,Type) " & _
            "VALUES (" & lCustomerID & ",'" & sPetName & "',#" & datBirthDay & "#,'" & sPetState & "','" & sPetType & "')"

editDB_ sSQL

''DB추가내용 이미 채워졌던 콘트롤 새정보로 갱신..
fillListBox Me.lstPets, PETS
fillCombo Me.cboPets, PETS

'' 상태가 새 정보일때 갱신
Dim iX As Integer
For iX = 0 To cboPetState.ListCount - 1
    If sPetState = cboPetState.List(iX) Then
        GoTo Y
    End If
Next
cboPetState.AddItem sPetState

'' 동물타입이 새 정보일때 갱신
Y:

For iX = 0 To cboPetType.ListCount - 1
    If sPetType = cboPetType.List(iX) Then
        GoTo Z
    End If
Next
cboPetType.AddItem sPetType


Z:
txtPetName.Text = ""
txtBirthDate.Text = ""
cboPetState.Text = ""
cboPetType.Text = ""
MsgBox "새정보 입력되고 관련 콘트롤 갱신되었습니다"

Exit Sub
X:
MsgBox sErr

End Sub

진료타입테이블 편집

진료집행관리테이블을 추가하다 보니까..
새로운 진료타입이 발생했다
새로운 진료타입이 발생하면 진료타입관리테이블에 추가하여 두어야 진료진행관리입력을 할때 콤보상자에서
선택만 하면 된다
아래와 같이 위와 같은 요령으로 하면 되겠다

Private Sub cmdAddTreatNew_Click()
''관련콘트롤
''cboTreatList
''txtTreatAmount
''cboTreats
'' 테이블구조
''TreatID,TreatName,Price
On Error Resume Next
If cboTreatList.ListIndex > -1 Then
    MsgBox "진툐타입은 신규입력만 합니다,콤보상자에서 선택하지 마시고 새로운 진료나 서비스명을 직접입력하세요": Exit Sub
End If

Dim sTreatName As String
Dim sPrice As String
Dim sSQL As String
sTreatName = Trim(cboTreatList.Text)
sPrice = Trim(txtTreatAmount.Text)
If sTreatName = "" Or sPrice = "" Then
    MsgBox "진료명과 금액이 모두 입력되어야 합니다": Exit Sub
End If
If Not IsNumeric(sPrice) Then MsgBox "금액은 숫자이어야 합니다": Exit Sub

sSQL = "INSERT INTO " & TREAT_TYPES & " (TreatName,Price) VALUES('" & sTreatName & "'," & CDbl(sPrice) & ")"

editDB_ sSQL

'' 콘트롤 갱신...
cboTreatList.Text = ""
txtTreatAmount.Text = ""
fillCombo cboTreatList, TREAT_TYPES
fillCombo cboTreats, TREAT_TYPES

MsgBox "[" & sTreatName & "] 이 새로 추가 되었습니다"
End Sub

이제 애완동물병원에서 발생하는 정보를 모두
입력하고 관리하는 시스템이 완벽히 구축되었다
좀더 기능을 추가하자면 한이 없으니..이정도에서 DB와 UserForm의 연동을
통하여 데이타관리시스템을 마치고...
아쉬운 것, 뭔가 또 필요한 것은 나중에 또 붙여도 된다
다음에는 무엇이 필요할까???
당연히 분석시스템이 필요하게 된다
분석을 하지 않는 데이타는 별 큰의미가 없지 않을까???
다음 페이지에서는 영업분석이라는 탭을 하나 더 추가하고 기능을 추가하여
엑셀의 파워를 완벽히 조합하여 확장된 시스템이 되게 해보자..
[애완동물병원]이라는 가상의 데이타를 그려놓고 하였지만
여러분의 현장에서 발생하는 데이타의 관리 요령도 역시 마찬가지 응용이다
기본테이블을 만들어 놓고
이 기본테이블을 하나의 테이블에서 조합하는 것...
예를 들어서
어떤 회사에서 A,B,C라는 상품을 영업사원 A,B,C가 영업활동을 한다고 하면
기본참조테이블로서..
[상품 테이블]이 하나 있어야 하고
[영업사원 테이블]이 하나 있어야 한다
이렇게 두개로 분산된 정보가
영업활동이 진행될때마다 조합되는 것이니..
이것을 조합시킨
[영업진행테이블]이라고 할수있을 것이다
용어를 다양하게 붙여서 헷갈리겠지만..
두개의 테이블을 조합하여 진행되는 테이블, 운영테이블이라고 불러도 좋고
나머지 두개(상품,직원)은 참조테이블이면서 기본테이블이라고도 부를수 있을 것이다
관계형테이블의 핵심은 하나도 복잡할 것이 없다, 위와 같은 요령의 확장인 것이다

***[LOG-IN]***