Программы "Простой софт" www.prostoysoft.ru

ВНИМАНИЕ! РЕКЛАМНЫЕ СООБЩЕНИЯ И ГИПЕРССЫЛКИ В ФОРУМЕ ЗАПРЕЩЕНЫ (посты удаляются автоматически часто с пользователем)
Текущее время: 27.06.2019 12:22

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
СообщениеДобавлено: 28.12.2018 00:51 
Не в сети

Зарегистрирован: 16.07.2016 13:41
Сообщения: 103
Добрый вечер, очень нужна помощь со следующей задачей: (MSsql server 2014, учет клиентов, версия актуальная)

Есть поле в таблице: текстовое с выбором значений из списка. (список задан в самом поле)

1 Звонок
2 Заказ принят
3 Уведомление
4 Заказ готов
5 Заказ доставлен

Оператор менят статус заказа по ходу его выполнения. Как сделать так чтобы он не мог выбрать значение которое идет до того которе уже было вабранно в поле. То есть его можно оставить, добавив комментарий в другое поле или изменить статус на след уровень, но ни как нельзя выбрать значение которе было раньше.

Пытался сделать через условие для поля по умолчанию, не вышло.
Потом создавал поле в которе записывал статусы каждый раз после обновления поля, и пытался опять повесть на условие по полю, ну функция LIKE не отрабатывает.

Пока идей светлых больше в голову не приходило, буду благодарен за любой совет. Спасибо.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 28.12.2018 12:54 
Не в сети

Зарегистрирован: 25.04.2012 10:09
Сообщения: 2137
Откуда: Жуковский, Московская область
Добрый день. Используйте проверку, анализируя предыдущее значение поля в условии на значение:
Код:
Len({Status}) > 0 AND {Status} NOT LIKE <Status> AND (CInt(Mid(<Status>, 1, 1)) < CInt(Mid({Status}, 1, 1)))


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


Вложения:
Status.gif
Status.gif [ 1.12 МБ | Просмотров: 2079 ]
2018-12-28_115306.jpg
2018-12-28_115306.jpg [ 93.85 КБ | Просмотров: 2079 ]

_________________
90% ответов на ваши вопросы находятся в руководстве, разделах "Вопросы" и "Видео" на нашем сайте.
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 28.12.2018 14:14 
Не в сети

Зарегистрирован: 16.07.2016 13:41
Сообщения: 103
OMEN писал(а):
Добрый день. Используйте проверку, анализируя предыдущее значение поля в условии на значение:
Код:
Len({Status}) > 0 AND {Status} NOT LIKE <Status> AND (CInt(Mid(<Status>, 1, 1)) < CInt(Mid({Status}, 1, 1)))


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


Такой варинат не подойдет. Так как при изменении записи на каждое действие срабатывает ряд триггеров.
и почему то у меня в форме он не отрабатывает.

Нужен именно запрет с сообщением, что пользователь понял что он не так делает.
А то тыкать будут доупора. И так и не поймут, что не так.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 28.12.2018 14:17 
Не в сети

Зарегистрирован: 25.04.2012 10:09
Сообщения: 2137
Откуда: Жуковский, Московская область
Сообщение неверно отрабатывает по условию, к тому же лишь один раз. Помогает только перезапуск программы.
Обращайтесь в поддержку по поводу этой проблемы.

_________________
90% ответов на ваши вопросы находятся в руководстве, разделах "Вопросы" и "Видео" на нашем сайте.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 28.12.2018 15:34 
Не в сети

Зарегистрирован: 06.10.2014 18:30
Сообщения: 253
Откуда: Орел
Есть более сложное решение, однако требующее бОльших усилий при программировании.

1. Ваш список заносим во вновь созданную таблицу (например "tblStatus") с полями "Status" и "StatusLevel".
2. Создаем функцию, возвращающую "Уровень статуса" текущей записи (например "GetStatusLevel").
Ей передаем ID записи которую редактируем. Она по нему определяет текст статуса и по тексту из "tblStatus" возвращает его уровень.
3. Создаем функцию, возвращающую табличное значение (например "GetStatusTbl"). Ей передаем уровень статуса (полученный GetStatusLevel). Она возвращает табличное значение с полями "Status" и записями у которых уровень статуса равен или выше уровня из переданного ей параметра.
4. В нашей таблице в свойствах поля "Список значений" – "Привязать к таблице" – "Формула" указываем SELECT Status FROM dbo.GetStatusTbl(dbo.GetStatusLevel(<ID>).

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

Первая часть работы сделана!

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

5. Создаем функцию возвращающую статус текущей записи (например "GetStatusCurrent").
Ей передаем ID записи которую редактируем. Она по нему определяет текст статуса.
6. В условии на значение в поле "ЕСЛИ" - "Соблюдается условие" указываем <Значение> = dbo.GetStatusCurrent(<ID>)
7. В поле "ТО" указываем напоминание без запрета или процедуру на VBS которая рисует окошко с требованием ввести комментарий. Введенный комментарий заносим в базу

Тут может быть проблема.
В той версии что у меня (она старая) условие на значение работает не корректно.
Условие проверяется не только ПОСЛЕ изменения поля, а и ПРИ ВХОДЕ в редактирование ПОЛЯ.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 28.12.2018 15:40 
Не в сети

Зарегистрирован: 06.10.2014 18:30
Сообщения: 253
Откуда: Орел
OMEN писал(а):
Сообщение неверно отрабатывает по условию, к тому же лишь один раз. Помогает только перезапуск программы.
Обращайтесь в поддержку по поводу этой проблемы.

Я за два года трижды писал туда об этом. И подробно расписывал и видео снимал.
А воз и ныне по ходу там....

Может Вам повезет.
Вода камень точит...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 28.12.2018 18:19 
Не в сети

Зарегистрирован: 25.04.2012 10:09
Сообщения: 2137
Откуда: Жуковский, Московская область
Uspenskiy писал(а):
Есть более сложное решение, однако требующее бОльших усилий при программировании.
Это жесть писать столько функций и создавать служебные таблицы для решения таких элементарных задач. Должно просто тупо нормально отрабатывать проверка условия и показ сообщения.
Uspenskiy писал(а):
В той версии что у меня (она старая) условие на значение работает не корректно.
Условие проверяется не только ПОСЛЕ изменения поля, а и ПРИ ВХОДЕ в редактирование ПОЛЯ.
И в новой версии также, причем перестает работать такая проверка после второго показа сообщения...

_________________
90% ответов на ваши вопросы находятся в руководстве, разделах "Вопросы" и "Видео" на нашем сайте.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29.12.2018 00:30 
Не в сети

Зарегистрирован: 06.10.2014 18:30
Сообщения: 253
Откуда: Орел
OMEN писал(а):
Uspenskiy писал(а):
Есть более сложное решение, однако требующее бОльших усилий при программировании.
Это жесть писать столько функций и создавать служебные таблицы для решения таких элементарных задач. Должно просто тупо нормально отрабатывать проверка условия и показ сообщения.

Да. Так.
Но в предложенном варианте пользователь НЕ МОЖЕТ ввести то чего нельзя. Это сильно лучше чем ему разрешать и потом ругаться.

Их хоть и много но они простые из одного двух операторов всего.

Посмотрев Ваш вариант понял что мой п.5 лишний. Я не знал/забыл что <Field> возвращает введенное значение а {Field} значение поля из базы.
OMEN писал(а):
Uspenskiy писал(а):
В той версии что у меня (она старая) условие на значение работает не корректно.
Условие проверяется не только ПОСЛЕ изменения поля, а и ПРИ ВХОДЕ в редактирование ПОЛЯ.
И в новой версии также, причем перестает работать такая проверка после второго показа сообщения...

Странно это всё.
Важная и уверен нужная многим функция. И неработоспособность её легко выявляется.
В условие введи 1=1. Входи в поле, жми также ОК и Отмену. И смотри когда сообщения возникают.

Может разработчики почитают и задумаются...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29.12.2018 01:13 
Не в сети

Зарегистрирован: 16.07.2016 13:41
Сообщения: 103
Жалко, что ошибки часто возникают в программе, но надеюсь будут исправляться.

Вообщем решил вопрос просто.

Создал таблицу ЭтапыЗаказа , там два поля Этап и КодЭтапа

В таблице в рабочей два поля ЭтапЗаказа и Код Этапа.

Сделал Выборку из таблицы ЭтапыЗаказов с условием, что ЭтапыЗаказа.КодЭтапа >= <РабочаяТаблица.КодЭтапа>

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


В этом случае в списке не выпадают значения, которые уже выбирались раннее, можно оставить текущие или перейти на новое.
+ можно принудительно сменить код этапа основной таблицы и откроются предыдущие записи (ну вдруг когда все таки нужно откатиться на пару этапов)

Всплывающего окна конечно нет, но думаю пользователь сможет понять логику.

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


Вложения:
К2.jpg
К2.jpg [ 44.21 КБ | Просмотров: 2056 ]
К1.jpg
К1.jpg [ 44.73 КБ | Просмотров: 2056 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29.12.2018 05:05 
Не в сети

Зарегистрирован: 06.10.2014 18:30
Сообщения: 253
Откуда: Орел
Константин5825 писал(а):
Создал таблицу ЭтапыЗаказа , там два поля Этап и КодЭтапа
В таблице в рабочей два поля ЭтапЗаказа и Код Этапа.
Сделал Выборку из таблицы ЭтапыЗаказов с условием, что ЭтапыЗаказа.КодЭтапа >= <РабочаяТаблица.КодЭтапа>
После каждого изменения записи рабочей таблицы, через триггер обновляю код этапа до нужного значения.

Отлично!

Только возможно можно ещё лучше.
В рабочей таблице иметь только одно поле "КодЭтапа", но его не отображать, вместо него отображать "Этап".

Как это сделать мне OMEN объяснил на форуме "Учет пациентов" тема "Ввод данных в не отображаемое поле"
Для Вас "ИНН" это "КодЭтапа", а "Название организации" это "Этап"
Я не сильно вник поможет ли это Вам, но советую почитать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29.12.2018 14:42 
Не в сети

Зарегистрирован: 06.10.2014 18:30
Сообщения: 253
Откуда: Орел
Вот усовершенствование Вашего варианта
Константин5825 писал(а):
Создал таблицу ЭтапыЗаказа , там два поля Этап и КодЭтапа

Вместо таблицы сделать представление.
В него добавить
LEFT OUTER JOIN dbo.ЭтапыЗаказа ON dbo.РабочаяТаблица.Этап = dbo.ЭтапыЗаказа.Этап
(Заменить имена "Простого софта" на имена SQL)

В Вашем представлении появится вычисляемое поле КодЭтапа.
В настройках представления скрыть его отображение.

Остальное всё как у Вас, только триггер не нужен.

Достоинство этого решения отсутствие необходимости синхронизации полей Этап и КодЭтапа в рабочей таблице тригером.
Синхронизация это всегда плохо.

Недостатком этого моего и Вашего решения является увеличение передаваемых от сервера до клиентского компьютера данных.
Вроде int это мало. Но тут, там и еще где нибудь так и набирается...

Я после 100 000 записей почувствовал торможение. И занимался подобной оптимизацией.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


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

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB