2012-12-27 2 views
1

그래서 몇 가지 플래그를 설정하는 등의 시스템이 구축되었지만 수행하려는 작업 중 하나는 준비 테이블의 내용을 가져 와서 보냅니다. 추적에 사용되는 다른 테이블로 넘어갑니다. 내가 루프에 삽입을 사용하여 그것을 할려고하지만 단순히 의도대로 작동하게하는 방법을 알아낼 수 없습니다.루프가 전체 테이블에서 실행되지 않음

Private Sub Form_Load() 
    DoCmd.SetWarnings False 
    DoCmd.OpenQuery ("qryDeleteEmail") 
    Dim db As Object 
    Dim rst As Object 
    Dim test As Object 

    Set db = Application.CurrentDb 
    Set rst = db.OpenRecordset("qryDate") 
    Set test = db.OpenRecordset("tblEmailTemp") 

    If Me.RecordsetClone.RecordCount = 0 Then 
     MsgBox ("No delinquent accounts. No email will be generated.") 
     Me.Refresh 
     DoCmd.Close acForm, "qryDate", acSaveNo 
     DoCmd.CancelEvent 
    Else 
     rst.MoveFirst 
     Do Until rst.EOF 
      rst.Edit 
      rst!NeedsEmail = 1 
      rst.Update 
      rst.MoveNext 
     Loop 

     'DoCmd.Requery 
     'rst.Close 


     DoCmd.RunMacro ("StagingTable") 
     test.MoveFirst 

     Do Until test.EOF 
      CurrentDb.Execute "Insert Into EmailTracking (Account, ExpirationDate)" & _ 
       "Values ('" & AccountName & "', '" & ExpirationDate & "')" 
      test.MoveNext    
     Loop 

     test.Close 
     rst.MoveFirst 

     Do Until rst.EOF 
      rst.Edit 
      rst!EmailSent = 1 
      rst.Update 
      rst.MoveNext 
     Loop 

     'DoCmd.Requery 
     rst.Close 
     DoCmd.RunMacro ("Close") 
     'DoCmd.OpenQuery ("qryDeleteEmail") 
    End If 
    Exit Sub 
End Sub 

현재 스테이징 테이블의 첫 번째 레코드를 두 번 복사하고 있습니다. 예를 들어 나는 계정 이름 A와 계정 이름 S를 가지고 있지만 A에 대한 레코드와 S에 대한 레코드를 삽입하는 대신 단순히 A를 두 번 삽입하는 것입니다.

도움이 될 것입니다.

+0

코드의 들여 쓰기가 이해가되지 않아 편집했습니다. 코드의 작은 부분에는 의미가 없지만 아직 많이 있습니다. – dnLL

+0

글쎄, 나는이 일에 매우 나쁘다는 것을 인정하고 여전히 배우려고 애쓰는 첫 번째 사람이 될 것이다. 그래도 편집 해 주셔서 감사합니다. 그것은 읽기 쉽게합니다. – user1706975

+0

"StagingTable"매크로는 무엇을 수행합니까? 또한 AccountName 및 ExpirationDate를 초기화하지 않았습니다. 모듈 상단에'Option Explicit'을 두는 것이 좋습니다. 당신이 원할 수있는 것은'test! AccountName'과'test! ExpirationDate'입니다. – Bobort

답변

4

해결하려는 문제에 집중하는 간단한 절차를 만들고 테스트 해보십시오. 불행히도, 나는 그 문제가 무엇인지 모르겠습니다. 나는 ExpirationDate)Values 사이에 공간이 없었다 원래 버전에서 ... 어쨌든

Public Sub TestLoopThruTable() 
    Dim db As DAO.database 
    Dim test As DAO.Recordset 
    Dim strInsert As String 

    DoCmd.SetWarnings True ' make sure SetWarnings is on 
    Set db = CurrentDb 
    Set test = db.OpenRecordset("tblEmailTemp") 
    Do While Not test.EOF 
     strInsert = "INSERT INTO EmailTracking (Account, ExpirationDate)" & vbCrLf & _ 
      "VALUES ('" & AccountName & "', '" & ExpirationDate & "')" 
     Debug.Print strInsert 
     'db.Execute strInsert, dbFailOnError 
     test.MoveNext 
    Loop 
    test.Close 
    Set test = Nothing 
    Set db = Nothing 
End Sub 

공지 사항이 제안합니다. 나는 줄 바꿈 (vbCrLf) 대신 공백을 사용했지만, 둘 중 하나는 db 엔진을 행복하게 유지할 것이다.

SetWarnings이 켜져 있는지 확인했습니다. 코드에서 시작시 해제했지만 결코 다시 켜지 않았습니다. SetWarnings off로 작동하면 코드 관련 문제를 이해하는 데 사용할 수있는 중요한 정보가 표시되지 않습니다.

해당 코드가 레코드 세트를 반복하면 단순히 INSERT 문이 만들어지고 각 행에 대해 표시됩니다. 직접 실행 창에서 출력을 볼 수 있습니다 (Ctrl + g 키보드 바로 가기로 이동하십시오). 이러한 INSERT 문 중 하나를 복사하고 새 Access 쿼리의 SQL보기에 붙여 넣어 테스트하십시오. 거기서 실패하면 db 엔진을 만족시키기 위해 바꿀 필요가있는 것을 알아 내십시오. INSERT이 성공하면 코드에서 실행 해보십시오. db.Execute 행을 활성화하려면 해당 행의 시작 부분에서 작은 따옴표를 제거하십시오.

VALUES 절을 쓰는 방법은 [ExpirationDate]이 텍스트 필드 인 것으로 나타납니다. 그러나 데이터 유형이 실제로 날짜/시간 인 경우 삽입하는 값 주변에 따옴표를 포함하지 마십시오. 따옴표 대신 # 날짜 구분 기호를 사용하십시오.

또한이 같은 코드 모듈의 선언 구역에 Option Explicit를 포함해야합니다

Option Compare Database 
Option Explicit 

내가 그 시점을 언급하기 때문에 당신이 Option Compare하지만 Option Explicit 보여 주었다이 질문의 이전 버전. Option Explicit없이 코드 문제를 해결하는 것은 시간 낭비입니다.

+0

매개 변수 쿼리를 기반으로 QueryDef를 사용하는 것이 나을 것 같습니다. 그런 다음 매번 루프를 통해 매개 변수 값을 제공하고 QueryDef를 실행할 수 있습니다. 나는 야망을 잃었다. – HansUp

+0

도움을 주셔서 감사합니다. 내가이 문제를 해결하려고 할 때 이것을 언급 할 것이다. 고맙습니다. – user1706975

1

여기서 무엇을하려고하는지 잘 모르겠습니다. Else 성명서에 (해당하는 경우에도) ErrorHandler이 (가) 무엇을하는지 이해하기가 어렵습니다.

레코드 세트를 반복하면서 MS-Access에서 VBA 프로그래밍의 기초에 대해 조금 읽으라고 조언합니다. 아래 기사를 읽어 보면 시작할 수 있습니다. VBA 레코드 집합에 대해 간략하게 소개 한 다음 VBA에서 가장 일반적인 실수입니다.

http://allenbrowne.com/ser-29.html

http://www.techrepublic.com/blog/10things/10-mistakes-to-avoid-when-using-vba-recordset-objects/373

그것은 당신이 당신의 코드를 개선하는 데 도움이됩니다.

관련 문제