본문으로 바로가기
바코2://#19. 하위 개념 사용해보기(3) - 중간 오류 수정 - 바보처럼코딩하기

바코2://#19. 하위 개념 사용해보기(3) - 중간 오류 수정

반응형

폼을 구성하는데 사용자가 사용하는 방식으로 체크해봐야 할것들이 있습니다.

개발자 입장에서 본다면 생각보다 사용자는 무자비 합니다. ㅎㅎㅎ 모든 버튼을 순서와 상관없이 누릅니다.

 

개발자가 가장 머리아픈이유가 이런데 있는것 같습니다. 변수를 생각해서 변수 방지를 위한 코드를 해야합니다.

개발자 축에도 못끼는 제가 이런 말을 하다니...다른 사람이 내 프로그램을 사용하는 순간, 당신은 이미 개발자 입장일 수 밖에 없다는 점!!!

 

실제로 만든 프로그램에 오류가 뜨거나, 느리면 사용자들이 엉터리 프로그램을 만들었다며, 마음에 상처를 ㅠ.ㅜ

 

작동하는 코드가 있다면, 오류가 나지 않게 하는 코딩이 필요합니다. 

이 포스트에서는 에러처리 코드를 사용하지는 않겠지만 대표적으로는 on error 문이 있습니다. 알아두시면 좋을것 같아서 링크를 남깁니다.

https://docs.microsoft.com/ko-kr/dotnet/visual-basic/language-reference/statements/on-error-statement

 

On Error 문 - Visual Basic

자세한 정보: On Error 문(Visual Basic)

docs.microsoft.com

 

이번 포스트에서 다룰 내용은 직관적으로 행동하고 그 오류를 방지하는 코드를 작성하는 과정입니다.

 

폼을 열고서 버튼을 하나 씩 눌러보겠습니다.

- 저장, 수정 버튼

아무것도 없는데 저장이 됐군요;;;

테이블을 확인 해 보겠습니다.

ID 9의 레코드가 생성됐습니다.

우선 ID 9 레코드를 테이블상에서 삭제를 해주시고, 저장에 필요한 조건이 뭐가 있을지 확인해봅시다.

업체를 등록하는데 꼭 필요한 요소가 뭘까요?

  • 사업자등록번호: 업체들 특성상 사업자등록증을 주문 이후에 계산서 발행시점에 전달하는 곳들도 있으므로 패스
  • 업체명: 필수겠네요.
  • 대표이름: 마찬가지로 추후에 받는 경우가 종종 있습니다. 패스
  • 전화번호: 사무실 전화번호는 요즘 잘 사용안합니다.
  • 팩스번호: 시대가 많이 변해서 팩스번호도 잘 사용을 안합니다.
  • 업종: 사업자등록증 수령후
  • 업태: 사업자등록증 수령후
  • 부가세이메일: 사업자등록증 수령후

업체명이 있으면 등록이 되고 없으면 등록이 안되게끔 설정해주면 되겠네요.

실제 거래에서는 업체명과 담당자명 담당자 연락처가 가장 중요하지요.

Private Sub 버저장_Click()
If Nz(업체명, "") = "" Then
MsgBox "업체명 없음"
Exit Sub
End If

버저장의 가장 위쪽에 if문 하나를 넣어줍니다.

업체명이 없으면 메시지 박스를 출력하고 끝내라. 입니다.

 

테스트를 해보겠습니다.

잘 작동합니다.

데이터도 잘 있네요.

 

- 삭제버튼

- 복제버튼

복제 버튼은 ID만 null을 만들어주기 때문의 에러가 날게 없어 뵙니다. 패스.

 

- 초기화 버튼

마찬가지로 초기화 버튼도 에러를 만들 소지는 없어뵙니다. 패스.

 

- 고객 담당자 버튼

에러가 발생하는 군요. null값의 사용이 잘못되었다고 합니다.

디버그 버튼을 누르면 아래와 같이 보여줍니다.

OPid로 가져올 값이 null이라서 발생된것 같습니다.

업체ID가 없으니 담당자가 있을 수 없겠지요.

여기도 IF문을 상단에 기입해주겠습니다.

Private Sub 버고객담당자_Click()
If Nz(ID, 0) = 0 Then
MsgBox "업체를 선택하세요."
Exit Sub
End If


Dim OPid As Long
OPid = ID
DoCmd.OpenForm "고객담당자", , , , , , OPid


End Sub

ID가 없으면 더 이상의 진행은 차단 시키면서 어떤걸 하라는 메시지를 주는 형태의 코드를 넣어줬습니다.

'사용자가 뭘 잘못했는지 어떤걸 해야 작동이 되는지 알아야겠지요?'

업체를 선택하라는 메시지 박스가 잘 뜹니다.

 

if 문을 가지고 분기점을 만들어서 잘 처리했습니다.

위에서 했던대로, 저장/수정 버튼을 수정해보겠습니다.

If Nz(담당자명, "") = "" Or Nz(담당자전화, "") = "" Then
MsgBox "담당자 이름 또는 전화번호가 없습니다."
Exit Sub
End If

AND 와 OR를 사용해서 조건을 합칠 수도 있습니다.

 

[담당자명없음] AND [담당자전화가없음] = 둘다 없다.

[담당자명없음] OR [담당자전화없음] = 둘중에 하나가 없다. 

 

[]안은 내가 만든 조건입니다. AND 와 OR를 처음 접하시는 분들이 헷갈려 하시는 부분이

내가 만든 조건과 판별을 하는데 쓰이는 조건을 따로 분리해서 생각하셔야 하는데, 같이 생각하셔서 원하는 대로 코딩이 안될때가 있습니다.

 

내가 만든 조건에 어떤 해당사항인지를 잘 살펴보셔야 합니다.

 

고객ID의 after update하단에 초기화를 해줄 ID, 담당자명, 담당자전화에 대한 = null 코드를 삽입해줍니다. 

Private Sub 고객ID_AfterUpdate()
Dim strSQL As String
strSQL = "select * from 고객담당자 where 고객ID = " & 고객ID & ""
담당자리스트.RowSource = strSQL
담당자리스트.Requery
ID = Null
담당자명 = Null
담당자전화 = Null

End Sub

 

오늘까지의 고객 담당자 코드 전문

Option Compare Database

Private Sub Form_Load()
'MsgBox Me.OpenArgs
고객ID = Me.OpenArgs
고객ID_AfterUpdate
End Sub

Private Sub 고객ID_AfterUpdate()
Dim strSQL As String
strSQL = "select * from 고객담당자 where 고객ID = " & 고객ID & ""
담당자리스트.RowSource = strSQL
담당자리스트.Requery
ID = Null
담당자명 = Null
담당자전화 = Null
End Sub

Private Sub 담당자리스트_AfterUpdate()
ID = 담당자리스트
고객ID = 담당자리스트.Column(1)
담당자명 = 담당자리스트.Column(2)
담당자전화 = 담당자리스트.Column(3)
End Sub

Private Sub 버삭제_Click()
If Nz(ID, 0) = 0 Then
Exit Sub
Else

CurrentDb.Execute "Delete * from 고객담당자 where ID = " & ID & "", dbSeeChanges
End If


고객ID_AfterUpdate
버초기화_Click
End Sub

Private Sub 버저장_Click()
If Nz(담당자명, "") = "" Or Nz(담당자전화, "") = "" Then
MsgBox "담당자 이름 또는 전화번호가 없습니다."
Exit Sub
End If


If Nz(ID, 0) = 0 Then

CurrentDb.Execute "insert into 고객담당자(고객ID,담당자명,담당자전화) values(" & 고객ID & ",'" & 담당자명 & "','" & 담당자전화 & "')", dbSeeChanges

Else


CurrentDb.Execute "update 고객담당자 set 고객id = " & 고객ID & ",담당자명 = '" & 담당자명 & "',담당자전화 = '" & 담당자전화 & "'  where id = " & ID & "", dbSeeChanges

End If

고객ID_AfterUpdate
버초기화_Click
End Sub

Private Sub 버초기화_Click()

ID = Null
고객ID = Null
담당자명 = Null
담당자전화 = Null

End Sub

오늘까지의 고객등록 코드 전문

Option Compare Database

Private Sub Form_Load()
검색창.SetFocus
End Sub



Private Sub 검색리스트_AfterUpdate()

ID = 검색리스트
업체명 = 검색리스트.Column(1)
대표이름 = 검색리스트.Column(2)
사업자등록번호 = 검색리스트.Column(3)
전화번호 = 검색리스트.Column(4)
팩스번호 = 검색리스트.Column(5)
주소 = 검색리스트.Column(6)
업종 = 검색리스트.Column(7)
업태 = 검색리스트.Column(8)
부가세이메일 = 검색리스트.Column(9)

업체명.SetFocus

End Sub

Private Sub 검색창_AfterUpdate()
버검색.SetFocus
End Sub

Private Sub 버검색_Click()

'검색리스트.RowSource = "SELECT ID, 업체명 FROM 고객 WHERE 업체명 Like '*" & 검색창 & "*'"

검색리스트.RowSource = "SELECT * FROM 고객 WHERE 업체명 Like '*" & 검색창 & "*'"

검색리스트.SetFocus
End Sub

Private Sub 버고객담당자_Click()
If Nz(ID, 0) = 0 Then
MsgBox "업체를 선택하세요."
Exit Sub
End If


Dim OPid As Long
OPid = ID
DoCmd.OpenForm "고객담당자", , , , , , OPid


End Sub

Private Sub 버복제_Click()
ID = Null
End Sub

Private Sub 버삭제_Click()
If Nz(ID, 0) = 0 Then
MsgBox "선택한 레코드없음"
Else

CurrentDb.Execute "delete * from 고객 where id = " & ID & "", dbSeeChanges
MsgBox "삭제"
End If

버초기화_Click
버검색_Click

End Sub

Private Sub 버저장_Click()
If Nz(업체명, "") = "" Then
MsgBox "업체명 없음"
Exit Sub
End If


If Nz(ID, 0) = 0 Then 'ID가 없으면 새로운 레코드 입력하는 코드

CurrentDb.Execute "insert into 고객(사업자등록번호,업체명,대표이름,전화번호,팩스번호 " & _
", 주소, 업종, 업태, 부가세이메일) values ('" & 사업자등록번호 & "', '" & 업체명 & "', '" & 대표이름 & "', " & _
"'" & 전화번호 & "', '" & 팩스번호 & "', '" & 주소 & "', '" & 업종 & "', '" & 업태 & "', '" & 부가세이메일 & "')", dbSeeChanges

MsgBox "저장"

Else 'ID가 있으면 수정하는 코드

Dim RS As DAO.Recordset
Set RS = CurrentDb.OpenRecordset("select * from 고객 where id = " & ID & "", dbOpenDynaset, dbSeeChanges)
With RS
.Edit
!업체명 = 업체명
!대표이름 = 대표이름
!사업자등록번호 = 사업자등록번호
!전화번호 = 전화번호
!팩스번호 = 팩스번호
!주소 = 주소
!업종 = 업종
!업태 = 업태
!부가세이메일 = 부가세이메일

.Update
.Close
End With

Set RS = Nothing

MsgBox "수정"

End If

버초기화_Click
버검색_Click

End Sub

Private Sub 버초기화_Click()
'이곳에 코딩을 합니다.
'Null의 쓰임
'텍스트 박스 오브젝트명 = null

ID = Null
업체명 = Null
사업자등록번호 = Null
대표이름 = Null
전화번호 = Null
팩스번호 = Null
주소 = Null
업종 = Null
업태 = Null
부가세이메일 = Null


End Sub

 

[이전 글]: 바코2://#18. 하위 개념 사용해보기(3)

[다음 글]: 바코2://#20. 공급자 및 공급담당자 폼 생성

 

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유