powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Отследить изменения на закрытие и отмену формы
94 сообщений из 94, показаны все 4 страниц
Отследить изменения на закрытие и отмену формы
    #39498016
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите с кодом. Нужно, чтобы была проверка на внесенные изменения перед закрытием или отменой формы (форма для ввода данных) и выдавать окно сообщения сохранить изменения: да/нет/отмена, если юзер нажал:
1) закрыть форму - кнопка «X» на форме.
2) по привычке на Esc.
Не могу никак справиться с событиями: «Form_BeforeUpdate», «Form_Undo», «Form_Unload» - состояние "Me.Dirty" получается словно морковка, привязанная впереди у ослика.

И это еще только при том учете, если юзер заполнил форму как надо - без повторяющихся значений в полях, что тоже не знаю как заранее вынести на проверку, чтобы форма не уходила с записи и позволяла юзеру дать возможность исправить за собой ошибку.

Код пытаюсь использовать такой:

Код: 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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
Dim intClose As Integer '1-да(сохраняем данные при закрытии), 2-нет(отмена изменений при закрытии), 3-отмена(режим ожидания)
Dim intEsc As Integer '1-да(сохраняем изменения), 2-нет(отмена изменений), 3-отмена(режим ожидания)
'------------------------------------------------
Private Sub Form_BeforeUpdate(Cancel As Integer)
  Dim ctrl As control

  Set ctrl = Screen.ActiveControl

  If Me.Dirty = True Then 'если были внесены изменения
    Select Case MsgBox("Сохранить изменения?", vbYesNoCancel + vbQuestion, "Info. Form_BeforeUpdate")
      Case vbYes 'сохранение изменений
        If ПроверкаНаЗаполнение = True Then 'если все ок
          intClose = 1
        Else 'если косяк, стоим на месте в режиме ожидания исправлений
          intClose = 3
        End If

      Case vbNo 'отмена изменений - как тут правильно сделать отмену???
        intEsc = 2
        intClose = 2
        Me.Undo
'        Me.Dirty = False

      Case vbCancel 'режим ожидания
        intClose = 3
        Cancel = False
        ctrl.SetFocus
        Me.Dirty = True
        ctrl.SetFocus
    End Select

End Sub
'------------------------------------------------
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  Dim ctrl As control
  
  Set ctrl = Screen.ActiveControl
  
  Select Case KeyCode
    ...
    Case vbKeyEscape
      If Me.Dirty = True Then
        Select Case MsgBox("Сохранить изменения?", vbYesNoCancel + vbQuestion, "Info. Form_KeyDown")
          Case vbYes 'сохранение изменений
            If ПроверкаНаЗаполнение = True Then 'если все ок
              intEsc = 1
            Else
              intEsc = 3
            End If

          Case vbNo 'отмена изменений
            intEsc = 2
            Me.Undo
'            Me.Dirty = False

          Case vbCancel 'режим ожидания
            intEsc = 3
            ctrl.SetFocus
            Me.Dirty = True
            ctrl.SetFocus
        End Select
      Else
        DoCmd.Close acForm, Me.Name, acSaveNo
      End If
  End Select

End Sub
'------------------------------------------------
Private Sub Form_Undo(Cancel As Integer)

  Select Case intEsc
    Case 1
      If (ПроверкаНаЗаполнение = True) Then 'если все ок
        DoCmd.RunCommand acCmdSaveRecord
        ...
      Else 'остаться на текущей записи и исправить запись
        Cancel = True
      End If

    Case 2 'отмена изменений
      Cancel = False

    Case 3 'остаться на текущей записи
      Cancel = True
  End Select

End Sub
'------------------------------------------------
Private Sub Form_Unload(Cancel As Integer)
  Dim ctrl As control

  Set ctrl = Screen.PreviousControl
  
  Select Case intClose
    Case 1 'сохранение изменений
      Cancel = False

    Case 2 'отмена изменений - как тут сделать отмену изменений???
      Cancel = False

    Case 3 'режим ожидания
      Cancel = True
      ctrl.SetFocus
      Me.Dirty = True
      ctrl.SetFocus
'    Case Else
'      Cancel = False
  End Select
  
End Sub



В общем без помощи опытных мне не справиться.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39498039
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23,
не понял зачем кнопка "отмена"
а прочие Ваши "хотелки" не понимаю (если Вы не сохраняете изменения происходит отмена.Проверку полей производите на BeforeUpdate соответствующих полей с отменой события при нарушении валидности-курсор остается в поле пока не будут внесены корректные данные )
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Sub Form_BeforeUpdate(Cancel As Integer)
If Me.Dirty = True Then
    Dim intResponse As Integer
    intResponse = MsgBox("данные изменились,сохранить?", vbYesNo, "заголовок окна")
        If intResponse = vbNo Then
            Cancel = True
            Me.Undo
        End If
    End If
End Sub
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39498629
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdkuне понял зачем кнопка "отмена"
На форме нет никакой кнопки "отмена", а вот на клавиатуре привычная клавиша «Esc» есть. Поэтому я использую "vbKeyEscape" в событии «Form_KeyDown», чтобы отловить попытку отмены данных.
Прежде, чем делать отмену хорошо бы предварительно выдавать запрос о сохранении данных, если таковые юзер начал вносить и по какой то причине нажал Esc.
sdkuа прочие Ваши "хотелки" не понимаю
Закрытие формы - кнопка «X» на форме - аналогичная тема, если были изменения, перед закрытием формы сделать запрос юзеру хочет ли он их сохранить:
1) да - если хочет.
2) нет - если не хочет, то закрыть без сохранения.
3) отмена - форма стоит в режиме ожидания дальнейших действий юзера.

По моему это самая обычная рядовая ситуация!?!
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39498700
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23...Закрытие формы - кнопка «X» на форме - аналогичная тема, если были изменения, перед закрытием формы сделать запрос юзеру хочет ли он их сохранить:..
Приведенная выше процедура, каким бы способом Вы не закрывали форму,выдаст запрос на сохранение изменений, если они были.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39498707
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вдогонку:создайте программу,которой сможет пользоваться даже дурак, и только он будет ей пользоваться. Если редактирование формы не закончено зачем её закрывать???? И вообще зачем редактировать,кому не попадя, сохранённые записи, лишаясь честной истории и нарушая, вплоть до краха, работоспособность БД ??
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39498937
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обычно создается временная таблица, в которую переносятся данные которые нужно изменить, в форме обрабатываются данные из этой таблицы и обрабатывается только операция сохранения при закрытии формы (корректно измененные/добавленные данные (после проверки естественно) переносятся уже в основные таблицы).
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39499010
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdkuПриведенная выше процедура, каким бы способом Вы не закрывали форму,выдаст запрос на сохранение изменений, если они были.
Если убрать весь приведенный мной код к форме и использовать Ваш пример, то в сообщении о сохранении данных при выборе " не сохранять ", последовательно уже выдается стандартное сообщение об ошибке от аксеса о невозможности сохранить запись:

Т.е. он все равно пытается сохранить данные, даже при условии, что был применен Me.Undo. На мой взгляд это действительно ошибка и она логична, потому что это получается уже попытка сохранить пустую запись. Мне нужно, чтобы при выборе "не сохранять" форма закрывалась так как если бы юзер ничего не вводил изначально (ну мало ли - передумал в конце концов и закрыл форму), т.е. отменить все что было введено, чтобы форма при закрытии не орала как дура тупая.

И потом, если после моего сообщения сразу вылазит стандартное сообщение акса как на скриншоте, то мое предварительное сообщение о сохранении из Вашего примера получается "не в кассу", согласитесь.

sdkuвдогонку:создайте программу,которой сможет пользоваться даже дурак, и только он будет ей пользоваться.
Не понятен Ваш совет. Если Вы можете что то предложить дайте пожалуйста конкретный пример.

sdkuЕсли редактирование формы не закончено зачем её закрывать????
Если бы все юзеры были роботами и выполняли строго определенные движения при работе, программистам много чего не пришлось бы продумывать... и тогда код был бы значительнее проще

Я не утверждаю, что выложенный мой код оптимальный, я пытаюсь найти способ и сделать возможность направлять юзера при работе с формой делать выбор, что ему нужно, если он нажал закрыть или же клавишу Esc, но данные при этом еще не сохранил.
Кстати Ваш пример на клавишу Esc не реагирует. Каким образом тогда с этим быть?

Я не знаю как Вы, но я много и часто сталкивалась с юзерами, которые тыкают мышкой без разбору, а потом начинают жаловаться, что якобы программа работает неправильно. Именно для этого, на мой взгляд, необходимо выдавать юзеру соответствующий запрос, чтобы программа выполняла требования согласно выбору юзера, а именно, если на форме были изменения и юзер их не сохранил - вначале выдать запрос о сохранении.
Я в общем то не пытаюсь изменить концепцию креста на форме и клавиши Esc для отмены заполненных полей. Я пытаюсь сделать предварительный запрос на продолжение соответствующих действий в зависимости от того, что выберет юзер.
В случае, когда юзер нажал "X" на форме для закрытия формы выдать запрос о сохранении изменений, если они были внесены :
1) если да - сохранить и закрыть форму.
2) если нет - вертать все в зад и закрыть форму.
3) отмена - форма в режиме ожидания. В случае, если юзер хочет продолжить работать с записью дальше.

В случае, когда юзер нажал "Esc" выдать запрос о сохранении изменений, если они были внесены :
1) если да - просто сохранить.
2) если нет - вертать все в зад.
3) отмена - форма в режиме ожидания.

sdkuИ вообще зачем редактировать,кому не попадя, сохранённые записи, лишаясь честной истории и нарушая, вплоть до краха, работоспособность БД ??
Я не знаю от куда Вы взяли, что через форму для ввода данных я делаю возможность редактирования других данных, которые уже содержатся в базе? В моей ситуации речь идет о редактировании текущих данных пока пользователь заполняет форму.

И напоследок еще что мне не понятно, Вы советуете:
sdkuПроверку полей производите на BeforeUpdate соответствующих полей
но, когда я в «Form_BeforeUpdate» вызываю свою процедуру по проверке на пустые поля, отлавливаю их и выдаю сразу юзеру сообщение об этом, то по возврату обратно и уже завершению BeforeUpdate аксес все равно выдает мне ошибку. В итоге получается, что мое сообщение для юзера срабатывает преждевременно, затем аксес возмущается уже своим сообщением. В этом случае я не понимаю как правильно осуществляется обработка ошибок?
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39499160
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23,
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39499175
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23....Если бы все юзеры были роботами и выполняли строго определенные движения при работе, программистам много чего не пришлось бы продумывать... и тогда код был бы значительнее проще.. Все косяки юзверей предусмотреть (предугадать-самых светлых мозгов не хватит) не возможно в принципе, и задачу разработчика,я лично, вижу в том,чтоб не позволить ввести не корректные данные (а для этого достаточно встроенных средств АКСА условий на значение,маски ввода или собственных проверок в коде-пусть юзвери изобретают сотни новых косяков)
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39499282
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,
спасибо за пример, но в нем я не вижу, чтобы форма так же предварительно реагировала на клавишу Esc - это первое.
Второе - сообщение акса как на моем же скриншоте у Вас так же выводится после того как в сообщении о сохранении изменений выбираешь "нет", даже при условии, что все поля заполнены и заполнены как было нужно. Это то, о чем писала в посте выше.
Я не вижу тогда в Вашем случае смысла вообще выводить юзеру свое сообщение о сохранении изменений, если при пользовательском отказе сохранять данные, будет выводиться данное аксовское назойливое сообщение. Это бессмыслица какая то.
Больше того, если первое поле пройти мимо и ничего не заполнять а заполнить только второе, форма при выводе сообщение о сохранении данных в Вашем примере если выбирать "да", сохраняет запись как ни в чем не бывало, что является косяком.
Самое обидное для меня в Вашем примере - это то, что нет возможности сделать приостановление закрытия формы, если понимаешь, что где то что то пропустил при заполнении. В моей ситуации заполнение полей в порядке очередности нет, т.е. юзер может в принципе что то где то упустить, а поскольку сообщение уже висит сделать его отмену в Вашем случае нельзя.
sdkuВсе косяки юзверей предусмотреть (предугадать-самых светлых мозгов не хватит) не возможно в принципе
Согласна, но в данном случае - это самое обычная и распространенная ситуация.
Если реально нет возможности найти для этого решение, честно говоря для майкрософта это агромная и тупая косячина, которую они не удосужились продумать для тех кто программирует на бейсике в аксе.
sdkuи задачу разработчика,я лично, вижу в том,чтоб не позволить ввести не корректные данные (а для этого достаточно встроенных средств АКСА условий на значение,маски ввода или собственных проверок в коде-пусть юзвери изобретают сотни новых косяков)
Я как раз и пытаюсь делать преждевременную проверку, например перед сохранением или добавлением новой записи, но в ситуациях с Esc и закрытием формы преждевременную проверку делать у меня не получается без назойливых аксесовских сообщений. И самое главное с тем кодом, который у меня сейчас, я не могу никак осилить один момент - это при закрытии формы не сохранять введеные данные, если юзер выбрал "нет". В процедуре "Form_BeforeUpdate" указываю Me.Undo -> форма все равно закрывается со всеми заполненными данными.

По поводу проверок, единственное до чего я пока что еще не добралась, это до проверки на повторяющееся значение, что тоже для меня загадка.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39499295
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23sdku,
Второе - сообщение акса как на моем же скриншоте у Вас так же выводится после того как в сообщении о сохранении изменений выбираешь "нет", даже при условии, что все поля заполнены и заполнены как было нужно. Это то, о чем писала в посте выше.
просмотрел пример-при переходе на другую запись ,(хоть новая, хоть редактирование) никаких сообщений при нажатии кнопки "нет" не выводится (за исключением случая закрытия формы сочетанием alt+f4 ,без предварительного сохранения записи.Вывод-перед закрытием формы сочетанием клавиш запись надо сохранять)
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39499317
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdkuВывод-перед закрытием формы сочетанием клавиш запись надо сохранять)
Я не закрываю форму сочетанием клавиш, я говорю о нажатии на крестик.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39499319
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdkuзакрытия формы сочетанием alt+f4
Не знаю кто так осуществляет закрытие форм по нажатию на alt+f4, но у меня тогда после сообщения закрывается весь аксес, т.е. полностью все приложение. Не знаю кто как лично я такого не делаю, когда работа идет с формами внутри приложения, бред какой то я такое впервые слышу, чтобы какой нить юзер работая с формой пытался закрывать ее в глобальном смысле для всего приложения неважно будь это аксес или же др.приложение.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39499339
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23,
дошло-Вы закрываете форму не сохранив изменения и ACCESS очень даже логично задает вопрос закрывать форму или нет т.к. не понятно что делать с новыми данными (ведь процедура выполняется перед сохранением записи а при нажатии на крестик она выполняется внутри события закрытие которое и выводит сообщение. Вижу только один вариант: в событии выгрузка если Dirty=true вывести сообщение о необходимости сохранения записи и отменить событие
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39499342
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вдогокнку: насчет alt+f4 закрывает акс,но перед этим закрывает открытые объекты
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39499868
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdkuВижу только один вариант: в событии выгрузка если Dirty=true вывести сообщение о необходимости сохранения записи и отменить событие
а у Вас получается в событии "Form_Unload" Dirty=true???
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39499875
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,
Больше того, если Dirty=true, то при нажати на крестик, он не идет сразу в событие "Form_Unload", он вначале идет в событие "Form_BeforeUpdate".
Если состояние формы Dirty=true/false было бы возможно определить так как Вы предлагаете, у меня бы давно не возникало бы вопросов на эту тему. Посмотрите в моем изначальном посте мой код, именно по этой причине я разместила свой MsgBox в событии "Form_BeforeUpdate", а не в "Form_Unload". И бы было мне счастье, наверное, если бы не одно но... - в моем сообщении при выборе отказаться от сохранения ("нет"), данные все равно молча сохраняются в базе (ну это конечно при условии, что все поля заполнены и заполнены без ошибок).
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39499909
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23,
Насчет "Form_Unload" я действительно был не прав-прошу прощения, а вот в нижесказанном уверен.
Успехов Вам в изменении логики, заложенной в ACCESS программистами Microsoft
(кстати юзер наткнувшись пару раз на сообщение, в дальнейшем, будет делать все правильно,чтоб его не получать)
sdkuВы закрываете форму не сохранив изменения и ACCESS очень даже логично задает вопрос закрывать форму или нет т.к. не понятно что делать с новыми данными
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39499938
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdkuУспехов Вам в изменении логики, заложенной в ACCESS программистами Microsoft
Дело не в том, что пытаюсь изменить логику программистов Microsoft.
Я пытаюсь понять почему не получается на этапе закрытия через крестик отменить на форме введенные данные в процессе заполнения, до момента сохранения. Что за концепция такая странная???
Мне так же не понятен принцип бегающего состояния Dirty.

Еще мне не понятен процесс отслеживания ошибок аксеса, т.к. своими сообщениями он сбрасывает внесенные данные, но при этом переходит к запросу с выбором закрытия формы, что для меня тупо.
Если с проверкой на пустые поля я еще могу как то заранее отследить и не дать допустить юзеру ошибку, то вкупе всего вышеизложенного я не пойму как и где мне реализовать проверку на повторяющиеся значения своих двух полей, а проверка мне нужна.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500020
nikolay_magagin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Конечно может мои рассуждения туповаты.
Как только вносится любой символ в таблицу (форму), строковая запись по факту начинает существовать, но одновременно существует в виртуальном значении, что возможно блокирует одномоментное участие строки по передаче внесенных/измененных данных. Для примера попробуйте внести новые данные в таблицу, затем отменить ввод, затем еще новую запись. Вы заметите, что ID будет показывать только цифры 1 и 3. Цифра 2 отображаться не будет, это отмененный ввод. Другой пример: откройте одновременно таблицу и форму созданную на ее основе. При изменении данных где либо, они изменяться в другой, лишь после перехода на следующую запись. Поэтому ситуацию с выплывающим окном я понимаю так: сохранить - снятие блокировки с текущей записи; отмена - снятие блокировки с текущей записи и удаление текущей записи. Все остальные действия дают сохранение.
Для удаления повторов создайте запрос на удаление записи, где группируются возможные повторы, условие для ID last/first/max/min, подсчитываются количество повторяющихся записей с условием на отображение >1. Если будете запускать из формы, перед запросом не забудьте задать сохранить запись.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500037
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23Помогите с кодом. Нужно, чтобы была проверка на внесенные изменения перед закрытием или отменой формы (форма для ввода данных) и выдавать окно сообщения сохранить изменения: да/нет/отмена, если юзер нажал:
1) закрыть форму - кнопка «X» на форме.
2) по привычке на Esc.
Могу предложить направление.

Как я понял, вы хотите, чтобы по нажатию крестика форма закрывалась молча только в том случае, если ее св-во Dirty = false, но если Dirty = true, то предложить диалог. Но реализовать не можете, событийная модель Access против вас.
Попробуйте компромисс.
Суть в том, что как только форма переходит в режим редактирования (Dirty = true), блокируйте кнопку закрытия формы. Таким образом пользователь окажется в ситуации, когда ему нужно или сохранить запись или отказаться от изменений(нажать ESC). Как только он сделает одно из двух, кнопка закрытия окна станет снова доступной.

Как я сказал, это просто направление. Во вложении пример, сделанный на скорую руку. Просто для демонстрации идеи. В режиме tabbed интерфейса он не работает. Надеюсь, доработаете, если будет нужно.

nataxa232) по привычке на Esc.
ESC для меня это или отмена изменений или выход без сохранения. Без вариантов.
Я не встречал в Windows программ, которые бы на ESC реагировали диалогом. Встретил бы - оторопел.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500553
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль СергейМогу предложить направление.

Как я понял, вы хотите, чтобы по нажатию крестика форма закрывалась молча только в том случае, если ее св-во Dirty = false, но если Dirty = true, то предложить диалог. Но реализовать не можете, событийная модель Access против вас.
Попробуйте компромисс.
Суть в том, что как только форма переходит в режим редактирования (Dirty = true), блокируйте кнопку закрытия формы. Таким образом пользователь окажется в ситуации, когда ему нужно или сохранить запись или отказаться от изменений(нажать ESC). Как только он сделает одно из двух, кнопка закрытия окна станет снова доступной.

Как я сказал, это просто направление. Во вложении пример, сделанный на скорую руку. Просто для демонстрации идеи. В режиме tabbed интерфейса он не работает. Надеюсь, доработаете, если будет нужно.
АГРОМНЕЙШЕЕ спасибище за Вашу идею. Она оказалась очень для меня приемлемой.
Не много изменила идею вывода сообщения. Для клавиши Esc, если изменений не было - форма молча закрывается, если же юзер ее нажал, а данные не были сохранены, вывожу предварительное сообщение-запрос об очищении данных и тогда юзер уже сам выберет, что ему нужно - очищать форму или продолжать дальше работать с тем что он там на вводил. А для крестика на форме сообщение стало за ненадобностью т.к. на основе Вашего примера я блокирую кнопку пока юзер не сохранит данные - это отличная идея на мой взгляд, раз Microsoft не позволяет при закрытии осуществить для юзеров запрос на подтверждение действий, если вдруг данные не были предварительно сохранены.
Без Вашего примера через функцию WinAPI я бы честно говоря не справилась. Для меня это уже довольно сложноватая тема.
В связи с этим, мое мнение конечно, я считаю, что со своей идеологией Microsoft не совсем прав и должен был тогда хотя бы дать возможность работать с этими кнопками на самой форме в отдельном порядке как то, а не упрощенно вкл\выкл в режиме Конструктора в макете.
Заметила правда такую вещь, в Вашем примере, с чем может быть связано то, что на скриншоте:

Правда если мышкой поводить по кнокам, то все отображается нормально.

И еще хотела бы только уточнить, не догадалась что значит:
Вакшуль СергейВ режиме tabbed интерфейса он не работает
Что за режим Вы имели в виду?

А и еще попутный вопрос есть, который висит надо мной как "домоклов меч", поскольку тема касается проверок на форме. Проверку на пустые поля я делаю перед сохранением данных, а так же перед добавлением новых. Но как сделать проверку на повторяющиеся значения в поле?
У меня таких полей два. Форма заносит данные на основе запроса, который строится из 2-х таблиц. Одно поле из одной таблицы, и другое поле из второй. Если значение повторяется в первом поле, аксес выдает свое сообщение с ошибкой и возможность внести правку у юзера еще есть, а вот когда значение повторяется во втором поле, аксес после сообщения об ошибке (3022) в полях самой формы начинает затирать данные (#Ошибка) и последовательно забрасывать другими сообщениями, типа ошибка 3021 - "Текущая запись отсутствует", ну и т.д. и т.п..., пошло, поехало.
По хорошему нужна предварительная проверка на повторяющиеся значения, как это сделать, аксес же как то отлавливает?
В процедуре Form_Error при ошибке возможности прервать дальнейшие "телодвижение" например через Cancel нет:

Код: 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.
Private Sub Form_Error(DataErr As Integer, Response As Integer)

  Select Case DataErr
    Case 2169
'      Response = acDataErrContinue 'игнор стандартное сообщение Microsoft Access
'      MsgBox "В данное время сохранение объекта невозможно." & vbCrLf & vbCrLf & _
'              "В приложении обнаружена ошибка при попытке сохранения записи." & vbCrLf & _
'              "Если закрыть объект, выполненные изменения будут потеряны.", _
'              vbCritical, "Info. Ошибка № 2169"
'-------------
    Case 3314
      Response = acDataErrContinue
      intClose = 2
      MsgBox "Значение поля не может быть пустым.", vbCritical, "Info. Ошибка № 3314"
'-------------
    Case 3020
      Response = acDataErrContinue
      MsgBox "Update или CancelUpdate без AddNew или Edit.", vbCritical, "Info. Ошибка № 3020"
'-------------
    Case 3021
      Response = acDataErrContinue
      MsgBox "Текущая запись отсутствует.", vbCritical, "Info. Ошибка № 3021"
'-------------
    Case 3022
      Response = acDataErrContinue
      intClose = 2
      MsgBox "Вы ввели значение, которое уже существует в другой записи." & vbCrLf & _
              "Проверте значения в полях «Номер» и повторите попытку.", _
              vbCritical, "Info. Ошибка 3022"
  End Select
    
End Sub


...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500569
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23,
nataxa23Заметила правда такую вещь, в Вашем примере, с чем может быть связано то, что на скриншоте:
ну, перерисовка окна подглючивает. Решается через Application.Echo
Функцию SetCloseBox подправил, с этим теперь все ок. См.вложение. Но идеала, к сожалению, все равно нет - форму по-прежнему можно закрыть и через ALT+F4 и через системное меню окна формы. Наверно и тут можно решить вопрос через API. Я просто в эту сторону не смотрел. Думал, вы покапаете.

tabbed интерфейс - имел ввиду вот такой вид:
https://support.office.com/en-us/article/Guide-to-the-Access-2010-user-interface-CD8ECA71-78A1-484F-897B-FC80B1AC77EC#__toc252879451
тоже не рыл в этом направлении.

nataxa23А и еще попутный вопрос есть, который висит надо мной как "домоклов меч", поскольку тема касается проверок на форме
я видел, что вы на этот счет писали, но, если честно, мне непонятно, что у вас не получается. Если нужно сделать проверку, написать запрос или воспользоваться Dlookup, чтобы проверить, а есть ли в таблице повторяющиеся данные по определенному полю, так сделайте такой запрос. В чем проблема?
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500582
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал еще один вариант. Во вложении.
Так мне нравится больше. Спасибо Олегу Osmor-у за код API 13967471 .

Все кнопки в заголовке формы на момент редактирования убираются. Теперь пользователь не сможет закрыть форму ни крестиком, ни кликом в системном меню в крайнем левом углу, ни двойным кликом в крайнем левом углу. Сочетание клавиш CTRL+F4 также заблокировано.
Минус только один - если редактирование начато в момент, когда форма развернута на весь экран, то крестик окажется доступным пользователю.

Описание нужного поведения формы вынес в класс CaptionBarButtonsHandler
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500730
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль Сергей,
Спасибо Вам еще раз за идею с функцией WinAPI и тем, кто в свое время так же реализовывал эту тему.
Вакшуль СергейНо идеала, к сожалению, все равно нет - форму по-прежнему можно закрыть и через ALT+F4 и через системное меню окна формы
Если в параметрах аксеса текущей базы данных параметры окна документа изменить настройку "перекрывание окон" на "вкладки", то при использовании формы, раз она всплывающая как у меня проблем вроде нет:
1) поведение крестика работает как надо, даже если форму развернуть во весь экран - это хорошо.
2) если правым кликом мыши в левом углу на пиктограмке (значке) формы смотреть в контекстном меню, то форма в режиме занесения данных отображает недоступным закрытие формы - это тоже хорошо.
Вакшуль СергейСделал еще один вариант. Во вложении.
Так мне нравится больше. Спасибо Олегу Osmor-у за код API 13967471 .

Все кнопки в заголовке формы на момент редактирования убираются. Теперь пользователь не сможет закрыть форму ни крестиком, ни кликом в системном меню в крайнем левом углу, ни двойным кликом в крайнем левом углу. Сочетание клавиш CTRL+F4 также заблокировано.
Минус только один - если редактирование начато в момент, когда форма развернута на весь экран, то крестик окажется доступным пользователю.
В приципе гор.клавиша ALT+F4 - это же попытка закрыть всю оболочку аксеса, соответственно если открыта хоть одна какая-либо форма, то здесь акс уже пытается вначале закрыть форму(-ы), а затем всю оболочку. Поэтому это идея имеет свои плюсы и минусы, правда я еще пока не нашла какие.
Пока что я остановилась на Вашем конкретно примере, т.к. в моей ситуации мне нужны кнопки свернуть/развернуть на форме, т.к. в настройках акса у меня для базы используется вариант со вкладками. Ваш вариант в моей ситуации получается идеальным. Но вариант с наибольшими ограничениями я не исключаю и так же приму к сведению.
К слову о минусах, при использовании в настройках акса параметры окна текущей базы - "вкладки", то в этом случае минус уже будет не крестиком, а сдвойным щелчком по форме, если она развернута в режиме внесения данных, то при двойном клике по форме она возвращается в свой режим окна Normal.
В общем тот кто хорошо разбирается с WinAPI быстро для себя найдут оптимальный вариант.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500758
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user friendly interface грустно курит в сторонке.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500760
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23,
Насчет ALT+F4 я описался. Я хотел написать CTRL+F4, собственно именно это сочетание может закрыть форму. Его я и обработал в классе CaptionBarButtonsHandler

Вот эту фразу я не понял:nataxa23К слову о минусах, при использовании в настройках акса параметры окна текущей базы - "вкладки", то в этом случае минус уже будет не крестиком, а сдвойным щелчком по форме, если она развернута в режиме внесения данных, то при двойном клике по форме она возвращается в свой режим окна Normal.
у вас режим работы - "Вкладки", форма всплывающая. Двойной клик по форме или по заголовку формы? А в чем собственно минус?

Да, если режим работы - "Вкладки" и форма всплывающая, то тогда действительно минусов нет. Но всплывающая форма это же частный случай. Разве у вас одна форма в приложении или они все всплывающие? Если режим работы - "Вкладки" и формы не всплывающие, то надо искать решение как заблокировать "крестик". Если добьете этот вопрос, поделитесь, пожалуйста.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500770
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Predeclared, день добрый!
Predeclareduser friendly interface грустно курит в сторонке.
не, ну, ведь действительно, есть такой момент... я вот об этом сообщение Access - 20694927
Понятно, что его можно заглушить.

Но, а как по нажатию на крестик, обратить внимание пользователя, что данные были изменены, но не сохранены? Наталья хочет несколько user friendly вариантов развития событий:
- возможность закрыть форму без сохранения изменений
- возможность закрыть форму с сохранением изменений
- возможность не закрывать форму, остаться в режиме редактирования и продолжить редактирование.

Форма имеет источник данных, поля связанные.
И ни каких пугающий message-ей Access быть не должно.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500785
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей, добрый день!

Его грусть не относится конкретно ни к вопросу ТС, ни к предложенным решениям.

Он просто курит, и просто грустит.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500803
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль Сергейя видел, что вы на этот счет писали, но, если честно, мне непонятно, что у вас не получается. Если нужно сделать проверку, написать запрос или воспользоваться Dlookup, чтобы проверить, а есть ли в таблице повторяющиеся данные по определенному полю, так сделайте такой запрос. В чем проблема?
попробую подробно изложить ситуацию.
Форма моя для ввода данных на основе запроса. Сам запрос построен из 2-х таблиц - основная (содержит записи с заявками) и второстепенная (содержит записи, созданные к заявкам). Каждая из таблиц содержит индексированное поле (но это не счетчик, сразу говорю, поля счетчик в таблицах так же имеются), которое имеет установленное значение "Да (Совпадения не допускаются)" в режиме конструктора.
Форму я построила таким образом, чтобы можно было создавать несколько записей к одной заявке.
Аксес отлавливает ошибку повторяющегося значения в этих полях, но в случае, когда повторяющееся значение содержится в поле из второй таблицы после отлова аксеса данной ошибки внести исправление уже не получается возможным. Он начинает затирать данные отображая в полях "#Ошибка" и забрасывать другими сообщениями, такого типа как ошибка 3021 - "Текущая запись отсутствует".
Если бы аксес не осуществлял затирку данных в полях, я бы не парилась и пользовалась тем, что он отлавливает эту ошибку, чтобы юзер мог ее исправить. Поэтому я считаю, что для этого необходимо делать предварительную проверку на повторяющиеся значения в этих полях перед сохранением данных.
В нете наблюдала такой вариант:
Код: vbnet
1.
2.
3.
dim s
s="select count(*) from t where f = 'MyCriteria'"
if currentproject.connection.execute(s).fields(0)=0 then msgbox "Нет данных"


Если для поля из второй таблицы делать проверку как в приведенном варианте, это еще наверное прокатит и даст возможность внести правку юзеру. Но в случае для поля из первой таблицы такой вариант уже не подходит, т.к. перед сохранением данных для записи, которая добавляется он сообщает ошибку на повтор значения в поле. Как тогда аксес осуществляет эту проверку?
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500808
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23Форма моя для ввода данных на основе запроса. Сам запрос построен из 2-х таблиц -...

Чем обусловлен выбор такого решения, если не секрет?
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500819
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23,

Лучше бы, конечно, вы сделали тестовый файл. Я попробовал повторить по вашему описанию, но с вашей проблемой не столкнулся.
Дублирую данные в обоих полях, при этом Access корректно сообщает о нарушении индекса:
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500833
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
изображение отображено неправильно.
Картинка выглядела так:
https://www.dropbox.com/home/SQL.ru_images?preview=fApplDetails.jpg

сам тестовый файл во вложении
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500868
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nataxa23,
авторВ случае, когда юзер нажал "X" на форме для закрытия формы выдать запрос о сохранении изменений, если они были внесены:
1) если да - сохранить и закрыть форму.
2) если нет - вертать все в зад и закрыть форму.
3) отмена - форма в режиме ожидания. В случае, если юзер хочет продолжить работать с записью дальше.

В случае, когда юзер нажал "Esc" выдать запрос о сохранении изменений, если они были внесены:
1) если да - просто сохранить.
2) если нет - вертать все в зад.
3) отмена - форма в режиме ожидания.

Попробуйте в своем 2010-м аксе, во всяком случае, у меня в моём 2003-м аксе всё работает именно так, как вы описали :)
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500930
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimport, доброе утро :)

Да, в целом - да, работает.
SendKeys "~" гасит нежелательное окно

Правда при длительном тестировании заметил некоторые странности, например:
- Добавьте форме стандартные кнопки навигации. Откроем форму, "Иванов" меняем на "Иванов1", нажмем на вашу кнопку перехода к след.записи(Кнопка6), выскочит диалоговая форма, нажмем ESC, пока все хорошо, нажмем на стандартную кнопку навигации перехода к новой записи, выскочит диалоговая форма, нажмем ESC. В ответ на ESC диалоговая форма будет выброшена повторно.
Но это мелочь.

Вообще, я когда думал о задаче, то мысленно отделял поведение по нажатию на "крест" от поведения при:
- переходе к след.записи
- сохранении записи своими средствами
- сохранении записи при нажатии на "карандаш" в области выделения записи.

Ну, допустим пользователь жмет на "карандаш", чтобы сохранить запись. Какие тут нужны подтверждения? Это прямое указание. А у вас в примере получается, что ему в ответ на это будет предложено аж три опции, причем одна из них полностью противоположна по смыслу - сохранить, но не его изменения, а те, что были до редактирования.

Также, как побочный эффект, мы теперь получаем тот же диалог при переходе на другую запись. А нужен ли он? Это еще вопрос.
Переход на другую запись подразумевает, что изменения в текущей записи должны быть сохранены, а тут им снова навязывается диалог.

Потом еще.
Как правило на Form_BeforeUpdate делаются какие-то проверки. Допустим внесенные изменения нарушают какую-то бизнес логику. В этом случае нужно выдать соответствующее сообщение, например, "Сохранение невозможно, нарушена бизнес логика. Внесите изменения туда-то, туда-то или откажитесь от внесенных изменений(имеется ввиду путем нажатия ESC)". Это сообщение должно быть только с одной кнопкой - ОК. После нажатия на ОК тот блок кода, который вы написали для реализации изначальной задачи топика работать не должен, вернее диалоговое окно с тремя возможными опциями: ДА, НЕТ, ОТМЕНА, выводится не должно. Пользователь должен остаться в режиме редактирования.

Т.е. возникает новая задача - совместить проверки бизнес логики и предложенный вами механизм диалога. А тут тоже будут немалые сложности. Ну, а желание nataxa23 перепрограммировать стандартное поведение по ESC еще больше все запутает.


Поэтому хотелось бы отделить поведение при нажатии на "крест" от любых других сценариев.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500934
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе утро, Сергей
Ну, если в целом в 2010-м работает, то это уже хорошо.
Стандартные кнопки навигации я убрал намеренно, с ними возникали трудности. "Карандашика" в своем 2003-м не нашел. О дополнительных проверках в BeforeUpdate формы у ТС речь не шла, поэтому, естественно, в примере этого нет. Пример - это лишь идея согласно "хотелкам" ТС, ну, а расширить его функционал - это как кто пожелает, на что у кого хватит фантазии и способностей.

Спасибо, Сергей, за тестирование и замечания.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500938
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_rusimportПопробуйте в своем 2010-м аксе, во всяком случае, у меня в моём 2003-м аксе всё работает именно так, как вы описали :)
Вначале обрадовалась, очень похоже на то что я собственно в самом начале хотела добиться, но действительно нашла нюансы, которые прокомментировал Сергей.
Дополнительно к его комментарию добавлю еще, что с SendKeys есть проблемы. Я уже с этим сталкивалась задавая здесь на форуме вопрос в котором Вы участвовали с предложением использовать SendKeys, однако и здесь ситуация повторяется. Я не знаю что там в 2010-й версии акса Microsoft накрутил по сравнению с предыдущими версиями, но у меня SendKeys влияет на клавиатуру - конкретно на NumLock.
Переходы по записям в отчете
Поэтому в конечном счете я остановилась на предложенном варианте Сергея отключать крестик пока не будут сохранены данные. Добавлю так же - это мне только упрощает ситуацию, поскольку в этом случае мне не требуется проводить проверку на корректность ввода данных при нажатии на крестик, проверка будет только перед сохранением и если обнаружен косяк (простите за жаргон) юзера, крестик будет недоступен до тех пор, пока пользователь:
а) не исправит свой косяк.
б) или же не отменит свой ввод данных.
А на Esc я прописала вывод сообщения с вопросом очистить данные на форме. Это в случае предохранения от очищения данных по умолчанию, а так же вдобавок юзер будет знать разницу между Esc (отменой введеных данных) и крестиком на форме.

Код: 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.
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  Dim ctrl As control
  
On Error GoTo ErrNumber
  Select Case KeyCode
    Case vbKeyF2
      If Me.КнопкаСохранить.enabled = True Then
        КнопкаСохранить_Click
      End If
    Case vbKeyF5
      КнопкаОбновить_Click
'-----------------------------
    Case vbKeyEscape
      If Me.Dirty = False Then
        DoCmd.Close acForm, Me.Name, acSaveNo
      Else
        Select Case MsgBox("Отменить текущий ввод данных?", vbQuestion + vbOKCancel, "Info")
          Case vbOK
            intEsc = 1
            Me.Undo
          Case vbCancel
            intEsc = 2
            Me.КнопкаСохранить.SetFocus
            Set ctrl = Screen.PreviousControl
            ctrl.SetFocus
            Set ctrl = Nothing
        End Select
      End If
  End Select
End Sub




Сергей, по вопросу повторяющихся значений.
Вакшуль СергейЛучше бы, конечно, вы сделали тестовый файл. Я попробовал повторить по вашему описанию, но с вашей проблемой не столкнулся.
Дублирую данные в обоих полях, при этом Access корректно сообщает о нарушении индекса
Чуть позже отпишусь по Вашему вопросу, есть у меня подозрения почему в Вашем примере все получается, а в моей ситуации нет. Хотела сделать это вчера, но уже сил не хватило.
Проверю свою догадку прямо на Вашем примере, который Вы сделали для меня и выложу чуть позже.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500939
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimport,
guest_rusimportПример - это лишь идея согласно "хотелкам" ТС
ну это да, но я бы тоже хотел чтобы проблема вот этого сообщения 20694927 была решена, только не в частном, а общем смысле(с оглядкой на то, о чем я говорил выше), т.е. в полном объеме. Но пока не знаю как. Не знаю, как заблокировать "крест" на обычной, невсплывающей форме, если приложение работает в режиме tabbed интерфейса(режим "Вкладки").

Под "карандашом" я имел ввиду ввиду изображение, появляющееся в области выделения формы, в момент, когда dirty = true.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500940
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23,
Вакшуль СергейНо всплывающая форма это же частный случай. Разве у вас одна форма в приложении или они все всплывающие?
я так и не понял, почему вы именно для этой формы хотите организовать диалог. У вас же режим "Вкладки", и на любой другой невсплывающей форме примененный подход с API не работает.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500955
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nataxa23Вначале обрадовалась, очень похоже на то что я собственно в самом начале хотела добиться, но действительно нашла нюансы, которые прокомментировал Сергей.
Эти нюансы, которые прокоментировал Сергей, как мне думается, не имели никакого отношения к вашему конкретному ТЗ.
nataxa23 Я не знаю что там в 2010-й версии акса Microsoft накрутил по сравнению с предыдущими версиями, но у меня SendKeys влияет на клавиатуру - конкретно на NumLock.
Переходы по записям в отчете

В этом топике, о котором вы говорите, я давал вам решение - "костыль" по этой проблеме. Вы так там и не удосужились ответить, попробовали вы его или нет.
nataxa23Поэтому в конечном счете я остановилась на предложенном варианте Сергея отключать крестик пока не будут сохранены данные.
Как говорится - "хозяин - барин". Успехов.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500960
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль Сергей... но я бы тоже хотел чтобы проблема вот этого сообщения 20694927 была решена, только не в частном, а общем смысле...
Думается мне, Сергей, что программирование - это зачастую решение частных проблем, вытекающих из общих "смыслов"... И "в идеале" до ситуации , когда пользователь пришёл на работу, нажал единственную кнопку "Выполнить работу" и получил сразу всё, что только не пожелал бы, ещё очень и очень далеко, если "в общем смысле" такое, вообще, возможно :)
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500967
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_rusimportВ этом топике, о котором вы говорите, я давал вам решение - "костыль" по этой проблеме. Вы так там и не удосужились ответить, попробовали вы его или нет.
дело в том, этот "костыль", вызывает другой "костыль" и поэтому это не является решением проблемы. Я в том топике писала, что раз SendKeys влияет на клаву и не дает добиться возможности переходов по страницам, то смысла в нем нет, ну за исключением одного - прикольнуться на юзером и поржать, когда он будет тыкать по клавиатуре в NumLock и беситься.
Здесь SendKeys если и срабатывает, то лично меня например раздражает, что на клаве NumLock незаметно то включается, то выключается.
Вакшуль Сергейя так и не понял, почему вы именно для этой формы хотите организовать диалог. У вас же режим "Вкладки", и на любой другой невсплывающей форме примененный подход с API не работает.
Да режим вкладки, потому что основная форма для работы у меня как раз сделана вкладкой, с которой юзер работает постоянно - это поисковая форма, а форма для ввода данных открывается как всплывающая форма.
Мне для форм, которые расположены вкладками не требуется идея манипуляций с крестиком и гор.клав.Esc как для формы ввода данных - вы не заморачивайтесь с этим, у меня проблема только со всплывающей формой для ввода данных. Поэтому я еще говорю решение с крестиком через Ваш предложенный вариант оказался для меня самым приемлемым и идеальным.

Я вот щас другого понять не могу, найти причину того почему у меня повторяющееся значения во втором поле затираются. Пытаюсь на Вашем примере сделать так как работает моя форма, но реально не получается.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500970
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nataxa23дело в том, этот "костыль", вызывает другой "костыль" и поэтому это не является решением проблемы.

Какой именно? (Что за привычка у женщин - вечно не договаривать. Или это как в той песне - "... должна быть в женщине какая-то загадка?...")
Вы это пробовали 20631263 ? Какой ещё "костыль" у вас на это возник?
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500974
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nataxa23Здесь SendKeys если и срабатывает, то лично меня например раздражает, что на клаве NumLock незаметно то включается, то выключается.

"Мыши плакали и давились, но стойко продолжали жрать кактус."
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500983
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nataxa23Чуть позже отпишусь по Вашему вопросу, есть у меня подозрения почему в Вашем примере все получается, а в моей ситуации нет. Хотела сделать это вчера, но уже сил не хватило.
Проверю свою догадку прямо на Вашем примере, который Вы сделали для меня и выложу чуть позже.
Сергей выкладываю обратно пример с добавленным кодом как в моей форме сейчас. Ошибку мне правда не удалось воспроизвести. Непонятно с чем она связана, последнее мое подозрение было вчера это то, что в моей форме установлено блокировка изменяемой записи. Я подозревала, что может он пытается делать переход на новую запись при найденной ошибке. Я в примере для формы продублировала всё по аналогии как в моей форме. Но ошибка не возникает (хотя вчера один раз она вылезла в примере на форме). В общем не получается ее отловить. Зато в примере стала вылезать другая ошибка связанная с клавишей Esc. Скриншот тоже в архиве.
Я уже по всякому пытаюсь ее выловить, но никак. Я не скидываю свою форму только потому что она привязывается к пользовательскому доступу.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500996
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль СергейНе знаю, как заблокировать "крест" на обычной, невсплывающей форме, если приложение работает в режиме tabbed интерфейса(режим "Вкладки").

А почему бы в конструкторе формы не задать свойству CloseButton значение False? Вместо крестика сделать на форме спецкнопочку "Выход" и управлять её видимостью в зависимости от ситуации. (Или в 2010-м это нельзя для режима "Вкладки"? Мне почему-то думается, что это возможно)
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39500999
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23,

Ну да, у вас ошибки. Код не отлажен.
То, о чем вы спросили происходит, очевидно, в результате неправильной инициализации ваших флагов, а именно:
1. Жмете на ESC, запись сохранена
2. происходит событие Form_KeyDown
3. т.к. Me.Dirty = False, то отрабатывает DoCmd.Close acForm, Me.Name, acSaveNo
4. форма пытается закрыться, срабатывает Form_Unload, т.к. intClose = 2, срабатывает Cancel = True
5. Задав Cancel = True, вы прервали выполнение DoCmd.Close (см.пунк 3)
Соответственно получаете ошибку №2501
Описание: "Прервано выполнение макрокоманды Close."

Насчет кода. Углубляться не хочу. Вы автор, вам нужно отладить.

blnSave = False вы задаете в Form_BeforeUpdate. Логичней это делать в Form_AfterUpdate(тогда, когда сохранение уже железно произошло и уже не может быть отменено)

Вообще, конечно, вы там перемудрили с этими user friendly сообщениями. Ну, смотрите, что получается:
1. вношу изменения
2. перехожу на строчку выше(рассчитываю, что данные будут сохранены)
3. получаю ваше сообщение "Невозможно сохранить запись. Отмените ввод данных и повторите попытку."
4. ну, думаю, мало ли... раз просят - сделаю. Жму ОК
5. возвращаюсь к записи. Так, меня попросили отменить ввод. Как это сделать? Естественно - нажать ESC(А как еще?). Жму ESC
6. вдруг, бах, снова сообщение: "Отменить текущий ввод данных?". Ну, да, да, конечно, да(мне же нужно все отменить и повторить попытку). Жму ОК.
7. строка вернулась в исходный вид.
8. Так, что там меня просили? Повторить попытку? Повторяю.
9(см. пункт 1). вношу изменения
10(см.пункт 2). перехожу на строчку выше(рассчитываю, что данные будут сохранены)
11(см.пункт 3). получаю ваше сообщение "Невозможно сохранить запись. Отмените ввод данных и повторите попытку."
12(см.пункт 4.). ну, думаю, мало ли... раз просят - сделаю. Жму ОК
13(см.пункт 5) возвращаюсь к записи. Так, меня попросили отменить ввод. Как это сделать? Естественно - нажать ESC(А как еще?). Жму ESC
14(см.пункт 6). вдруг, бах, снова сообщение: "Отменить текущий ввод данных?". Ну, да, да, конечно, да(мне же нужно все отменить и повторить попытку). Жму ОК.
15(см.пункт 7). строка вернулась в исходный вид.
16(см.пункт 8). Так, что там меня просили? Повторить попытку? Повторяю.
И сколько мне так петлять? "Оторопел" это еще мягко сказано.

Насчет того, что у вас затирались данные. я вам отправлял другой пример. А вы изменили таблицу applDetails поменяв местами поле первичного ключа и внешний ключ. А в форме по сути изменений не сделали. В результате смысл утрачен. В вашей форме нельзя вносить новые строки. Только править существующие. Разберитесь со связями, ключами. Все должно работать.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39501001
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_rusimportА почему бы в конструкторе формы не задать свойству CloseButton значение False? Вместо крестика сделать на форме спецкнопочку "Выход" и управлять её видимостью в зависимости от ситуации. (Или в 2010-м это нельзя для режима "Вкладки"? Мне почему-то думается, что это возможно)
потому что помимо крестика юзеры разворачивают окно формы во весь экран. И получится тогда нелепая ситуация - кнопка крестика будет видна, но в режиме недоспности, а на самой форме я сделаю похожую по действиям кнопку. У всех свои запросы и эта просьба была оговорена сразу - я имею в виду возможность разворачивать окно формы во весь экран.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39501003
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimportА почему бы в конструкторе формы не задать свойству CloseButton значение False? Вместо крестика сделать на форме спецкнопочку "Выход" и управлять её видимостью в зависимости от ситуации. (Или в 2010-м это нельзя для режима "Вкладки"? Мне почему-то думается, что это возможно)
Да, можно, конечно. Так можно сделать и не только в 2010-ом.
Просто блокировка крестика пусть и на короткий промежуток времени, но это отход от неписанных стандартов. Т.е. уже нехорошо. Но если это на короткий период, то как-то можно согласиться, наверное. Хотя внутренний протест уже назревает. А вообще убрать кресты...ну, что за стиль такой? Самопал какой-то.
Крест, кстати не исчезает полностью. Он виден, просто заблокирован. "Висит груша, нельзя скушать".
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39501006
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль Сергей,
да согласна. аксес меня в конец запутал, потому то я никак и не могу добраться до истины. В итоге запуталась в конец в том то и проблема.

Вакшуль СергейНасчет того, что у вас затирались данные. я вам отправлял другой пример. А вы изменили таблицу applDetails поменяв местами поле первичного ключа и внешний ключ. А в форме по сути изменений не сделали. В результате смысл утрачен. В вашей форме нельзя вносить новые строки. Только править существующие. Разберитесь со связями, ключами. Все должно работать.
На Вашем примере я просто попыталась отобразить то как отрабатывает моя форма, но как я же говорила мне это не удалось. Тяжело воспроизвести то, что составляет лишь часть относительно всей базы данных.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39501007
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль СергейКрест, кстати не исчезает полностью. Он виден, просто заблокирован. "Висит груша, нельзя скушать".
Во-во..., вот и я о том же..
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39501011
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль СергейblnSave = False вы задаете в Form_BeforeUpdate. Логичней это делать в Form_AfterUpdate(тогда, когда сохранение уже железно произошло и уже не может быть отменено)
уточнить, честно говоря я blnSave в Form_BeforeUpdate прописывала, для того, чтобы при нажатии кнопки сохранить он не лез в сообщение, которое по сути относится к моменту, когда юзер жмет крестик на форме.
Ведь команда DoCmd.RunCommand acCmdSaveRecord автоматически идет в Form_BeforeUpdate, разве я не права?
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39501014
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nataxa23Вакшуль СергейКрест, кстати не исчезает полностью. Он виден, просто заблокирован. "Висит груша, нельзя скушать".
Во-во..., вот и я о том же..
Да, я, собственно, что, я ничего. Что, мне больше всех надо? Это вы сами определяйтесь "шашечки вам или ехать". Или, как говорится, если уж больной решил умереть, то тут медицина бессильна. :)
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39501019
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23,
nataxa23Ведь команда DoCmd.RunCommand acCmdSaveRecord автоматически идет в Form_BeforeUpdate, разве я не права?
не пойму вас.
DoCmd.RunCommand acCmdSaveRecord инициирует процесс сохранения записи. Это все равно, что если вы нажмете на ленте "Сохранить". Эта команда вызовет событие Form_BeforeUpdate. Но не факт, что запись в итоге будет сохранена. Если будет сохранена, значит потом произойдет событие Form_AfterUpdate, а если не будет сохранена, то Form_AfterUpdate не произойдет. А вы в независимости от результата уже только при попытке сохранить меняете ваш флаг blnSave = False
Поэтому я и говорил вам:
Вакшуль СергейblnSave = False вы задаете в Form_BeforeUpdate. Логичней это делать в Form_AfterUpdate(тогда, когда сохранение уже железно произошло и уже не может быть отменено)

Код: plaintext
1.
2.
Private Sub Form_BeforeUpdate(Cancel As Integer)
  
  If Dirty = True Then
А что разве Dirty может = False в этом событии? Нет.

Код: plaintext
1.
2.
Private Sub Form_Dirty(Cancel As Integer)
  
  If Me.Dirty Then
Тут тоже - разве Dirty может быть =True в этом событии? Нет. А у вас там есть какой-то код, который никогда не выполнится.

Код: plaintext
1.
2.
3.
      Set ctrl = Screen.PreviousControl
      ctrl.SetFocus
      Cancel = True
      Set ctrl = Nothing
как по мне, так это вообще ни к чему. В чем смысл этих перемещений? Вернуть пользователя туда, где он был последний раз? Зачем? Тем более, что далеко не всегда этот код вернет курсор на такое поле. Фокус у вас пляшет. То он на последнем редактируемом поле, то он на кнопке Сохранить.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39501021
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimport,

я с наскока не нашел API код, который может заблокировать крестик, если приложение работает в tabbed интерфейсе.
также не нашел код, который может заблокировать крестик у формы, развернутой на весь экран(не всплывающей), при работе в традиционном ранее оконном интерфейсе(не tabbed).
Если найдете источник, поделитесь, пожалуйста. Хотелось бы добить тему.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39501026
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль Сергей,
А я честно говоря никак не пойму, почему Вы вначале игнорируете то, что прописано в самой кнопке "Сохранить"???
Давайте на том примере который я Вам скинула. Я иду последовательно:
Жмем кнопку "Кнопка12_Click":

Код: 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.
Private Sub Кнопка12_Click()
  Dim ctrl As Control
  
On Error GoTo ErrNumber
  Set ctrl = Screen.ActiveControl
  Me.Кнопка12.SetFocus
  ctrl.SetFocus
  
  blnSave = True
  DoCmd.RunCommand acCmdSaveRecord

ExitHeare:
  Set ctrl = Nothing
Exit Sub

ErrNumber:
  Select Case Err.Number
    Case 3022 'ошибка повторного значения записи
      MsgBox "Значение в поле «Номер» уже существует в другой записи.", _
              vbCritical, "Info"

      Resume ExitHeare
'-------------
    Case Else
      MsgBox "Процедура: Кнопка12_Click. Форма: " & Me.Name & vbCrLf & _
        Err.Description, vbCritical, "№ " & Err.Number
      Resume ExitHeare
  End Select
End Sub



1) В ней я прописываю с контролом так потому что он уводит фокус в другое поле (ну вот честное слово не знаю я почему, если б не уводил, то и не прописывала бы), поэтому здесь я его предварительно пытаюсь вернуть на свое место, где пользователь его оставил перед нажатием на кнопку "Кнопка12_Click".
Идем дальше в коде процедуры:
2) Перед командой "DoCmd.RunCommand acCmdSaveRecord" я делаю " blnSave = True ", потому что команда сэйв автоматически ведет в Form_BeforeUpdate.
"blnSave = True" по своей сути там для того, чтобы не идти прямиком в сообщение, которое если брать из вашего примера, будет выдаваться юзеру тогда и для кнопки "Кнопка12_Click". А чтобы этого не было я сделала "blnSave = True" и когда он идет в Form_BeforeUpdate то там по условию blnSave = True не пойдет в сообщение. Это же сообщение нужно в Form_BeforeUpdate нужно для момента, когда юзер жмет крест на форме, а не для кнопки сохранить.
Или я не правильно строю последовательность? В пошаговом код движется именно так - в чем здесь неверна моя логика то?
Другое дело, что как Вы сказали:
Вакшуль Сергейне факт, что запись в итоге будет сохранена
Да, такое возможно например, в моей ситуации - это как раз и есть проблема с повторяющимися значениями в полях. Пустые поля (в Вашем примере я этого не делала, но в моей форме это есть) пустые поля я проверяю перед тем как сработает команда "DoCmd.RunCommand acCmdSaveRecord"). Если находит пустышки, то сообщает об этом и благополучно выходит из процедуры "Кнопка12_Click".
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39501031
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23,
nataxa23А я честно говоря никак не пойму, почему Вы вначале игнорируете то, что прописано в самой кнопке "Сохранить"???
В чем выражается игнорирование? В том, что я обратил ваше внимание, что на то, что у вас есть код, который никогда не выполнится, а вместо этого, я должен был комментировать процедуру Кнопка12_Click? Злонамеренно игнорирую судя по количеству знаков вопроса.

У вас реплика с чем связана: с тем что в процедуре Кнопка12_Click есть код по перемещению фокуса, который вы думаете я не вижу, или с тем, что то, что я до этого говорил, - ерунда и нужно присмотреться к Кнопка12_Click, где, как вы подозреваете кроется корень зла?
nataxa23Зато в примере стала вылезать другая ошибка связанная с клавишей Esc
мы же с вами это обсуждаем? как-то я потерял нить.

Насчет Кнопка12_Click. Комментарии справа по строчкам

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Sub Кнопка12_Click()
  Dim ctrl As Control
  
On Error GoTo ErrNumber
  Set ctrl = Screen.ActiveControl      'Мы сейчас в процедуре Кнопка12_Click. В чем смысл опрашивать имя активного контрола, если его имя - Кнопка12?
                                       'Процедура отрабатывает, потому что был клик по Кнопке12. Если был клик, значит фокус на Кнопке12
  Me.Кнопка12.SetFocus                 'Зачем ставить фокус на Кнопку12, если фокус и так на этой кнопке?
  ctrl.SetFocus                        'Зачем ставить фокус на Кнопку12, если фокус и так на этой кнопке?
  
  blnSave = True                       '1. Вы уверены, что значение blnSave нужно менять здесь, а не после DoCmd.RunCommand acCmdSaveRecord, причем только в том случае, если не было ошибки?
                                       '2. Направление выполнения кода в модуле ни как не зависит от флага blnSave. Он ни на что не влияет. Мусор.
  DoCmd.RunCommand acCmdSaveRecord
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39501038
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль Сергей
Код: plaintext
blnSave = True                       '1. Вы уверены, что значение blnSave нужно менять здесь, а не после DoCmd.RunCommand acCmdSaveRecord, причем только в том случае, если не было ошибки?

Я его не меняю, я изначально отсюда задаю . А в Form_BeforeUpdate я уже его как раз меняю.
Я прописала это значение blnSave с тем, что заметила, что когда срабатывает команда DoCmd.RunCommand acCmdSaveRecord он идет в Form_BeforeUpdate. А там соответственно, чтобы он понял, что была нажата кнопка сохранить, а не какое либо другое условие.
Сергей я не утверждаю, что я делаю все на 100% правильно, я пытаюсь логически сопоставлять как срабатывает код и куда и зачем он ведет. Мне никто не говорит, вот здесь не правильно или вот тут ты не правильно продумываешь, это должно быть так и так так то, тогда код поведет туда, сюда и т.д. и т.п...
Я вообще сижу одна и пытаюсь продумать все от 0 - и логику и построение кода и т.д. и т.п... - все вместе взятое. Это при том, что я не профессионал там какой нить..., который за свою жизнь сотни баз данных наклепал и имеет уже агромный опыт на подводных камнях microsoft access, а тут простите застопорился на "крестиках и ноликах".

С контролами здесь я прописала тоже по такому же принципу - отталкиваясь от возникшей ошибки, пару раз она выдавалась непомню номера ее уже, по поводу того что фокус должен быть в поле. Отсюда и логика, раз фокус почему то ушел попыталась реализовать его возврат на место. Опять же все это происходит по причине, что майкрософт аксес сыпит стандартными сообщениями по ошибкам, но не всегда понятно почему она вызвалась и с чем связана. Вчера он ругнулся, а сейчас например закоментировала эти строки вроде молчит, а завтра что снова ошибку с контролами выдаст. Думаете я не понимаю, что по логике, если жмешь кнопку мышкой да даже если и гор.клавиша, то по идее конечно же фокус должен быть на кнопке и смысл переводить куда то там отсутствует. Меня тоже удивила возникшая ошибка. К сожалению я не могу на данный момент эту ошибку предъявить Вам, хотябы даже на скриншоте, но тем не менее она была. Потому такая логика и сложилась.

Не судите строго, я не профи там какой то..., но и не дебил тоже.
Больше того, сидишь карпеешь ищешь возможность как исправить ту или иную ошибку, делаешь делаешь, вроде как исправилась ситуация, на следующее утро хренак, снова здорова - база получается как живая, ванька дома - маньки нет, манька дома - ваньки нет...
_____________
PS: я не жалуюсь, я просто устала уже, в особенности, когда застреваешь на одном месте и ходишь по кругу как пес ценой, а время проходит.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39501040
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А и еще один момент при возникновении повторяющегося значения поля он затирает потому что заходит в процедуру "Private Sub Form_Error" отрабатывает сообщение и затирает поля.
А вот на Вашем примере с учетом того моего переделанного он в эту процедуру не заходит, ошибка отлавливается на кнопке - процедура "Кнопка12_Click". Парадокс для меня.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39501240
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей,
с имитировала Вам для наглядности ошибку, которая у меня происходит с затиранием данных.
Дополнительно только сделала демонстрационную кнопку того как добавляются записи в моей форме. Это к я к тому что Вы писали:
Вакшуль СергейНасчет того, что у вас затирались данные. я вам отправлял другой пример. А вы изменили таблицу applDetails поменяв местами поле первичного ключа и внешний ключ. А в форме по сути изменений не сделали. В результате смысл утрачен. В вашей форме нельзя вносить новые строки. Только править существующие. Разберитесь со связями, ключами. Все должно работать.
Я внесла изменения для того, чтобы Вы могли увидеть мою версию построения с целью увидеть, обнаружить ошибку и место ее возникновения, дать разъяснения, если знаете как ее устранить.
Форма моя при запуске вначале создает как бы общую запись, а затем уже происходит добавление, но только для второй таблицы.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39501430
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль Сергейguest_rusimport,

я с наскока не нашел API код, который может заблокировать крестик, если приложение работает в tabbed интерфейсе.
также не нашел код, который может заблокировать крестик у формы, развернутой на весь экран(не всплывающей), при работе в традиционном ранее оконном интерфейсе(не tabbed).
Если найдете источник, поделитесь, пожалуйста. Хотелось бы добить тему.
Здравствуйте, Сергей! Поиски не увенчались успехом, хотя вопросы такие встречал, именно апишного решения не нашел. Хотя мне это кажется странным, ведь должно же оно быть. Но к сожалению сам не силен в этом вопросе. Тоже было бы интересно посмотреть решение.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39501588
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23,

в ответ на 20704108 ,
Вы меня втянули в отладку вашего кода, а на комментарии реагируете болезненно, поэтому чтобы закрыть тему отладки:
nataxa23Зато в примере стала вылезать другая ошибка связанная с клавишей Esc
я вам сделал пример, демонстрирующий, как отделить мухи от котлет. Он во вложении.

Суть в том, что у вас есть три несвязанных сюжетных линии, на каждую из которых выделен свой класс:

- CaptionBarButtonsPopUpFormHandler.
Код: plaintext
1.
2.
'Класс описывает поведение кнопок заголовка окна формы. Оптимизирован для всплывающих форм
'При переходе формы в режим редактирования возможность закрыть форму пользователю блокируется
'При выходе формы из режима редактирования возможность закрыть форму пользователю возвращается

- ExitDialog
Код: plaintext
1.
2.
'Класс описывает поведение при нажатии пользователем клавиши ESC
'Если форма не находится в состоянии редактирования, она будет закрыта
'Если форма находится в состоянии редактирования, будет предложен диалог: отменить изменения или нет

- CommandButtons
Код: plaintext
'Класс описывает логику установки св-ва Enabled кнопок "Создать", "Сохранить", "Удалить"

Вся эта управляющая логика, вынесена из модуля вашей формы. Цель - добиться стройности кода. Вы уже сейчас запутались, а если сложность начнет нарастать, то совсем застрянете. Если вам нужно будет поработать, например, с кодом, отвечающим за диалог по ESC, то вы просто зайдете в класс ExitDialog и сосредоточитесь на его содержимом.
Каждый класс - это отдельная задача. А все события формы теперь в вашем распоряжении под бизнес задачи.

Я добавил еще кнопок, хотя вы не просили. Возможно, сами добавите еще или наоборот - удалите(в этом случае просто не инициируйте соотв.св-ва класса CommandButtons).

Я долго не тестировал. Времени мало. И вообще - это скорее заготовка. Проникнитесь - доработаете под себя.
Тему с отладкой закрываю.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39501590
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimportПоиски не увенчались успехом, хотя вопросы такие встречал, именно апишного решения не нашел. Хотя мне это кажется странным, ведь должно же оно быть.
Спасибо, что потратили время. Жаль, конечно. Если получится, может поищу еще.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39501593
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23Я внесла изменения для того, чтобы Вы могли увидеть мою версию построения с целью увидеть, обнаружить ошибку и место ее возникновения
Наташа, я не могу повторить ошибку, о которой вы говорите(затирание полей).
Вы писали:
nataxa23Аксес отлавливает ошибку повторяющегося значения в этих полях, но в случае, когда повторяющееся значение содержится в поле из второй таблицы после отлова аксеса данной ошибки внести исправление уже не получается возможным.
А у меня получается внести исправление. Ничего вообще не менял, просто открыл ваш файл и попробовал:
- Открываю форму.
- Делаю текущей самую нижнюю строку в форме(applType=4, detailsType=4)
- Нажимаю на кнопку "Демонстрация кнопки Добавить запись"
- Появляется новая строка в режиме редактирования. У нее applType=4.
- Вношу details="текст". Вношу detailsType=3, тем самым нарушаю его уникальность
- перехожу на другую строку, чтобы сохранить, выскакивает сообщение: "Вы ввели значение, которое уже существует ...". Жму ОК
- изменяю detailsType на 5, и перехожу на другую строку, чтобы сохранить, выскакивает сообщение "Сохранить запись?". Жму ОК
- запись сохранена
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39501928
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль СергейНаташа, я не могу повторить ошибку, о которой вы говорите(затирание полей).
Сергей вы не можете и никогда не сможете повторить ошибку, потому что при всем уважении, простите мечетесь по сообщениям, ведя диалог на половину с тем, кто создал этот пост и на половину с тем, с кем вы сейчас пытаетесь, я так понимаю, решить уже не мою, а свою проблему с крестиком в режиме tabbed интерфейса.
Моя проблема с крестиком и клавишей Esc была решена Вами же уже давным давно, за это я даже уже отписалась Вам в ответ с благодарностью, НО Вы почему то продолжаете решать эту проблему совместно с Вашим вторым оппонентом попутно отвлекаясь на мои посты, где я уже в свою очередь задала новый вопрос касающийся ошибки. Отсюда Вы сами себя дезинформируете, потому что кусками воспринимаете информацию непосредственно от меня, а попутно сейчас дезинформируете и меня как я понимаю.
На Вашу реплику, что у меня проблема со связями и ключами..., см. ее в конце текста Вашего же поста: 20703777
Когда я добавила демонстрационную кнопку, я прокомментировала Вашу реплику и для наглядности добавила ее в Ваш пример (потому она блин так и называется в моем примере "Демонстрация кнопки Добавить запись"), но она была сделана только чтобы Вы поняли как работает моя форма, раз Вы стали высказывать свое предположение утверждая, что у меня неверно построены связи и ключи, а не пытались делать своих догадок тем более что предоставить Вам истинную работу формы у меня не предоставляется возможным, да и Вам это не зачем - никому не интересно сидеть и парится разбираться в чужом коде. Мне казалось что мой выложенный пример к Вашей реплике очевиден: 20705413 .
Но эта кнопка не имеет никакого отношения к моему вопросу об ошибке. Че Вы к ней прицепились то??? Ваш последний пост: 20706983 как раз и подтверждает это.
Изначально моя ошибка срабатывала везде, где не попадя исключительно только потому, что в самом начале я преследовала идею с выводом сообщения с тройным выбором в 2-х ситуациях:
1) если юзер жмет на крест, но запись то не сохранена (вывод MsgBox сохранить изменения? Да/Нет/Отмена).
2) если юзер жмет Esc, но запись так же не сохранена (вывод MsgBox сохранить изменения? Да/Нет/Отмена).
И хотя я не пыталась особенно изменить концепцию Microsoft, а пыталась осуществить предварительный запрос пользователю чего он хочет от нажатия в этих 2-х ситуациях, если запись предварительно не сохранил, мне этого сделать не удалось.
Когда Вы помогли мне с идеей блокировки креста на форме пока запись не будет сохранена, я отписалась об этом здесь: 20702132 , изменив идеологию вывода MsgBox при Esc и блокированием креста на форме, теперь сообщение об ошибке остается только в одном месте - это перед тем как сохранить данные, а не как было ранее. Именно поэтому в этом же самом посте я совершенно очевидно перешла к вопросу этой проблемы, т.к. ее мне решить тоже удается.

Таким образом в моем примере Вам всего лишь нужно было просто увидеть, что когда вы забили данные с повторяющимися значениями в полях формы, то при нажатии кнопки сохранить возникает эта ошибка. Вместо этого Вы зачем то переключились на демонстрационную кнопку добавления записи и пытались работать с ней: 20706983 . Отсюда мой вывод, что не я как раз таки проявляю свою невнимательность. Больше того, на примере Вашего оппонента, очень хорошо наблюдается эдакая "мужская солидарность", мол если за клавиатурой сидит баба - это по тому же принципу, что и за рулем обезьяна с гранатой. Свою обиду с текстом сарказма в мой адрес Ваш оппонент очень хорошо продемонстрировал не только здесь, я уж просто тактично промолчала об этом и не стала тратить на это свое время. Уж больно по детски это все.
Я еще раз подчеркиваю , в моем примере кнопка "Демонстрация кнопки Добавить запись" - это демонстрация того, как форма создает запись, затем после сохранения этой записи вы уже можете осуществить ДО бавление, если это потребуется. Где то здесь в самом начале звучал вопрос почему форма построена на основе общего запроса из двух таблиц. Демонстрационная кнопка тому ответ.
Так же я уже писала об этом - я таким образом как бы вначале создаю общую запись, а потом к этой записи добавляю другие (если возникнет такая необходимость), данные для первой таб.уже будут заполнены и юзер будет ДОбалять данные для второй таб. Функция кнопки "Добавить" осуществляет добавление данных для второй таблицы. Вы что никогда с таким не сталкивались? Странно?
По этой же самой причине в Вашем примере я внесла корректировки в таблицу, потому что мне нужно было через код иметь возможность делать добавление записей. Но когда Вы отписались: 20703777 , что я тупо изменила вашу таблицу и цитирую: «в результате смысл утрачен»..., у меня возникло впечатление, что Вы просто бегло пронаблюдали, что я внесла корректировки, но интересоваться почему не стали, а просто отписались не вникая в суть. Честно говоря, мне даже показалось, что я Вас обидела тем, что внесла свои корректировки в Ваш пример. Но моя база не построена на Вашем примере, она построена по тем нуждам и требованиям, которые нужны заказчику.
Столкнувшись со своей проблемой я попыталась максимально здесь в своих постах дать идеологию по форме.

Сергей, я благодарна Вам за Вашу идею с крестом на форме, а так же что потратили свое время и выложили мне еще один демонстрационный пример теперь уже с отладкой: 20706929 , буду его изучать.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39501961
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39502236
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23,
Вы описали проблему "затирания".
nataxa23в случае, когда повторяющееся значение содержится в поле из второй таблицы после отлова аксеса данной ошибки внести исправление уже не получается возможным. Он начинает затирать данные отображая в полях "#Ошибка"
т.к. в тестовом примере, который сделал я проблема не выявлялась, вы сделали тестовый стенд:
nataxa23с имитировала Вам для наглядности ошибку, которая у меня происходит с затиранием данных.
и выложили файл здесь - 20705413
я протестировал файл и доложил:
nataxa23Наташа, я не могу повторить ошибку, о которой вы говорите(затирание полей)
вы:
nataxa23Таким образом в моем примере Вам всего лишь нужно было просто увидеть, что когда вы забили данные с повторяющимися значениями в полях формы, то при нажатии кнопки сохранить возникает эта ошибка
и буквально сразу перед этим:
nataxa23вы не можете и никогда не сможете повторить ошибку
Вы правы - не смог. Повторно скачал файл еще раз 20705413 и попробовал. Добиться появления в полях текста "#Ошибка" не получилось. Генерируемые вами сообщения сыпятся, а "#Ошибка" не проявляется. Как и говорил, перед тестом ваш код не трогал, работал только в форме как пользователь.
Если бы вы описали пошаговую инструкцию(подобно тому, как я здесь - 20706983 ), это бы помогло: или я делаю что-то не так, или вы сделали неполное описание или у кого-то из нас проблемы с используемым софтом.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39502761
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей здравствуйте!
Думала Вы уже не станете заглядывать в этот пост. Поскольку вопрос с ошибкой зашел в тупик, решила вывести вчера свой вопрос в отдельную тему здесь на форуме.
Вакшуль СергейЕсли бы вы описали пошаговую инструкцию(подобно тому, как я здесь - 20706983 ), это бы помогло: или я делаю что-то не так, или вы сделали неполное описание или у кого-то из нас проблемы с используемым софтом.
Сергей, последовательность моих действий такая:
Заполняю все поля на форме.
1) поля для второй таб. (applDetails) заполняю с номером из какой-нибудь предыдущей записи
2) нажимаю кнопку сохранить
3) вижу свое отловленное сообщение - «Значение в поле «Номер» уже существует в другой записи»
4) ну а далее, если мышкой переходить по полям из второй таб. - все ок. Если же тыкнуть мышкой в любое поле из первой таблицы - вижу сообщение с ошибкой 3021 - «Текущая запись отсутствует». Это сообщение идет уже из процедуры «Form_Error».
5) в поле куда тыкали мышкой вместо введенного текста появляется «#Ошибка»

Далее кроме как на «Esc» для очистки данных жмакать не куда,
6) жму «Esc» и вижу свое сообщение-вопрос «Отменить текущий ввод данных?»
7) выбираю ок - очищаю данные во всех полях.

Ну а дальше можно закрывать форму или вводить данные по новой.

Сергей, я скидываю свой пример, еще раз, так как в предыдущем примере кнопка добавления записи всегда доступна и думаю, что именно это Вас и ввело в заблуждение в прошлый раз, хотя мне казалось, что Вы попытаетесь осуществить разные варианты манипуляций.
Здесь в примере, кнопка будет оставаться недоступной до тех пор, пока данные не будут сохранены. Так же при переходах по текущим записям поля блокируются, переход на новую запись делает поля доступными для ввода данных, т.е. так как это сделано в моей форме. На ленточной форме правда это может смотреться некорректным, но моя то форма имеет режим простой формы, а в данном примере для Вас я уже максимально приблизила то как работает моя форма и что она выполняет.

Если и сейчас при возникновении ошибки, в моем примере на основе Вашего, поля все равно не будут затираться, тогда действительно уже не знаю. Возможно дело и в софте, но только просто как не верится, ну как то не похоже на это.

По поводу ошибки, я склоняюсь к версии, что при срабатывании ошибки, аксес пытается уйти с записи, а поскольку запись еще не сохранена, то это приводит к ошибке. И получается замкнутый круг, при котором затираются поля, и кроме как сделать отмену больше ничего сделать нельзя. Но я не утверждаю.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39502903
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей, все таки ошибка эта не связана с софтом. Я так же ее наблюдаю и на Вашем примере взятом здесь: 20706929
Последовательность действий такая:
1) поля для первой таблицы заполняю без повторяющегося значения
2) поля для второй таблицы заполняю с повторяющимся
3) т.к. в Вашем примере кнопка демонстрационная и на ней пока я не проверю, жму навигационную кнопку перехода на новую запись
4) вижу сообщение акса «Не удалось внести изменения из-за повторяющихся значений...»
5) далее, если тыкать мышом в поле из первой таблицы, вижу сообщение акса: «Текущая запись отсутствует»
6) жму ок, в поле куда тыкалось мышом, появляется «#Ошибка», и тут же снова вижу сообщение акса см.п.5

Далее можно только делать отмену.

Это тот же самый момент как и в моем примере.

Теперь еще эксперимент:
1) поля для первой таблицы заполняю без повторяющегося значения
2) поля для второй таблицы заполняю с повторяющимся
3) т.к. в Вашем примере кнопка демонстрационная и на ней пока я не проверю, жму навигационную кнопку перехода на новую запись
4) вижу сообщение акса «Не удалось внести изменения из-за повторяющихся значений...»
5) исправляю в поле повторяющееся значение
6) делаю см.п.3
7) вижу новое сообщение акса: «Update или CancelUpdate без AddNew или Edit». Это ошибка - 3020.

Далее можно делать отмену, если тыкать мышом в поля из первой таблицы:
8) вижу сообщение акса: «Текущая запись отсутствует»
9) жму ок, в поле куда тыкалось мышом, появляется «#Ошибка», и тут же снова вижу сообщение акса см.п.5

Далее можно только делать отмену.

Отсюда мой вывод, что аксес при этой ошибке осуществляет или пытается осуществить уход с записи, а запись по факту не сохранена, что и вызывает затирку полей.
Либо нужно как то заранее делать проверку на повторяющиеся значения и не давать пользователю сохранять запись, пока он не исправит значение в поле. Либо должна быть какая то команда, которая не дает возможности аксу осуществлять уход с текущей записи, если срабатывает данная ошибка.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39502911
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23....Либо нужно как то заранее делать проверку на повторяющиеся значения и не давать пользователю сохранять запись, пока он не исправит значение в поле. Либо должна быть какая то команда, которая не дает возможности аксу осуществлять уход с текущей записи, если срабатывает данная ошибка.Именно об этом Вам и говорилось в сообщениях 20689773 от 31.07 и 20696551 от 2.08
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39502912
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, при определенном порядке ввода проблема "затирания" существует. При определенном, но далеко не всегда.
Жаль, описание было неполное изначально.

Тем не менее:Вакшуль СергейЕсли нужно сделать проверку, написать запрос или воспользоваться Dlookup, чтобы проверить, а есть ли в таблице повторяющиеся данные по определенному полю, так сделайте такой запрос. В чем проблема?

Добавьте на событие формы Form_BeforeUpdate вот эту проверку:
'Проверим заполнено ли applType
If IsNull(Me.applType) Then
MsgBox "Не задано значение applType." & vbCr & vbCr & "Задайте applType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
Cancel = True
Exit Sub
End If

'Проверять заполнено ли detailsType не надо - оно не обязательно к заполнению

'Проверим applType на повторения
If Not IsNull(DFirst("id", "applications", "applType=" & Me.applType)) Then
MsgBox "Значение applType = " & Me.applType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение applType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
Cancel = True
Exit Sub
End If

'Проверим detailsType на повторения
If Not IsNull(Me.applType) Then
If Not IsNull(DFirst("applID", "applDetails", "detailsType=" & Me.detailsType)) Then
MsgBox "Значение detailsType = " & Me.detailsType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение detailsType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
Cancel = True
Exit Sub
End If
End If
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39502913
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с форматированием:

Код: plaintext
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.
Private Sub Form_BeforeUpdate(Cancel As Integer)

    'Проверим заполнено ли applType
    If IsNull(Me.applType) Then
        MsgBox "Не задано значение applType." & vbCr & vbCr & "Задайте applType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
        Cancel = True
        Exit Sub
    End If
    
    'Проверять заполнено ли detailsType не надо - оно не обязательно к заполнению
  
    'Проверим applType на повторения
    If Not IsNull(DFirst("id", "applications", "applType=" & Me.applType)) Then
        MsgBox "Значение applType = " & Me.applType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение applType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
        Cancel = True
        Exit Sub
    End If
  
    'Проверим detailsType на повторения
    If Not IsNull(Me.applType) Then
        If Not IsNull(DFirst("applID", "applDetails", "detailsType=" & Me.detailsType)) Then
            MsgBox "Значение detailsType = " & Me.detailsType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение detailsType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
            Cancel = True
            Exit Sub
        End If
    End If
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39502939
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdkuИменно об этом Вам и говорилось в сообщениях 20689773 от 31.07 и 20696551 от 2.08
Да, но Ваш пример кода мне и сейчас не говорит о том, каким образом мне тогда еще надо было сделать соответствующую проверку на повторяющиеся значения. А сами комментарии по сути были больше адресованы в сторону событий срабатывания формы по крестику и т.д..., в общем смысле для меня Ваши советы оказались запутанными и в Ваших постах я просто увидела своего рода смешанный смысл.
В итоге в тот момент я мало чего поняла, что Вы хотели сказать и показать мне.

Вакшуль СергейДобавьте на событие формы Form_BeforeUpdate вот эту проверку:
Добавила код, но после сообщения из BeforeUpdate ошибка 3021 отрабатывается в процедуре кнопки сохранения в обработчике ошибок.
Запись остается на месте, но поскольку в BeforeUpdate идет проверка обоих полей, то когда добавляется в последствии запись для второй таблицы из BeforeUpdate приходит сообщение об ошибке.
Получается, что в BeforeUpdate проверять поле из первой таблицы в моем случае не получится.
Но вообще тогда получается, что проверку поля из второй таблицы точно так же можно предварительно запускать в процедуре кнопки сохранения. Получается, что если обнаружит повторяющееся значение то выйдет перед командой «DoCmd.RunCommand acCmdSaveRecord». А в случае, если ошибка на повторяющееся значение будет в поле из первой таблицы, то сработает обработчик ошибок.
Не знаю есть ли здесь какой то подвох?
Или я снова неверно мыслю?
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39502947
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наташа,
Вам нужно сделать проверку.
А ваш код в форме нужно переделать. Если это сделаю я, вы опять обидитесь.
Код я вам дал. Направление.
Все проверки вынесите в отдельную процедуру. Вызывайте эту процедуру как на BeforeUpdate, так и по клику на вашу кнопку.
Если проверка не проходит - инициализируйте Cancel = true. Тогда никаких ошибок не будет.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39502961
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль СергейНаташа,
Вам нужно сделать проверку.
А ваш код в форме нужно переделать. Если это сделаю я, вы опять обидитесь.
Код я вам дал. Направление.

Код в форме - это все понятно.

Вакшуль СергейВсе проверки вынесите в отдельную процедуру. Вызывайте эту процедуру как на BeforeUpdate, так и по клику на вашу кнопку.
Если проверка не проходит - инициализируйте Cancel = true. Тогда никаких ошибок не будет.
Да я и имела в виду именно это, подразумевая под этим:
nataxa23проверку поля из второй таблицы точно так же можно предварительно запускать в процедуре кнопки сохранения. Получается, что если обнаружит повторяющееся значение то выйдет перед командой «DoCmd.RunCommand acCmdSaveRecord»
Только не оговорила, что через отдельную процедуру. Здесь это и так понятно.

Но я так же хотела сказать, что проверку поля из первой таблицы так не сделать, потому что записи у меня добавляются путем присваивания поля со счетчиком из первой таблицы, связанному полю из второй таблицы для последующих записей. Я все время пытаюсь это сказать, вот код того как идет добавление:
Код: vbnet
1.
2.
3.
    lng_id = Me.id.Value
    DoCmd.GoToRecord , , acNewRec
    Me.id.Value = lng_id


Поэтому в моем случае проверка поля «applType» для первой таблицы, всегда будет сообщать об ошибке - значение всегда будет совпадать с данными в поле.
Разве здесь я не права?
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39502988
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23Но я так же хотела сказать, что проверку поля из первой таблицы так не сделать, потому что записи у меня добавляются путем присваивания поля со счетчиком из первой таблицы, связанному полю из второй таблицы для последующих записей. Я все время пытаюсь это сказать, вот код того как идет добавление:
Код: vbnet
1.
2.
3.
    lng_id = Me.id.Value
    DoCmd.GoToRecord , , acNewRec
    Me.id.Value = lng_id


Поэтому в моем случае проверка поля «applType» для первой таблицы, всегда будет сообщать об ошибке - значение всегда будет совпадать с данными в поле.
Разве здесь я не права?
При создании записи таким образом:
- в таблице applications запись не добавляется, а редактируется(если, конечно, пользователь внесет изменения)
- в таблице applDetails будут добавляться новые записи.
Соответственно код вот этой проверки:
Код: vbnet
1.
2.
3.
4.
5.
6.
    'Проверим applType на повторения
    If Not IsNull(DFirst("id", "applications", "applType=" & Me.applType)) Then
        MsgBox "Значение applType = " & Me.applType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение applType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
        Cancel = True
        Exit Sub
    End If



нужно переписать. Т.к. то, что я написал для редактирования существующей записи(таблицы applications) не подходит.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39502989
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и вторую проверку тоже нужно переписать :)
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39502996
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
например, так:
Код: 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.
37.
38.
39.
40.
    'Проверим заполнено ли applType
    If IsNull(Me.applType) Then
        MsgBox "Не задано значение applType." & vbCr & vbCr & "Задайте applType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
        Cancel = True
        Exit Sub
    End If
    
    'Проверять заполнено ли detailsType не надо - оно не обязательно к заполнению
  
    'Проверим applType на повторения
    If Me.NewRecord Then
        If Not IsNull(DFirst("id", "applications", "applType=" & Me.applType)) Then
            MsgBox "Значение applType = " & Me.applType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение applType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
            Cancel = True
            Exit Sub
        End If
    Else
        If Not IsNull(DFirst("id", "applications", "applType=" & Me.applType & " and id<>" & Me.id)) Then
            MsgBox "Значение applType = " & Me.applType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение applType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
            Cancel = True
            Exit Sub
        End If
    End If
  
    'Проверим detailsType на повторения
    If Not IsNull(Me.applType) Then
        If Me.NewRecord Then
            If Not IsNull(DFirst("applID", "applDetails", "detailsType=" & Me.detailsType)) Then
                MsgBox "Значение detailsType = " & Me.detailsType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение detailsType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
                Cancel = True
                Exit Sub
            End If
        Else
            If Not IsNull(DFirst("applID", "applDetails", "detailsType=" & Me.detailsType & " and applID<>" & Me.applID)) Then
                MsgBox "Значение detailsType = " & Me.detailsType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение detailsType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
                Cancel = True
                Exit Sub
            End If
        End If
    End If



кстати, хоть вам это сейчас и не интересно, я, думаю, что можно будет заблокировать крест и в tabbed интерфейсе. Будет время - попробую.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39503006
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей,
решила уточнить, протестила Ваш код, все равно проверял и выдавал ошибку, я правда с ориентировалась и поменяла местами прописанный блок условия запросов в «Проверим applType на повторения» и «Проверим detailsType на повторения». Вроде срабатывает теперь как надо и отлавливает ошибку когда надо:

Код: 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.
37.
38.
39.
40.
    'Проверим заполнено ли applType
    If IsNull(Me.applType) Then
        MsgBox "Не задано значение applType." & vbCr & vbCr & "Задайте applType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
        Cancel = True
        Exit Sub
    End If
    
    'Проверять заполнено ли detailsType не надо - оно не обязательно к заполнению
  
    'Проверим applType на повторения
    If Me.NewRecord Then
        If Not IsNull(DFirst("id", "applications", "applType=" & Me.applType & " and id <>" & Me.id)) Then '- поменяла местами блок условия, иначе все равно срабатывал отлов ошибки
            MsgBox "Значение applType = " & Me.applType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение applType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
            Cancel = True
            Exit Sub
        End If
    Else
        If Not IsNull(DFirst("id", "applications", "applType=" & Me.applType)) Then
            MsgBox "Значение applType = " & Me.applType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение applType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
            Cancel = True
            Exit Sub
        End If
    End If
  
    'Проверим detailsType на повторения
    If Not IsNull(Me.applType) Then
        If Me.NewRecord Then
            If Not IsNull(DFirst("applID", "applDetails", "detailsType=" & Me.detailsType & " and applID <>" & Me.applID)) Then '- поменяла местами блок условия, иначе все равно срабатывал отлов ошибки
                MsgBox "Значение detailsType = " & Me.detailsType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение detailsType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
                Cancel = True
                Exit Sub
            End If
        Else
            If Not IsNull(DFirst("applID", "applDetails", "detailsType=" & Me.detailsType)) Then
                MsgBox "Значение detailsType = " & Me.detailsType & " уже используется в другой записи." & vbCr & vbCr & "Задайте другое значение detailsType или нажмите ESC для отказа от изменений", vbExclamation, "Сохранение"
                Cancel = True
                Exit Sub
            End If
        End If
    End If




Вакшуль Сергейкстати, хоть вам это сейчас и не интересно, я, думаю, что можно будет заблокировать крест и в tabbed интерфейсе. Будет время - попробую.
Если честно, то очень интересно, не откажусь и от такого варианта знать как это возможно было бы реализовывать. И если что приму участие в тестировании.

Спасибо Вам еще раз за огромную помощь мне, за потраченное время в решении для меня двух больших проблем.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39503008
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и напоследок,
насчет классов - 20706929
Не знаю, будете ли применять, но если да, то выкладываю последнюю их версию. Используйте этот код.
Все-таки тогда делал впопыхах, кое-что нужно было подправить (обработку откатов событий - Cancel=true).

Там важный момент - порядок инициализации:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Sub Form_Open(Cancel As Integer)
    'Подключим и настроим поведенческие классы
    'Порядок инициализации классов должен быть именно таким: сначала exitDlg, а потом уже cbbHandler и cmdButtons
    '
    exitDlg.Initialize Me       'Класс диалога по ESC нужно инициализировать первым. Только в этом случае управление доступом к кнопке закрытия окна(Х) будет работать корректно
    cbbHandler.Initialize Me
    cmdButtons.Initialize Me
    
    Set cmdButtons.SaveButton = Me.Кнопка12
    Set cmdButtons.newButton = Me.newButton
    Set cmdButtons.deleteButton = Me.deleteButton
End Sub
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39503235
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вакшуль СергейНе знаю, будете ли применять, но если да, то выкладываю последнюю их версию. Используйте этот код.
Обязательно буду, хочу разобраться в Вашем примере, спасибо. Это очень грамотный и талантливый подход, я это сразу поняла, как только Вы его предложили. Мне это очень интересно, главное разобраться.
Сергей в тысячный раз выражаю Вам свою благодарность за помощь в решении непосильной для меня проблемы, за пример и потраченное время на все вместе взятое.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39503277
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23,

в принципе ваши таблицы --это вариант накладных
--есть головная часть(не повторяются)
--и может быть табличная часть
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39503283
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23,

сейчас же у вас ситуация, что стол можно продать только один раз (только одному клиенту)
хотя обычно требуется продажа столов любому числу клиентов,
только нельзя продать некому клиенту 2 раза стол

если добавить в ключ дату --то это приведет к запрету повтора товарной позиции в данной накладной
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39503330
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23,

пример прилагаю
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39503332
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23,
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39503637
nataxa23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПЕНСИОНЕРКА,
прошу меня извинить, что отвечаю с опозданием, разбираюсь в коде Сергея и попутно пытаюсь привести свой код в порядок.
Спасибо, что тоже заинтересовались моей темой. Я просмотрела Ваш пример, но тут есть некоторые нюансы, которые были согласованы с заказчиком. Форма для заполнения должна быть как можно проще для пользователей - не иметь ни лишних дополнительных кнопок, ни тем более дополнительных всплывающих форм для другого какого-либо ввода. Им нужно, чтобы заполнение данными было в одной простой форме. Я даже по этому не стала делать форму с подчиненной формой.
С моей стороны в этом отношении просьба была выполнена - простая форма, кнопок по минимуму (сохранить, добавить, ну и кнопки переходов по записям для просмотра).

Вы писали:
ПЕНСИОНЕРКАесли добавить в ключ дату --то это приведет к запрету повтора товарной позиции в данной накладной
Не сильно поняла Вашу мысль. То что акс отлавливает в моих 2-х полях ошибку это и есть запрет повтора, аксес таким образом и пытается сказать пользователю, что в этих полях должно быть значение уникальным. Моя же проблема была связана с тем, что после срабатывания ошибки аксес не удерживает текущую запись, чтобы юзер мог исправить.
До того момента, как Сергей помог мне с запросом я пыталась осуществлять проверку перед сохранением, и кстати говоря в общем смысле, я шла то в правильном направлении, но только код моей проверки, который я пыталась изначально использовать не совсем подходил для моего варианта работы формы. Я приводила здесь пример своего кода, который нарыла в нете: 20703030
А здесь Сергей хорошо разъяснил момент, который происходит у меня на самом деле: 20712254
и в конечном итоге помог с запросом.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39503659
хм-м-м
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nataxa23но только код моей проверки, который я пыталась изначально использовать не совсем подходил для моего варианта работы формы.
Я приводила здесь пример своего кода, который нарыла в нете:
Код: vbnet
1.
2.
3.
dim s
s="select count(*) from t where f = 'MyCriteria'"
if currentproject.connection.execute(s).fields(0)=0 then msgbox "Нет данных"


Уж подобное надо делать без запинки самостоятельно.
А не нарывать в нете.
Какое-то тяжелое впечатление производит вся эта страшно многословная тема.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39503937
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nataxa23Форма для заполнения должна быть как можно проще для пользователей - не иметь ни лишних дополнительных кнопок, ни тем более дополнительных всплывающих форм для другого какого-либо ввода
не могу припомнить какой-то тупости у исполнителей
--две минуты пояснений при установке им всегда было достаточно
--затем они обычно спрашивали, а можно ли добавить некие плюшечки типа фильтра/поиска/распечатки

конечно я делала работу с повтором немного по другому(не люблю системную ругань, обычно пишу свою)

например в вашем случае возможно применила бы форму1 с подчиненной формой2
--ввожу в свободное поле формы1 значение для первой таблицы
-----если найдено --высвечиваю запись из первой таблицы и в подчиненной форме --записи из второй(если есь)
-----если не найдено --запрос добавить запись в таб1 или отказаться
--ввожу в свободное поле формы1 значение для второй таблицы
-----если не нашла --добавляю
-----если нашла показываю предупреждение, что запись во второй таблице и даю возможность оператору исправиться(при этом он видит в подчиненной форме, а что же уже есть в таблице2 по заданному полю из таблицы1)
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39504317
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimportВакшуль Сергейguest_rusimport,

я с наскока не нашел API код, который может заблокировать крестик, если приложение работает в tabbed интерфейсе.
также не нашел код, который может заблокировать крестик у формы, развернутой на весь экран(не всплывающей), при работе в традиционном ранее оконном интерфейсе(не tabbed).
Если найдете источник, поделитесь, пожалуйста. Хотелось бы добить тему.
Здравствуйте, Сергей! Поиски не увенчались успехом, хотя вопросы такие встречал, именно апишного решения не нашел. Хотя мне это кажется странным, ведь должно же оно быть. Но к сожалению сам не силен в этом вопросе. Тоже было бы интересно посмотреть решение.

Я еще поковырял тему, но не очень успешно.
До самого креста через API я не добрался. Дело в том, что и сам крест, и ярлычки вкладок, и серая область, на которой они лежат, являют собой единое окно, с одним дескриптором. До этого окна я дохожу, двигаясь от главного окна Access вниз, используя
Код: vbnet
1.
GetWindow(hwndCurrent, GW_CHILD)

и
Код: vbnet
1.
GetWindow(hwndCurrent, GW_HWNDNEXT)


или просто сразу из формы вот так:
Код: vbnet
1.
2.
3.
4.
    'Узнаем координаты окна формы
    lRetr = apiGetWindowRect(Me.hWnd, lpRect)
    'Получим дескриптор окна нужной области
    xHandle = apiWindowFromPoint(lpRect.Left + 1, lpRect.Top - 1)


а потом блокирую:
Код: vbnet
1.
2.
    'Скроем окно
    ShowWindow xHandle, SW_HIDE



В результате получается, что блокируется не только крест, но и все ярлычки. Т.е. нельзя переключится на другую форму, пока не разблокируешь:
Код: vbnet
1.
2.
    'Покажем окно
    ShowWindow xHandle, SW_SHOWNA



Собственно это и все, чего смог добиться. Не нравится.
На картинке ниже в окне Spy++ видно блокируемое окно. Видно, что внутрь уже не войдешь :(
А Inspect.exe легко доходит до креста(тоже видно на картинке). Inspect.exe использует UI Automation:
https://msdn.microsoft.com/en-us/library/windows/desktop/ee684009(v=vs.85).aspx
Но как из VBA с ней работать - понятия не имею. Но даже если бы и смог, то нужны будут библиотеки, которые нужно за собой тащить. Короче, цель средства не оправдывает.

Хотя, возможно, это просто я не в курсе, как от этого окна(область ярлычков с крестиком) добраться до креста и взять его под контроль.
Если у кого-то есть идеи, было бы интересно послушать.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39504331
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе утро, Сергей
а так попробуйте, по идее, для найденного дескриптора окна должен заблокироваться только крестик
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
    Dim lRetr As Long, xHandle As Long, lngMenu As Long
    Dim lpRect As typRect
    'Узнаем координаты окна формы
    lRetr = apiGetWindowRect(Me.hwnd, lpRect)
    'Получим дескриптор окна нужной области
    xHandle = WindowFromPoint(lpRect.Left + 1, lpRect.Top - 1)

    lngMenu = GetSystemMenu(xHandle, 0)
    Call DeleteMenu(lngMenu, 6, MF_BYPOSITION)


где
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Declare Function apiGetWindowRect Lib "user32" Alias "GetWindowRect" (ByVal hwnd As Long, lpRect As typRect) As Long
Private Type typRect
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Integer, ByVal yPoint As Integer) As Integer
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal wRevert As Long) As Long
Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Const MF_BYPOSITION = &H400
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39504357
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе утро, guest_rusimport :)

Код: vbnet
1.
lngMenu = GetSystemMenu(xHandle, 0)


lngMenu в результате будет равно 0, т.е. ссылку на системное меню мы не получим.
У этого окна нет доступного системного меню. Но, даже если с помощью GetSystemMenu того "единого" окна мы и получили бы ссылку на его системное меню, то его крест(Close button) это не тот крест, который нам нужно заблокировать.
Я так понимаю, что крест, закрывающий вкладки, это не Close button обычного окна Windows. Это контрол.
Т.е. та область, на которую мы получили дескриптор:
Код: vbnet
1.
2.
    'Получим дескриптор окна нужной области
    xHandle = WindowFromPoint(lpRect.Left + 1, lpRect.Top - 1)


это в терминах Access - подчиненная форма, на которой лежат контролы управления:область для ярлычков, сами ярлычки и та самая заветная кнопка "крестик", управляющая видимостью ярлычков. Как до нее добраться и контролировать, я не знаю.

Как возможное направление решения главной задачи(выдать сообщение по клику на область "креста"), думаю, можно получить примерные координаты кнопки "крест", а дальше, отловить клик. Допустим клик отловили, но можно ли его отменить и как - я не знаю, нужно разбираться. Почему я говорю "примерные координаты", потому, что если вертикальные размеры мы знаем, то горизонтальные - нет.
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39504380
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вакшуль СергейДопустим клик отловили, но можно ли его отменить и как - я не знаю, нужно разбираться.
Посмотрел - да, можно. Нужно будет оформить это в код
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39504406
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С точки зрения использования 2003 акса было бы интересно посмотреть это решение -
Вакшуль Сергей... код, который может заблокировать крестик у формы, развернутой на весь экран(не всплывающей), при работе в традиционном ранее оконном интерфейсе(не tabbed)...
...
Рейтинг: 0 / 0
Отследить изменения на закрытие и отмену формы
    #39516078
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimportС точки зрения использования 2003 акса было бы интересно посмотреть это решение -
Вакшуль Сергей... код, который может заблокировать крестик у формы, развернутой на весь экран(не всплывающей), при работе в традиционном ранее оконном интерфейсе(не tabbed)...

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


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