|
* 답변하시는 분들께 도움이 되도록 자신의 환경을 아래 항목 옆에 기재해 주세요.
- 액세스 버전(2007-2016):
* 아래줄에 질문을 작성하세요 >>
오류 해결이 되지 않아 파일을 올립니다~
==============[이형재님 글에 대한 답변입니다]==============
휴대폰 번호에서 문제가 발생하는데 ado는 지식이 짧아 어디가 문제인지 모르겠습니다ㅠㅠ
그리고 신규 추가 할 때 마다 메세지가 나타나는데 이 부분도 검토하셔야 할 듯 합니다.
아래코드로 대체해서 테스트 해보세요.
'용도 종류를 2개 이상 주문한 경우만 'tbl용도'에 등록
Dim rs용도 As DAO.Recordset
Dim strSQL As String
If x용도종류tot >= 2 Then
strSQL = "SELECT * FROM tbl용도 WHERE 주문자명 = '" & x주문자명 & "' AND 주문자휴대폰 = '" & x주문자휴대폰 & "'"
Set rs용도 = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
If rs용도.EOF = True Then '동일인이 없으므로 신규등록
'주문자에 대한 기존 레코드가 없으면 단순히 신규등록하면 됨.
'===========전체코드
Private Sub cmd3용도색인_Click()
'검색창 clear
cmbo주문자명 = Null
cmbo수령인명 = Null
cmbo용도 = Null
cmbo품종 = Null
cmbo상품명 = Null
cmbo주소 = Null
txt시작날짜 = Null
txt끝날짜 = Null
cmbo사용자메모 = Null
cmbo관리자메모 = Null
' 'group by는 필드명과 group by 필드가 일치하지 않으면 읽기전용으로 열림에 주의!
'**********************************************************************
'주문자명과 주문자휴대폰 필드에 null or empty 값이 있는지 확인하는 코드
'**********************************************************************
Set rs = New ADODB.Recordset 'recordset이 가지고 있는 모든 속성과 메서드를 rs에 할당
rs.ActiveConnection = CurrentProject.Connection '현재 프로젝트의 DB에 연결
rs.CursorType = adOpenDynamic 'rs 환경설정(열고 있는 동안 다른 사용자가 추가 수정 삭제한 내용 모두 갱신)
rs.LockType = adLockOptimistic 'update 메소드를 부를 때만 레코드 잠금
rs.Open "select * from tbl주문1다운 where isnull(주문자명) = true or isnull(주문자휴대폰) = true"
If rs.EOF = False Then
MsgBox "주문자명 혹은 주문자휴대폰에 빈 칸이 있는 주문 건이 있습니다!" _
& vbCrLf & vbCrLf _
& "빈 칸은 작업 중 오류를 발생시키므로 지금 바로 값을 채우셔야 합니다!"
'lst주문목록창에서 빈 값이 있는 레코드 보여주기
lst주문목록창.Enabled = True
With Me.lst주문목록창 'Forms!frm주문1다운파일편집!lst주문목록창 으로 하면 속성값이 보이지 않음??
.ColumnCount = "10" '열 개수
.ColumnWidths = "1cm;1.5cm;1.7cm;2.7cm;6cm;1.5cm;2cm;1.7cm;2.7cm;2.7cm" '너비는 22.758로 속성창에서 고정시킴
End With
Forms!frm주문1다운파일편집!lst주문목록창.RowSource = _
"select 선택,ID,주문자명,주문자휴대폰,상품명,주문수량,판매가,수령인, 수령인휴대폰, [(추가) 필드27] " _
& "from tbl주문1다운 " _
& "where isnull(주문자명)=true or isnull(주문자휴대폰) = true " _
& "order by 주문자명+주문자휴대폰, [(추가) 필드27]"
Call 주문목록창_합계계산
rs.Close
Exit Sub
End If
rs.Close
'*****************************************************************
'tbl주문1다운_용도 table의 주문목록으로 주문자별 용도 색인' 만들기
'*****************************************************************
'*** tbl주문1다운 recordset으로 열기
Set rs = New ADODB.Recordset
rs.ActiveConnection = CurrentProject.Connection
rs.CursorType = adOpenDynamic
rs.LockType = adLockOptimistic
'다운 받은 테이블에서, 주문수량 만큼 새로 만든 레코드는 열기에서 제외해야 함!
'(추가) 필드27 필드에 추가기록이 있는 레코드는 제외!
rs.Open "select 주문자명, 주문자휴대폰, 상품명 " _
& "from tbl주문1다운 " _
& "where len([(추가) 필드27]) = 0 or isnull([(추가) 필드27]) or mid([(추가) 필드27],3,1) = '" & 0 & "' " _
& "order by 주문자명, 주문자휴대폰, 상품명"
If rs.EOF = True Or rs.BOF = True Then
MsgBox "용도 색인을 만들기 위한 주문내역이 없습니다."
rs.Close
Exit Sub
End If
'용도 색인을 만들기 위한 변수선언
Dim x용도명 As String '색인 테이블에 레코드를 추가할 때 사용
Dim x피클용qty As Integer '피클용 주문 수량
Dim x원액용qty As Integer '원액용 주문 수량
Dim x매실주용qty As Integer '매실주용 주문 수량
Dim x우메보시용qty As Integer '우메보시용 주문 수량(현재는 사용하지 않지만 미래에 대비)
Dim x주문수량tot As Integer '용도와 무관하게 주문한 갯 수의 합(향후 프로그램 기능확장에 대비)
Dim x용도종류tot As Integer '용도 종류(용도별 주문 건수)의 합 -> 발송을 선택(체크박스)할 때 작업자에게 주문자의 정보제공 목적
rs.MoveFirst 'tbl주문1다운 테이블을 bof()부터 eof()까지 읽어들이기 위함
Do While rs.EOF = False
'용도색인을 만드는 기준은 '주문자+주문자휴대폰' 임
x주문자명 = Nz(rs("주문자명"))
x주문자휴대폰 = CStr(Nz(rs("주문자휴대폰"))) 'x주문자휴대폰(짧은텍스트)가 빈칸인 경우 null이 아닌 empty로 변환되어 cStr로 바꾸었음
'주문자+주문자휴대폰이 바뀔 때마다 용도별 수량 변수 초기화
x피클용qty = 0
x원액용qty = 0
x매실주용qty = 0
x우메보시용qty = 0
x주문수량tot = 0
x용도종류tot = 0
Do While rs("주문자명") = x주문자명 And rs("주문자휴대폰") = x주문자휴대폰
' Do While rs("주문자명") = x주문자명 And rs("주문자휴대폰") = x주문자휴대폰 And rs.EOF = False '주문자가 다르면서 eof인 경우 오류발생
'주문자가 주문한 용도별 수량 계산
x용도명 = Left(rs("상품명"), 4) '4자리까지만 확보
If x용도명 = "피클용_" Then
x피클용qty = x피클용qty + 1
x주문수량tot = x주문수량tot + 1
ElseIf x용도명 = "원액용_" Then
x원액용qty = x원액용qty + 1
x주문수량tot = x주문수량tot + 1
ElseIf x용도명 = "매실주용" Then
x매실주용qty = x매실주용qty + 1
x주문수량tot = x주문수량tot + 1
ElseIf x용도명 = "우메보시" Then
x우메보시용qty = x우메보시용qty + 1
x주문수량tot = x주문수량tot + 1
End If
rs.MoveNext
If rs.EOF = True Then 'do while에서 eof()를 체크하는 경우 오류가 반복되어 추가했음. 주문자가 다르면서 eof인 경우로 보였음
Exit Do
End If
Loop
'동일한 주문자에 대한 주문수량 계산이 끝나면 용도의 갯수 계산
'용도 갯수는 주문수량에 관계없이 무조건 1개로 계산함.
If x피클용qty >= 1 Then
x용도종류tot = x용도종류tot + 1
End If
If x원액용qty >= 1 Then
x용도종류tot = x용도종류tot + 1
End If
If x매실주용qty >= 1 Then
x용도종류tot = x용도종류tot + 1
End If
If x우메보시용qty >= 1 Then
x용도종류tot = x용도종류tot + 1
End If
'용도 종류를 2개 이상 주문한 경우만 'tbl용도'에 등록
Dim rs용도 As DAO.Recordset
Dim strSQL As String
If x용도종류tot >= 2 Then
strSQL = "SELECT * FROM tbl용도 WHERE 주문자명 = '" & x주문자명 & "' AND 주문자휴대폰 = '" & x주문자휴대폰 & "'"
Set rs용도 = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
If rs용도.EOF = True Then '동일인이 없으므로 신규등록
'주문자에 대한 기존 레코드가 없으면 단순히 신규등록하면 됨.
MsgBox "동일인이 없으므로 신규 등록합니다."
rs용도.AddNew 'tbl용도 테이블은 '주문자명+주문자휴대폰'이 기본키로 되어 있음. 그렇지 않으면 동명이인인 경우 인텍스 오류 발생함.
rs용도("주문자명") = x주문자명
rs용도("주문자휴대폰") = x주문자휴대폰
rs용도("피클용qty") = x피클용qty
rs용도("원액용qty") = x원액용qty
rs용도("매실주용qty") = x매실주용qty
rs용도("우메보시용qty") = x우메보시용qty
rs용도("주문tot") = x주문수량tot
rs용도("용도tot") = x용도종류tot
rs용도.Update '만약 tbl주문1다운 테이블에 주문자명과 주문자휴대폰에 빈 값이 들어가면 여기에 인덱스 오류 발생함!
Else '동일인이 있으므로 수정
'주문자에 대한 용도종류가 이미 등록되이 었으면 대조 후 필요한 필드만 등록해야 함!
'주문자명과 주문자휴대폰은 이미 있으므로 update에서 생략
'기존 용도별 수량에 새 주문목록의 용도별 수량을 추가
rs용도.Edit
rs용도("피클용qty") = rs용도("피클용qty") + x피클용qty
rs용도("원액용qty") = rs용도("원액용qty") + x원액용qty
rs용도("매실주용qty") = rs용도("매실주용qty") + x매실주용qty
rs용도("우메보시용qty") = rs용도("우메보시용qty") + x우메보시용qty
rs용도("주문tot") = rs용도("주문tot") + x주문수량tot
'용도tot는 새로 업데이트 된 필드를 재계산하기로 한다.
'동일인의 새로 추가된 주문건은 이미 주문한 용도가 중복될 수 있으므로 용도의 갯수는 재 계산한다.
'용도 갯수는 주문수량에 관계없이 무조건 1개로 계산함.
x용도종류tot = 0
If x피클용qty >= 1 Then
x용도종류tot = x용도종류tot + 1
End If
If x원액용qty >= 1 Then
x용도종류tot = x용도종류tot + 1
End If
If x매실주용qty >= 1 Then
x용도종류tot = x용도종류tot + 1
End If
If x우메보시용qty >= 1 Then
x용도종류tot = x용도종류tot + 1
End If
rs용도("용도tot") = x용도종류tot
rs용도.Update '만약 tbl주문1다운 테이블에 주문자명과 주문자휴대폰에 빈 값이 들어가면 여기에 인덱스 오류 발생함!
End If
End If
Loop
'recordset 닫기
rs.Close
rs용도.Close
'결과를 보여주기.
'tbl용도 테이블 내용 보여주기
lst주문목록창.Enabled = False
With Me.lst주문목록창 'Forms!frm주문1다운파일편집!lst주문목록창 으로 하면 속성값이 보이지 않음??
.ColumnCount = "7" '열 개수
.ColumnWidths = "3cm;3cm;1.5cm;1.5cm;2cm;2cm;2cm" '너비는 22.758로 속성창에서 고정시킴
End With
Forms!frm주문1다운파일편집!lst주문목록창.RowSource = _
"select * " _
& "from tbl용도 " _
& "order by 주문자명+주문자휴대폰"
Call 주문목록창_합계계산_clear
Call 주문목록창_합계계산_용도색인
End Sub |
|