Фильтр Набор записей в SQL - PullRequest
1 голос
/ 26 мая 2020

У меня есть модуль MS Access, который создает электронные письма Outlook поставщикам в нашей компании в таблице HTML. Я могу заставить модуль создавать электронную почту для каждого клиента, но я не могу получить данные для фильтрации по каждой отдельной компании. Например, модуль создает электронное письмо для «Поставщика A», но по-прежнему показывает «Поставщик B» и результат «Поставщик C» в этом электронном письме. Моя текущая попытка - открыть набор записей и использовать его в качестве SQL критериев, хотя я продолжаю получать ошибку «Не указано значение для одного или нескольких обязательных параметров». Приветствуется любая помощь или указание в том, что я делаю неправильно.


Dim olApp As Outlook.Application
Dim objMail As Outlook.MailItem
Dim myRecipient As Outlook.Recipient
Dim strMsg As String
Dim strbody As String
Dim sqlmsg As String
Dim i As Integer
Dim rowColor As String
Dim strsup As String
Dim supfilter As DAO.Recordset
Dim db As DAO.Database
Dim Maillist As DAO.Recordset
Dim Mailset As DAO.QueryDef


DoCmd.SetWarnings False
Set db = CurrentDb

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Set Maillist = db.OpenRecordset("P086 - Email OOR")
Set Mailset = db.QueryDefs("P086 - SOOR Email Format")

sqlmsg = "SELECT [P086 -  Supplier Open Order Report].[Purchase Order ID], [P086 -  Supplier Open Order Report].[PO#] AS [STC Job#], Format([Date],""mm/dd/yyyy"") AS [Issued Date], [P086 -  Supplier Open Order Report].Supplier, [P086 -  Supplier Open Order Report].Quantity, [P086 -  Supplier Open Order Report].DeliveryDate AS [Delivery Date], [P086 -  Supplier Open Order Report].StatDate AS [Stat Date], [P086 -  Supplier Open Order Report].[Till Delivery], [P086 -  Supplier Open Order Report].[Quantity In]" _
        & " From [P086 -  Supplier Open Order Report]" _
        & " WHERE [P086 -  Supplier Open Order Report].Supplier = '" & Maillist.Fields("Supplier") & "'" _
        & " ORDER BY [P086 -  Supplier Open Order Report].DeliveryDate;"


rs.Open sqlmsg, CurrentProject.Connection, adOpenKeyset, adLockOptimistic

strMsg = "<table border='1' cellpadding='3' cellspacing='3' style='border-collapse: collapse' bordercolor='#111111' width='800'>" & _
"<tr>" & _
"<td bgcolor='#B0C4DE'>&nbsp;<b>Purchase Order</b></td>" & _
"<td bgcolor='#B0C4DE'>&nbsp;<b>STC Job#</b></td>" & _
"<td bgcolor='#B0C4DE'>&nbsp;<b>Issue Date</b></td>" & _
"<td bgcolor='#B0C4DE'>&nbsp;<b>Supplier</b></td>" & _
"<td bgcolor='#B0C4DE'>&nbsp;<b>Quantity</b></td>" & _
"<td bgcolor='#B0C4DE'>&nbsp;<b>Quantity Received</b></td>" & _
"<td bgcolor='#B0C4DE'>&nbsp;<b>Delivery Date</b></td>" & _
"<td bgcolor='#B0C4DE'>&nbsp;<b>Stat Date</b></td>" & _
"<td bgcolor='#B0C4DE'>&nbsp;<b>Days Till Delivery</b></td>" & _
"</tr>"

i = 0

Do While Not rs.EOF

If (i Mod 2 = 0) Then
rowColor = "<td bgcolor='#FFFFFF'>&nbsp;"
Else
rowColor = "<td bgcolor='#E1DFDF'>&nbsp;"
End If

Mailset.SQL = sqlmsg

strMsg = strMsg & "<tr>" & _
rowColor & rs.Fields("Purchase Order ID") & "</td>" & _
rowColor & rs.Fields("STC Job#") & "</td>" & _
rowColor & rs.Fields("Issued Date") & "</td>" & _
rowColor & rs.Fields("Supplier") & "</td>" & _
rowColor & rs.Fields("Quantity") & "</td>" & _
rowColor & rs.Fields("Quantity In") & "</td>" & _
rowColor & rs.Fields("Delivery Date") & "</td>" & _
rowColor & rs.Fields("Stat Date") & "</td>" & _
rowColor & rs.Fields("Till Delivery") & "</td>" & _
"</tr>"

rs.MoveNext
Maillist.MoveNext
i = i + 1
Loop

strbody = Chr(12) & "The Raw Material Auto Order Screen Must Have the 5000 Serial Number Inserted To Be Remove From This Alert." & _
             Chr(12) & "Raw Material QM34 Process Sheets Required For All Inventory Purchases. Stock Number(s) Are Provided In This Email."


strMsg = strMsg & "</table>" & strbody
Set olApp = Outlook.Application
Set Maillist = db.OpenRecordset("P086 - Email OOR")

Do Until Maillist.EOF

Set objMail = olApp.CreateItem(olMailItem)
objMail.To = Maillist("emailaddress")

With objMail
.BodyFormat = olFormatHTML
.HTMLBody = "<Font size =""3"">" & strMsg & "</font>"
.Subject = "Supplier Open Order Report " & Date
'.Send 'if you want to send it directly without displaying on screen
.Display ' to display on screen before send
End With
Maillist.MoveNext
Loop

Set olApp = Nothing
Set objMail = Nothing

End Function

1 Ответ

1 голос
/ 26 мая 2020

Критерии для полей текстового типа требуют разделителей. Возможные варианты - апостроф или двойные кавычки. Я предпочитаю апостроф, так как его легче читать. В поле даты / времени потребуется разделитель #.

& " WHERE [P086 - Supplier Open Order Report].Supplier = '" & Maillist!Supplier & "'" _

Не нужны все эти скобки, не нужно объединять пустую строку, не нужно .Fields - альтернативный синтаксис для ссылочного поля.

Для получения дополнительной информации просмотрите INSERT INTO - ошибки, но позволяет ввод в таблицу

Что касается данных, которые отправляются, они только компилируются однажды вне набора записей Maillist l oop. Код logi c неверен. Измените процедуру для компиляции данных для каждой записи Maillist в пределах ее l oop. Кроме того, действительно нужно создать объект приложения Outlook только один раз, поэтому сделайте это и закройте его вне циклов. Объект электронной почты отличается.

Set olApp = Outlook.Application
Set Maillist = db.OpenRecordset("P086 - Email OOR")
Do Until Maillist.EOF
    sqlmsg = ...
    rs.Open sqlmsg, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    ...
    Do While Not rs.EOF
        ...
    Loop
    rs.Close
    ...
Loop

Удалите второй Set Maillist = db.OpenRecordset("P086 - Email OOR").

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