Проблема длины строки VBA - PullRequest
       16

Проблема длины строки VBA

0 голосов
/ 03 декабря 2009

У меня есть приложение Access, в котором каждый раз, когда пользователь входит в приложение, оно создает временную таблицу для этого пользователя, которая называется «их имя входа в Windows». В одном из моих отчетов мне нужно выполнить запрос с использованием этой таблицы, и я не могу просто сделать запрос и установить его в качестве источника ресурсов отчета, поскольку имя таблицы всегда отличается.

Тогда я попытался программно установить набор записей отчета, выполнив запрос и установив набор записей формы в качестве набора записей запроса. Когда я пробовал это, он продолжал давать мне ошибку о запросе.

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

Ранее я сталкивался с этой проблемой, но это было с запросом UPDATE. Затем я просто разделил его на два запроса и запустил оба по отдельности. Это запрос SELECT, и я не могу разделить его. Пожалуйста, помогите!

Спасибо

Вот что я пытался сделать:

ReturnUserName - это функция в модуле, которая возвращает только идентификатор входа пользователя в систему

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

Это то, что содержит strQuery, когда я добавляю точку останова на rsCmd.CommandText = strQuery:

SELECT myusername_Temp.EmpNumber, [FName] & '' & [LName] AS [Имя сотрудника], CourseName, DateCompleted,

tblEmp_SuperAdmin. [Учетный отдел] ОТ

(tblCourse INNER JOIN (myusername_Temp ВНУТРЕННЕЕ СОЕДИНЕНИЕ tblEmpCourses ON

myusername_Temp.EmpNumber = EmpNo) ON tblCourse.CourseID =

(это всего одна строка, но я написал это так, потому что текст курсивом выделен подчеркиванием)

И ошибка, которую я получаю, говорит «Ошибка времени выполнения: присоединение не поддерживается».

Ответы [ 3 ]

1 голос
/ 03 декабря 2009

Не совсем то, на что я надеялся, но думаю:

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, который я разместил выше, должен работать, но он может не соответствовать вашему желанию.

1 голос
/ 03 декабря 2009

Вы можете программно создать querydef, который подходит пользователю. Итак, когда ваш отчет называется, вы

  1. Удалить LoginName_Query_Temp (CurrentDb.QueryDefs.Delete), если оно уже существует.

  2. Создайте querydef (CurrentDB.CreateQueryDef), используя LoginName_Temp в качестве имени таблицы.

  3. Установите для RecordSource вашего отчета значение LoginName_Query_Temp.

  4. Открыть отчет.

0 голосов
/ 04 декабря 2009

Я не вижу, для чего здесь служит таблица 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 и позволяю ему позаботиться о получении порядка и правильных скобок!), И мои предположения о цели временная таблица может быть неправильной, но я не вижу, чтобы она использовалась ни для чего иного, кроме как для промежуточной связи между таблицами, поэтому я предположил, что она должна быть там, чтобы предоставить поля имени.

Если это не так, то я в недоумении, почему временная таблица должна быть там.

Также в своем втором посте вы упомянули элемент управления в форме как:

  Forms!Reports!txtEmpID.Text

... свойство .Text элементов управления Access доступно только тогда, когда элемент управления имеет фокус. Вы можете использовать свойство .Value, но так как это свойство по умолчанию для элементов управления Access, вам следует просто остановиться после имени элемента управления:

  Forms!Reports!txtEmpID

... вы увидите, как я это сделал в предложенном мной коде.

Я считаю, что идея вашей временной таблицы на основе имен очень проблематична с самого начала. Временные таблицы не принадлежат внешнему интерфейсу, и мне не ясно, что это на самом деле временная таблица. Если это временные данные, поместите их в общую таблицу и введите запись (записи) для имени пользователя. Тогда вам не нужно беспокоиться о создании имени таблицы на лету.

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