Я пишу скрипт vbs для запроса нескольких таблиц sql и сбора различных оценок для каждого пользователя, а затем отправляю результаты по электронной почте. Я могу сгенерировать электронное письмо для каждого счета, но я не могу за один раз отправить по одному электронному письму на пользователя со всеми его оценками в пределах.
Я разработал систему викторин на основе интрасети, которая генерирует тесты с сервера sql (2012) с использованием классического asp. Все это работает хорошо, но мне нужно запустить запланированное задание в Windows 2012 с помощью сценария VBS, чтобы запросить таблицы, определить, когда пользователь завершил все свои тесты, получить свои оценки, а затем сгенерировать электронное письмо, содержащее имя человека и оценки из тесты.
Письмо отправляется менеджеру магазина для определения местоположения пользователя, поэтому в запросе также должна указываться соответствующая контактная информация магазина.
У меня все запросы работают нормально, но я использую несколько вложенных циклов, и я получаю отдельное электронное письмо для каждой оценки теста, но мне нужно одно электронное письмо на пользователя, которое содержит все их оценки.
Я не могу структурировать код для этого.
'Check for completed onboardings...
Dim conn
Set conn = CreateObject("ADODB.Connection")
conn.ConnectionString = "Provider=SQLOLEDB; Data Source = server; Initial
Catalog = DB1; User Id = user; Password= xxxxxxxx"
conn.open conn.ConnectionString
If conn.errors.count <> 0 Then
Wscript.Echo "Database Connection Error"
End If
Set dbconn = CreateObject("ADODB.Connection")
dbconn.ConnectionString = "Provider=SQLOLEDB; Data Source = server; Initial
Catalog = DB2; User Id = user; Password= xxxxxxxx"
dbconn.open dbconn.ConnectionString
If dbconn.errors.count <> 0 Then
Wscript.Echo "Database Connection Error"
End If
'query quiz db to determine employees that have completed all quizzes and
get their location...
Dim rs
Set rs = CreateObject("ADODB.Recordset")
rs.CursorLocation = 3
rs.Open "Select a.group_id, v.emp_num, v.locationcode From QuizGroups as a,
Positions as p, ValidApplicants as v Where a.group_id = p.group_id And
p.Position = v.position And v.complete = 1",conn
RSCount = rs.RecordCount
i = 0
Do until i = RSCount
strGroupID = rs("group_id")
strEmpID = rs("emp_num")
strLocation = rs("locationcode")
'Grab employee names from HR database...
Dim avRS
Set avRS = CreateObject("ADODB.Recordset")
avRS.CursorLocation = 3
avRS.Open "Select GivenName, Surname From Employee_Master Where Empno = "&
strEmpID &"",dbconn
avRSCount = avRS.RecordCount
strEmpFname = trim(avRS("GivenName"))
strEmpLname = trim(avRS("Surname"))
'Obtain store manager name and email from quiz db...
Set avRec = CreateObject("ADODB.Recordset")
avRec.CursorLocation = 3
avRec.Open "Select PreferredName, Surname, Email From StoreContacts Where
locn = "& strLocation &"",conn
avRecCount = avRec.RecordCount
if avRecCount > 0 then
strEmail = trim(avRec("Email"))
strFname = trim(avRec("PreferredName"))
strLname = trim(avRec("Surname"))
end if
'obtain the quiz tables for each employee based on their group
membership...
Set rec = CreateObject("ADODB.Recordset")
rec.CursorLocation = 3
rec.Open "Select quiz_name, tblname, quiz_code From quizfilter Where
group_id in (1, "& strGroupID &")",conn
recCount = rec.RecordCount
x = 0
Do until x = recCount
strQuizName = rec("quiz_name")
strTable = rec("tblname")
strCode = rec("quiz_code")
'finally, query the scores from the above tables...
Set rez = CreateObject("ADODB.Recordset")
rez.CursorLocation = 3
rez.Open "Select score, CONVERT(date, date_completed) as date_completed
From "& strTable &" Where pass_fail = 1 And employee_num = "& strEmpID
&"",conn
rezCount = rez.RecordCount
'Create the email content...
strBody = "Hello "& strFname &",<br /><br />" & strEmpFname &" "&
strEmpLname &" has successfully completed all of the corporate trainings
necessary to be scheduled. Please see below for their scores:<br /><br />" _
'Loop through the quiz scores...
z = 0
Do Until z = rezCount
strScore = rez("score")
strDate = rez("date_completed")
strBody = strBody & "Quiz name: "& strQuizName &"<br />Final score: "&
strScore &"<br />"
strBody = strBody & "Date completed: "& strDate &"<br />"
rez.MoveNext
z = z + 1
Loop
strBody = strBody & "MANAGERS, Please present "& strEmpFname &" "&
strEmpLname &" with a gift card as recognition of successful completion."
'send the email out...
Set myMail = CreateObject("CDO.Message")
myMail.Subject = "Employee Quiz Scores"
myMail.From = "hr@company.com"
myMail.To = strEmail
myMail.HTMLBody = strBody
rec.MoveNext
x = x + 1
Loop
rs.MoveNext
i = i + 1
Loop
rs.close
conn.close()
Set conn = nothing
Извините за длинный код - я хотел показать, как взаимодействуют запросы и циклы. Как вы можете видеть, электронное письмо содержится в начальном цикле, и я не знаю, как заставить его отправлять по одному электронному письму для каждого результата сотрудника, содержащего все его оценки. На данный момент он рассылает электронную почту для каждого отдельного счета.
Спасибо.