Проверка наличия вводимой записи в таблицу

Проверка
Дата: 20.01.2012 12:14:44
привет форум!!!!! хелп. имеется форма без источника, на ней 4 поля: дата (тип Дата), Неисправность (тип String), работа (string), ЗатрачВремя (тип Integer)! необходимо введенные данные записать в таблицу, но перед записью в таблицу необходимо сделать проверку на наличие сохраняемой записи. что неправильно делаю?

+
Private Sub Подтвердить_Click()
    Dim rst As DAO.Recordset

        Dim db As Database
        Dim rc As DAO.Recordset
        Set db = CurrentDb
        Dim СтрокаПоиска As String
    
    If Len(Nz(Me![Неисправность], "")) <> 0 Or Len(Nz(Me![работа], "")) <> 0 or  Len(Nz(Me![ЗатрачВремя], "")) <> 0 Then
   
                    Set rc = db.OpenRecordset("Протокол", dbOpenDynaset)
                        СтрокаПоиска = "[Неисправность] = '" & Me![Неисправность] & "' and " & _
                        "[ЗатрачВремя] = '" & Me![ЗатрачВремя] & "' and " & _
                        "[дата] = #" & Format(Me![Дата], "mm dd yy") & "# and " & _
                        "[Работа] = '" & Me![Работа] & "'"
                        rc.FindFirst СтрокаПоиска

                            If rc.NoMatch = 0 Then
                                Dim Сообщение As String, ТекстСообщения As String
                                ТекстСообщения = "Данная запись уже содержится в базе данных!" & Chr(10) & Chr(13) & _
                                "Убедитесь, что все параметры внесены правильно."
                                Сообщение = MsgBox(ТекстСообщения, 16, "  Ошибка ввода!")
                                rc.Close
                                Exit Sub
                            End If
     
                        Set rst = CurrentDb.OpenRecordset("SELECT [Протокол].* FROM [Протокол];", dbOpenDynaset)
                            With rst
                                .AddNew
                                ![Дата] = Me.Дата
                                ![Неисправность] = Me.Неисправность
                                ![Работа] = Me.Работа
                                ![ЗатрачВремя] = Me.ЗатрачВремя
                                .Update
                            End With
                                rst.Close
                                Set rst = Nothing
       
            Me.неисправность = Null
            Me.Работа = Null
            Me.ЗатрачВремя = Null
    Else
        MsgBox "Вы заполниели не все поля", vbInformation, "ВНИМАНИЕ"
    End If
End Sub
Программист-Любитель
Дата: 20.01.2012 12:50:34
Проверка
что неправильно делаю?
- Кодите. Поставить ограничение на таблицу и обработать ошибку.
MrMuscul
Дата: 20.01.2012 13:37:41
Скорей всего формат даты разный. В БД один в формате другой.
Анатолий ( Киев )
Дата: 20.01.2012 14:07:22
"[дата] = #" & Format(Me![Дата], "mm dd yy") У вас поле текстовое со значениями вида "#01 20 10#"? Скорей всего поле типа Late/Time и формат должен быть такой: "mm\/dd\/yy".
Теперь по вашему примеру... Вы открываете Recordset со всеми записями в таблице "Протокол", ищете запись по критерию и, если такой нет, - снова открываете такой же Recordset со всеми записями в таблице "Протокол" для добавления записи.
Это неразумно! В вашем случае нужно указать критерии отбора в самом SELECT и добавить новую запись, если BOF=True.
sdku
Дата: 20.01.2012 14:21:03
Проверка
...имеется форма без источника,....
а не должно иметься (кроме как для ввода параметров)
Проверка
Дата: 20.01.2012 15:08:38
sdku
Проверка
...имеется форма без источника,....
а не должно иметься (кроме как для ввода параметров)


форма нужна только для ввода инфы, просмотр осуществляется через отчеты (этого достаточно)
Проверка
Дата: 20.01.2012 15:21:48
Вот другой вариант попробовал: не хочет работать.

+
        Dim rst1 As DAO.Recordset
        Dim Nal As Integer
        Dim strSQL As String

        strSQL = "Select (*) from (SELECT Протокол.Дата, Протокол.Неисправность, Протокол.Работа, Протокол.ЗатрачВремя
FROM Протокол
WHERE (((Протокол.Дата)=[Forms]![frmПротокол]![дата]) AND ((Протокол.Неисправность)=[Forms]![ frmПротокол]![Неисправность]) AND ((Протокол.ЗатрачВремя)=[Forms]![ frmПротокол]![ЗатрачВремя]));
) as таб"
        Set rst1 = CurrentDb.OpenRecordset(strSQL)
        Nal = rst1(0)
        CurrentDb.Close: rst1.Close

            If Nal = 0 Then

……………………………………………

	Else: MsgBox "Запись существует"
		Exit Sub
	End If
qwerty112
Дата: 20.01.2012 15:27:06
Проверка
sdku
пропущено...
а не должно иметься (кроме как для ввода параметров)


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

нуу и ? что из этого следует ? что нужно делать свободную форму ?
источник задай для формы, - и псёё, - все хотелки разом заработают, даже без кодинга (нуу с учётом этого, конечно 11938409 и НОТ НУЛЛ для соотв.полей)
Проверка
Дата: 20.01.2012 15:32:30
мне нужна свободная форма
qwerty112
Дата: 20.01.2012 15:38:20
Проверка
мне нужна свободная форма

даа, пожалста, - разбивайся

1
что это такое - Select (*) ?

2
ошибку ты не говориш, но если бы по ней поискал по форуму - сразу бы узнал что у тебя неправильно

3
через DLookup - было бы и проще и короче
- 
        Dim rst1 As DAO.Recordset
        Dim Nal As Integer
        Dim strSQL As String

        strSQL = "Select (*) from (SELECT Протокол.Дата, Протокол.Неисправность, Протокол.Работа, Протокол.ЗатрачВремя
FROM Протокол
WHERE (((Протокол.Дата)=[Forms]![frmПротокол]![дата]) AND ((Протокол.Неисправность)=" & [Forms]![ frmПротокол]![Неисправность] & ") AND ((Протокол.ЗатрачВремя)=" & [Forms]![ frmПротокол]![ЗатрачВремя] & "));
) as таб"
        Set rst1 = CurrentDb.OpenRecordset(strSQL)
        Nal = rst1(0)
        CurrentDb.Close: rst1.Close

            If Nal = 0 Then

……………………………………………

	Else: MsgBox "Запись существует"
		Exit Sub
	End If