Режим прерывания

N_A
Дата: 04.06.2004 17:07:50
AccessXp на WinXP, Стандартная связка: Таблицы(mdb)+Интерфес(mdb).
Проблема:
При открытии достаточно сложного отчета (несколько уровней группировок + сложный запрос с вычислениями + использование фильтра отчета, который задается в коде отчета при открытии) вылезает окно с сообщением:
Команда переведет текущую программу в режим прерывания. 
Остановить выполнение работающей программы?
Чтобы остановить выполнение программы и закрыть окно модуля, нажмите кнопку "Да".
Чтобы оставить программу в текущем состоянии, нажмите кнопку "Нет".
Если нажать «Да», то окно вылезет снова, пока не нажмешь «Нет», после этого отчет отображается нормально и работа в программе ничем не отличается от нормальной. Но при закрытии всего Access-а, он виснет (99процентов загрузки процессора).
П.С.:
Другие отчеты и сам запрос открываются нормально

на всякий случай код отчета:
Private S As String
Private d1 As Date
Private d2 As Date


Private Sub Report_Open(Cancel As Integer)
Dim l As Long
Dim l2 As Long
On Error Resume Next
Me.emplema.Picture = Application.CurrentProject.Path & "\LogoMini.bmp"
On Error GoTo eee

d1 = InputData(DateSerial(Year(Date), Month(Date), 1), "Начало периода")
S = S & " c " & Format(d1, "dd.mm.yy")
If CLng(d1) = 0 Then
    Cancel = True
    Exit Sub
End If
d2 = InputData(DateAdd("m", 1, DateSerial(Year(Date), Month(Date), 1)) - 1, "Конец периода")
If CLng(d2) = 0 Then
    Cancel = True
    Exit Sub
End If
S = S & " по " & Format(d2, "dd.mm.yy")

l2 = InputSPR("SELECT idSpr, NameFind FROM zsprOtd", "NameFind", "idSpr", 2, "550")

If l2 <> 0 Then
    S = S & VBA.vbCrLf & "" & DLookup("NameFind", "zsprOtd", "idSpr=" & l2)
End If
If l2 > 0 Then
    Me.Filter = "dOtdID=" & l2 & " and " & "oplData3 >= " & Format(d1, "\#mm\/dd\/yy\#") & " and " & "oplData3 <= " & Format(d2, "\#mm\/dd\/yy\#")
Else
    Me.Filter = "oplData3 >= " & Format(d1, "\#mm\/dd\/yy\#") & " and " & "oplData3 <= " & Format(d2, "\#mm\/dd\/yy\#")
End If
Me.FilterOn = True

Exit Sub
eee:
MsgBox Err.Description

End Sub
IgorM
Дата: 04.06.2004 17:15:16
Я такую ситуацию поборол декомпайлингом проекта и пересозданием проблемного отчета.
Kelme
Дата: 04.06.2004 17:22:39
а функция InputData можно заценить?
вадя
Дата: 04.06.2004 17:41:16
у меня аналогичное тоже есть.

сделал предположение, что слишком долго происходит прием данных от запроса или еще от чего, причем почему-то в асинхронном режиме.

этто только предположение, пока не копал.

но у меня данные для отчета ( конкретно этого ) получаются в событиеи открытия формы после ввода даты в всплывающей формы. а ежели проходить по шагам в отладке - всё нормально.
N_A
Дата: 04.06.2004 17:44:10
Обидно, но декомпиляция, (и даже модуль очистке мусора Юрия Шермана не помогает).
Обнаружилась правда интересная зависимость:
В коде открытия отчета у пользователя спрашивают (в диалоговых формах) два раза дату(границы периода) и подразделение (по которому формируется отчет).
Так вот, если выбранные пользователем параметры фильтрации соответствуют небольшему числу записей, то проблемы не возникает (окно не вылезает).

Число страниц, всегда примерно одинаковое (1-3), но это потому, что скрыта область данных и пара заголовков групп, т.е. оставлены видимыми самые верхние уровни группировки с итогами.
N_A
Дата: 04.06.2004 17:47:57
Public Function InputData(DefaultData As Date, Optional strTitle As String = "Выбор даты") As Date
Dim d As Date
'On Local Error Resume Next
G_Data = 0
DoCmd.OpenForm "frmInputData", acNormal, , , , acDialog, CLng(DefaultData) & ";" & strTitle
InputData = G_Data
End Function

Public Function InputSPR(strSql As String, FildNameFind As String, FildNameReturn As String, Optional ColumnCount As Long = 3, Optional strColumnWidths As String = "0;575") As Long
On Local Error Resume Next
G_TempInput = 0
DoCmd.OpenForm "frmInputSPR", acNormal, , , , acDialog, strSql & "##" & FildNameFind & "##" & FildNameReturn & "##" & ColumnCount & "##" & strColumnWidths
InputSPR = G_VARS.G_TempInput
End Function
Но врядли проблема в них.
Они интенсивно используются во всех моих прогах (втом числе в других отчетах) без глюков.
N_A
Дата: 04.06.2004 17:50:34
а ежели проходить по шагам в отладке - всё нормально
Таже ботва!
вадя
Дата: 04.06.2004 18:02:44
попробуй вместо получения данных для отчета сэмулировать :

типа
вместо
d1 = InputData(DateSerial(Year(Date), Month(Date), 1), "Начало периода")
вставить
d1=то что нужно
N_A
Дата: 04.06.2004 19:54:09
Попробовал без диалоговых форм - все работает.(Спасибо, Вадя!)
Покопался и нашёл причину(может не 100% но у меня сработало).
А причина в следующем:
Диалоговые формы закрываются кнопкой типа так:
Private Sub Кнопка5_Click()
    DoCmd.Close
End Sub
Если закрыть крестиком то все нормально, значит проблема в использовании DoCmd.Close
Проблема решается (у меня) добавлением DoEvents после последнего вызова диалоговой формы в коде отчета
...
l2 = InputSPR("SELECT idSpr, NameFind FROM zsprOtd", "NameFind", "idSpr", 2, "550")
DoEvents
....
Не понятно, правда, в чем конкретная взаимосвязь с числом записей и сложностью отчета,(в других отчетах глюк не лезет при той же схеме открытия, но без DoEvents)
Все спасибо. Буду тестировать дальше.
вадя
Дата: 04.06.2004 20:34:09
DoCmd.Close

попробуй указать форму для которой делается DoCmd.Close ....имя формы...