views:

163

answers:

3

Hi,

I have an Access application where everytime a user enters the application, it makes a temp table for that user called 'their windows login name'_Temp. In one of my reports I need to query using that table, and I can't just make a query and set it as the recourdsource of the report, since the name of the table is always different.

What I tried then was to programatically set the recordset of the report by running the query and setting the form's recordset as the query's recordset. When I tried this, it kept giving me an error about the query.

I tried to debug, and I found that the string variable isn't able to contain the whole query at once. When I ran it with break points and added a watch for the string variable, it shows me that it cuts off the query somewhere in the middle.

I've experienced this problem before, but that was with an UPDATE query. Then, I just split it into two queries and ran both of them separately. This one is a SELECT query, and there's no way I can split it. Please help!

Thank you

Heres what I've tried doing:

ReturnUserName is a function in a module that returns just the login id of the user

Private Sub Report_Open(Cancel As Integer)

Dim strQuery As String
Dim user As String
user = ReturnUserName

strQuery = "SELECT " & user & "_Temp.EmpNumber, [FName] & ' ' & [LName] AS [Employee Name], " & _
"CourseName, DateCompleted, tblEmp_SuperAdmin.[Cost Centre] " & _
"FROM (tblCourse INNER JOIN (" & user & "_Temp INNER JOIN tblEmpCourses ON " & _
user & "_Temp.EmpNumber = EmpNo) ON tblCourse.CourseID = tblEmpCourses.CourseID) " & _
"INNER JOIN tblEmp_SuperAdmin ON " & user & "_Temp.EmpNumber = tblEmp_SuperAdmin.EmpNumber" & _
"WHERE (((" & user & "_Temp.EmpNumber) = [Forms]![Reports]![txtEmpID].[Text])) " & _
"ORDER BY CourseName;"

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Dim rsCmd As ADODB.Command
Set rsCmd = New ADODB.Command
rsCmd.ActiveConnection = CurrentProject.Connection

rsCmd.CommandText = strQuery
rs.Open rsCmd
Me.Recordset = rs
rs.Close

End Sub

This what strQuery contains when I add a breakpoint on rsCmd.CommandText = strQuery:

SELECT myusername_Temp.EmpNumber, [FName] & ' ' & [LName] AS [Employee Name], CourseName, DateCompleted,

tblEmp_SuperAdmin.[Cost Centre] FROM

(tblCourse INNER JOIN (myusername_Temp INNER JOIN tblEmpCourses ON

myusername_Temp.EmpNumber = EmpNo) ON tblCourse.CourseID=

(It's all one line, but I've written it like this because the underscores italicize the text)

And the error I get says Run Time Error: Join not Supported.

+1  A: 

You can programmatically create a querydef that fits the user. So, when your report is called, you

  1. Delete LoginName_Query_Temp (CurrentDb.QueryDefs.Delete), if it already exists.

  2. Create the querydef (CurrentDB.CreateQueryDef), using LoginName_Temp as the table name.

  3. Set the RecordSource of your Report to LoginName_Query_Temp.

  4. Open the report.

Heinzi
A: 

Not quite what I was hoping for, but guessing, for:

strQuery = "long query goes here"

Try:

strQuery = "some long query goes here "
strQuery = strQuery  & "more query goes here "

BASED ON NEW INFORMATION:

strQuery = "SELECT " & user & "_Temp.EmpNumber, [FName] & ' ' & [LName] AS [Employee Name], " & _
"CourseName, DateCompleted, tblEmp_SuperAdmin.[Cost Centre] " & _
"FROM (tblCourse " & _
"INNER JOIN tblEmpCourses ON tblCourse.CourseID = tblEmpCourses.CourseID) " & _
"INNER JOIN (Temp INNER JOIN tblEmp_SuperAdmin  " & _
"ON  Temp.EmpNumber = tblEmp_SuperAdmin.EmpNumber)  " & _
"ON Temp.EmpNumber = tblEmpCourses.EmpNo  " & _
"WHERE " & user & "_Temp.EmpNumber =  " & [Forms]![Reports]![txtEmpID] & _
" ORDER BY CourseName;"

Note that in VBA:

& [Forms]![Reports]![txtEmpID].[Text] &

That is, the reference to the form must go outside the quotes so you get the value.

NEW INFORMATION #2

Your best bet would be to add these tables to the Access query design window and create the joins that you want, then switch to SQL view and use the string generated for you. I do not believe that the string is too long, only that the SQL is incorrect. The SQL I posted above should work, but it may not be what you want.

Remou
You're absolutely right about that, but unfortunately the string doesnt even reach that part, so it made no difference...
zohair
Please post the string you get when you step through (you can use ?strSQL in the immediate window). You should also try the string above in the immediate window or a scratch procedure and see what you get.
Remou
Please note that I have tested the above string in my version of Access. (That should read ?strQuery)
Remou
The form reference does not necessarily have to be outside of the quotes: In Access, is perfectly legal to embed such things *inside* SQLs (of course, the form must be available when the SQL is executed).
Heinzi
@Heinzi It is not possible to refer to a form other than in the way indicated above when building an SQL string in VBA for a recordset. Try it, you will get an error "Too few parameters"
Remou
@Heinz: for SQL used in DAO, you definitely cannot have control references embedded, as DAO can't use the Access expression service to get the values at runtime. You have to resolve the reference when building your SQL string.
David-W-Fenton
While "[Forms]![Reports]![txtEmpID].[Text]" should certainly go outside the quotes, in code, you should, also lose the brackets. Additionally, the .Text property of an Access control is accessible only when the control has the focus. If you must specify the property, use .Value, but as that's the default property of an Access control, just leave the whole thing off, i.e., "Forms!Reports!txtEmpID".
David-W-Fenton
@Remou, @David: Thanks for the clarification, I stand corrected.
Heinzi
A: 

I don't see what purpose the table myusername_Temp serves here. Is that where the name fields are? If so, avoid the join entirely:

  Dim lngEmpNumber As Long
  Dim strName As String
  Dim strSQL As String

  lngEmpNumber = Forms!Reports!txtEmpID

  strName = DLookup("[FName] & ' ' & [LName]", "myusername_Temp", "EmpNumber=" & lngEmpNumber

  strSQL = "SELECT " & Chr(34) & strName & Chr(34) & " AS [Employee Name], " & _
     "CourseName, DateCompleted, tblEmp_SuperAdmin.[Cost Centre] " & _
  "FROM tblCourse " & _
    "INNER JOIN tblEmpCourses " & _
       "ON tblCourse.CourseID = tblEmpCourses.CourseID) " & _
    "INNER JOIN tblEmp_SuperAdmin " & _
       "ON tblEmp_SuperAdmin.EmpNumber = tblEmpCourses.EmpNo " & _
  "WHERE tblEmp_SuperAdmin.EmpNumber = " & lngEmpNumber & _
  " ORDER BY CourseName;"

Now, the parentheses may need to be changed in the join (I always do my equi-joins in the Access QBE and let it take care of the getting the order and parens correct!), and my assumptions about the purpose of the temp table may be wrong, but I don't see it being used for anything other than as an intermediate link between tables, so I guessed it must be there to provide the name fields.

If that's wrong, then I'm at a loss as to why the temp table needs to be there.

Also, in your second post you referred to the control on the form as:

  Forms!Reports!txtEmpID.Text

...the .Text property of Access controls is accessible only when the control has the focus. You could use the .Value property, but since that's the default property of Access controls, you should just stop after the name of the control:

  Forms!Reports!txtEmpID

...you'll see this is how I did it in my suggested code.

I find the idea of your name-based temp table to be highly problematic to begin with. Temp tables don't belong in a front end, and it's not clear to me that it is actually a temp table. If it's temp data, put it in a shared table and key the record(s) to the username. Then you don't have to worry about constructing the table name on the fly.

David-W-Fenton