423,822 Members | 1,356 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 423,822 IT Pros & Developers. It's quick & easy.

Over my head (again)

P: n/a
I have a continous form based on a query. The Query checks a students
record to see if a letter has been selected. The letters are selected
from a combo box so each letter has a corresponding number. It also
checks a check box to see if the letter has been sent. If it hasn't
it's listed in the continious form along with the students name, Email
address and StudentID. There are also txt boxes for Email Subject and
Email Message. On the form I have a button to Email a report to the
student. The report is based on a different query. The code to Email
is as follows.

Private Sub Command12_Click()

If IsNull(Me.txtSubject) Or IsNull(Me.txtMessage) Then
MsgBox ("You must Enter Subject and message for Email")
Me.Undo
Else

Dim db As DAO.Database
Dim strSQL As String
Dim strEmail As String
Dim rs As DAO.Recordset
Dim strID As Integer

Set db = CurrentDb

strSQL = "SELECT tblDemoTrack.EmailName, tblDemoTrack.MCTCID,
tblDemoTrack.StudentID,
tblDemoTrack.FirstName, tblDemoTrack.LastName, tblStage.LetterID,
tblStage.LetterSent
FROM (tblStage INNER JOIN tblDemoTrack ON tblStage.StudentID =
tblDemoTrack.StudentID)
INNER JOIN tblStageTrack ON tblDemoTrack.StudentID =
tblStageTrack.StudentID
WHERE (((tblDemoTrack.EmailName) Is Not Null) AND
((tblStage.LetterID)=22) AND ((tblStage.LetterSent)=0))"
Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
If IsNull(Me.EmailName) Then
MsgBox ("No Records have been chosen")
Me.Undo
DoCmd.Close
Exit Sub

End If

rs.MoveFirst
While Not rs.EOF
strEmail = rs!EmailName '[EmailName]
strID = rs!StudentID
[ThisID] = strID

Debug.Print "Send Email to "; strEmail; ThisID
DoCmd.OpenReport "NotComplete1", acViewPreview, , "[StudentID] = "
& Forms![frm_qry_22_EmailIncomplete]![ThisID]
DoCmd.SendObject acSendReport, "NotComplete1", acFormatRTF,
strEmail, , , txtSubject, txtMessage, False
DoCmd.Close acReport, "NotComplete1"

rs.MoveNext
If Not rs.EOF Then strEmail = strEmail & ", "
If Not rs.EOF Then strID = strID & ", "

wend
rs.Close
Set rs = Nothing
db.Close
Set db = Nothing

End If

End Sub

The strSQL string is the same as the query source for the form. What
I'm trying to do is go through each record that meets the criteria,
open a report for that studentID and email the report, close the report
and go on to the next student. I had this working perfect in my
development data base but when I imported in to the working data base
it refuses to pass an ID to the report. I basically use the txtfield
ThisID to hold the StudentID and update it to the next record. I tried
passing strID Variable to the report but it didn't like that. The
debug statement just before the open report statement prints out the
Email address and the ThisID correctly. Is there a reason the report
won't accept the StudentID in the open report statement? Is there an
eaiser way to do this? Can I just read each record on the form and
somehow loop through them one at a time (Not sure how to code that)
keep in mind I need to pass the Email address to the SendObject and the
StudentID to the report, or is opening a record set the best way to go.
I've learned enough from this group to be dangerous and not enough to
be good! (Yet)
Thanks for your help.

Jul 28 '06 #1
Share this Question
Share on Google+
5 Replies


P: n/a
Rick wrote:

I'll attempt to correct a couple of things.
Private Sub Command12_Click()

If Me.txtSubject) Or IsNull(Me.txtMessage) Then
MsgBox ("You must Enter Subject and message for Email")
Me.Undo

Dim strEmail As String
Dim rs As DAO.Recordset
Dim strID As Integer
Dim blnOK As Boolean

blnOK = True
Set rs = Me.RecordsetClone
If rs.RecordCount 0 then
rs.MoveFirst
'loop through form's recordset and see if any
'records are missing an email name. I suppose this list
'is small, but you could also do this with a SQL statement
Do while not rs.EOF
If NZ(rs!EmailName,"") = "" then
msgbox "Some records don't have email addresses"
blnOK = False
Exit Do
Endif
rs.MoveNext
Loop

If blnOK Then
'all records have an email address
rs.MoveFirst
While Not rs.EOF
strEmail = rs!EmailName '[EmailName]
strID = rs!StudentID
[ThisID] = strID

'Debug.Print "Send Email to "; strEmail; ThisID

'I have no idea why you need to open the
'report first...but what the heck. I'll comment
'it out since I don't think it's necessary. remove
'the ' in case you need it
'DoCmd.OpenReport "NotComplete1", _
acViewPreview, , "[StudentID] = " & strID

DoCmd.SendObject acSendReport, "NotComplete1", _
acFormatRTF, strEmail, , , txtSubject, _ txtMessage, False

'remove comment mark in front of Docmd if for some
'odd reason you need the report open in preview
'mode.
'DoCmd.Close acReport, "NotComplete1"

rs.MoveNext

'I have no idea what the next 2 lines is for _
'is for except to create a couple of strings
'that are immediately overwritten. Commented out
'If Not rs.EOF Then strEmail = strEmail & ", "
'If Not rs.EOF Then strID = strID & ", "

wend
rs.Close
Set rs = Nothing
db.Close
Endif
else
MsgBox ("You must Enter Subject and message for Email")
Me.Subject.setfocus
End If

End Sub

Now...I see no need to open and close your report. Maybe someone more
experienced with sending reports can tell me differently. First thing,
I will assume this report is only called from this form. If not, look
in GoogleGroups, group *Access*, for IsLoaded. This is a function to
determine if a form is open. Next, I'll assume you have the student ID
on the report, hidden or visible, doesn't matter.

Now, in the OnOpen event of NotComplete1 report you could do something
like this
If IsLoaded("YourFormName") Then
Me.Filter = "[StudentID] = " & _
Forms![frm_qry_22_EmailIncomplete]![ThisID]
Me.FilterOn = True
Endif

If this report is only called from this form then enter
Me.Filter = "[StudentID] = " & _
Forms![frm_qry_22_EmailIncomplete]![ThisID]
Me.FilterOn = True

This will filter the report to 1 student record.

You can also set flags in the OnOpen event to preview will all records
or filter to 1 record. I'm trying to keep this simple.

See if the above code makes more sense now.
Jul 29 '06 #2

P: n/a
salad wrote:
Rick wrote:

I'll attempt to correct a couple of things.
Private Sub Command12_Click()

If Me.txtSubject) Or IsNull(Me.txtMessage) Then
MsgBox ("You must Enter Subject and message for Email")
Me.Undo

Dim strEmail As String
Dim rs As DAO.Recordset
Dim strID As Integer
Dim blnOK As Boolean

blnOK = True
Set rs = Me.RecordsetClone
If rs.RecordCount 0 then
rs.MoveFirst
'loop through form's recordset and see if any
'records are missing an email name. I suppose this list
'is small, but you could also do this with a SQL statement
Do while not rs.EOF
If NZ(rs!EmailName,"") = "" then
msgbox "Some records don't have email addresses"
blnOK = False
Exit Do
Endif
rs.MoveNext
Loop

If blnOK Then
'all records have an email address
rs.MoveFirst
While Not rs.EOF
strEmail = rs!EmailName '[EmailName]
strID = rs!StudentID
[ThisID] = strID

'Debug.Print "Send Email to "; strEmail; ThisID

'I have no idea why you need to open the
'report first...but what the heck. I'll comment
'it out since I don't think it's necessary. remove
'the ' in case you need it
'DoCmd.OpenReport "NotComplete1", _
acViewPreview, , "[StudentID] = " & strID

DoCmd.SendObject acSendReport, "NotComplete1", _
acFormatRTF, strEmail, , , txtSubject, _ txtMessage, False

'remove comment mark in front of Docmd if for some
'odd reason you need the report open in preview
'mode.
'DoCmd.Close acReport, "NotComplete1"

rs.MoveNext

'I have no idea what the next 2 lines is for _
'is for except to create a couple of strings
'that are immediately overwritten. Commented out
'If Not rs.EOF Then strEmail = strEmail & ", "
'If Not rs.EOF Then strID = strID & ", "

wend
rs.Close
Set rs = Nothing
db.Close
Endif
else
MsgBox ("You must Enter Subject and message for Email")
Me.Subject.setfocus
End If

End Sub

Now...I see no need to open and close your report. Maybe someone more
experienced with sending reports can tell me differently. First thing,
I will assume this report is only called from this form. If not, look
in GoogleGroups, group *Access*, for IsLoaded. This is a function to
determine if a form is open. Next, I'll assume you have the student ID
on the report, hidden or visible, doesn't matter.

Now, in the OnOpen event of NotComplete1 report you could do something
like this
If IsLoaded("YourFormName") Then
Me.Filter = "[StudentID] = " & _
Forms![frm_qry_22_EmailIncomplete]![ThisID]
Me.FilterOn = True
Endif

If this report is only called from this form then enter
Me.Filter = "[StudentID] = " & _
Forms![frm_qry_22_EmailIncomplete]![ThisID]
Me.FilterOn = True

This will filter the report to 1 student record.

You can also set flags in the OnOpen event to preview will all records
or filter to 1 record. I'm trying to keep this simple.

See if the above code makes more sense now.
Thanks salad

I'm just learning to deal with recordsets and it never dawned on me
that a form based on a query would already have it's own record set.
Makes sence now that I think about it. I'll give the code a try on
Monday and let you know how it all works. The query the forms based on
already checks for null email field so I don't think I'll need to check
if it's null. I can't say enough about this news group, although I
think I've learned who's postings I can trust and who's waste my time.

Jul 29 '06 #3

P: n/a
Rick wrote:
Thanks salad

I'm just learning to deal with recordsets and it never dawned on me
that a form based on a query would already have it's own record set.
Makes sence now that I think about it. I'll give the code a try on
Monday and let you know how it all works. The query the forms based on
already checks for null email field so I don't think I'll need to check
if it's null. I can't say enough about this news group, although I
think I've learned who's postings I can trust and who's waste my time.
This is an excellent group with the most knowledgable people in Access
you'll ever meet. Good luck.
Jul 29 '06 #4

P: n/a

salad wrote:
Rick wrote:
Thanks salad

I'm just learning to deal with recordsets and it never dawned on me
that a form based on a query would already have it's own record set.
Makes sence now that I think about it. I'll give the code a try on
Monday and let you know how it all works. The query the forms based on
already checks for null email field so I don't think I'll need to check
if it's null. I can't say enough about this news group, although I
think I've learned who's postings I can trust and who's waste my time.
This is an excellent group with the most knowledgable people in Access
you'll ever meet. Good luck.
Salad:

Thanks for all the help, here's my final code

If IsNull(Me.txtSubject) Or IsNull(Me.txtMessage) Then
MsgBox ("You must Enter Subject and message for Email")
Me.Undo
Me.txtSubject.SetFocus
Else

Dim strEmail As String
Dim rs As DAO.Recordset
Dim strID As Integer
'no need to check for null email as form query already checks for that
Set rs = Me.RecordsetClone
If rs.RecordCount 0 Then

rs.MoveFirst
While Not rs.EOF
strEmail = rs!EmailName '[EmailName]
strID = rs!StudentID
[ThisID] = strID
'Print copy of emailed report
'You where correct. No need to open report in preview to send as
attachment but I'm printing a copy for students file.
DoCmd.OpenReport "NotComplete1", acViewNormal, ,
"[StudentID] =" & Forms![frm_qry_22_EmailIncomplete]![ThisID]

DoCmd.SendObject acSendReport, "NotComplete1",
acFormatRTF, strEmail, , , txtSubject, txtMessage, False

rs.MoveNext

Wend
rs.Close
Set rs = Nothing
'no need to do db.close
End If

End If
End Sub

The report is only opened from the form so I did as you suggested and
filtered the report with the following in the reports onOpen event
Me.Filter = "[StudentID] = " & _
Forms![frm_qry_22_EmailIncomplete]![ThisID]
Me.FilterOn = True

Every thing works perfect, thanks for teaching this old dog something
new. It's much appreciated.

Jul 31 '06 #5

P: n/a
Rick wrote:
salad wrote:
>>Rick wrote:
>>>Thanks salad

I'm just learning to deal with recordsets and it never dawned on me
that a form based on a query would already have it's own record set.
Makes sence now that I think about it. I'll give the code a try on
Monday and let you know how it all works. The query the forms based on
already checks for null email field so I don't think I'll need to check
if it's null. I can't say enough about this news group, although I
think I've learned who's postings I can trust and who's waste my time.

This is an excellent group with the most knowledgable people in Access
you'll ever meet. Good luck.


Salad:

Thanks for all the help, here's my final code

If IsNull(Me.txtSubject) Or IsNull(Me.txtMessage) Then
MsgBox ("You must Enter Subject and message for Email")
Me.Undo
Me.txtSubject.SetFocus
Else

Dim strEmail As String
Dim rs As DAO.Recordset
Dim strID As Integer
'no need to check for null email as form query already checks for that
Set rs = Me.RecordsetClone
If rs.RecordCount 0 Then

rs.MoveFirst
While Not rs.EOF
strEmail = rs!EmailName '[EmailName]
strID = rs!StudentID
[ThisID] = strID
'Print copy of emailed report
'You where correct. No need to open report in preview to send as
attachment but I'm printing a copy for students file.
DoCmd.OpenReport "NotComplete1", acViewNormal, ,
"[StudentID] =" & Forms![frm_qry_22_EmailIncomplete]![ThisID]

DoCmd.SendObject acSendReport, "NotComplete1",
acFormatRTF, strEmail, , , txtSubject, txtMessage, False

rs.MoveNext

Wend
rs.Close
Set rs = Nothing
'no need to do db.close
End If

End If
End Sub

The report is only opened from the form so I did as you suggested and
filtered the report with the following in the reports onOpen event
Me.Filter = "[StudentID] = " & _
Forms![frm_qry_22_EmailIncomplete]![ThisID]
Me.FilterOn = True

Every thing works perfect, thanks for teaching this old dog something
new. It's much appreciated.
Responses like your makes this all worthwhile.

One last note...I'm not sure why you put in a Me.Undo...not sure it's
really needed as it will clear out the values to the values of last save
if the fields are bound to a recordset.
Jul 31 '06 #6

This discussion thread is closed

Replies have been disabled for this discussion.