| |
* 답변하시는 분들께 도움이 되도록 자신의 환경을 아래 항목 옆에 기재해 주세요.
1. 액세스 버전(95,97,2000,2002): 2000
2. 윈도우즈의 버전(win95,win98,winME,winNT,win2000,winXP): 2000
3. CPU (486,PentiumI/II/III/IV...):
4. RAM (32,64,128,256,512MB,1G...):
* 아래줄에 질문을 작성하세요 >>
ADP 파일을 생성하여 폼 명령버튼에 다음과 같이 코딩을 하였습니다.
If MsgBox("현재 등록내용을 확정하여 보내시겠습니까? (이후 수정 불가)", vbYesNo + vbQuestion, "등록내용확정송부") = vbYes Then
DoCmd.RunSQL ("INSERT INTO dbo.Result_All (Jumpo, Year, Quarter, Code_T, Code_M, Jumsu, UserID, Center, Opinion) SELECT Jumpo, Year, Quarter, Code_T, Code_M, Jumsu, UserID, Center, Opinion FROM dbo.Result where UserID = '" & myId & "'")
DoCmd.RunSQL ("Delete FROM dbo.Result where UserID = '" & myId & "'")
Else
Cancel = True
End If
간단히 말씀드리면
첫번째 SQL 문장에서는 Insert 처리를 하고
두번째 SQL 문장에서는 위 Insert 한 부분을 Delete 하는데
첫번째 문장에 에라가 있을 경우에도 메세지 출력후
두번째 문장을 그대로 처리합니다.
SQL Server에서의 Begin Tran ~~~~~ Commit 문 처럼
이 두 SQL 문을 트랜젝션 처리할 수 있는 방법이
VBA 코딩에서 있는지 궁금합니다.
즉 첫번째 문장과 두번째 문장중 어느 한 문장에도 에라가
있으면 모든 SQL 문이 실행되면 안됩니다.
고수님의 고견 부탁드립니다.
PS : Crocii 님 여러 도움에 참으로 감사드립니다. 간단한 인적사항이나
알고 싶군요!
==============[에밀님 글에 대한 답변입니다]==============
안녕하세요 에밀님~ ^^
드디어..!! 이곳에.. 트랜잭션에 관한 질문이 올라왔군요..
반갑습니다..
물론 트랜잭션 처리가 가능합니다..
한가지.. 사족으로..
많은 분들이 모르시거나 잘못 알고 계신것이 있는데.. mdb, 즉 액세스 DB도 트랜잭션 처리가 됩니다. DAO를 이용하여 가능하지요. 단 서버형DB와 같이 트랜잭션이 자동으로 발생하게 할 수는 없고 트랜잭션 시작을 선언해 주어야 합니다. 데스트탑DB이니까요..
즉, 바운드폼에서는 안되고 언바운드폼에서 DAO를 이용하여 액세스할 때 가능합니다. 게다가.. 다중 트랜잭션을 지원합니다..!! 메모리 부담이 커지겠지만.. 각설하고.. ^^;
ADP는 기본적으로 ADO로 연결합.. 할 겁니다.. (맞을 겁니다.)
코드를 보니 언바운드 폼이로군요..
ADO는 다중 트랜잭션을 지원하지 않습니다.. (아마도..)
때문에 아래와 같이 코딩해야 합니다.
dim Cnn as Connection
on error resume next
set Cnn=currentproject.connection
If MsgBox("현재 등록내용을 확정하여 보내시겠습니까? (이후 수정 불가)", vbYesNo + vbQuestion, "등록내용확정송부") = vbYes Then
Cnn.BeginTrans '★
DoCmd.RunSQL ("INSERT INTO dbo.Result_All (Jumpo, Year, Quarter, Code_T, Code_M, Jumsu, UserID, Center, Opinion) SELECT Jumpo, Year, Quarter, Code_T, Code_M, Jumsu, UserID, Center, Opinion FROM dbo.Result where UserID = '" & myId & "'")
'docmd.runsql 는.. 서버에서 보낸 에러코드를 반환할지.. 잘 모르겠습니다.. 아마 되리라고 생각합니다만.. 에러코드가 반환되지 않으면 아래처럼 Connection개체의 Excute메서드를 이용해 SQL을 날리십시요.
'Cnn.Excute "Insert Into dbo.Result_All ~"
if cnn.errors.count>0 then '★
cnn.rollbacktrans '★
else
DoCmd.RunSQL ("Delete FROM dbo.Result where UserID = '" & myId & "'")
'역시 에러코드가 반환되지 않으면 Excute메서드를 사용하십시요.
if cnn.errors.count>0 then '★
cnn.rollbacktrans '★
else
cnn.commitTrans '★
end if
end if
Else
Cancel = True
End If
|
|