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

Откуда: Москва
Сообщений: 719
Форма1 источник записей таблица1 на форме1 есть поле1 (которое не ключевое,но совпадения по задумке не должны быть если поле1 непустое).Когда у формы ввожу текстовое значение в поле1 ='0202214100001' сохраняю запись, перехожу к следующей, ввожу опять в поле1 ='0202214100001' должен срабатывать нижеописанный блок:

Private Sub поле1_AfterUpdate()
    ...
    ElseIf DCount("*", "таблица1", "поле1= '" & Me.поле1 & "'") > 1 Then
        MsgBox "ВВЕДЕННОЕ ВАМИ ЗНАЧЕНИЕ ПОЛЯ1 УЖЕ ИМЕЕТСЯ В БАЗЕ!", vbCritical, "ВНИМАНИЕ!"
        Me.поле1 = Null
    End If
    ...
End sub


но блок не срабатывает, т.к.значение DCount=1 (потому что у формы свойство на момент правки Dirty=True).
Можно ли как-то отловить попытку повтора значения в моем случае?

Сообщение было отредактировано: 23 мар 21, 08:32
23 мар 21, 08:38    [22298564]     Ответить | Цитировать Сообщить модератору
 Re: DCount не работает как надо  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 5181
drafty
Можно ли как-то отловить попытку повтора значения в моем случае?
создать уникальный индекс на поле1 в таблице
или
обрабатывать на форме событие формы перед обновлением (BeforeUpdate)

Сообщение было отредактировано: 23 мар 21, 09:33
23 мар 21, 09:40    [22298583]     Ответить | Цитировать Сообщить модератору
 Re: DCount не работает как надо  [new]
drafty
Member

Откуда: Москва
Сообщений: 719
Панург
drafty
Можно ли как-то отловить попытку повтора значения в моем случае?
создать уникальный индекс на поле1 в таблице
или
обрабатывать на форме событие формы перед обновлением (BeforeUpdate)

не пойдет, поле1 допускает пустые значения...
23 мар 21, 10:07    [22298597]     Ответить | Цитировать Сообщить модератору
 Re: DCount не работает как надо  [new]
alecko
Member

Откуда: Башкирия
Сообщений: 779
drafty, этот блок сработает при переходе к другой записи, т.е. все поля заполнили, переходим к следующей записи, а тут у нас "сюрприз". поэтому по опыту оптимальнее использовать got_focus в следующем поле, либо change в этом.
23 мар 21, 10:11    [22298599]     Ответить | Цитировать Сообщить модератору
 Re: DCount не работает как надо  [new]
drafty
Member

Откуда: Москва
Сообщений: 719
alecko
drafty, этот блок сработает при переходе к другой записи, т.е. все поля заполнили, переходим к следующей записи, а тут у нас "сюрприз". поэтому по опыту оптимальнее использовать got_focus в следующем поле, либо change в этом.

Если я пытаюсь отредактировать однажды сохраненную запись - тогда Dcount=1, если я пытаю сохранить новую запись (с уже существующим значением поле1 в базе) - тогда опять Dcount=1 (потому что Dirty=True),хотя "по факту" таких значений уже ДВА .
Вообщем я нашел такой выход:
+

If (DCount("*", "KartochkiUchetaNeispravnostei", "Nz(DataOtkaza)=#" & Nz(Format(Me.DataOtkaza, "yyyy\/mm\/dd")) & "# AND Nz(KodSistemi)='" & Nz(Me.KodSistemi) & "' AND Nz(PolniZavodskoiNomerIzd)='" & Nz(Me.cboPolniZavodskoiNomerIzd) & "' AND Nz(KodPodSistemiKUN)='" & Nz(Me.KodPodSistemiKUN) & "' AND Nz(KodSubPodsistemi)='" & Nz(Me.KodSubPodsistemi) & "' AND Nz(ChertNomerAgregata)='" & Nz(Me.fldChertNomerAgregata) & "' AND Nz(ChertNomerDetali)='" & Me.fldChertNomerDetali & "' AND Nz(SushnostKod)='" & Nz(Me.SushnostKod) & "'") > 0) Then
    Select Case Val(polucheniepolyazaprosa("SELECT KartochkiUchetaNeispravnostei.NomerKUN FROM KartochkiUchetaNeispravnostei 
    WHERE KartochkiUchetaNeispravnostei.NomerKUNAltn like '" & Me.NomerKUNAltn & "';")) 'для режима Dirty=True
        Case Is <> Me.NomerKUN 'значит попытка внести еще одну запись с таким же КУН
        MsgBox "ДАННАЯ КУН C ЗАДАННЫМИ:" & Chr(13) _
        & "-ДАТОЙ ВЫЯВЛЕНИЯ ДЕФЕКТА" & Chr(13) _
        & "-КОДОМ СИСТЕМЫ" & Chr(13) _
        & "-ЗАВНОМЕРОМ АГРЕГАТА" & Chr(13) _
        & "-КОДОМ ПОДСИСТЕМЫ" & Chr(13) _
        & "-КОДОМ СУБПОДСИСТЕМЫ" & Chr(13) _
        & "-ЧертежнНомером АГРЕГАТА" & Chr(13) _
        & "-ЧертежнНомером ДЕТАЛИ" & Chr(13) _
        & "-КОДОМ СУЩНОСТИ ДЕФЕКТА" & Chr(13) _
        & "УЖЕ ИМЕЕТСЯ В БАЗЕ!", vbCritical, "ЗАПИСЬ В БАЗУ НЕ ДОБАВЛЕНА!"
.............
Function polucheniepolyazaprosa(sqlstr As String) As String
    Call OpenTables(sqlstr, "", 1)
    If (RST1.RecordCount > 0) Then
            RST1.MoveFirst
            polucheniepolyazaprosa = Nz(RST1.Fields(0))
        Else
            polucheniepolyazaprosa = ""
    End If
    Call CloseTables(sqlstr, "", 1)
End Function
.............
Sub OpenTables(tablename1, tablename2, flagTablic)
Set DBS = CurrentDb
    If (flagTablic = 1) Then
        Set RST1 = CurrentDb.OpenRecordset(tablename1)
    End If
    If (flagTablic = 2) Then
        Set RST1 = CurrentDb.OpenRecordset(tablename1)
        Set RST2 = CurrentDb.OpenRecordset(tablename2)
    End If
End Sub

23 мар 21, 11:03    [22298634]     Ответить | Цитировать Сообщить модератору
 Re: DCount не работает как надо  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 5181
drafty
не пойдет, поле1 допускает пустые значения...
А ты пробовал?
23 мар 21, 11:12    [22298642]     Ответить | Цитировать Сообщить модератору
 Re: DCount не работает как надо  [new]
drafty
Member

Откуда: Москва
Сообщений: 719
Панург
drafty
не пойдет, поле1 допускает пустые значения...
А ты пробовал?

честно говоря нет, но помню что выдавалось сообщение,что поле поле содержащее индекс не может быть пустым.
Может я что-то путаю...ща протестирую
23 мар 21, 11:17    [22298648]     Ответить | Цитировать Сообщить модератору
 Re: DCount не работает как надо  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 5181
drafty,

Литвин П., Гетц К., Гунделой М. - Разработка Настольных Приложений в Access 2002. Для Профессионалов (2003), стр. 64
Сравнение событий BeforeUpdate и AfterUpdate
для элемента управления

Во многих случаях не имеет значения, каким из событий — BeforeUpdate или
AfterUpdate — следует воспользоваться в приложении, но существуют исключения.
Событие BeforeUpdate рекомендуется задействовать, если нужно:
● проверить значение, введенное в элемент управления (исправления можно
отменить, присвоив аргументу Cancel значение True в процедуре обработки
событий BeforeUpdate);
● сравнить измененное значение с предыдущим (для этого можно
воспользоваться свойством OldValue элемента управления).

А событие AfterUpdate принято использовать в случае необходимости:
● изменить значение, введенное пользователем;
● отследить изменения значений полей после их выполнения программой.
23 мар 21, 11:20    [22298651]     Ответить | Цитировать Сообщить модератору
 Re: DCount не работает как надо  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 5181
drafty
выдавалось сообщение,что поле поле содержащее индекс не может быть пустым.
CREATE UNIQUE INDEX поле1 ON таблица1 (поле1) WITH IGNORE NULL;
23 мар 21, 11:32    [22298659]     Ответить | Цитировать Сообщить модератору
 Re: DCount не работает как надо  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 7257
Панург

.....обрабатывать на форме событие формы перед обновлением (BeforeUpdate)
Проверка валидности производится по BeforeUpdate(Cancel As Integer),которое можно отменить,а не на AfterUpdate когда то,что введено уже в поле.Как то так:
Private Sub поле1_BeforeUpdate(Cancel As Integer)
     If DCount("*", "таблица1", "поле1= '" & Me.поле1 & "'") >= 1 Then
        MsgBox "ВВЕДЕННОЕ ВАМИ ЗНАЧЕНИЕ ПОЛЯ1 УЖЕ ИМЕЕТСЯ В БАЗЕ!", vbCritical, "ВНИМАНИЕ!"
        cancel=true 'из поля нельзя выйти пока не введете валидное значение или не очистите его
                          ' или такая строка Me.поле1.undo 
    End If
 End Sub


Сообщение было отредактировано: 23 мар 21, 11:34
23 мар 21, 11:36    [22298663]     Ответить | Цитировать Сообщить модератору
 Re: DCount не работает как надо  [new]
drafty
Member

Откуда: Москва
Сообщений: 719
Панург
drafty
не пойдет, поле1 допускает пустые значения...
А ты пробовал?

Да, работает как и задумано, а за 22298651 и 22298659 - особая благодарность!
23 мар 21, 11:39    [22298668]     Ответить | Цитировать Сообщить модератору
 Re: DCount не работает как надо  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 5181
sdku, мне то зачем это?
23 мар 21, 11:41    [22298669]     Ответить | Цитировать Сообщить модератору
 Re: DCount не работает как надо  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 7257
Панург,
так я не тебе,а ТСу-просто немного подробней ЕМУ объяснил,а сослался на твое сообщение чтоб подчеркнуть что об этом уже говорилось

Сообщение было отредактировано: 23 мар 21, 11:40
23 мар 21, 11:45    [22298676]     Ответить | Цитировать Сообщить модератору
 Re: DCount не работает как надо  [new]
drafty
Member

Откуда: Москва
Сообщений: 719
+ sdku

sdku
Панург

.....обрабатывать на форме событие формы перед обновлением (BeforeUpdate)
Проверка валидности производится по BeforeUpdate(Cancel As Integer),которое можно отменить,а не на AfterUpdate когда то,что введено уже в поле.Как то так:
Private Sub поле1_BeforeUpdate(Cancel As Integer)
     If DCount("*", "таблица1", "поле1= '" & Me.поле1 & "'") >= 1 Then
        MsgBox "ВВЕДЕННОЕ ВАМИ ЗНАЧЕНИЕ ПОЛЯ1 УЖЕ ИМЕЕТСЯ В БАЗЕ!", vbCritical, "ВНИМАНИЕ!"
        cancel=true 'из поля нельзя выйти пока не введете валидное значение или не очистите его
                          ' или такая строка Me.поле1.undo 
    End If
 End Sub


Честно говоря, я был уверен в том, что DCount подсчитывает ВСЕ значения (включая "грязные") исходя из 22263255
23 мар 21, 12:29    [22298724]     Ответить | Цитировать Сообщить модератору
 Re: DCount не работает как надо  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 7257
Я думал что все решено 22263349,а вы опять
23 мар 21, 14:08    [22298796]     Ответить | Цитировать Сообщить модератору
 Re: DCount не работает как надо  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 7257
а еще сообщаю что 1>1 false ,а 1=1 true или 1>0 true,0=0 true

Сообщение было отредактировано: 23 мар 21, 14:14
23 мар 21, 14:14    [22298803]     Ответить | Цитировать Сообщить модератору
 Re: DCount не работает как надо  [new]
drafty
Member

Откуда: Москва
Сообщений: 719
sdku
а еще сообщаю что 1>1 false ,а 1=1 true или 1>0 true,0=0 true

а еще вопрос - внутри DCOUNT можно перемещаться по записям, или это чисто цифИрь которая выражает количество?
23 мар 21, 14:40    [22298823]     Ответить | Цитировать Сообщить модератору
 Re: DCount не работает как надо  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 7257
drafty,
Я к тому что условие Dcount(..)>1 и при наличии записи и при её отсутствии будет FALSE. А как это "внутри DCOUNT можно перемещаться по записям?"не представляю - т.к это цифра которая показывает количество записей,соответствующих некому условию
И вообще читайте HELP (чё его пересказывать)


Сообщение было отредактировано: 23 мар 21, 15:22
23 мар 21, 15:27    [22298864]     Ответить | Цитировать Сообщить модератору
 Re: DCount не работает как надо  [new]
drafty
Member

Откуда: Москва
Сообщений: 719
sdku
drafty,
Я к тому что условие Dcount(..)>1 и при наличии записи и при её отсутствии будет FALSE. А как это "внутри DCOUNT можно перемещаться по записям?"не представляю - т.к это цифра которая показывает количество записей,соответствующих некому условию
И вообще читайте HELP (чё его пересказывать)

...поверьте мне (как старому подавану),иногда лучше переспросить
23 мар 21, 16:10    [22298901]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить