powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / DCount не работает как надо
19 сообщений из 19, страница 1 из 1
DCount не работает как надо
    #40056103
Фотография drafty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Форма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
DCount не работает как надо
    #40056115
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drafty
Можно ли как-то отловить попытку повтора значения в моем случае?
создать уникальный индекс на поле1 в таблице
или
обрабатывать на форме событие формы перед обновлением (BeforeUpdate)
...
Рейтинг: 0 / 0
DCount не работает как надо
    #40056120
Фотография drafty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панург
drafty
Можно ли как-то отловить попытку повтора значения в моем случае?
создать уникальный индекс на поле1 в таблице
или
обрабатывать на форме событие формы перед обновлением (BeforeUpdate)

не пойдет, поле1 допускает пустые значения...
...
Рейтинг: 0 / 0
DCount не работает как надо
    #40056122
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drafty, этот блок сработает при переходе к другой записи , т.е. все поля заполнили, переходим к следующей записи, а тут у нас "сюрприз". поэтому по опыту оптимальнее использовать got_focus в следующем поле, либо change в этом.
...
Рейтинг: 0 / 0
DCount не работает как надо
    #40056140
Фотография drafty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
DCount не работает как надо
    #40056144
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drafty
не пойдет, поле1 допускает пустые значения...
А ты пробовал?
...
Рейтинг: 0 / 0
DCount не работает как надо
    #40056148
Фотография drafty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панург
drafty
не пойдет, поле1 допускает пустые значения...
А ты пробовал?

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

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

А событие AfterUpdate принято использовать в случае необходимости:
● изменить значение, введенное пользователем;
● отследить изменения значений полей после их выполнения программой.
...
Рейтинг: 0 / 0
DCount не работает как надо
    #40056158
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drafty
выдавалось сообщение,что поле поле содержащее индекс не может быть пустым.
Код: sql
1.
CREATE UNIQUE INDEX поле1 ON таблица1 (поле1) WITH IGNORE NULL;
...
Рейтинг: 0 / 0
DCount не работает как надо
    #40056161
Фотография 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
...
Рейтинг: 0 / 0
DCount не работает как надо
    #40056164
Фотография drafty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панург
drafty
не пойдет, поле1 допускает пустые значения...
А ты пробовал?

Да, работает как и задумано, а за 22298651 и 22298659 - особая благодарность!
...
Рейтинг: 0 / 0
DCount не работает как надо
    #40056165
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku, мне то зачем это?
...
Рейтинг: 0 / 0
DCount не работает как надо
    #40056168
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панург,
так я не тебе,а ТСу-просто немного подробней ЕМУ объяснил,а сослался на твое сообщение чтоб подчеркнуть что об этом уже говорилось
...
Рейтинг: 0 / 0
DCount не работает как надо
    #40056202
Фотография drafty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
DCount не работает как надо
    #40056236
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думал что все решено 22263349 ,а вы опять
...
Рейтинг: 0 / 0
DCount не работает как надо
    #40056242
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а еще сообщаю что 1>1 false ,а 1=1 true или 1>0 true,0=0 true
...
Рейтинг: 0 / 0
DCount не работает как надо
    #40056255
Фотография drafty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku
а еще сообщаю что 1>1 false ,а 1=1 true или 1>0 true,0=0 true

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

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


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