2014-01-25 2 views
2

저는 Access에서 VBA로 수년간 놀고 있었지만 솔직히 RecordSets를 사용 해본 적이 없습니다.중첩 루프를 사용하여 각 수신자에게 일일 작업 목록을 전자 메일로 보내십시오.

나는 특정 날짜에 대한 모든 엔지니어의 방문 목록을 작성하는 SQL 문자열을 가지고 : 나는 다른 레코드 집합에 잘 작동 변수로 고정 날짜를 대체하는거야

"SELECT Cases.Id, Customers.SiteName, tbl_Visits.[Visit Date], Employees.[Last Name],  Employees.[Job Title], Employees.[E-mail Address] " & vbCrLf & _ 
"FROM (Customers INNER JOIN Cases ON Customers.ID = Cases.Customer) INNER JOIN (Employees INNER JOIN tbl_Visits ON Employees.ID = tbl_Visits.Engineer) ON Cases.Id = tbl_Visits.CaseID " & vbCrLf & _ 
"WHERE (((tbl_Visits.[Visit Date])=#1/27/2014#) AND ((Employees.[Job Title])=""Engineer""));" 

I 용도.

이 데이터로 수행하고자하는 작업은 ID, 사이트 이름, 각 전자 메일 주소의 방문 날짜 텍스트 문자열을 만든 다음 전자 메일로 보냅니다. 이메일 비트를 할 수 있고 전체 RecordSet을 하나의 이메일 텍스트 문자열로 보낼 수 있습니다. 이메일 주소만큼이나 많은 이메일을 보내고 있습니다.

나는 "각각의"직업에 대한 느낌이 있지만, 나는 정말로 모른다.

답변

1

당신은 올바른 길을 가고 있습니다. Access 쿼리는 테이블을 기반으로 할 수있을뿐만 아니라 같은 방식으로 다른 저장된 쿼리를 사용할 수도 있다는 사실을 이용하면됩니다.

그래서 당신은 그럼 당신은

에 중첩 루프를 사용하여이

Dim qdf As DAO.QueryDef 
Set qdf = CurrentDb.CreateQueryDef("dailyVisits", _ 
     "SELECT Cases.Id, Customers.SiteName, tbl_Visits.[Visit Date], Employees.[Last Name],  Employees.[Job Title], Employees.[E-mail Address] " & vbCrLf & _ 
     "FROM (Customers INNER JOIN Cases ON Customers.ID = Cases.Customer) INNER JOIN (Employees INNER JOIN tbl_Visits ON Employees.ID = tbl_Visits.Engineer) ON Cases.Id = tbl_Visits.CaseID " & vbCrLf & _ 
     "WHERE (((tbl_Visits.[Visit Date])=#1/27/2014#) AND ((Employees.[Job Title])=""Engineer""));" 
Set qdf = Nothing 

같은 VBA 코드에서 SQL 문자열을 사용하여 [dailyVisits]라는 이름의 "저장된 쿼리"(기술적으로 QueryDef 객체라고)를 만드는 경우

  1. 는 각각의 사이트 정보 문자열을 작성, 전자 메일 주소의 고유 한 세트를 추출, 전자 메일을 통해 보내
이 같은

사용하여 VBA 코드 무언가 : 당신의 도움에 대한

Dim rstEmail As DAO.RecordSet, rstVisits As DAO.RecordSet, VisitList As String 
Set rstEmail = CurrentDb.OpenRecordset(_ 
     "SELECT DISTINCT [E-mail Address] FROM dailyVisits", _ 
     dbOpenSnapshot) 
Do Until rstEmail.EOF 
    Set rstVisits = CurrentDb.OpenRecordset(_ 
      "SELECT Id & ", " & SiteName & ", " & [Visit Date] AS Visit " & _ 
      "FROM dailyVisits " & _ 
      "WHERE [E-mail Address] = '" & rstEmail![E-mail Address] & "'", 
      dbOpenSnapshot) 
    VisitList = "" 
    Do Until rstVisits.EOF 
     VisitList = VisitList & rstVisits!Visit & VbCrLf 
     rstVisits.MoveNext 
    Loop 
    rstVisits.Close 
    Set rstVisits = Nothing 
    ' 
    ' insert code to send VisitList to rstEmail![E-mail Address] 
    ' 
    rstEmail.MoveNext 
Loop 
rstEmail.Close 
Set rstEmail = Nothing 
DoCmd.DeleteObject acQuery, "dailyVisits" 
+0

고마워요. 나는 아침에 그걸 가지고 가려고합니다. – MikeH

1

정말 감사합니다. 보인다

Dim rstEmail As DAO.Recordset, rstVisits As DAO.Recordset, VisitList As String, eml2txt As String, sql2 As String 

Dim OutApp As Object 
    Dim OutMail As Object 

Dim qdf As DAO.QueryDef 
Set qdf = CurrentDb.CreateQueryDef("qryEngJobList1", _ 
    "SELECT Cases.Id, Customers.SiteName, Customers.[Post Code] AS PCode, tbl_Visits.[Visit Date] AS vDate, Employees.[Last Name] AS lname, Employees.[Job Title], Employees.[E-mail Address] AS dEmail " & vbCrLf & _ 
    "FROM Employees INNER JOIN (Customers INNER JOIN (Cases INNER JOIN tbl_Visits ON Cases.Id = tbl_Visits.CaseID) ON Customers.ID = Cases.Customer) ON Employees.ID = tbl_Visits.Engineer " & vbCrLf & _ 
    "WHERE (((tbl_Visits.[Visit Date])=" & SQLDate([TempVars]![senddate].[Value]) & ") AND ((Employees.[Job Title])=""Engineer""));") 
Set qdf = Nothing 


Set rstEmail = CurrentDb.OpenRecordset(_ 
     "SELECT DISTINCT [dEmail] FROM qryengjoblist1", _ 
     dbOpenSnapshot) 
Do Until rstEmail.EOF 
    Set rstVisits = CurrentDb.OpenRecordset(_ 
      "SELECT Id, SiteName, vDate, PCode " & _ 
      "FROM qryengjoblist1 " & _ 
      "WHERE dEmail = '" & rstEmail![dEmail] & "'", _ 
      dbOpenSnapshot) 
    VisitList = "" 
    Do Until rstVisits.EOF 
     VisitList = VisitList & rstVisits!ID & vbTab & rstVisits!SiteName & vbTab & rstVisits!PCode & vbCrLf 
     rstVisits.MoveNext 
    Loop 
    rstVisits.Close 
    Set rstVisits = Nothing 
    ' 
    ' insert code to send VisitList to rstEmail![E-mail Address] 

    eml2txt = "Please find below your visit summary for " & TempVars!senddate & ":" & Chr(13) & Chr(10) & Chr(13) & Chr(10) & "" _ 
    & VisitList & Chr(13) & Chr(10) & Chr(13) & Chr(10) & "" _ 
    & "If there are any issues, please contact " & TempVars!sereml & Chr(13) & Chr(10) & Chr(13) & Chr(10) & "" _ 
    & "Thank you." 



    Set OutApp = CreateObject("Outlook.Application") 
    OutApp.Session.Logon 
    Set OutMail = OutApp.CreateItem(0) 
    On Error Resume Next 
    With OutMail 
     .SentOnBehalfOfName = TempVars!sereml 
     .To = rstEmail!dEmail 
     .CC = TempVars!sereml 
     .BCC = "" 
     .Subject = "Job Summary for " & TempVars!senddate 
     .Body = eml2txt 
     .Display 'or use .Send 
     .ReadReceiptRequested = False 
    End With 
    On Error GoTo 0 

    'MsgBox eml2txt 
    ' 
    rstEmail.MoveNext 
Loop 
rstEmail.Close 
Set rstEmail = Nothing 

DoCmd.DeleteObject acQuery, "qryengjoblist1" 


End Sub 

멋지게 트릭을 수행 될 : 매우 장난하지 후, 나는에 정착했습니다. 내가해야 할 일은 여기서 어떻게 감사를 드려야할지 생각해 보는 것입니다.

+0

"감사합니다"는 대개 가장 도움이 된 답변을 [수락] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235)로 전달합니다. 당신에게 도움이되었거나 다른 사람들에게 도움이 될 수있는 답변을 "upvote"할 수도 있습니다. –

+1

건배 Gord, 나는 그것에 대한 도움말 파일을보고있는 jus이었다. 나는 투표를하기에 충분한 담당자가 있어야한다. – MikeH