Двадцать лет назад, когда начал работать с корпоративными системами, был немало раздосадован тем, что при получении отчетов постоянно приходится вводить полную дату начала и полную же дату окончания периода. С тех пор сменились поколения процессоров, операционных систем, и т.д., а большинство программ по-прежнему требуют от пользователя лишних пальцедвижений для ввода даты начала и даты конца периода.
Предложения следующие:
Давайте обойдемся одним полем и приделаем к нему кнопку вызова календаря. Примерно так, как показано на рисунке
И дадим пользователю максимальную свободу ввода. Правила простые (описание не формальное, зато, надеюсь, понятное):
- Канонический формат ввода границ периода: дд/мм/гг… дд/мм/гг
- Разрешается опускать некоторые параметры:
- Отсутствие левой границы интерпретируется как все доступные данные до указанной даты
- Если нет правой границы, то берутся данные от отмеченной даты по настоящий момент, либо без ограничения справа
- Вместо двух точек можно использовать две запятые (актуально при смене раскладки клавиатуры)
- Вместо разделителей день/месяц/год допускаем использование точки или тире
- Для ввода квартала можно использовать комбинации: I, II, III, IV или i, ii, iii, iv, которые означают, соответственно, первый, второй, третий и четвертый кварталы
- Если год опущен, то считаем, что речь идет о текущем годе
- Если опущен месяц, аналогично считаем, что пользователь имел в виду текущий месяц
- Если пропущен день, то трактовка зависит от того, введена пара термов или один. Если терм один (например, «10/2013»), то полагаем, что пользователю требуется полный месяц или год, если же период содержит пару термов (скажем, 5/2012..6/2012), то, в зависимости от того, закрывает рассматриваемая дата период или открывает, вставляем вместо пропущенной даты начало месяца (года) или конец месяца (года), соответственно
- При вводе года 21 века можно опускать ноль после 2. Например: 213 это 2013 год
- Неоднозначные варианты разрешаются в пользу более точного представления периода. Например:
- 1/1 — первое января (не январь 2001)
- 10 — десятое число текущего месяца (не октябрь и не 2010 год)
Приведу несколько примеров:
- 1.2.07..29.3.07 С 1 февраля по 29-е марта 2007 года
- ..4.07 По апрель 2007 года включительно
- 4.98 Весь апрель 1998 года
- 1.207..5.207 С января по май 2007 года
- 1.2007… С января 2007 года по настоящий момент
- ..23.4 По 23 апреля текущего года
- ..23 По 23 число текущего месяца текущего года
- 12 двенадцатое число текущего месяца
- 12… с двенадцатого числа текущего месяца до последнего введенного значения
- I..II С первого по второй квартал текущего года включительно
- IV Только четвертый квартал текущего года
- iv/2006..ii/07 С четвертого квартала 2006 года по второй квартал 2007 включительно
Осталось рассмотреть визуальный выбор периода
На рисунке изображен календарь, для выбора пользователем периода. Обходимся одним окном: если период «ровный», то есть число, неделя, месяц, квартал или год, то щелкаем соответствующую кнопку вверху и далее что-то, в зависимости от предыдущего выбора, внизу.
Если период не ровный, то сначала щелкаем по первой дате, потом выбираем следующую и щелкаем по ней. Естественно, разрешается сначала выбрать конец, а потом начало.
На этом рисунке тот же самый календарь демонстрирует быстрый выбор по одному из часто используемых случаев:
- Сегодня
- Вчера
- Последние 7 дней
- Прошлая неделя
- Прошлая рабочая неделя
- Текущий месяц
- Прошедший месяц
Три кнопки внизу справа позволяют, соответственно, открыть относительно выбранной даты период слева (..5/11/2013), выбрать пустой период, открыть относительно выбранной даты период слева (1/11/2013..).
Описанная техника работает с 1996 года в системе Papyrus компании Петроглиф и неизменно радует пользователей.
PS. Пока писал свой опус пришел к выводу, что быстрый выбор периода по одному из перечисленных в последнем списке вариантов следует вызывать по нажатию клавиши «вниз», когда фокус ввода находится в поле периода — так и сделаем в ближайшее время.
Автор: antonsobolev