Последняя версия DataExpress 3 beta от 9 декабря 2018 года. Скачать. Энциклопедия DX. Форум на Develop-Soft

[РЕШЕНО] Поле "Время" и NULL

Здесь содержаться темы из данного форума, потерявшие свою актуальность ввиду того, что ошибка (баг) программы устранён разработчиком или данное поведение программы не являлось ошибкой и не требует вмешательства разработчика.
Kiss
Интересующийся
Сообщения: 117
Зарегистрирован: Вт мар 14, 2017 11:41 am
Откуда: Гомель, Беларусь

[РЕШЕНО] Поле "Время" и NULL

Сообщение Kiss » Пт окт 12, 2018 3:14 pm

Подскажите, пожалуйста,
1. Как правильно очистить поле "Время"?
2. Как правильно работать с полем "Время" и функцией "NZ" (или IFE) ?

Пробовал ставить выражения в поле Время, тогда при создании записи по умолчанию само ставится 00:00, что не есть NULL.
Корень проблемы в том, чтобы определить ввел ли пользователь 00:00 т.к. нужно было именно полночь ИЛИ хотел оставить поле пустым, т.к. не знает на данный момент, что вводить, а программа выставила 00:00 сама.

Проблема возникла из задачи посчитать разницу между "Планируемыми" Датой и Временем и "Фактическими", чтобы определить Опоздание или Опережение (количеством минут), т.е. если Факт позже, чем План - это Отрицательное число минут (опоздание) и наоборот - Положительное число минут (опережение).

Код: Выделить всё

MINUTESBETWEEN(nz([Запланировано дата],0),nz([Запланировано время],0),nz([Фактически дата],0),nz([Фактически время],0))
*IIF([Фактически дата]=[Запланировано дата]&nz([Фактически время],0)<=nz([Запланировано время],0),1,
IIF([Фактически дата]<[Запланировано дата],1,-1))

Даже при таком выражении (не совсем решающим проблему с отсутствием одного из времени) Пишет, несовместимые типы, т.к. видимо 00:00 в поле "Время" это не совсем тот ноль при сравнении, если в одном из 2х полей "Время" забить выражение или выставить полночь.

Пробовал ставить в "значение по умолчанию" NULL, программа при создании записи всё равно выставляет 00:00, по SETFIELD и кнопке с действием "Очистить поле" - тоже 00:00. Как бороться?

Аватара пользователя
Гocть
Эксперт
Сообщения: 1398
Зарегистрирован: Пн ноя 27, 2017 8:02 am

Re: [РЕШЕНО] Поле "Время" и NULL

Сообщение Гocть » Пт окт 12, 2018 3:26 pm

Так что ли?

Код: Выделить всё

iif ( ([Запланировано дата]<>null &
      [Запланировано время]<>null &
      [Фактически дата]<>null &
      [Фактически время]<>null) , //  если все поля заполнены

// Ваши вычисления

,0) // если хотя бы одно поле содержит null (вычислять нечего)           


1. null'ом
Фрилансер. Разработка на заказ. Консультирование.

Kiss
Интересующийся
Сообщения: 117
Зарегистрирован: Вт мар 14, 2017 11:41 am
Откуда: Гомель, Беларусь

Re: [РЕШЕНО] Поле "Время" и NULL

Сообщение Kiss » Пт окт 12, 2018 3:32 pm

Гocть писал(а):Так что ли?
Оно-то так, но если в любое из полей "Время" вбить "выражение" или "Очистить" поле, то оно станет НЕ null, при создании новой записи, а со значением 00:00. А надо как раз как-то ничего не вычислять, если пользователь сам руками не забивал тот же 00:00.

Аватара пользователя
Гocть
Эксперт
Сообщения: 1398
Зарегистрирован: Пн ноя 27, 2017 8:02 am

Re: [РЕШЕНО] Поле "Время" и NULL

Сообщение Гocть » Пт окт 12, 2018 3:38 pm

Я не до конца понял суть вашей формулы. Просто засуньте ее в обертку (постом выше) и поубирайте везде nz за ненадобностью.
Если пользователь забил руками 00:00 то он установил время.
Фрилансер. Разработка на заказ. Консультирование.

Аватара пользователя
Гocть
Эксперт
Сообщения: 1398
Зарегистрирован: Пн ноя 27, 2017 8:02 am

Re: [РЕШЕНО] Поле "Время" и NULL

Сообщение Гocть » Пт окт 12, 2018 3:42 pm

Kiss писал(а):Пробовал ставить в "значение по умолчанию" NULL, программа при создании записи всё равно выставляет 00:00, по SETFIELD и кнопке с действием "Очистить поле" - тоже 00:00.

А. Ну это да, косяк. Попробуйте сделать свое поле времени из текстового поля с маской.
Фрилансер. Разработка на заказ. Консультирование.

Kiss
Интересующийся
Сообщения: 117
Зарегистрирован: Вт мар 14, 2017 11:41 am
Откуда: Гомель, Беларусь

Re: [РЕШЕНО] Поле "Время" и NULL

Сообщение Kiss » Пт окт 12, 2018 3:47 pm

Гocть писал(а):... из текстового поля с маской.
Вариант, спасибо за наводку. Не совсем удобный правда, но вариант. Только в последующих вычислениях будут тонны CNUM и CTIME, если дальше развивать вычисления времени из текста.

Аватара пользователя
Гocть
Эксперт
Сообщения: 1398
Зарегистрирован: Пн ноя 27, 2017 8:02 am

Re: [РЕШЕНО] Поле "Время" и NULL

Сообщение Гocть » Пт окт 12, 2018 3:50 pm

На самом деле это недоработка поля. Видимо автор не учел этот момент.
Фрилансер. Разработка на заказ. Консультирование.

Kiss
Интересующийся
Сообщения: 117
Зарегистрирован: Вт мар 14, 2017 11:41 am
Откуда: Гомель, Беларусь

Re: [РЕШЕНО] Поле "Время" и NULL

Сообщение Kiss » Пт окт 12, 2018 4:01 pm

Гocть писал(а):На самом деле это недоработка поля. Видимо автор не учел этот момент.
Попробовал текст с маской и... Дичайше не удобно! А потом до меня дошло, что многие поля с которыми уже работают люди придется переделывать под расчет из текста. ......А потом переделывать еще раз, когда (если) ситуацию исправят).

Спасибо за советы, буду ждать или придумывать временное решение задачи. А тему надо бы в баг-трекер.

Аватара пользователя
Гocть
Эксперт
Сообщения: 1398
Зарегистрирован: Пн ноя 27, 2017 8:02 am

Re: [РЕШЕНО] Поле "Время" и NULL

Сообщение Гocть » Пт окт 12, 2018 4:23 pm

Kiss писал(а):Дичайше не удобно!

Так что ли?

ВРЕМЯ.zip
(45.52 КБ) 8 скачиваний
Фрилансер. Разработка на заказ. Консультирование.

Kiss
Интересующийся
Сообщения: 117
Зарегистрирован: Вт мар 14, 2017 11:41 am
Откуда: Гомель, Беларусь

Re: [РЕШЕНО] Поле "Время" и NULL

Сообщение Kiss » Пт окт 12, 2018 5:09 pm

Гocть писал(а):
Kiss писал(а):Дичайше не удобно!

Так что ли?
ВРЕМЯ.zip
Реализацию выбора времени через стандартный значок часов программы я как-то так и представлял.
Не удобно сравнивать время через текстовые поля в тех же MINUTESBETWEEN.
Вычислять из них время придется как-то так: ctime([Text1]). Если Текст1 = null, то CTIME выдаст ошибку. Или же запрещать сравнивать Время из Текста, если Текст1=null и сравнить только Даты. Плюс у меня задача разграничить опоздания и опережения как положительные и отрицательные числа, Плюс сделал, чтобы сравнение шло хотя бы Дат, если не введено любое из 2х полей времени. А вычисления в самих полях я пока вынес при сохранении записи в SetField в "Проверке значения", чтобы автоматом не ставило 00:00 хотя бы при создании новой записи.

Код: Выделить всё

IIF([Фактически дата]=null|[Запланировано дата]=null,0,
IIF([Фактически дата]<[Запланировано дата]|[Фактически дата]=[Запланировано дата]&nz([Фактически время],nz([Запланировано время],0))<nz([Запланировано время],nz([Фактически время],0)),
MINUTESBETWEEN([Фактически дата],nz([Фактически время],[Запланировано время]),[Запланировано дата],nz([Запланировано время],[Фактически время])),
MINUTESBETWEEN([Фактически дата],nz([Фактически время],[Запланировано время]),[Запланировано дата],nz([Запланировано время],[Фактически время]))*-1))
Как-то так. А если сюда везде еще и CTIME впихнуть, то будет еще длиннее)))
Вот работало бы как должно - я бы не парился с вычислениями в "Проверке значения". Сложно описать что должно в последствии работать и зависеть У МЕНЯ от используемых в примере полей до и после вычислений... так что... как-то так.
За помощь еще раз большое Вам спасибо!


Вернуться в «РЕШЕНО: Закрытые вопросы.»