02.05.2006, 14:31 | #1 |
Участник
|
Уважаемые гуру! Столкнулся я тут с такой плевой проблемой, что и говорить не хочется, однако так сильно туплю, что ничего путнего не могу придумать для ее разрешения.
Дело в следующем: есть таблица, есть форма - карточка (связанная с этой таблицей). Требуется проверять, чтобы при вводе новых записей пользователь заполнял некоторые обязательные поля и выдавать ошибку, если они не запаолнены... Запихал код типа IF ("Passport Serial" = '') OR ("Passport No." = '') OR ("Passport Issued By" = '') OR ("Passport Issue Date" = 0D) THEN BEGIN ERROR(...); END; в тригер OnModifyRecord этой формы. Так он при возникновении ошибки СТИРАЕТ все поля, заполненные ранее. А надо, чтобы остались, ибо по второму кругу их вводить неприкольно... Запись вводится, как я понял двумя способами - F3 (создается новая) и закрытием (стандартным крестиком) формы. Приведенный выше пример блокирует создание записи с незаполненными полями, но стирает их, хочется этого избежать. Да, и еще, если закрывать форму, он сначала выкидывает ошибку, а потом спрашивает - "Закрыть все равно"? и при утвердительном ответе закрывает, сохраняя куцую запись... Записи создаются сначала (при помощи серий), присваивается автонумерацией код (первичный ключ), остальная часть карточки - редактируется и апдейтится, если я правильно понимаю... Клиен Navision 2.6 (Incadea) |
|
02.05.2006, 15:21 | #2 |
Участник
|
Бился какое-то время назад над подобной задачей... Много косяков вылезало.
Особенно когда на форме ещё несколько табов (вкладок) и есть элементы (по нажатию на кнопку открывался OCX выбора даты), которые переключали с формы управление на себя и форма начинала верещать, думая, что кто-то там что-то не доввёл. Были ситуации, когда пользователю удавалось перескочить на сосседнюю запись и вписать чего-то туда по ошибке. Много вариантов было перепробовано, но пришел в итоге к созданию новой записи при помощи Мастера - отдельной формы, кот. вызывается например по кнопке "Создать новое что-то". Все сейчас привыкли, всё чётко работает и ошибок ноль. Во многих местах теперь используем мастеры. |
|
02.05.2006, 16:45 | #3 |
Участник
|
Поддерживаю идею мастера.
У нас они тоже сделаны. |
|
02.05.2006, 17:50 | #4 |
Участник
|
Возможное решение - триггер OnQueryCloseForm формы
В нем можно проверить заполены ли нужные поля и если нет - не давать пользователю закрыть карточку выводя информационное сообщение о том какое поле нужно заполнить. |
|
03.05.2006, 00:08 | #5 |
Administrator
|
я не программист ниразочку, но
TESTFIELD("Passport Serial") выглядит куда компактнее, чем IF ("Passport Serial" = '') THEN ERROR('???') ;) |
|
03.05.2006, 00:32 | #6 |
Участник
|
Цитата:
С пользовательской - нет. TESTFIELD даст сообщение об ошибке типа "Поле Серия Паспорта не должно быть для VEND0008" ERROR выдаст ошибку какую захочешь. Например "Введите серию и номер паспорта для Поставщика - Иванов". |
|
03.05.2006, 09:50 | #7 |
Участник
|
Да, попробовал триггер, ПОЧТИ то, что нужно, единственно что не спасает от нажатия F3...
|
|
03.05.2006, 10:27 | #8 |
Участник
|
Появилась еще мысль.
Можно вывести динамический список недостающих обязательных полей где-нибуть вверху или внизу формы. А если пользователь их не заполнил, то это уже его проблемы. Пусть заполняет еще раз все поля. Уверен, он скоро перестанет забывать заполнять поля и нажимать F3 когда нипоподя. |
|
03.05.2006, 11:41 | #9 |
Участник
|
Цитата:
Сообщение от Fordewind
Появилась еще мысль.
Можно вывести динамический список недостающих обязательных полей где-нибуть вверху или внизу формы. А если пользователь их не заполнил, то это уже его проблемы. Пусть заполняет еще раз все поля. Уверен, он скоро перестанет забывать заполнять поля и нажимать F3 когда нипоподя. Ладно, всем большое спасибо! Отдельное - Scorpie |
|
03.05.2006, 11:48 | #10 |
Участник
|
Цитата:
Сообщение от Destroyer
Цитата:
Сообщение от Fordewind
Появилась еще мысль.
Можно вывести динамический список недостающих обязательных полей где-нибуть вверху или внизу формы. А если пользователь их не заполнил, то это уже его проблемы. Пусть заполняет еще раз все поля. Уверен, он скоро перестанет забывать заполнять поля и нажимать F3 когда нипоподя. Ладно, всем большое спасибо! Отдельное - Scorpie Кстати, а они не просят вас "сделать все как в 1С" ?)) |
|
03.05.2006, 12:31 | #11 |
Участник
|
Вот и зря Достаточно сделать форму - один в один совпадающую с исходной, предназначеной для просмотра/редактирования и буит она открываться хоть по F3, а внизу кнопка "Сохранить". И, как в рекламе - "и делай с ней что хочешь" Можно энейблить кнопку "сохранить" только после указания всей информации. Можно сообщение выдывать, в котором последовательно указаны незаполненные поля... Вариантов масса.
Впрочем, вам виднее. У нас слишком замороченные формы и привязанные к ним сущности, чтобы отделаться простыми тригерами и инсертом прям из формы... |
|
03.05.2006, 17:09 | #13 |
Участник
|
А вот это интересно! Как сделать форму, открывающуюся по F3? Прописать ее в LookupFormID? Или что-то типа того?
|
|
03.05.2006, 17:55 | #14 |
Участник
|
Nope Несколько извратно, но...
В исходной форме есть тригер OnNewRecord(BelowxRec : Boolean). Там можно наколдовать чего хочется. |
|
03.05.2006, 18:35 | #15 |
Участник
|
А не пробовали, не вызывать ERROR. а использовать Message, из триггера возвращать EXIT(FALSE)
|
|
03.05.2006, 20:02 | #16 |
Участник
|
2 zub:
Не совсем понял вопрос (если это вопрос вообще - по пунктуации не понять). |
|
03.05.2006, 23:02 | #17 |
Administrator
|
странно все это.
есть уже РАБОТАЮЩАЯ система, в которой на алгоритмическом уровне заложены проверки (например, упомянутый мной выше TESTFIELD). да, сообщения об ошибках там кривоваты НА ПЕРВЫЙ ВЗГЛЯД ("Сумма должно быть отрицательно, таблица ... первичный ключ ..."), но после первого полугода работы в поддержке они мне стали гораздо более милы, нежели "тут нечего учитывать" или отсебятина, вроде "Вы внесли не все реквизиты. Пожалуйста, внесите все реквизиты". 2 zub именно ERROR, а не EXIT(FALSE), который не ловится дебагером и на то, чтобы понять, почему функция НЕ ОТРАБОТАЛА и НЕ ОТРУГАЛАСЬ или отругалась мессейджем, уходит от получаса и более. помним, что ERROR откатывает всю транзакцию, что тоже немаловажно. 2 Destroyer обязательные для заполнения поля в карточке - моветон. ибо обязательные для заполнения поля можно настроить напрямую в SQL (никаких обходных путей! пока не заполнил - сиди дальше в строке!), но Navision так не работает, поскольку ЗАПИСЬ СОХРАНЯЕТСЯ сразу после определения номера из серии номеров. ты еще название поставщика не ввел, а запись уже сохранена в таблице. проверять заполнение полей нужно не на выходе из карточки, а при попытке использовать эту карточку в документе. забыл указать Поставщик Учетную Группу - фиг тебе, а не заказ покупки! это в конечном счете только дисциплинирует пользователей. безответственных пользователей никакая информационная система со всеми запретами и проверками не вылечит. у них всегда останется простор для маневра перепутать количество и цену. простите что так длинно спасибо тому кто осилил |
|
04.05.2006, 11:26 | #18 |
Участник
|
2 e-statik
Приношу свои извенения за этот дурной синтаксис Я имебю ввиду следующее: Триггера формы OnInsertRecord и OnModifyRecord могут возвращать TRUE или FALSE, при возврате FALSE никаких действий по вставке или изменению записи не производится, поэтому можно в триггере произвести прверку и в случае "ошибки" заменить ERROR на MESSAGE с возвратом из триггера FALSE, правда незнаю на сколько это приведет к желаемому результату согласно исходным условиям. Надо попробовать. ; |
|
04.05.2006, 13:50 | #19 |
Участник
|
2 Sancho:
Хм, спасибо за интересные рассуждения! Цитата:
поля можно настроить напрямую в SQL (никаких обходных путей! пока не заполнил - сиди дальше в строке!)
Теперь попробую инсертнуть новую запись.. Мне не дают даже выйти из филда с ключевым полем. То же мощное сообщение об ошибке. Да, понимаю - "ЗАПИСЬ СОХРАНЯЕТСЯ сразу после определения номера из серии номеров. ты еще название поставщика не ввел, а запись уже сохранена в таблице" Какие есть другие варианты с ограничением в SQL? Цитата:
забыл указать Поставщик Учетную Группу - фиг тебе, а не заказ покупки!
это в конечном счете только дисциплинирует пользователей. |
|
04.05.2006, 15:23 | #20 |
Administrator
|
2 e-statik
да, если написать триггерок на запрет вставки записи без указания значения (NOT NULL не прокатывает, Nav туда сам вставляет ''), то пользователь получит устрашающее сообщение. дело не в этом дело в том, что это НЕПРАВИЛЬНО сейчас попробую объяснить. если информацию вводим, значит это кому-то нужно. если поле влияет на бизнес логику (как Учетная Группа), то проверки уже стоят. если поле не влияет на бизнес логику (как Паспорт Серия), то конечно никаких проверок нет. выводы: 1. самостоятельно вставлять проверку заполнения реквизитов, как только пытаемся воспользоваться этой карточкой. сделать это можно прямо в таблице и вызывать функцию отовсюду, где надо. 2. дать пользователю возможность ошибаться и забывать. одновременно повесить таблицу на аудит. написать репортик, скажем "нагнуть нерадивых пользователей", который будет выводить следующую информацию: всего некорректно заполненных карточек: 120 из них: манагер Иванов наплодил 20 Петров - 17 Сидоров - 12 ... и присудить премию в размере -$10 за каждую некорректно заполненную карточку. программить полчаса, а эффект потрясающий |
|