VBA字符串长度问题

时间:2009-12-03 15:42:33

标签: sql string ms-access vba

我有一个Access应用程序,每次用户进入应用程序时,它都会为该用户创建一个名为'他们的Windows登录名'_Temp的临时表。在我的一个报告中,我需要使用该表进行查询,并且我不能只进行查询并将其设置为报告的recourdsource,因为表的名称总是不同的。

我尝试的是通过运行查询并将表单的记录集设置为查询的记录集来以编程方式设置报表的记录集。当我尝试这个时,它一直给我一个关于查询的错误。

我尝试调试,我发现字符串变量不能一次包含整个查询。当我用断点运行它并为字符串变量添加了一个监视器时,它向我显示它在中间某处切断了查询。

之前我遇到过这个问题,但是有一个UPDATE查询。然后,我将它分成两个查询并分别运行它们。这是一个SELECT查询,我无法拆分它。请帮忙!

谢谢

继承了我尝试过的事情:

ReturnUserName是模块中的一个函数,它只返回用户的登录ID

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

当我在rsCmd.CommandText = strQuery上添加断点时,strQuery包含的内容:

  

SELECT myusername_Temp.EmpNumber,[FName]   &安培; ''& [LName] AS [员工姓名],   CourseName,DateCompleted,

     

tblEmp_SuperAdmin。[成本中心] FROM

     

(tblCourse INNER JOIN(myusername_Temp   INNER JOIN tblEmpCourses ON

     

myusername_Temp.EmpNumber = EmpNo)ON   tblCourse.CourseID =

(这是一行,但我写的是这样的,因为下划线用斜体字表示)

我得到的错误说运行时错误:加入不支持。

3 个答案:

答案 0 :(得分:1)

您可以以编程方式创建适合用户的querydef。因此,当您的报告被调用时,您

  1. 删除LoginName_Query_TempCurrentDb.QueryDefs.Delete),如果它已存在。

  2. 使用CurrentDB.CreateQueryDef作为表名创建querydef(LoginName_Temp)。

  3. 将报告的RecordSource设置为LoginName_Query_Temp

  4. 打开报告。

答案 1 :(得分:1)

不是我所希望的,但猜测,为:

strQuery = "long query goes here"

尝试:

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

基于新信息:

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;"

请注意,在VBA中:

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

也就是说,对表单的引用必须超出引号,以便获得值。

新信息#2

最好的办法是将这些表添加到Access查询设计窗口并创建所需的连接,然后切换到SQL视图并使用为您生成的字符串。我不相信字符串太长,只是SQL不正确。上面发布的SQL应该可以使用,但可能不是你想要的。

答案 2 :(得分:0)

我看不出myusername_Temp表在这里的用途。这是名称字段的位置吗?如果是这样,请完全避免加入:

  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;"

现在,可能需要在连接中更改括号(我总是在Access QBE中执行我的equi-joins并让它来处理订单和parens正确!),以及我对目的的假设临时表可能是错误的,但我不认为它被用于表之间的中间链接,所以我猜它必须在那里提供名称字段。

如果这是错的,那么我不知道为什么临时表需要在那里。

此外,在您的第二篇文章中,您将表单上的控件称为:

  Forms!Reports!txtEmpID.Text

...仅当控件具有焦点时,才能访问Access控件的.Text属性。您可以使用.Value属性,但由于这是Access控件的默认属性,您应该在控件名称后面停止:

  Forms!Reports!txtEmpID

...你会看到我在建议的代码中这样做了。

我发现基于名称的临时表的想法一开始就很成问题。临时表不属于前端,我不清楚它实际上是临时表。如果是临时数据,请将其放在共享表中并将记录键入用户名。然后,您不必担心动态构建表名。

相关问题