Добрый день!
Возникла задача, для упрощения создал ограниченный пример. Есть мероприятия, у каждого мероприятия есть дата начала и дата окончания. Есть календарь. В календаре выбирается дата. Вопрос - как отфильтровать в таблице те мероприятия, у которых дата начала меньше выбранной даты, а дата окончания мероприятия больше выбранной даты. Во вложении картинка. Код приложения:
SET ThousandSep=' ';
SET DecimalSep=',';
SET MoneyThousandSep=' ';
SET MoneyDecimalSep=',';
SET MoneyFormat='# ##0,00р.;-# ##0,00р.';
SET TimeFormat='h:mm:ss';
SET DateFormat='DD.MM.YYYY';
SET TimestampFormat='DD.MM.YYYY h:mm:ss[.fff]';
SET MonthNames='янв;фев;мар;апр;май;июн;июл;авг;сен;окт;ноя;дек';
SET DayNames='Пн;Вт;Ср;Чт;Пт;Сб;Вс';
Календарь:
load * Inline
[Дата, Квартал, Месяц, Год, День, Неделя, День недели];
Let ТекущаяДата = Num(Today(1));
Let ПрошедшийПериод = -10;
Let БудущийПериод = 0;
For i = $(ПрошедшийПериод) to $(БудущийПериод)
Concatenate(Календарь)
Load
Date ($(ТекущаяДата) + $(i)) as Дата,
'Q' & Ceil(Month($(ТекущаяДата) + $(i))/3) as Квартал,
Month (Date($(ТекущаяДата) + $(i))) as Месяц,
Year (Date($(ТекущаяДата) + $(i))) as Год,
Day (Date($(ТекущаяДата) + $(i))) as День,
week($(ТекущаяДата) + $(i)) as [Неделя],
weekday($(ТекущаяДата) + $(i)) as [День недели]
AutoGenerate 1
;
Next i;
Мероприятие:
Load * inline [
Дата старта мероприятия, Дата окончания мероприятия, Наименование мероприятия
01.01.2015, 05.01.2015, Мероприятие 1
01.01.2015, 03.01.2015, Мероприятие 2
02.01.2015, 06.01.2015, Мероприятие 3
02.01.2015, 04.01.2015, Мероприятие 4
03.01.2015, 03.01.2015, Мероприятие 5
03.01.2015, 05.01.2015, Мероприятие 6
04.01.2015, 05.01.2015, Мероприятие 7
05.01.2015, 10.01.2015, Мероприятие 8
06.01.2015, 11.01.2015, Мероприятие 9
];
И совсем для гуру, как обрабатывать несколько выбранных дат (причем даты могут идти непоследовательно, например 1, 5 и 20 число месяца)? Думаю, что нужно через setExpression делать, но не втыкаю как... I need help!
Может как то можно создать дополнительную таблицу в которой хранить интервалы? Хотя это кажется плохим решением...
Как временное решение сделал так:
=if([Дата старта мероприятия]<= Date(Interval(Num(Дата)),'DD.MM.YYYY') and [Дата окончания мероприятия] >= Date(Interval(Num(Дата)),'DD.MM.YYYY'),Дата,Null())
У кого будут предложения, напишите, пожалуйста.
Проблему решил, во вложении приложение с решением. Надеюсь кому-то поможет, ибо сразу не додуматься.
Алгоритм следующий:
1) Используем прямую таблицу (chart);
2) Вычисляемое измерение (его необходимо скрыть)
=if([Дата старта мероприятия]<= Date(Interval(Num(Дата)),'DD.MM.YYYY') and [Дата окончания мероприятия] >= Date(Interval(Num(Дата)),'DD.MM.YYYY'),Дата,Null())
3) Выражение
Aggr([Наименование мероприятия], [Дата старта мероприятия], [Дата окончания мероприятия])
Цитата: Иван от 11 января 2015, 01:24:11
Вопрос - как отфильтровать в таблице те мероприятия, у которых дата начала меньше выбранной даты, а дата окончания мероприятия больше выбранной даты.
Т.е. при выделении даты требуется отобрать записи мероприятий которые действуют на эту дату?
Обратите внимание на функцию IntervalMatch()
Да, совершенно верно. Спасибо, гляну эту функцию.
И по поводу календаря, зачем создавать циклом когда есть AUTOGENERATE?
Цитата: admin от 11 января 2015, 04:42:23
И по поводу календаря, зачем создавать циклом когда есть AUTOGENERATE?
К сожалению, первый раз сталкиваюсь с календарем, поэтому делал по первому попавшемуся образцу. Спасибо! :)
Цитата: admin от 11 января 2015, 04:42:23
И по поводу календаря, зачем создавать циклом когда есть AUTOGENERATE?
Евгений, добрый день!
А можете пояснить, в чем недостаток цикла и в чем преимущество AUTOGENERATE при создании календаря? Либо ссылку на информацию киньте, пожалуйста.
С уважением,
Шамаев Иван.
Привет, возьмите лет десять и сравните создание календарей на этот период в двух вариантах по времени и задействованным ресурсам.