Модераторы: mihanik
  

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Как отменить вставку новой записи в MS Access, Реализовать cancel кнопку 
:(
    Опции темы
Sardar
Дата 6.3.2007, 02:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: нет
Всего: 317



Столкнулся с совершенно дикой проблемой, то ли я так жёстко туплю, то ли Access действительно мозги сушит.

Есть форма, используется для вставки новых записей и изменения уже существующих. Форма имеет (не уберу ни за какие коврижки) кнопку cancel и крестик на окне. При клике на любом из них все изменения должны быть отброшены и ничего не должно произойти. Звучит элементарно, но как это в Access'е?

Ниже что не работает. Под не работает считаю скрытие формы и сохранение изменений в базе (бред, это не должно быть дефолтовым действием...):
  • макрос close имеет аргумент "сохранить", выставляю в "нет", игнор
  • пробовал вырубить все поля через enabled=false, всё равно обновляет запись
  • в BeforeUpdate формы пробовал аннулировать обновление, работает, но показывает не скрываемое (даже через SetWarnings false) предупреждение, мол все данные сейчас будут потеряны. Похоже Access видит это как ошибку, значит не той дорогой иду...
  • пробовал перейти на другую запись, затем вернуться (записывает изменения), затем вызвать Undo. Сработало, но при закрытии окна через крестик без ввода чего либо в поля undo список будет пуст, следовательно вызов Undo кидает ошибку
Звиняюсь за ламерство, если что, но никак не могу понять как мыслили разработчики Access'а. Нутром чую извраты и отталкиваясь от них нахожу решения, но проблема с undo после 4.5 часов бесплодных поисков, поставила в тупик smile 


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
mihanik
Дата 6.3.2007, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 9
Всего: 109



Sardar, я в базах не силён, но!!!

По опыту программирования баз знаю, что кнопку "отмены" организовать в них довольно сложно,
поскольку, если до апдейта записи ещё можно средствами системы как-то сделать отмену редактирования ОДНОЙ РЕДАКТИРУЕМОЙ В ДАННЫЙ МОМЕНТ записи, то после апдейта этого сделать стандартными средствами нельзя. Приходится изворачиваться.

Сколько действий ты собираешься выполнять на форме? Сколько записей редактировать?
Отмена, думаю, будет работать только на последнее действие.

И ещё. База находится в монопольном пользовании или многопользовательском?
Если многопользовательский режим, то отмену сделать будет ой как не просто!!!!

Опиши подробней что именно ты хочешь?
Возможно для наглядности выложишь сюда скриншот формы?



--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
RockClimber
Дата 6.3.2007, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 848
Регистрация: 5.5.2006
Где: планета 013 в тен туре

Репутация: 7
Всего: 15



Если форма напрямую связана с таблицей - то не знаю. Но могу предложить такой вариант: форма не связана с таблицей, вносишь в нее данные, потом нажимаешь кнопку - и данные вносятся в базу (макросом - обработчиком нажатия). Нажимаешь cancel или крестик - закрывается без сохранения.
Записи можно отменять только по одной, зато довольно просто.
Как вариант для нескольких записей - использовать промежуточную таблицу, по нажатию кнопки "сохранить" - данные из промежуточной копируются в основную, по нажатию cancel - наоборот, из основной в промежуточную.
Но придется писать много кода.


--------------------
Хорошо кинутый дятел далеко летит, крепко встревает, долго торчит.
PM MAIL GTalk   Вверх
Sardar
Дата 6.3.2007, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: нет
Всего: 317



Цитата(RockClimber @  6.3.2007,  19:33 Найти цитируемый пост)
Но могу предложить такой вариант: форма не связана с таблицей, вносишь в нее данные, потом нажимаешь кнопку - и данные вносятся в базу

А зачем мне тогда Access, если всю форму мне придёться отдельно от логики держать и макросами значения в базу отправлять? В привычной Java + SQLite/MySQL + JFreeReport это делаеться элементарно, но меня посадили за Access, т.к. якобы разработка должна быть быстрей... сутки в никуда потерял  smile 

Форма связана с таблицей. Людям свойственно писать разную лажу в форме, затем убегать через cancel или закрывать на крестик. Это я знаю по родителям, нельзя это убирать.

Добавлено @ 21:48 
Цитата(mihanik @  6.3.2007,  06:59 Найти цитируемый пост)
Сколько действий ты собираешься выполнять на форме? Сколько записей редактировать?

Только текущую запись. Она открываеться через список с "живым" поиском. Навигации нет, т.е. перейти на другуюу запись пользователь через окошко не может.

Цитата(mihanik @  6.3.2007,  06:59 Найти цитируемый пост)
И ещё. База находится в монопольном пользовании или многопользовательском?

В будущем в многопользовательском. Мне сказали в 2003 это просто. Вижу также база стала транзакции поддерживать, по сравнению с 2000.

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


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Akina
Дата 6.3.2007, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



Цитата(Sardar @  6.3.2007,  03:37 Найти цитируемый пост)
При клике на любом из них все изменения должны быть отброшены и ничего не должно произойти.

Код
'Idea, not a code
Sub Form_Unload
 If SaveData = False Then
  Me.Undo
 End If
End Sub


Цитата(Sardar @  6.3.2007,  22:41 Найти цитируемый пост)
В привычной Java + SQLite/MySQL + JFreeReport 

Лукавите. В такой связке данные не пишутся в базу с каждым вводимым символом.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Sardar
Дата 6.3.2007, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: нет
Всего: 317



Цитата(Akina @  6.3.2007,  21:09 Найти цитируемый пост)
'Idea, not a code

Unload событие возникает при закрытии окна, база уже обновлена. SaveData не нашёл, в референсе и в хелпе ни слова...

Опытным путём замечено, Access вставляет новую строку в базу если форма открыта на "новой" строке и пользователь ввёл минимум одну букву в любое поле. Как удалить эту запись не знаю...  И воообще мне просто претит эта мысль, вставить строку, обновить, сразу удалить  smile 

Цитата(Akina @  6.3.2007,  21:09 Найти цитируемый пост)
Лукавите. В такой связке данные не пишутся в базу с каждым вводимым символом. 

Я не говорил, что мне нужна запись с каждым вводимым символом. Мало того это дико, если Access это реально делает, то я даже не знаю как в этом гиморе работать... база в конечном варианте отделяеться от форм на куче терминалов  smile  . Я имел в виду зачем мне гимор с Access'ом, если он работает от противного, пишет в базу при любом условии, включая ошибки, тем самым убивая моё время, ибо хочу сделать "так как к этому привык юзер". А юзер привык любопытства ради жать по кнопкам, а потом жать cancel.


Совет менеджерам: не пересаживайте программистов в другое окружение, если не уверены в возможностях этого окружения и в знаниях программиста. Могу собрать любые либы в что либо логичное и правильное. В Access'е редкий случай когда прямых путей очень мало и никак не удаётся "войти в ту волну, на которой думали разработчики" smile 


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Akina
Дата 7.3.2007, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



Цитата(Sardar @  7.3.2007,  00:47 Найти цитируемый пост)
Unload событие возникает при закрытии окна, база уже обновлена. SaveData не нашёл, в референсе и в хелпе ни слова...

Идея на то и идея, чтобы дать направление куда думать. У формы СТОЛЬКО событий... осталось выбрать нужное.
Цитата(Sardar @  7.3.2007,  00:47 Найти цитируемый пост)
это дико, если Access это реально делает, то я даже не знаю как в этом гиморе работать... 

Каждый инструмент решает свои задачи.


Это сообщение отредактировал(а) mihanik - 7.3.2007, 10:00


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Sardar
Дата 7.3.2007, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: нет
Всего: 317



Цитата(Akina @  7.3.2007,  00:05 Найти цитируемый пост)
У формы СТОЛЬКО событий... осталось выбрать нужное.

Подскажи smile




--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
mihanik
Дата 7.3.2007, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 9
Всего: 109



Уважаемые Sardar и Akina.

Вынужден прикрыть эту тему по понятным вам причинам.

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





--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
Sardar
Дата 7.3.2007, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: нет
Всего: 317



mihanik, извини, только ответ поставлю и закрою smile

У формы обнаружилось событие OnDirty, которое зажигаеться при любой введённой букве в любое текстовое поле (любом изменении любого контрола). В первом посте 4 вариант работал, но кидал исключение если изменений не было, а значит через OnDirty ловим любое изменение и выставляем переменную (скрытый чекбокс). При скрытии формы проверяем этот чекбокс, если выставлен, вызываем Undo (переход на другую запись лишний), исключений уже не будет, т.к. точно знаем что изменения были. Вот и всё smile

Пока сквозь пальцы смотрим на лишние апдейты БД, при переходе на многопользовательский вариант (формы размножаться по терминалам), надеюсь ошибок не будет  smile 


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Программирование, связанное с MS Office"
mihanik staruha

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами



  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в "Книге отзывов о работе администрации"
  • А вот тут лежит FAQ нашего подраздела


Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема »


 




[ Время генерации скрипта: 0.0576 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.