2009-12-03 5 views
0

사용자가 응용 프로그램을 시작할 때마다 'windows 로그인 이름'_Temp이라는 해당 사용자의 임시 테이블을 만듭니다. 내 보고서 중 하나에서 해당 테이블을 사용하여 쿼리해야하며 테이블의 이름이 항상 다르므로 쿼리를 만들어 보고서의 리 소스 소스로 설정할 수는 없습니다.VBA 문자열 길이 문제

내가 시도한 다음 프로그래밍 방식으로 쿼리를 실행하고 폼의 레코드 집합을 쿼리의 레코드 집합으로 설정하여 보고서의 레코드 집합을 프로그래밍 방식으로 설정했습니다. 이것을 시도 할 때 쿼리에 대한 오류가 발생했습니다.

디버깅을 시도했는데 문자열 변수가 전체 쿼리를 한 번에 포함 할 수 없음을 발견했습니다. 내가 브레이크 포인트로 달리고 문자열 변수에 대한 시계를 추가하면 중간에 쿼리가 끊어지는 것을 알 수있다.

이전에이 문제가 발생했지만 이는 UPDATE 쿼리와 관련이 있습니다. 그런 다음 두 개의 쿼리로 분할하고 두 개를 따로 실행했습니다. 이 중 하나는 SELECT 쿼리이며이를 나눌 방법이 없습니다. 도와주세요!

감사합니다

Heres는 내가 일을 시도했다 :

ReturnUserName 사용자이 strQuery에 포함 된 내용을

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 

의 바로 로그인 ID를 반환하는 모듈의 기능입니다 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=

(모두 한 줄이지만 텍스트 밑줄이 밑줄로 표시되어 있으므로이 글을 썼습니다.)

오류가 발생하면 런타임 오류 : 가입이 지원되지 않습니다.

+0

임시 테이블은 사용자 이름을 보유하는 유일한 목적입니까? 또는 사용자에게 연결된 다른 데이터가 있습니까 – CaRDiaK

+0

일부 코드를 게시하십시오. 수정하기가 쉽지 않을 것으로 생각됩니다. – Fionnuala

+0

임시 테이블에 다른 데이터도 있습니다. – zohair

답변

1

:

strQuery = "long 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;" 

: NEW 정보를 기반으로

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

주의 사항 VBA에서 :

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

즉, 양식에 대한 참조가 따옴표 바깥에 있어야 값을 얻을 수 있습니다.

새로운 정보 # 2

가장 좋은 방법은 액세스 쿼리 디자인 창으로이 테이블을 추가하고 당신이 원하는 조인 만든 다음 SQL보기로 전환하고 당신을 위해 생성 된 문자열을 사용하는 것입니다. 문자열이 너무 길어서 SQL이 올바르지 않다고 나는 믿지 않는다. 위에 게시 된 SQL은 작동해야하지만 원하는 것은 아닐 수도 있습니다.

+0

당신은 그것에 대해 전적으로 옳습니다,하지만 불행히도 문자열 나던도 그 부분에 도달, 그래서 당신이 (직접 실행 창에서 사용할 수있는? STRSQL)를 통해 단계 때 – zohair

+0

당신이 얻을 문자열을 게시하시기 바랍니다 ... 차이를하지 않았다. 직접 창이나 스크래치 절차에서 위의 문자열을 시도하고 얻은 것을 확인해야합니다. – Fionnuala

+0

내 버전의 Access에서 위의 문자열을 테스트했음을 유의하십시오. (그것은? strQuery를 읽어야합니다.) – Fionnuala

1

프로그래밍 방식으로 사용자에게 적합한 querydef를 만들 수 있습니다. 이미 존재한다면, 때 보고서가이

  1. LoginName_Query_Temp (CurrentDb.QueryDefs.Delete를) 삭제이라고합니다.

  2. LoginName_Temp을 테이블 이름으로 사용하여 querydef (CurrentDB.CreateQueryDef)를 만듭니다.

  3. 보고서의 RecordSource를 LoginName_Query_Temp으로 설정하십시오.

  4. 보고서를 엽니 다.내가 바라고 있지만, 위해, 추측했다 그렇진 무엇

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

, 괄호 조인에서 변경해야 할 수도 있습니다 (난 항상 내 액세스 QBE에서 동등이 조인 할과는 점점 순서 알아서하고 parens correct!) 임시 테이블의 목적에 대한 내 가정은 틀릴 수도 있지만 테이블 간의 중간 링크 이외의 용도로 사용되는 것을 보지 못하므로 이름을 제공해야합니다. 전지.

이것이 잘못된 경우 임시 테이블이 있어야하는 이유가 무엇입니까? 컨트롤에 포커스가있는 경우에만

Forms!Reports!txtEmpID.Text 

가 ... 액세스 제어의는 .text 속성에 액세스 :

또한, 두 번째 게시물에 당신은 양식에 제어 함. 당신은 내가 그것을 어떻게했는지이가 볼 수 ...

Forms!Reports!txtEmpID 

: 당신은 .Value 속성을 사용할 수 있지만,이 액세스 제어의 기본 속성이기 때문에, 당신은 단지 컨트롤의 이름 다음에 중지해야 내 제안 코드.

나는 당신의 이름 기반 임시 테이블이 매우 문제가 될 것이라고 생각한다. 임시 테이블은 프런트 엔드에 속하지 않으며 실제로는 임시 테이블이라는 사실이 분명하지 않습니다. 임시 데이터 인 경우 공유 테이블에 저장하고 사용자 이름에 레코드를 입력하십시오. 그렇다면 테이블 이름을 즉시 생성하는 것에 대해 걱정할 필요가 없습니다.