Как мне структурировать циклы vbscript для прохождения через несколько SQL-запросов и отправки результатов по электронной почте, сгруппированных по пользователям? - PullRequest
0 голосов
/ 12 января 2019

Я пишу скрипт 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

Извините за длинный код - я хотел показать, как взаимодействуют запросы и циклы. Как вы можете видеть, электронное письмо содержится в начальном цикле, и я не знаю, как заставить его отправлять по одному электронному письму для каждого результата сотрудника, содержащего все его оценки. На данный момент он рассылает электронную почту для каждого отдельного счета. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...