Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / DCount не работает как надо / 19 сообщений из 19, страница 1 из 1
23.03.2021, 08:38
    #40056103
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCount не работает как надо
Форма1 источник записей таблица1 на форме1 есть поле1 (которое не ключевое,но совпадения по задумке не должны быть если поле1 непустое ).Когда у формы ввожу текстовое значение в поле1 ='0202214100001' сохраняю запись, перехожу к следующей, ввожу опять в поле1 ='0202214100001' должен срабатывать нижеописанный блок:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
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).
Можно ли как-то отловить попытку повтора значения в моем случае?
...
Рейтинг: 0 / 0
23.03.2021, 09:40
    #40056115
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCount не работает как надо
drafty
Можно ли как-то отловить попытку повтора значения в моем случае?
создать уникальный индекс на поле1 в таблице
или
обрабатывать на форме событие формы перед обновлением (BeforeUpdate)
...
Рейтинг: 0 / 0
23.03.2021, 10:07
    #40056120
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCount не работает как надо
Панург
drafty
Можно ли как-то отловить попытку повтора значения в моем случае?
создать уникальный индекс на поле1 в таблице
или
обрабатывать на форме событие формы перед обновлением (BeforeUpdate)

не пойдет, поле1 допускает пустые значения...
...
Рейтинг: 0 / 0
23.03.2021, 10:11
    #40056122
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCount не работает как надо
drafty, этот блок сработает при переходе к другой записи , т.е. все поля заполнили, переходим к следующей записи, а тут у нас "сюрприз". поэтому по опыту оптимальнее использовать got_focus в следующем поле, либо change в этом.
...
Рейтинг: 0 / 0
23.03.2021, 11:03
    #40056140
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCount не работает как надо
alecko
drafty, этот блок сработает при переходе к другой записи , т.е. все поля заполнили, переходим к следующей записи, а тут у нас "сюрприз". поэтому по опыту оптимальнее использовать got_focus в следующем поле, либо change в этом .

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

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
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


...
Рейтинг: 0 / 0
23.03.2021, 11:12
    #40056144
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCount не работает как надо
drafty
не пойдет, поле1 допускает пустые значения...
А ты пробовал?
...
Рейтинг: 0 / 0
23.03.2021, 11:17
    #40056148
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCount не работает как надо
Панург
drafty
не пойдет, поле1 допускает пустые значения...
А ты пробовал?

честно говоря нет, но помню что выдавалось сообщение,что поле поле содержащее индекс не может быть пустым.
Может я что-то путаю...ща протестирую
...
Рейтинг: 0 / 0
23.03.2021, 11:20
    #40056151
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCount не работает как надо
drafty,

Литвин П., Гетц К., Гунделой М. - Разработка Настольных Приложений в Access 2002. Для Профессионалов (2003), стр. 64 Сравнение событий BeforeUpdate и AfterUpdate
для элемента управления
Во многих случаях не имеет значения, каким из событий — BeforeUpdate или
AfterUpdate — следует воспользоваться в приложении, но существуют исключения.
Событие BeforeUpdate рекомендуется задействовать, если нужно:
● проверить значение, введенное в элемент управления (исправления можно
отменить, присвоив аргументу Cancel значение True в процедуре обработки
событий BeforeUpdate );
● сравнить измененное значение с предыдущим (для этого можно
воспользоваться свойством OldValue элемента управления).

А событие AfterUpdate принято использовать в случае необходимости:
● изменить значение, введенное пользователем;
● отследить изменения значений полей после их выполнения программой.
...
Рейтинг: 0 / 0
23.03.2021, 11:32
    #40056158
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCount не работает как надо
drafty
выдавалось сообщение,что поле поле содержащее индекс не может быть пустым.
Код: sql
1.
CREATE UNIQUE INDEX поле1 ON таблица1 (поле1) WITH IGNORE NULL;
...
Рейтинг: 0 / 0
23.03.2021, 11:36
    #40056161
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCount не работает как надо
Панург

.....обрабатывать на форме событие формы перед обновлением (BeforeUpdate)
Проверка валидности производится по BeforeUpdate(Cancel As Integer),которое можно отменить,а не на AfterUpdate когда то,что введено уже в поле.Как то так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
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
...
Рейтинг: 0 / 0
23.03.2021, 11:39
    #40056164
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCount не работает как надо
Панург
drafty
не пойдет, поле1 допускает пустые значения...
А ты пробовал?

Да, работает как и задумано, а за 22298651 и 22298659 - особая благодарность!
...
Рейтинг: 0 / 0
23.03.2021, 11:41
    #40056165
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCount не работает как надо
sdku, мне то зачем это?
...
Рейтинг: 0 / 0
23.03.2021, 11:45
    #40056168
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCount не работает как надо
Панург,
так я не тебе,а ТСу-просто немного подробней ЕМУ объяснил,а сослался на твое сообщение чтоб подчеркнуть что об этом уже говорилось
...
Рейтинг: 0 / 0
23.03.2021, 12:29
    #40056202
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCount не работает как надо
sdku
sdku
Панург

.....обрабатывать на форме событие формы перед обновлением (BeforeUpdate)
Проверка валидности производится по BeforeUpdate(Cancel As Integer),которое можно отменить,а не на AfterUpdate когда то,что введено уже в поле.Как то так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
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
...
Рейтинг: 0 / 0
23.03.2021, 14:08
    #40056236
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCount не работает как надо
Я думал что все решено 22263349 ,а вы опять
...
Рейтинг: 0 / 0
23.03.2021, 14:14
    #40056242
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCount не работает как надо
а еще сообщаю что 1>1 false ,а 1=1 true или 1>0 true,0=0 true
...
Рейтинг: 0 / 0
23.03.2021, 14:40
    #40056255
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCount не работает как надо
sdku
а еще сообщаю что 1>1 false ,а 1=1 true или 1>0 true,0=0 true

а еще вопрос - внутри DCOUNT можно перемещаться по записям, или это чисто цифИрь которая выражает количество?
...
Рейтинг: 0 / 0
23.03.2021, 15:27
    #40056278
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCount не работает как надо
drafty,
Я к тому что условие Dcount(..)>1 и при наличии записи и при её отсутствии будет FALSE. А как это "внутри DCOUNT можно перемещаться по записям?"не представляю - т.к это цифра которая показывает количество записей,соответствующих некому условию
И вообще читайте HELP (чё его пересказывать)
...
Рейтинг: 0 / 0
23.03.2021, 16:10
    #40056303
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DCount не работает как надо
sdku
drafty,
Я к тому что условие Dcount(..)>1 и при наличии записи и при её отсутствии будет FALSE. А как это "внутри DCOUNT можно перемещаться по записям?"не представляю - т.к это цифра которая показывает количество записей,соответствующих некому условию
И вообще читайте HELP (чё его пересказывать)

...поверьте мне (как старому подавану),иногда лучше переспросить
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / DCount не работает как надо / 19 сообщений из 19, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]