|
영화,배우, 감독 데이터를 출력하고 관리하는 프로그램을 만들고 있습니다.
영화부분은 저장이 되는데
감독과 배우 부분 저장이 안되네요 ㅠ
어디가 잘 못 된 건가요?ㅠ
배우 부분에서는 리스트에 뿌려주는 것 까지는 되는데 저장 에서 오류가 납니다.
제 생각에는 혈액형과 별자리 콤보에서 오류가 나는 것 같아요~
감독 부분에서는 리스트에 뿌려줄 때 생년월일의 널의 사용이 잘 못 되었다고 나옵니다 ㅠ
vate Sub cmdAD_Click(Index As Integer) '배우 정보/관리
Dim sql As String
Dim tmpDate As String
'버튼의 배열값으로 분기함.
Select Case Index
Case 0 '저장버튼
'이름이 입력되지 않았으면 저장하지 않음.
If Len(Trim(txtAD(0).Text)) = 0 Then
MsgBox "영화배우 & 감독의 이름은 필수 항목 입니다." + vbCrLf _
+ "이름을 입력하세요.", vbExclamation + vbOKOnly, "저장 오류"
Focus txtAD(0)
Exit Sub
End If
'신장에 숫자가 아닌것이 들어가면 오류
If Not IsNumeric(Trim(txtAD(1).Text)) Then
MsgBox "신장에는 숫자만 입력하십시오.", vbExclamation + vbOKOnly, "신장 입력 오류"
Focus txtAD(1)
Exit Sub
End If
'체중에 숫자가 아닌것이 들어가면 오류
If Not IsNumeric(Trim(txtAD(2).Text)) Then
MsgBox "체중에는 숫자만 입력하십시오.", vbExclamation + vbOKOnly, "체중 입력 오류"
Focus txtAD(2)
Exit Sub
End If
'날짜가 잘못되어있으면 오류
'임시 문자열에 세 콤보박스를 더해서 날짜 문자열을 만듦
tmpDate = Format(cmbAD(1).ItemData(cmbAD(1).ListIndex), "0000") + "-" + Format(cmbAD(2).ItemData(cmbAD(2).ListIndex), "00") + "-" + Format(cmbAD(3).ItemData(cmbAD(3).ListIndex), "00")
If Not IsDate(tmpDate) Then '만든 문자열이 날짜형식인지 검사
MsgBox "생년월일을 잘못 입력하셨습니다." + vbCrLf + "날짜를 다시 입력하세요.", vbExclamation + vbOKOnly, "체중 입력 오류"
cmbAD(3).SetFocus
Exit Sub
End If
'기존에 저장된 이름이 있는지 검색
sql = "Select * From Acts_Table Where a_Name='" + Trim(txtAD(0).Text) + "'"
If Not Run(sql, False) Then
'검색하는것을 실패하면
MsgBox "배우 이름을 확인하세요.", vbCritical + vbOKOnly, "저장 오류"
Exit Sub
End If
If Not (Rs.EOF Or Rs.BOF) Then
'검색해서 자료가 있으면 Update
sql = "Update Acts_Table Set "
sql = sql + "a_Sex = " + CStr(cmbAD(0).ListIndex) + ","
sql = sql + "a_BirthY = " + CStr(cmbAD(1).ItemData(cmbAD(1).ListIndex)) + ","
sql = sql + "a_BirthM = " + CStr(cmbAD(2).ListIndex) + ","
sql = sql + "a_BirthD = " + CStr(cmbAD(3).ListIndex) + ","
sql = sql + "a_Tall = " + Trim(txtAD(1).Text) + ","
sql = sql + "a_Weight = " + Trim(txtAD(2).Text) + ","
sql = sql + "a_Blood = '" + Trim(cmbMovies(4).Text) + "',"
sql = sql + "a_Cons = '" + Trim(cmbMovies(5).Text) + "',"
sql = sql + "a_Deview = '" + Trim(txtAD(3).Text) + "',"
sql = sql + "a_Award = '" + Trim(txtAD(4).Text) + "',"
sql = sql + "Where a_Name='" + Trim(txtAD(0).Text) + "'"
If Not Run(sql, False) Then 'Update 명령을 실행 실패하면 메시지 박스 내보냄
MsgBox "저장 도중 오류가 발생하였습니다." + vbCrLf _
+ "DB를 확인하세요.", vbCritical + vbOKOnly, "저장 오류"
Focus txtAD(0)
Exit Sub
End If
Else
'검색해서 자료가 없으면 Insert
sql = "Insert into Acts_Table ("
sql = sql + "a_Name, a_Sex, a_BirthY, a_BirthM, a_BirthD, a_Tall, a_Weight, a_Blood, a_Cons, a_Deview, a_Award "
sql = sql + ") Values ("
sql = sql + "'" + Trim(txtAD(0).Text) + "',"
sql = sql + CStr(cmbAD(0).ListIndex) + ","
sql = sql + CStr(cmbAD(1).ItemData(cmbAD(1).ListIndex)) + ","
sql = sql + CStr(cmbAD(2).ListIndex) + ","
sql = sql + CStr(cmbAD(3).ListIndex) + ","
sql = sql + Trim(txtAD(1).Text) + ","
sql = sql + Trim(txtAD(2).Text) + ","
sql = sql + "'" + Trim(cmbMovies(4).Text) + "',"
sql = sql + "'" + Trim(cmbMovies(5).Text) + "',"
sql = sql + "'" + Replace(Trim(txtAD(3).Text), "'", "{SQ}") + "',"
sql = sql + "'" + Replace(Trim(txtAD(4).Text), "'", "{SQ}") + "',"
If Not Run(sql, False) Then 'Insert 명령을 실행 실패하면 메시지 박스 내보냄
MsgBox "저장 도중 오류가 발생하였습니다." + vbCrLf _
+ "DB를 확인하세요.", vbCritical + vbOKOnly, "저장 오류"
Focus txtAD(0)
Exit Sub
End If
End If
Call Acts_Data_Refresh
Case 1 '삭제버튼
'리스트에서 선택한 자료를 삭제한다.
If lstAD.ListIndex < 0 Then
'리스트에서 배우를 선택하지 않았으면
MsgBox "목록에서 배우를 선택하지 않으셨습니다.", vbExclamation + vbOKOnly, "선택 오류"
Focus txtAD(0)
Exit Sub
End If
'선택이 되어있으면 삭제할것인지 물어본다.
If MsgBox("선택하신 " + lstAD.List(lstAD.ListIndex) + " 배우 자료를 삭제하시겠습니까?" + vbCrLf _
+ "(삭제하신 자료는 복구가 되지 않습니다.)", vbQuestion + vbYesNo, "삭제 확인") = vbYes Then
'삭제를 하겠다고 했음.
sql = "Delete From Acts_Table Where a_idx = " + CStr(lstAD.ItemData(lstAD.ListIndex))
If Not Run(sql, False) Then
'삭제 명령을 실패하였음.
MsgBox "삭제 도중 오류가 발생하였습니다." + vbCrLf _
+ "DB를 확인하세요.", vbCritical + vbOKOnly, "삭제 오류"
Focus txtAD(0)
Exit Sub
End If
MsgBox "삭제되었습니다.", vbInformation + vbOKOnly, "삭제 완료"
'삭제가 되었으므로 초기화 버튼을 한번 눌러줌(목록 갱신과 내용란 청소를 위해서)
Call cmdAD_Click(2)
Exit Sub
End If
Case 2 '초기화버튼
Call Acts_Data_Refresh '이 메뉴를 누르면 배우&감독 자료관리의 리스트박스를 갱신함.
'내용부분을 초기화 함.
Call Acts_Text_Setting '텍스트 박스를 초기화 함.
Call Acts_Combo_Setting '각종 콤보박스를 초기화함
Case 3 '메인으로
Call Menu_Index(0) '메뉴 함수 1번을 호출함.
Case 4 '관리자모드 닫기
fraIDActors.Visible = False
End Select
End Sub
Private Sub Acts_Combo_Setting() '배우 각종 콤보 박스를 셋팅하는 함수
Dim i As Integer
Dim sql As String
'성별 콤보박스 셋팅
cmbAD(0).Clear
cmbAD(0).AddItem "남"
cmbAD(0).AddItem "여"
cmbAD(0).ListIndex = 0
'생년월일 에서 생년 셋팅
cmbAD(1).Clear
For i = Year(Now) To 1900 Step -1 '현재 년도부터 1900년도 까지 셋팅
cmbAD(1).AddItem Format(i, "#### 년") '콤보박스에 보여줄 값을 넣음.
cmbAD(1).ItemData(cmbAD(1).NewIndex) = i '추가된 값의 itemdata에 실제 값을 넣음 (실제 보이는 값에는 년이라는 글자때문에 숫자로 쓰기 곤란함.)
Next
cmbAD(1).ListIndex = 0
'생년월일 에서 월 셋팅
cmbAD(2).Clear
For i = 1 To 12 '1월 부터 12월 까지
cmbAD(2).AddItem Format(i, "## 월")
cmbAD(2).ItemData(cmbAD(2).NewIndex) = i '추가된 값의 itemdata에 실제 값을 넣음
Next
cmbAD(2).ListIndex = Month(Now) - 1
'생년월일 에서 일 셋팅
cmbAD(3).Clear
For i = 1 To 31 '1일 부터 31일 까지, 만약 해당월에 없는 일을 선택했다면 저장누를때 체크해서 날짜를 잘못선택했다고 지적할것임. 일단 31일까지 무조껀 보여줌.
cmbAD(3).AddItem Format(i, "## 일")
cmbAD(3).ItemData(cmbAD(3).NewIndex) = i '추가된 값의 itemdata에 실제 값을 넣음
Next
cmbAD(3).ListIndex = Day(Now) - 1
'배우 혈액형 콤보박스 초기화(DB에서 기존 썼던 자료를 불러옴.)
sql = "Select Distinct a_Blood From Actors_Table Order by a_Blood;"
cmbAD(4).Clear
If Run(sql, False) Then
' 검색이 실패하지 않았을때만 자료가 있는지 본다.
If Not (Rs.EOF Or Rs.BOF) Then
'검색이 성공하고, 자료도 있을때만 목록을 만든다.
Rs.MoveFirst
Do While Not Rs.EOF '자료의 끝이 아닐때까지 루프를 돈다.
' 최소 1글자 이상일때만 목록에 추가한다.
If Len(Trim(Rs("a_Blood") & "")) > 0 Then
cmbAD(4).AddItem Trim(Rs("a_Blood") & "")
End If
Rs.MoveNext
Loop
End If
End If
cmbAD(4).Text = "" '빈문자열을 넣어줌.(초기화 상태)
'배우 별자리 콤보박스 초기화(DB에서 기존 썼던 자료를 불러옴.)
sql = "Select Distinct a_Cons From Actors_Table Order by a_Cons;"
cmbAD(5).Clear
If Run(sql, False) Then
' 검색이 실패하지 않았을때만 자료가 있는지 본다.
If Not (Rs.EOF Or Rs.BOF) Then
'검색이 성공하고, 자료도 있을때만 목록을 만든다.
Rs.MoveFirst
Do While Not Rs.EOF '자료의 끝이 아닐때까지 루프를 돈다.
' 최소 1글자 이상일때만 목록에 추가한다.
If Len(Trim(Rs("a_Cons") & "")) > 0 Then
cmbAD(5).AddItem Trim(Rs("a_Cons") & "")
End If
Rs.MoveNext
Loop
End If
End If
cmbAD(5).Text = "" '빈문자열을 넣어줌.(초기화 상태)
End Sub
Private Sub lstAD_Click()
'리스트박스가 클릭되면 해당 배우 검색해서 뿌려줌.
Dim sql As String
Dim i As Integer
If lstAD.ListIndex < 0 Then Exit Sub '리스트박스를 클릭했을때 인덱스가 0보다 작으면 그냥 나감.
sql = "Select * From Acts_Table Where a_idx=" + CStr(lstAD.ItemData(lstAD.ListIndex))
If Not Run(sql, False) Then
'검색에 실패를 하면 그냥 나감
Focus txtAD(0)
Exit Sub
End If
If Not (Rs.EOF Or Rs.BOF) Then
'검색해서 자료가 있으면 해당값을 대입함
txtAD(0).Text = Trim(Rs("a_Name") & "")
cmbAD(0).ListIndex = Rs("a_Sex")
'년도는 매년 인덱스가 바뀌기 때문에 itemdata에서 해당값을 찾아야 함.
For i = 0 To cmbAD(1).ListCount - 1
If cmbAD(1).ItemData(i) = Rs("a_BirthY") Then
cmbAD(1).ListIndex = i
Exit For
End If
Next
cmbAD(2).ListIndex = Rs("a_BirthM")
cmbAD(3).ListIndex = Rs("a_BirthD")
txtAD(1).Text = CStr(Rs("a_Tall"))
txtAD(2).Text = CStr(Rs("a_Weight"))
cmbAD(4).Text = Rs("a_Blood")
cmbAD(5).Text = Rs("a_Cons")
txtAD(3).Text = Replace(Trim(Rs("a_Deview") & ""), "{SQ}", "'")
txtAD(4).Text = Replace(Trim(Rs("a_Award") & ""), "{SQ}", "'")
End If
End Sub
'디비를 번호별로 추가가 가능하게끔 설정하는 부분
Public Sub DB_Info() '만들고자 하는 DB 구조를 이곳에 정의 하면 됨.
Call DB_Init
'배우등록할 테이블 정의
DB_Gujo(1).DB_Table = "Acts_Table"
DB_Gujo(1).DB_Field = _
" [a_idx] int Identity Primary Key Not Null, " & _
" [a_Name] varChar(100) Default '', " & _
" [a_Sex] int Default 0, " & _
" [a_BirthY] int Default 0, " & _
" [a_BirthM] int Default 0, " & _
" [a_BirthD] int Default 0, " & _
" [a_Tall] Single Default 0, " & _
" [a_Weight] Single Default 0, " & _
" [a_Blood] varChar(50) Default '', " & _
" [a_Cons] varChar(50) Default '', " & _
" [a_Deview] varChar(255) Default '', " & _
" [a_Award] nText Default '', " & _
" [a_Tag] varChar(10) Default ''"
'영화를 등록할 테이블 정의
DB_Gujo(2).DB_Table = "Movies_Table"
DB_Gujo(2).DB_Field = _
" [m_idx] int Identity Primary Key Not Null, " & _
" [m_Name] varChar(50) Default '', " & _
" [m_Kind] varChar(50) Default '', " & _
" [m_Grade] varChar(50) Default '', " & _
" [m_Act1] int Default 0, " & _
" [m_Act2] int Default 0, " & _
" [m_Act3] int Default 0, " & _
" [m_Act4] int Default 0, " & _
" [m_Act5] int Default 0, " & _
" [m_Tag] varChar(10) Default ''"
'출연영화를 따로 정의
DB_Gujo(3).DB_Table = "MA_Table"
DB_Gujo(3).DB_Field = _
" [m_idx] int Identity Primary Key Not Null, " & _
" [m_Movie] varChar(50) Default '', " & _
" [m_Act] varChar(100) Default '', " & _
" [m_Tag] varChar(10) Default ''"
'감독등록할 테이블 정의
DB_Gujo(4).DB_Table = "Director_Table"
DB_Gujo(4).DB_Field = _
" [d_idx] int Identity Primary Key Not Null, " & _
" [d_Name] varChar(100) Default '', " & _
" [d_Sex] int Default 0, " & _
" [d_BirthY] int Default 0, " & _
" [d_BirthM] int Default 0, " & _
" [d_BirthD] int Default 0, " & _
" [a_Deview] varChar(255) Default '', " & _
" [a_Award] nText Default '', " & _
" [a_Tag] varChar(10) Default ''"
End Sub
Private Sub lstDD_Click()
'리스트박스가 클릭되면 해당 감독 검색해서 뿌려줌.
Dim sql As String
Dim i As Integer
If lstDD.ListIndex < 0 Then Exit Sub '리스트박스를 클릭했을때 인덱스가 0보다 작으면 그냥 나감.
sql = "Select * From Director_Table Where d_idx=" + CStr(lstDD.ItemData(lstDD.ListIndex))
If Not Run(sql, False) Then
'검색에 실패를 하면 그냥 나감
Focus txtDD(0)
Exit Sub
End If
If Not (Rs.EOF Or Rs.BOF) Then
'검색해서 자료가 있으면 해당값을 대입함
txtDD(0).Text = Trim(Rs("d_Name") & "")
cmbDD(0).ListIndex = Rs("d_Sex")
'년도는 매년 인덱스가 바뀌기 때문에 itemdata에서 해당값을 찾아야 함.
For i = 0 To cmbDD(1).ListCount - 1
If cmbDD(1).ItemData(i) = Rs("d_BirthY") Then
cmbDD(1).ListIndex = i
Exit For
End If
Next
cmbDD(2).ListIndex = Rs("d_BirthM")
cmbDD(3).ListIndex = Rs("d_BirthD") <- 이부분에서 null의 사용이 잘 못되었다고 나오네요 ㅠ
txtDD(1).Text = Replace(Trim(Rs("d_Deview") & ""), "{SQ}", "'")
txtDD(2).Text = Replace(Trim(Rs("d_Award") & ""), "{SQ}", "'")
End If
End Sub
|
첫댓글 개체에는 널값을 넣을수 없습니다. cmbDD(2).ListIndex = Rs("d_BirthM") & "" 식으로 해주시면 됩니다.