|
|
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
(Access 97) Есть несложная форма с тремя полями: Фамилия, Имя и Отчество, от которой хочу добиться следующего поведения: если введенное ФИО уже есть в базе, открывается диалог с возможными однофамильцами, по выходу из которого принимается решение - "отменить введенные изменения и перейти к другой существующей записи" или - "сохранить запись". Причем этот механизм должен действовать вне зависимости от .NewRecord. Не могу решить, как это лучше сделать: Способ 1: BeforeUpdate => openForm ...,acDialog => Cancel=... => Timer => GotoRecord Это очень коряво, имхо. Особенно с Timer'ом. Перемещаться по записям в BeforeUpdate вообще боюсь - в свое время вольности в этом событии мне много крови попили, не меньше чем в OnDelete. Способ 2: На все возможные события от FormCurrent и дальше заполнять несвязанные с данными поля на форме, заполнение которых и обрабатывать. Form_Before/AfterUpdate эмулировать перезаписью содержимого какого-нибудь поля при начале изменения любого из полей ФИО. Соответственно, обновлять запись можно в Form_AfterUpdate, что, по-моему, не так опасно. Соответственно, в этом событии уже можно и перемещаться по записям спокойно. Способ, мне кажется, лучше предыдущего, но лень обрабатывать все возможные телодвижения. Слишком много писанины даже по сравнению с предыдущим. Способ 3: , а также 4 и далее еще не придумал. М.б. что-нибудь посоветуете. ЗЫ. Почему именно такая задача? Хочется, чтобы штатный процесс ввода был максимально ускорен: текучесть будет довольно большая. Набрали ФИО, если надо появился список, просмотрели дни рождения, например; нажали Esc, если нет похожего, и вводим дальше. Минимум лишних действий со стороны пользователя. С другой стороны, это делает форму ввода также и формой, пригодной для поиска, что само по себе тоже уменьшает количество лишних действий. Вот так примерно. ЗЗЫ. Заранее спасибо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2005, 21:47:02 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
Лично я не думаю, что именно в этом случае предложенное объединение функций является оптимальным. ---- Способ 3: Форма без источника данных - это первое и, пожалуй, главное, - так геморроя меньше. Далее. Делаем формочку, в которой размещаем листбокс с источником данных, например, "Таблица "Клиенты"". На событие OnChange соответствующих полей в основной форме вешаем код открытия нашей формочки. Источник данных листбокса выглядит примерно так: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 00:25:14 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
Vsevolod VЛично я не думаю, что именно в этом случае предложенное объединение функций является оптимальным. Возможно. Но я не могу придумать способа лучше сохранить функционал обычной формы, добавив контроль и реакцию на ввод дублирующихся данных. Индекс исключается, т.к. полей ФИО и ДР недостаточно для обеспечения уникальности. Vsevolod VСпособ 3: Форма без источника данных - это первое и, пожалуй, главное, - так геморроя меньше. Далее. Делаем формочку, в которой размещаем листбокс с источником данных, например, "Таблица "Клиенты"". На событие OnChange соответствующих полей в основной форме вешаем код открытия нашей формочки. Сомневаюсь, что при заданном условии: быстрый ввод/правка информации, по возможности не требуя от пользователя никаких лишних движений, это будет проще. Кроме того, зачем задействовать OnChange полей? Либо я не понял, что ты предлагаешь, либо одно из двух. На всякий случай переповторю задачу: Человек вводит информацию в три поля, в любом порядке, причем обязательно к заполнению только одно из них. Если в базе есть аналогичные записи, надо либо сохранить введенную запись, либо нет (и тогда перейти к другой). Если таких записей нет, текущая сохраняется как обычно. При штатной работе форма должна работать как можно проще и быстрее для оператора. Если надо ввести ФИО - то вводим только ФИО, а не ловим мышью кнопки по всему экрану. Честное слово, при чем тут OnChange? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 00:44:50 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
Упрощу вопрос: Как, желательно в пределах событий Form_BeforeUpdate/Form_AfterUpdate, лучше организовать отмену внесенных изменений и переход к другой записи, не опасаясь за целостность данных в mdb97? Потому что я, честно говоря, боюсь в BeforeUpdate пользоваться GotoRecord или me.bookmark=... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 00:59:17 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
ГеоУпрощу вопрос: Как, желательно в пределах событий Form_BeforeUpdate/Form_AfterUpdate, лучше организовать отмену внесенных изменений и переход к другой записи Да вот кроме такого: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Геоне опасаясь за целостность данных в mdb97? Потому что я, честно говоря, боюсь в BeforeUpdate пользоваться GotoRecord или me.bookmark=... а ты не боись :) честно говоря я не понял - причем тут целостность данных? ГеоПеремещаться по записям в BeforeUpdate вообще боюсь - в свое время вольности в этом событии мне много крови попили, не меньше чем в OnDelete. Можешь ссылкой кинуть? А то что-то не припоминаю случаев когда это к чему-то плохому приводило. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 01:36:56 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
2ЛП По BeforeUpdate вряд ли найду, не припомню, чтобы я видел такие топики, а по Delet\'e вот пара вопросов: /topic/41449&hl=delete /topic/62795&hl=delete Не очень связаны, но по теме. Почему я боюсь в BeforeUpdate ходить по записям? Когда-то я тестировал свою форму на одной большой таблице, причем в этой форме был сделан фактически только "триггер для бедных" на Update. И с определенной переодичностью на локальной базе получал выпавший Акцесс или нераспознаваемый формат базы. Очень не хочется экспериментировать с этим на рабочей базе немаленького предприятия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 10:18:48 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
было несколько очень похожих задач. Однозначно только то что добавление надо делать в отдельной, не привязанной к данным форме (вызывается кнопкой Добавить из ленточной формы - списка). заполняешь необходимые поля и жмешь кнопку добавить рекордсетами вытягиваешь похожие записи и выдаешь предупреждения. если пользователь подтверждает то добавляешь эти данные опять же через рекордсет и обновляешь данные в ленточной форме из которой вызвана диалоговая. Есть несколько вариантов (Фио, дата рождения ; просто фио, с проверками на совпадения на имя отчество т.к. женщины выходят замуж и меняют фамилию или без ) только у меня для ADP 2002. если хочешь пришлю образцы или код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 10:42:45 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
2 АлексейК Да нет, образцы в принципе не нужны. Интересна сама идея. Что характерно: ты вот тоже говоришь, что лучше несвязанной формой пользоваться, а есть список того, что нельзя делать в событии Form_BeforeUpdate связанной формы и почему? Но это вопрос для меня пока только теоритический. Основное неудобство этого подходя для меня в лишней кнопке "добавить" - сильно она выбивает эту форму из общей картины. В остальных формах добавляются записи одним способом, а здесь будет совершенно другим. Неудобно это будет для пользователя, по-моему. Событием OnChange, как предложил Всеволод, здесь пользоваться тоже бессмысленно - хотел бы я посмотреть, как без кучи кода можно перенести в другую форму, скажем, данные, вставленные мышой из буфера обмена или вырезанные в него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 10:51:50 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
говорить о том что нельзя сделать - видимо неверно. можно, только овчинка выделки не стоит - отдельная несвязанная форма делается проще. кроме того в случае с диалоговой формой юзер сразу видит перечень обязательных для заполнения полей тогда как в ленточной может быть полей гораздо больше - там удобно сортировать, фильтровать и просматривать в компексе. выходит плюс с точки зрения интуитивности интерфейса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 11:06:15 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
Мой вариант полностью ложится на поставленную задачу (по крайней мере мне так кажется ) И так. Событие OnChange используется для "горячей" сортировки фамилий во вспомогательной форме, которая открывается ровно под соответствующим контролом и имеет его ширину. Если пользователь нашел в открывшемся в списке нужную запись, то нажимает на нее, а на форме устанавливается идентификатор того, что эта запись взята из базы. И так для каждого поля (ФИО). То есть пишем функцию, которая в зависимости от изменяемого поля открывает нашу формочку с соответствующими размерами и рекордсурсом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 11:49:53 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
Vsevolod VСобытие OnChange используется для "горячей" сортировки фамилий во вспомогательной форме, которая открывается ровно под соответствующим контролом и имеет его ширину. Если пользователь нашел в открывшемся в списке нужную запись, то нажимает на нее, а на форме устанавливается идентификатор того, что эта запись взята из базы. Это называется "поле со списком". А для чего здесь могут пригодиться поля со списком, да еще и динамически фильтруемые в зависимости от содержимого их соседей, ума не приложу. Хотя... Придумал, как все обставить! Пойду по такому способу: форма свободная, но у нее в подчинении нередактируемая ленточная или табличная для фильтрации по введенным в поля главной значениям. Это сэкономит пользователю одно нажатие кнопки, что и требовалось доказать. Правда, листания записей не будет, но оно будут в подчиненной. Попробую, что из этого вырастет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 12:02:45 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
гЭто называется "поле со списком". А для чего здесь могут пригодиться поля со списком, да еще и динамически фильтруемые в зависимости от содержимого их соседей, ума не приложу. Это называется именно так, как я сказал. Поле со списком не обладает полнофункциональным "горячим поиском". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 12:06:43 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
Тьфу млин, не хочу. Еще раз с тоской посмотрел на свою форму, и решил, что лучше все-таки попробую поиграть с "голым" вариантом ЛП. Если будут какие-нибудь неувязки, пойду дорогой № 2. Очень хочется оставить форму с обычным и привычным пользователю функционалом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 12:07:39 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
О как, отцепиться забыл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 12:08:15 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
ГеоХотя... Придумал, как все обставить! Пойду по такому способу: форма свободная, но у нее в подчинении нередактируемая ленточная или табличная для фильтрации по введенным в поля главной значениям. Это сэкономит пользователю одно нажатие кнопки, что и требовалось доказать. Правда, листания записей не будет, но оно будут в подчиненной. Попробую, что из этого вырастет. Не будет редактирования существующих. Только добавление. Если все-таки нужно редактирование, то придется на Current'е подчиненной перекидывать данные в поля основной, там отслеживать их изменения, и не забывать эти изменения внести в базу. Причем еще и непонятно - а надо ли их вносить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 12:10:24 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
Vsevolod VЭто называется именно так, как я сказал. Очень хорошо. Можно посмотреть на набросок этой реализации, для двух или даже одного поля, без позиционирования вспомогательной формы под контролом и на его ширину, только чтобы посмотреть, что, для чего и каким образом передается из одной формы в другую? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 12:14:36 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
г Vsevolod VЭто называется именно так, как я сказал. Очень хорошо. Можно посмотреть на набросок этой реализации, для двух или даже одного поля, без позиционирования вспомогательной формы под контролом и на его ширину, только чтобы посмотреть, что, для чего и каким образом передается из одной формы в другую? кк Сейчас набросаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 12:15:44 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
ЛПпридется на Current'е подчиненной перекидывать данные в поля основной, там отслеживать их изменения, и не забывать эти изменения внести в базу. Причем еще и непонятно - а надо ли их вносить. Угу, а это что-то совсем некрасиво... :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 12:17:24 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
По поводу голого варианта имени меня, страха ходить на BeforeUpdate'е и события Delete Про глюки Delete я помню, но они обусловлены тем, что само событие кривовато Наверное потому, что оно, в отличие от других, выбрасывается из самых кишок скрытой аксесовской транзакции. Про BeforeUpdate я не могу сказать, что оно такое же принципиально кривое. Были случаи, когда и я ловил доктора ватсона при отмене апдейта, но вероятность этого (имхо) не больше, чем словить ватсона при любом другом событии. Так что дерзай. Будет ватсон - будешь его лечить. Мне как-то раз пришлось Me.Undo заменять на Sendkeys "{ESC}{ESC}" --------------------------------------- А сама идея интересная... Объединить ввод, редактирование, контроль юзерского ввода на предмет дублирования, и ненавязчивый поиск в придачу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 12:21:35 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
пока полет нормальный Сейчас (если не сдернут с места) попробую на одной машинке зациклить это действие: ввод данных/обработка Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 12:28:03 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
г ЛПпридется на Current'е подчиненной перекидывать данные в поля основной, там отслеживать их изменения, и не забывать эти изменения внести в базу. Причем еще и непонятно - а надо ли их вносить. Угу, а это что-то совсем некрасиво... :( А редактирование таки нужно? Я могу понять необходимость проверки дубляжа на вводе новой записи. Но если редактируем существующую - то как-то непонятна логика. Редактируем, редактируем, редактируем, хуяк - а у нас уже есть то, что мы в итоге наредактировали... Переходим к тому, что уже есть, и вынуждены повторно вбивать дополнительную информацию (помимо ФИО, ежели такая есть). Может следующим образом сделать: Вбиваем ФИО в несвязанные поля, при этом у нас автоматически фильтруется подформа - хоть на Update'е полей, хоть на Change'е (хоть и медленнее) Если в результате фильтрации в подформе что-то есть - то юзер туда в любой момент переходит и редактирует. Если в подформе нет нихто, или есть, но не то - юзер жмет на кнопку (рядом с несвязанными полями) в подформу добавляется новая запись, туда перекидывается ФИО из несвязанных полей Т.е. это почти твоя идея Хотя... Придумал, как все обставить! Пойду по такому способу: форма свободная, но у нее в подчинении нередактируемая ленточная или табличная для фильтрации по введенным в поля главной значениям. только подформа редактируемая, а свободные поля не только для фильтрации используются, но и для добавления записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 12:38:58 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
Лох ПозорныйА редактирование таки нужно? Я могу понять необходимость проверки дубляжа на вводе новой записи. Но если редактируем существующую - то как-то непонятна логика. Редактируем, редактируем, редактируем, хуяк - а у нас уже есть то, что мы в итоге наредактировали... Переходим к тому, что уже есть, и вынуждены повторно вбивать дополнительную информацию (помимо ФИО, ежели такая есть). Особенно мне про "хуяк" понравилось - сразу представляются вытянутые лица операторов В случае с редактированием (а оно нужно, без сомнения) такая ситуация возможна. Но тут появляются несколько но: - во-первых, подобные вещи (например, исправление неправильно введенной фамилии, которая позволила создать дубликат записи) будут возникать значительно реже, чем повторный ввод уже существующего человека; - во-вторых, ключевые поля предполагается заполнять в первую очередь, до всяких адресов и кличек любимых мышей, соответственно, в ранее введенной записи, вероятно, информации будет больше (в случае, если ошибка обнаружена достаточно быстро); - в третьих, из-за своей редкости для пользователя, это событие при редактировании будет привлекать внимание пользователя, соответственно, его можно грузить дополнительной информацией, тут можно заставить его и на кнопку нажать лишний раз, в конце концов; - в четвертых, при редактировании Undo можно и не делать, пусть пользователь спокойно выберет, какая из дублирующих записей более важна, а данные какой надо, если возможно, переносить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 12:50:47 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
Вроде бы работает. В четыре руки подобавляли и поизменяли данные в базе, где на третьей машинке крутился описанный цикл. Проблем не видно. Если что, Саш, вместо следующей пьянки будем искать хвосты (потому что "вместе" для этого действия не бывает, насколько я понял:). ЗЫ. Кстати, предлагаю следующую неделю, когда жена будет на выписке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 13:13:57 |
|
||
|
Форма одновеменно и для поиска, и для редактирования
|
|||
|---|---|---|---|
|
#18+
Сорри, что долго - меня задержали ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 13:45:07 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32889219&tid=1668966]: |
0ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
53ms |
get topic data: |
5ms |
get forum data: |
1ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 191ms |
| total: | 301ms |

| 0 / 0 |
