2016-06-08 2 views
0

문제 : 로컬 테이블에 직접 연결된 그룹화 된 MS Access 2010 보고서가 있습니다. 레코드 당 40 개의 '경계'필드와 그룹당 152 개의 계산 필드가 있습니다. 내 VBA 스크립트가 자동으로 런타임에 마지막 몇 계산 필드의 제어 소스를 업데이트하려고하면 "Query is too complex"오류가 발생합니다!테이블을 기반으로 MS 액세스 보고서 "쿼리가 너무 복잡합니다"오류

배경 : 나는 사람 필드/열, 프로젝트 필드/열 및 각 레코드 (38) 숫자 필드/열이 포함되어 직접 로컬 테이블에 연결된 MS Access 보고서를 만드는거야.

보고서는 사람에 따라 그룹화되며 각 사람마다 여러 개의 프로젝트 레코드가 있습니다.

각 사람의 그룹 꼬리말에는 38 개의 숫자 필드/열 아래에 4 개의 계산 된 컨트롤이 있습니다.

요약하면 총 40 개의 '경계'/ 레코드 당 직접 연결된 필드와 그룹당 152 개의 계산 필드가 있습니다.

보고서는 현재 날짜에 따라 다른 열을 출력하는 동적 SQL 쿼리에 연결된 maketable 쿼리에 의해 주기적으로 삭제되고 다시 작성되는 로컬 테이블에 직접 연결됩니다. 동적 쿼리에서 제공 할 다른 필드 이름을 설명하기 위해 서버에서 발생하는 것과 동일한 계산을 수행하는 일부 VBA 스크립트가 있습니다 (오늘 날짜 -11 개월과 +6 개월 사이의 모든 달과 일치하는 형식을 계산 함). 예상되는 열 이름)을 입력 한 다음 동적 쿼리에서 가져온 테이블에서 오는 것으로 예상되는 것과 일치하도록 관련 보고서 필드 및 열 레이블 캡션의 컨트롤 소스를 변경합니다.

그룹 바닥 글에서 계산 된 필드 중 일부를 업데이트하는 마지막 몇 줄의 코드를 제외하면 모두 훌륭하게 보입니다.

Dim NowDate As Date 
Dim i, monthcalc As Integer 
Dim Dates(1 To 18) As String 

NowDate = Now() 

monthcalc = -11 

'The below creates variables of formatted dates to be used as control sources for the expected fields incoming from SQL 
For i = 1 To 18 
    Dates(i) = Year(DateAdd("m", monthcalc, NowDate)) & Format(month(DateAdd("m", monthcalc, NowDate)), "00") 
    monthcalc = monthcalc + 1 
Next i 


monthcalc = -11 

'The below sets the column captions to match the expected fields incoming from SQL 
For i = 1 To 18 
    Me.Controls("Date" & Trim(Str(i))).Caption = MonthName(month(DateAdd("m", monthcalc, NowDate))) & " " & Year(DateAdd("m", monthcalc, NowDate)) 
    monthcalc = monthcalc + 1 
Next i 

'The below sets the dynamic 'bound' numeric fields to match the expected fields incoming from SQL 
For i = 1 To 18 
    Me.Controls("Date" & Trim(Str(i)) & "P").ControlSource = Dates(i) & " P" 
    Me.Controls("Date" & Trim(Str(i)) & "TS").ControlSource = Dates(i) & " TS" 
Next i 

'The below sets the first calculated column beneath each numeric field 
For i = 1 To 18 
    Me.Controls("TotalDate" & Trim(Str(i)) & "P").ControlSource = "=Sum([" & Dates(i) & " P])" 
    Me.Controls("TotalDate" & Trim(Str(i)) & "TS").ControlSource = "=Sum([" & Dates(i) & " TS])" 
Next i 

지금 문제가 코드 (줄의 세 가지를주의 : 여기 (보고서의 열기 이벤트에서) 스크립트의 작업 섹션은 모든 단지 문맥, 잘 작동하는 것 같다입니다 루프가) 주석 처리되어 내 :

For i = 1 To 18 
    Me.Controls("TotalPHrsPDate" & Trim(Str(i))).ControlSource = "=Sum(IIf([Project] Like 'AS#*' Or [Project] Like 'ABG#*' Or [Project] Like 'ADG#*' Or [Project] Like 'AE#*' Or [Project] Like 'AI#*' Or [Project] Like 'AIN#*' Or [Project] Like 'AM#*' Or [Project] Like 'IMP#*',[" & Dates(i) & " P]), 0))" 
    ' Me.Controls("TotalPHrsTSDate" & Trim(Str(i))).ControlSource = "=Sum(IIf([Project] Like 'AS#*' Or [Project] Like 'ABG#*' Or [Project] Like 'ADG#*' Or [Project] Like 'AE#*' Or [Project] Like 'AI#*' Or [Project] Like 'AIN#*' Or [Project] Like 'AM#*' Or [Project] Like 'IMP#*',[" & Dates(i) & " TS], 0))" 
    ' Me.Controls("TotalNPHrsPDate" & Trim(Str(i))).ControlSource = "=Sum(IIf([Project] Not Like 'AS#*' And [Project] Not Like 'ABG#*' And [Project] Not Like 'ADG#*' And [Project] Not Like 'AE#*' And [Project] Not Like 'AI#*' And [Project] Not Like 'AIN#*' And [Project] Not Like 'AM#*' And [Project] Not Like 'IMP#*',[" & Dates(i) & " P],0))" 
    ' Me.Controls("TotalNPHrsTSDate" & Trim(Str(i))).ControlSource = "=Sum(IIf([Project] Not Like 'AS#*' And [Project] Not Like 'ABG#*' And [Project] Not Like 'ADG#*' And [Project] Not Like 'AE#*' And [Project] Not Like 'AI#*' And [Project] Not Like 'AIN#*' And [Project] Not Like 'AM#*' And [Project] Not Like 'IMP#*',[" & Dates(i) & " TS],0))" 
Next i 

나는 단지 빨리 나는 그것이 "쿼리를 던져, 이들 중 둘 이상을 실행하려고로, 주석 루프 내에서 위의 라인 중 하나가 너무 복잡 할 수 있습니다 "보고서를 열려고하면 오류가 발생합니다.

별도의 루프에서 실행 해 보았지만 동일한 오류가 발생합니다. 이것들은 코드의 마지막 몇 줄이기 때문에 한 줄을 실행 한 후에 어떤 종류의 한계에 부딪혔을 가능성이 있습니다.

수정 사항에 대한 제안 사항이 있습니까?

그룹 합계 & 계산을 하위 보고서로 이동하는 것을 고려해 보았지만 기본 보고서 그룹 바닥 글에이 그룹의 합계 만 표시 할 수 있습니까? 내가 부딪히는 한계가 하위 보고서의 영향을 받습니까?

답변

3

와우. 코드에 많은 복잡성이 생기고 Access에서 불평하는 것이 전혀 놀랍지 않습니다. 이제는 많은 시간을 할애하여 결국 오류를 던지고있는 것을 정확히 찾아 낼 수 있습니다.

하지만 정말로해야 할 일은 단순화하는 것입니다.

문제 코드를 확인하십시오. 답을 얻기 위해 전체 기본 레코드 세트보다 복잡한 IIf() 문을 72 시간 합계해야합니까? 번호 :

수정 : ProjectType이라는 숫자 필드를 테이블에 추가하십시오. 당신의 새로 고침의 일환으로,과 같이 쿼리를 실행합니다

UPDATE MyLocalTable 
SET [ProjectType] = IIf([Project] Like 'AS#*' Or [Project] Like 'ABG#*' 
    Or [Project] Like 'ADG#*' Or [Project] Like 'AE#*' Or [Project] Like 'AI#*' 
    Or [Project] Like 'AIN#*' Or [Project] Like 'AM#*' Or [Project] Like 'IMP#*',1, 0) 

지금, 당신은 두 가지 중요한 것들을 해봤 : 당신은 단 한 번 IIf() 끔찍한 문 것을 입력 한

  • 를, 당신의 코드를 쉽게 만들기 이해 및 유지
  • 각 행의 ProjectType은 72 번이 아니라 정확히 한 번 계산되었습니다.

이제 문제의 코드는 더이 다음과 같습니다

For i = 1 To 18 
    Me.Controls("TotalPHrsPDate" & Trim(Str(i))).ControlSource = "=Sum(IIf([ProjectType]=1,[" & Dates(i) & " P]), 0)" 
    Me.Controls("TotalPHrsTSDate" & Trim(Str(i))).ControlSource = "=Sum(IIf([ProjectType]=1,[" & Dates(i) & " TS], 0)" 
    Me.Controls("TotalNPHrsPDate" & Trim(Str(i))).ControlSource = "=Sum(IIf([ProjectType]=0,[" & Dates(i) & " P],0))" 
    Me.Controls("TotalNPHrsTSDate" & Trim(Str(i))).ControlSource = "=Sum(IIf([ProjectType]=0,[" & Dates(i) & " TS],0))" 
Next i 

훨씬 더 간결. 그리고 오류를 던지지 않을 확률이 훨씬 큽니다. 이 아이디어를 취하고이 코드에서 더 많은 복잡성을 제거 할 수 있습니다.

+0

간결하고 효과적인! 감사합니다 kismert! 때로는 너무 가까이에서 보았던 명백한 것을 지적 할 사람이 필요합니다! – TimJ

관련 문제