Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Функция для проверки уникальности записи  [new]
Sergey NV
Member

Откуда:
Сообщений: 103
Создал функцию для проверки на уникальность введенной записи.
В функцию ПеревіркаНаУнікальність вносятся:
- названия с полей формы,которые записуются в масив FN;
- названия полей таблицы подключеной к форме, записуются в масив FieldNames;
- форма в которой надо сделать проверку на уникальность, Frm.

Я ставлю ее на свойство потери фокуса в определенном поле, которое надо проверить на уникальность.

Я проверял - работает. Кому надо, пользуйтесь.
Если найдете ошыбку в коде, или чтото другое, связаное с этой темой обращайтесь или пишыте на мило. Буду рад критике.

За ошыбки в руском языке извиняюсь. не месный я.

Option Compare Database
Option Explicit

Public Function ПеревіркаНаУнікальність(FN As Variant, FieldNames As Variant, frm As Form) As Boolean
    ПеревіркаНаУнікальність = True
    If Not frm.Dirty Then Exit Function
    
    Dim msgtext As String
    Dim i As Integer
    
    If Not IsArray(FN) Then
        msgtext = "Програмна помилка №001: Значення не є масивом." & Chr(13) & "(Повідомте розробника!)"
        MsgBox msgtext, vbExclamation
        Exit Function
    End If
       
    If Not (UBound(FN, 1) >= 0) Then
        msgtext = "Програмна помилка №002: Масив не містить жодного запису." & Chr(13) & "(Повідомте розробника!)"
        MsgBox msgtext, vbExclamation
        Exit Function
    End If
    
    For i = 0 To UBound(FN, 1)
        If IsNull(frm(FN(i)).Value) Then Exit Function
    Next i
    
    
    Dim fld1() As Variant
    ReDim fld1(UBound(FN, 1), 1)
    
    For i = 0 To UBound(FN, 1)
        If IsNull(FN(i)) Then Exit Function
        fld1(i, 0) = frm(FN(i))
        fld1(i, 1) = FieldNames(i)
    Next i
    
    Dim w, v As Variant
    w = ExistinTable3(frm("OBJECTID"), "OBJECTID", Array(fld1), frm)
    If IsNull(w) Then Exit Function
    ПеревіркаНаУнікальність = False
    
    'Формується список полів
    Dim ttx As String
    ttx = Chr(13)
    For i = 0 To UBound(FieldNames, 1)
        ttx = ttx & " - [" & FieldNames(i) & "]" & Chr(13)
    Next i

    If MsgBox("Значення введені в поле:" & ttx & "вже використовуються іншим записом цієї таблиці." & Chr(13) & "Відмінити внесені зміни та ПЕРЕЙТИ на цей запис?", vbYesNo, "Повідомлення...") = vbYes Then     ' перехід на запис
        frm.Undo
        v = frm.OBJECTID.Visible
        frm.OBJECTID.Visible = True
        frm.OBJECTID.SetFocus
        frm.Recordset.MoveFirst
        frm.Recordset.FindFirst "[OBJECTID] = " & w
        frm(FN(0)).SetFocus
        frm.OBJECTID.Visible = v
    End If
End Function

Public Function ExistinTable3(id As Integer, idfld As String, val As Variant, frm As Form) As Variant
    ExistinTable3 = Null
    Dim dd  As Recordset
    Dim fltr As String
    Dim i As Integer
    fltr = ""
    For i = 0 To UBound(val(0), 1)
        fltr = CreateFilter(fltr, val(0)(i, 1), val(0)(i, 0), frm)
    Next i
    Set dd = CurrentDb.OpenRecordset("select * from " & frm.RecordSource & " where " & fltr & " and [" & idfld & "] <> " & id)
    If dd.RecordCount < 1 Then Exit Function
    ExistinTable3 = dd.Fields(idfld).Value
End Function

Function CreateFilter(txt As String, f1 As Variant, v1 As Variant, frm As Form) As String
    If txt <> "" Then txt = txt & " AND "
    If frm.Recordset.Fields(f1).Type = dbText Then v1 = "'" & v1 & "'"
    txt = txt & "[" & f1 & "] = " & v1 & ""
    CreateFilter = txt
End Function
15 июн 06, 15:29    [2775326]     Ответить | Цитировать Сообщить модератору
 Re: Функция для проверки уникальности записи  [new]
bubucha
Member

Откуда:
Сообщений: 5640
Так, в плане расширения кругозора, зачем?
15 июн 06, 15:38    [2775368]     Ответить | Цитировать Сообщить модератору
 Re: Функция для проверки уникальности записи  [new]
неважно
Guest
А ключи/уникальные индексы в определении таблицы чем не нравятся?
15 июн 06, 15:42    [2775392]     Ответить | Цитировать Сообщить модератору
 Re: Функция для проверки уникальности записи  [new]
Sergey NV
Member

Откуда:
Сообщений: 103
например на форме может быть очень много полей. пользователь их все заполнит, а потом выяснит что даная запись уже существует.
А так он вводит в поле данные, после чего "уходит" с поля, а функция тем временем ему показывает есть ли даная запись или нет, и предлагает ему перейти к ней.
Это для економии времени пользователя.
15 июн 06, 15:50    [2775444]     Ответить | Цитировать Сообщить модератору
 Re: Функция для проверки уникальности записи  [new]
MasterZ
Member

Откуда: Москва
Сообщений: 1145
Sergey NV
например на форме может быть очень много полей. пользователь их все заполнит, а потом выяснит что даная запись уже существует.
А так он вводит в поле данные, после чего "уходит" с поля, а функция тем временем ему показывает есть ли даная запись или нет, и предлагает ему перейти к ней.
Это для економии времени пользователя.


По моему составной ключ удобнее использовать...
15 июн 06, 17:07    [2776117]     Ответить | Цитировать Сообщить модератору
 Re: Функция для проверки уникальности записи  [new]
bubucha
Member

Откуда:
Сообщений: 5640
автор
А так он вводит в поле данные, после чего "уходит" с поля, а функция тем временем ему показывает есть ли даная запись или нет, и предлагает ему перейти к ней

Из этой фразы получается, что уникальность записи у вас, определяется значением в ОДНОМ поле.
15 июн 06, 17:13    [2776154]     Ответить | Цитировать Сообщить модератору
 Re: Функция для проверки уникальности записи  [new]
Анатолий Кудрявцев
Member

Откуда: Санкт-Петербург
Сообщений: 1575
А вот интересно, если пользователю удобно работать методом Ctrl+C Ctrl+V, а потом вносить изменения в новую запись, такая проверка как себя поведёт?
15 июн 06, 17:59    [2776464]     Ответить | Цитировать Сообщить модератору
 Re: Функция для проверки уникальности записи  [new]
Sergey NV
Member

Откуда:
Сообщений: 103
bubucha
автор
А так он вводит в поле данные, после чего "уходит" с поля, а функция тем временем ему показывает есть ли даная запись или нет, и предлагает ему перейти к ней

Из этой фразы получается, что уникальность записи у вас, определяется значением в ОДНОМ поле.

Нет. В Масивы указывается група полей Пример:
If Not ПеревіркаНаУнікальність(Array("ФИО", "дата"), Array("ФИО", "дата"), Me) Then Exit Sub
или
ПеревіркаНаУнікальність Array("ФИО", "дата"), Array("ФИО", "дата"), Me
15 июн 06, 18:23    [2776562]     Ответить | Цитировать Сообщить модератору
 Re: Функция для проверки уникальности записи  [new]
Sergey NV
Member

Откуда:
Сообщений: 103
Анатолий Кудрявцев
А вот интересно, если пользователю удобно работать методом Ctrl+C Ctrl+V, а потом вносить изменения в новую запись, такая проверка как себя поведёт?

Извините, непонимаю как пользователи делают?
15 июн 06, 18:28    [2776585]     Ответить | Цитировать Сообщить модератору
 Re: Функция для проверки уникальности записи  [new]
Анатолий Кудрявцев
Member

Откуда: Санкт-Петербург
Сообщений: 1575
Sergey NV
Извините, непонимаю как пользователи делают?

Итак, цитирю.
Sergey NV
например на форме может быть очень много полей. пользователь их все заполнит, а потом выяснит что даная запись уже существует.
А так он вводит в поле данные, после чего "уходит" с поля, а функция тем временем ему показывает есть ли даная запись или нет, и предлагает ему перейти к ней.
Это для економии времени пользователя.

Вот я пользователь. Мне надо ввести несколько больших записей, очень похожих друг на друга, но отличающихся некоторыми значениями. Как я буду делать? Я честно набью первую запись, потом скопирую её в clipboard (нажму Ctrl+C), а потом буду её вставлять и изменять нужные мне значения. Согласитесь, что это здорово сэкономит моё время.
А вот теперь вопрос: сразу после моей вставки сработает «проверка на уникальность», которая начнёт мне любезно сообщать о том, что такая запись уже есть и шёл бы ты на неё. Типа, я тут уникальность проверяю, а ты мне мешаешь. :-)
Спасибо, но я и сам знаю, что такая запись есть. Более того, это хорошо, что она есть. И я, как пользователь, лучше знаю, какая запись мне нужна, а какая нет.
Я это всё к чему говорю? А к тому, что всякие проверки лучше делать перед тем, как пользователь закончил работу с записью, читай перед сохранением ВСЕЙ записи, а не некоторых значений.
15 июн 06, 19:12    [2776730]     Ответить | Цитировать Сообщить модератору
 Re: Функция для проверки уникальности записи  [new]
Adolis
Member

Откуда:
Сообщений: 67
Для этого я сделал настройки в програме в которой пользователь сам выбирает - нужна ему такая функция.
16 июн 06, 17:47    [2781447]     Ответить | Цитировать Сообщить модератору
 Re: Функция для проверки уникальности записи  [new]
Анатолий Кудрявцев
Member

Откуда: Санкт-Петербург
Сообщений: 1575
Так может на каждое нечетное нажатие мыши проверку повесить, нужно оно пользователю или нет? Существуют же стандартные и отработанные способы проверки уникальности, зачем изобретать велосипед?
16 июн 06, 18:02    [2781533]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить