Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2012, 14:50   #1
hamsidJ
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 20
Злость ОШИБКА!

Почему-то выдаёт ошибку 3021 "Текущая запись отсутствует".
Код:

Код:
Private Sub Add_Click()
'объявление переменных
Dim tblMain As DAO.Recordset
Set tblMain = CurrentDb.OpenRecordset("Расписание")
Dim tblType As DAO.Recordset
Set tblType = CurrentDb.OpenRecordset("Тип действия")
Dim i As Integer

'перебор таблицы типов действий
tblType.MoveFirst
Do Until (tblType.EOF) Or (tblType.Fields("Тип действия").Value = Form_Расписание.Тип_Действия.Value)//на этой строчке вылетает
    tblType.MoveNext
Loop

i = 0

tblMain.MoveFirst
Do While (i < tblMain.RecordCount - 2)
    If (tblMain.Fields("Дата").Value = Form_Расписание.Дата.Value) And (tblMain.Fields("Человек").Value = Form_Расписание.Человек.Value) Then
        If (tblMain.Fields("Время").Value = Form_Расписание.Время.Value) Or (tblMain.Fields("Время").Value > DateAdd("h", -(tblType.Fields("Время испонения(ч)").Value + tblType.Fields("Перерыв(ч)").Value), Form_Расписание.Время.Value)) Or (tblMain.Fields("Время").Value < DateAdd("h", (tblType.Fields("Время испонения(ч)").Value + tblType.Fields("Перерыв(ч)").Value), Form_Расписание.Время.Value)) Then
            MsgBox "ОШИБКА"
            tblMain.Close
            tblType.Close
            Exit Sub
        Else
            tblMain.AddNew
            tblMain.Fields("Дата").Value = Form_Расписание.Дата.Value
            tblMain.Fields("Время").Value = Form_Расписание.Время.Value
            tblMain.Fields("Место").Value = Form_Расписание.Место.Value
            tblMain.Fields("Тип Действия").Value = Form_Расписание.Тип_Действия.Value
            tblMain.Fields("Человек").Value = Form_Расписание.Человек.Value
            tblMain.Close
            tblType.Close
            Exit Sub
        End If
    End If
    tblMain.MoveNext
Loop

End Sub
hamsidJ вне форума Ответить с цитированием
Старый 06.01.2012, 15:08   #2
gluk_fm
Форумчанин
 
Аватар для gluk_fm
 
Регистрация: 09.06.2011
Сообщений: 515
По умолчанию

Если честно мне совсем не понятна данная строка может должно быть как-то так:
tblType.MoveFirst
Do Until (tblType.EOF)
if tblType.Fields("Тип действия").Value = Form_Расписание.Тип_Действия.Value) then
действие
End if
tblType.MoveNext
Loop
gluk_fm вне форума Ответить с цитированием
Старый 06.01.2012, 16:07   #3
hamsidJ
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 20
По умолчанию

Я последовал вашему совету
Код:
Private Sub Add_Click()
'объявление переменных
Dim tblMain As DAO.Recordset
Set tblMain = CurrentDb.OpenRecordset("Расписание")
Dim tblType As DAO.Recordset
Set tblType = CurrentDb.OpenRecordset("Тип действия")
Dim i As Integer

'перебор таблицы типов действий
tblType.MoveFirst
Do Until (tblType.EOF)
    if tblType.Fields("Тип действия").Value = Form_Расписание.Тип_Действия.Value then
    Exit Do
    end if
    tblType.MoveNext
Loop

i = 0

tblMain.MoveFirstЗдесь выдаёт ту же ошибку
Do While (i < tblMain.RecordCount - 2)
    If (tblMain.Fields("Дата").Value = Form_Расписание.Дата.Value) And (tblMain.Fields("Человек").Value = Form_Расписание.Человек.Value) Then
        If (tblMain.Fields("Время").Value = Form_Расписание.Время.Value) Or (tblMain.Fields("Время").Value > DateAdd("h", -(tblType.Fields("Время испонения(ч)").Value + tblType.Fields("Перерыв(ч)").Value), Form_Расписание.Время.Value)) Or (tblMain.Fields("Время").Value < DateAdd("h", (tblType.Fields("Время испонения(ч)").Value + tblType.Fields("Перерыв(ч)").Value), Form_Расписание.Время.Value)) Then
            MsgBox "ОШИБКА"
            tblMain.Close
            tblType.Close
            Exit Sub
        Else
            tblMain.AddNew
            tblMain.Fields("Дата").Value = Form_Расписание.Дата.Value
            tblMain.Fields("Время").Value = Form_Расписание.Время.Value
            tblMain.Fields("Место").Value = Form_Расписание.Место.Value
            tblMain.Fields("Тип Действия").Value = Form_Расписание.Тип_Действия.Value
            tblMain.Fields("Человек").Value = Form_Расписание.Человек.Value
            tblMain.Close
            tblType.Close
            Exit Sub
        End If
    End If
    tblMain.MoveNext
Loop

End Sub

Последний раз редактировалось hamsidJ; 06.01.2012 в 16:17.
hamsidJ вне форума Ответить с цитированием
Старый 06.01.2012, 19:00   #4
gluk_fm
Форумчанин
 
Аватар для gluk_fm
 
Регистрация: 09.06.2011
Сообщений: 515
По умолчанию

Если теперь работает, то по тому же принципу и продолжайте, что перебираем - условие.
tblType.MoveFirst
Do Until tblType.EOF
if i < tblMain.RecordCount - 2 then

ЛУУП

а вообще, выложили бы пример уже давно бы решили данную задачу.
gluk_fm вне форума Ответить с цитированием
Старый 06.01.2012, 19:25   #5
hamsidJ
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 20
По умолчанию

Вот исправил но
Код:
Option Compare Database

Private Sub Add_Click()
'объявление переменных
Dim tblMain As DAO.Recordset
Set tblMain = CurrentDb.OpenRecordset("Расписание")
Dim tblType As DAO.Recordset
Set tblType = CurrentDb.OpenRecordset("Тип службы")
Dim i As Integer
'перебор таблицы типов служб
tblType.MoveFirst
Do Until (tblType.EOF) 'Or (tblType.Fields("Тип службы").Value = Form_Расписание.Тип_службы.Value)
    If tblType.Fields("Тип службы").Value = Form_Расписание.Тип_службы.Value Then
        Exit Do
    End If
    tblType.MoveNext
Loop

    tblMain.MoveFirst
    Do Until tblMain.EOF
        i = i + 1
        If (tblMain.Fields("Дата").Value = Form_Расписание.Дата.Value) And (tblMain.Fields("Священник").Value = Form_Расписание.Священник.Value) Then
            If (tblMain.Fields("Время").Value = Form_Расписание.Время.Value) Or (tblMain.Fields("Время").Value > DateAdd("h", -(tblType.Fields("Служба(ч)").Value + tblType.Fields("Перерыв(ч)").Value), Form_Расписание.Время.Value)) Or (tblMain.Fields("Время").Value < DateAdd("h", (tblType.Fields("Служба(ч)").Value + tblType.Fields("Перерыв(ч)").Value), Form_Расписание.Время.Value)) ThenRun-time error 3265: Элемент не обнаружен в данном семействе
                MsgBox "Извените, но в указанное вами время данный священник занят."
                tblMain.Close
                tblType.Close
                Exit Sub
        Else
            tblMain.AddNew
            tblMain.Fields("Дата").Value = Form_Расписание.Дата.Value
            tblMain.Fields("Время").Value = Form_Расписание.Время.Value
            tblMain.Fields("Монастырь").Value = Form_Расписание.Монастырь.Value
            tblMain.Fields("Тип службы").Value = Form_Расписание.Тип_службы.Value
            tblMain.Fields("Священник").Value = Form_Расписание.Священник.Value
            tblMain.Close
            tblType.Close
            Exit Sub
        End If
    End If
    tMain.MoveNext
Loop

End Sub
hamsidJ вне форума Ответить с цитированием
Старый 06.01.2012, 20:35   #6
Woodlin
Форумчанин
 
Регистрация: 30.03.2010
Сообщений: 153
По умолчанию

hamsidJ, если не хотите выкладывать пример, то ищите ошибку сами.
В редакторе VBA нажмите в меню View -> Immediate window, или нажмите Ctrl+G.
Откроется окно Immediate, в нём проверьте по частям глючную строку.
В окне набираете сначала знак вопроса, потом то что хотите проверить,
типа такого: ? tblMain.Fields("Дата").Value и жмёте Enter
Если проверяемая строка нормальная, то получите значение, если нет то сразу поймёте где был глюк.

Проверку делайте в режиме выполнения кода (открыт редактор VBA, выполняемая строчка выделена жёлтым цветом).

Когда вылетает окно об ошибке с кнопкой Debug, жмите Debug. Откроется окно редактора VBA, глючная строка будет выделена.
Второй вариант делать точки остановки выполнения кода самому, жмёте на поле окна с кодом мышью, появится точка, на ней выполнение кода остановится, Вас выкинет в редактор VBA. Так можно установить точку на Private Sub Add_Click() и построчно, используя кнопку F8 прогнать весь код, или проверить что-нибудь в окне Immediate.

В общем дерзайте, и удачи.

Последний раз редактировалось Woodlin; 06.01.2012 в 21:51.
Woodlin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Nero - ошибка драйвера DMA. ошибка CRC NecRoMat Софт 5 09.05.2012 01:29
Ошибка run-time Error 1004 общая ошибка ODBC kaval88 Microsoft Office Excel 0 27.02.2011 20:20
Ошибка в коде, ошибка в css или это проблема с совместимостью с браузерами? ankris HTML и CSS 5 23.11.2010 16:58
Это ошибка Delphi или моя ошибка??? bloodeagle Общие вопросы Delphi 3 12.11.2009 15:26
...Ошибка 101 (net::ERR_CONNECTION_RESET): Неизвестная ошибка... infrared Помощь студентам 0 16.04.2009 17:44