AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.05.2006, 14:31   #1  
Vavilon is offline
Vavilon
Участник
 
17 / 10 (1) +
Регистрация: 03.03.2006
Уважаемые гуру! Столкнулся я тут с такой плевой проблемой, что и говорить не хочется, однако так сильно туплю, что ничего путнего не могу придумать для ее разрешения.
Дело в следующем: есть таблица, есть форма - карточка (связанная с этой таблицей). Требуется проверять, чтобы при вводе новых записей пользователь заполнял некоторые обязательные поля и выдавать ошибку, если они не запаолнены... Запихал код типа
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  
e-statik is offline
e-statik
Участник
 
102 / 10 (1) +
Регистрация: 06.07.2005
Бился какое-то время назад над подобной задачей... Много косяков вылезало.
Особенно когда на форме ещё несколько табов (вкладок) и есть элементы (по нажатию на кнопку открывался OCX выбора даты), которые переключали с формы управление на себя и форма начинала верещать, думая, что кто-то там что-то не доввёл. Были ситуации, когда пользователю удавалось перескочить на сосседнюю запись и вписать чего-то туда по ошибке.

Много вариантов было перепробовано, но пришел в итоге к созданию новой записи при помощи Мастера - отдельной формы, кот. вызывается например по кнопке "Создать новое что-то".
Все сейчас привыкли, всё чётко работает и ошибок ноль. Во многих местах теперь используем мастеры.
Старый 02.05.2006, 16:45   #3  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Поддерживаю идею мастера.
У нас они тоже сделаны.
Старый 02.05.2006, 17:50   #4  
Scorpie is offline
Scorpie
Участник
 
239 / 10 (1) +
Регистрация: 25.10.2004
Адрес: Moskow
Возможное решение - триггер OnQueryCloseForm формы
В нем можно проверить заполены ли нужные поля и если нет - не давать пользователю закрыть карточку выводя информационное сообщение о том какое поле нужно заполнить.
Старый 03.05.2006, 00:08   #5  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
я не программист ниразочку, но
TESTFIELD("Passport Serial")
выглядит куда компактнее, чем
IF ("Passport Serial" = '') THEN ERROR('???')

;)
Старый 03.05.2006, 00:32   #6  
Scorpie is offline
Scorpie
Участник
 
239 / 10 (1) +
Регистрация: 25.10.2004
Адрес: Moskow
Цитата:
Сообщение от Sancho Посмотреть сообщение
я не программист ниразочку, но
TESTFIELD("Passport Serial")
выглядит куда компактнее, чем
IF ("Passport Serial" = '') THEN ERROR('???')

C программистской точки зрения да - выглядит компактнее.
С пользовательской - нет.
TESTFIELD даст сообщение об ошибке типа "Поле Серия Паспорта не должно быть для VEND0008"
ERROR выдаст ошибку какую захочешь. Например "Введите серию и номер паспорта для Поставщика - Иванов".
Старый 03.05.2006, 09:50   #7  
Vavilon is offline
Vavilon
Участник
 
17 / 10 (1) +
Регистрация: 03.03.2006
Цитата:
Сообщение от Scorpie Посмотреть сообщение
Возможное решение - триггер OnQueryCloseForm формы
В нем можно проверить заполены ли нужные поля и если нет - не давать пользователю закрыть карточку выводя информационное сообщение о том какое поле нужно заполнить.
Да, попробовал триггер, ПОЧТИ то, что нужно, единственно что не спасает от нажатия F3...
Старый 03.05.2006, 10:27   #8  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Появилась еще мысль.
Можно вывести динамический список недостающих обязательных полей где-нибуть вверху или внизу формы. А если пользователь их не заполнил, то это уже его проблемы. Пусть заполняет еще раз все поля. Уверен, он скоро перестанет забывать заполнять поля и нажимать F3 когда нипоподя.
Старый 03.05.2006, 11:41   #9  
Vavilon is offline
Vavilon
Участник
 
17 / 10 (1) +
Регистрация: 03.03.2006
Цитата:
Сообщение от Fordewind Посмотреть сообщение
Появилась еще мысль.
Можно вывести динамический список недостающих обязательных полей где-нибуть вверху или внизу формы. А если пользователь их не заполнил, то это уже его проблемы. Пусть заполняет еще раз все поля. Уверен, он скоро перестанет забывать заполнять поля и нажимать F3 когда нипоподя.
Обязательные к заполнению поля и так выделены цветом. Может, конечно, когда-нибудь и привыкнут, но пока кричат и топают ногами, что приходится все перебивать при забытии одного. А их там 6. И в каждом до фига информации вводится (на самом деле не очень - паспортные данные). Но, им, типа, неприятно. При этом новую форму не хотят (через мастера добавления)...
Ладно, всем большое спасибо! Отдельное - Scorpie
Старый 03.05.2006, 11:48   #10  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Цитата:
Сообщение от Destroyer Посмотреть сообщение
Цитата:
Сообщение от Fordewind Посмотреть сообщение
Появилась еще мысль.
Можно вывести динамический список недостающих обязательных полей где-нибуть вверху или внизу формы. А если пользователь их не заполнил, то это уже его проблемы. Пусть заполняет еще раз все поля. Уверен, он скоро перестанет забывать заполнять поля и нажимать F3 когда нипоподя.
Обязательные к заполнению поля и так выделены цветом. Может, конечно, когда-нибудь и привыкнут, но пока кричат и топают ногами, что приходится все перебивать при забытии одного. А их там 6. И в каждом до фига информации вводится (на самом деле не очень - паспортные данные). Но, им, типа, неприятно. При этом новую форму не хотят (через мастера добавления)...
Ладно, всем большое спасибо! Отдельное - Scorpie
Выеленные поля могут находиться на разных вкладках, тогда и правда можно потерять. А когда вверху экрана горит красная надпись "Есть незаполненные поля!" это уже наводит на определенные мысли

Кстати, а они не просят вас "сделать все как в 1С" ?))
Старый 03.05.2006, 12:31   #11  
e-statik is offline
e-statik
Участник
 
102 / 10 (1) +
Регистрация: 06.07.2005
Цитата:
Сообщение от Destroyer Посмотреть сообщение
При этом новую форму не хотят (через мастера добавления)...
Вот и зря Достаточно сделать форму - один в один совпадающую с исходной, предназначеной для просмотра/редактирования и буит она открываться хоть по F3, а внизу кнопка "Сохранить". И, как в рекламе - "и делай с ней что хочешь" Можно энейблить кнопку "сохранить" только после указания всей информации. Можно сообщение выдывать, в котором последовательно указаны незаполненные поля... Вариантов масса.

Впрочем, вам виднее. У нас слишком замороченные формы и привязанные к ним сущности, чтобы отделаться простыми тригерами и инсертом прям из формы...
Старый 03.05.2006, 17:09   #13  
Vavilon is offline
Vavilon
Участник
 
17 / 10 (1) +
Регистрация: 03.03.2006
Цитата:
Сообщение от e-statik Посмотреть сообщение
Достаточно сделать форму - один в один совпадающую с исходной, предназначеной для просмотра/редактирования и буит она открываться хоть по F3, а внизу кнопка "Сохранить". И, как в рекламе - "и делай с ней что хочешь"
А вот это интересно! Как сделать форму, открывающуюся по F3? Прописать ее в LookupFormID? Или что-то типа того?
Старый 03.05.2006, 17:55   #14  
e-statik is offline
e-statik
Участник
 
102 / 10 (1) +
Регистрация: 06.07.2005
Nope Несколько извратно, но...
В исходной форме есть тригер OnNewRecord(BelowxRec : Boolean). Там можно наколдовать чего хочется.
Старый 03.05.2006, 18:35   #15  
zub is offline
zub
Участник
 
40 / 10 (1) +
Регистрация: 23.08.2005
А не пробовали, не вызывать ERROR. а использовать Message, из триггера возвращать EXIT(FALSE)
Старый 03.05.2006, 20:02   #16  
e-statik is offline
e-statik
Участник
 
102 / 10 (1) +
Регистрация: 06.07.2005
2 zub:
Не совсем понял вопрос (если это вопрос вообще - по пунктуации не понять).
Старый 03.05.2006, 23:02   #17  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
странно все это.
есть уже РАБОТАЮЩАЯ система, в которой на алгоритмическом уровне заложены проверки (например, упомянутый мной выше TESTFIELD). да, сообщения об ошибках там кривоваты НА ПЕРВЫЙ ВЗГЛЯД ("Сумма должно быть отрицательно, таблица ... первичный ключ ..."), но после первого полугода работы в поддержке они мне стали гораздо более милы, нежели "тут нечего учитывать" или отсебятина, вроде "Вы внесли не все реквизиты. Пожалуйста, внесите все реквизиты".

2 zub
именно ERROR, а не EXIT(FALSE), который не ловится дебагером и на то, чтобы понять, почему функция НЕ ОТРАБОТАЛА и НЕ ОТРУГАЛАСЬ или отругалась мессейджем, уходит от получаса и более.
помним, что ERROR откатывает всю транзакцию, что тоже немаловажно.

2 Destroyer
обязательные для заполнения поля в карточке - моветон. ибо обязательные для заполнения поля можно настроить напрямую в SQL (никаких обходных путей! пока не заполнил - сиди дальше в строке!), но Navision так не работает, поскольку ЗАПИСЬ СОХРАНЯЕТСЯ сразу после определения номера из серии номеров. ты еще название поставщика не ввел, а запись уже сохранена в таблице. проверять заполнение полей нужно не на выходе из карточки, а при попытке использовать эту карточку в документе.
забыл указать Поставщик Учетную Группу - фиг тебе, а не заказ покупки!
это в конечном счете только дисциплинирует пользователей.

безответственных пользователей никакая информационная система со всеми запретами и проверками не вылечит. у них всегда останется простор для маневра перепутать количество и цену.

простите что так длинно
спасибо тому кто осилил
Старый 04.05.2006, 11:26   #18  
zub is offline
zub
Участник
 
40 / 10 (1) +
Регистрация: 23.08.2005
2 e-statik
Приношу свои извенения за этот дурной синтаксис
Я имебю ввиду следующее:
Триггера формы OnInsertRecord и OnModifyRecord могут возвращать TRUE или FALSE, при возврате FALSE никаких действий по вставке или изменению записи не производится, поэтому можно в триггере произвести прверку и в случае "ошибки" заменить ERROR на MESSAGE с возвратом из триггера FALSE, правда незнаю на сколько это приведет к желаемому результату согласно исходным условиям. Надо попробовать.
;
Старый 04.05.2006, 13:50   #19  
e-statik is offline
e-statik
Участник
 
102 / 10 (1) +
Регистрация: 06.07.2005
2 Sancho:
Хм, спасибо за интересные рассуждения!

Цитата:
поля можно настроить напрямую в SQL (никаких обходных путей! пока не заполнил - сиди дальше в строке!)
А каким образом? Я вот сделал тут на поля Check Constraints - Text1 <> '' и Date1 <> '01.01.1753 0:00:00'. Теперь открываю форму и пытаюсь стереть дату: получаю огромный мессадж на нечеловческом (для юзера) языке с развернутым текстом ошибки SQL Юзер уже должен поседеть от этого. После закрытия сообщения, вижу, что перескочил уже в карточку другой записи.
Теперь попробую инсертнуть новую запись.. Мне не дают даже выйти из филда с ключевым полем. То же мощное сообщение об ошибке. Да, понимаю - "ЗАПИСЬ СОХРАНЯЕТСЯ сразу после определения номера из серии номеров. ты еще название поставщика не ввел, а запись уже сохранена в таблице"
Какие есть другие варианты с ограничением в SQL?


Цитата:
забыл указать Поставщик Учетную Группу - фиг тебе, а не заказ покупки!
это в конечном счете только дисциплинирует пользователей.
Полностью согласен, что пользователей нужно дисциплинировать! Но если б это было так просто. Вот у вас не удаётся использовать в заказе покупки, где, видимо, навешены соответствующие проверки. А что делать, когда косяки вылезают потом в отчетах и видны не сразу? И когда приходится рыть и копать, кто когда и что понавводил.
Старый 04.05.2006, 15:23   #20  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
2 e-statik
да, если написать триггерок на запрет вставки записи без указания значения (NOT NULL не прокатывает, Nav туда сам вставляет ''), то пользователь получит устрашающее сообщение.
дело не в этом
дело в том, что это НЕПРАВИЛЬНО
сейчас попробую объяснить.
если информацию вводим, значит это кому-то нужно.
если поле влияет на бизнес логику (как Учетная Группа), то проверки уже стоят.
если поле не влияет на бизнес логику (как Паспорт Серия), то конечно никаких проверок нет.
выводы:
1. самостоятельно вставлять проверку заполнения реквизитов, как только пытаемся воспользоваться этой карточкой. сделать это можно прямо в таблице и вызывать функцию отовсюду, где надо.
2. дать пользователю возможность ошибаться и забывать. одновременно повесить таблицу на аудит.
написать репортик, скажем "нагнуть нерадивых пользователей", который будет выводить следующую информацию:
всего некорректно заполненных карточек: 120
из них:
манагер Иванов наплодил 20
Петров - 17
Сидоров - 12
...
и присудить премию в размере -$10 за каждую некорректно заполненную карточку.

программить полчаса, а эффект потрясающий
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 03:25.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.