19.06.2007, 16:53 | #21 |
Участник
|
Лезем в ключи таблицы
Добавляем в поле KeyGroups имя группы Лезем в инфу по базе -> таблицы -> группы ключей Выбираем нужную группу -> жмем включить, выключить А дальше ждемс окончания процесса Пользователь сам определяет, когда ему нужны ключики |
|
19.06.2007, 19:42 | #22 |
Участник
|
Цитата:
Сообщение от VasVovec
Так в этой форме же вроде фильтруются записи по периоду тоже, а не как мне надо - допустим по конкретному месяцу всех лет.
И еще я что-то не понял там смысла конструкции: Код: SETRANGE("Date Filter",Calendar."Period Start",Calendar."Period End"); IF GETRANGEMIN("Date Filter") = GETRANGEMAX("Date Filter") THEN SETRANGE("Date Filter",GETRANGEMIN("Date Filter")); Ну или вообще можно упростить поставив ДатаФомулу (ну этот вариант мне не очень - универсальность падает..) |
|
20.06.2007, 09:36 | #23 |
Участник
|
Цитата:
Сообщение от RedFox
Можно сделать ОЧЕНЬ просто (на основании фильтрации такого рода форм). Например сделать 2 рядка кнопочек (где первый ряд это захватываемый диапазон (в твоем случае это месяц май), а второй это диапазон ПРЫЖКА вывода (в твоем случае это через год).
Ну или вообще можно упростить поставив ДатаФомулу (ну этот вариант мне не очень - универсальность падает..) Так что это еще одно решение... И еще можно много решений придумывать, выдумывая себе - что же за задача реально стоит перед автором |
|
20.06.2007, 09:43 | #24 |
Участник
|
Цитата:
Тут вопрос - пользовался ли кому нибудь реально этой процедурой? Есть ли у кого-то отчеты, которые реально запускаются раз в год, а в остальное время не трогаются, причем под этот отчет выведен специальный ключ? Не думаю, что пользователям ради этого стоит давать права доступа к информации о базе, разрешать играть с группами ключей и т.п. А еще юзер случайно оптимизацию нажмет в пиковый час... все это чревато... Это прерогатива все таки программистов. |
|
20.06.2007, 10:49 | #25 |
Участник
|
Цитата:
Сообщение от randrews
Вы описали процедуру... Она известна...
Тут вопрос - пользовался ли кому нибудь реально этой процедурой? Есть ли у кого-то отчеты, которые реально запускаются раз в год, а в остальное время не трогаются, причем под этот отчет выведен специальный ключ? Не думаю, что пользователям ради этого стоит давать права доступа к информации о базе, разрешать играть с группами ключей и т.п. А еще юзер случайно оптимизацию нажмет в пиковый час... все это чревато... Это прерогатива все таки программистов. |
|
20.06.2007, 11:44 | #26 |
Участник
|
Цитата:
А в обычном коде можно сделать просто формой ввода. Цитата:
Так что это еще одно решение...
И еще можно много решений придумывать, выдумывая себе - что же за задача реально стоит перед автором Это просто вариант для разработки и обсуждения, который не требует модификации таблиц. И...и вообще, можно сделать маленькую формочку (по аналогии с календарем), которую потом и юзать где нужно. |
|
20.06.2007, 12:04 | #27 |
Участник
|
Чтото я не очень понял реализацию:
Цитата:
Можно сделать ОЧЕНЬ просто (на основании фильтрации такого рода форм). Например сделать 2 рядка кнопочек (где первый ряд это захватываемый диапазон (в твоем случае это месяц май), а второй это диапазон ПРЫЖКА вывода (в твоем случае это через год).
Код: OnPreDataItem () SETFILTER ("Posted Date", '<=%1', CALCDATE('<CM>-5<Y>', RepDateS)); // - чтобы ограничить диапазон выборки допустим 5 лет OnAfterGetRecord () EntryMonth:=DATE2DMY("Posted Date",2); IF EntryMonth <> (RepMonth+1) THEN CurrReport.SKIP; // - +1 потому что выпадающий список с месяцами: январь - 0 и т.д. { Обработка нужных записей } |
|
20.06.2007, 12:24 | #28 |
Участник
|
Цитата:
Сообщение от VasVovec
Чтото я не очень понял реализацию:
Вот у меня сейчас сделано так: Код: OnPreDataItem () SETFILTER ("Posted Date", '<=%1', CALCDATE('<CM>-5<Y>', RepDateS)); // - чтобы ограничить диапазон выборки допустим 5 лет OnAfterGetRecord () EntryMonth:=DATE2DMY("Posted Date",2); IF EntryMonth <> (RepMonth+1) THEN CurrReport.SKIP; // - +1 потому что выпадающий список с месяцами: январь - 0 и т.д. { Обработка нужных записей } В предложенном варианте записей будет в разы больше отсеяно, чем обработано. Вернее обработаются все, но куча из них - впустую. Лучше взять снаружи цикл по годам. Внутри цикл по определенному месяцу. В этом случае обрабатываться будут только полезные записи. Лишний датаайтем сверху по вирт таблице Дата, ограниченной интервалом в пять (или сколько вам угодно) лет. И все дела ) |
|
20.06.2007, 13:20 | #29 |
Участник
|
Цитата:
Лучше взять снаружи цикл по годам. Внутри цикл по определенному месяцу. В этом случае обрабатываться будут только полезные записи. Лишний датаайтем сверху по вирт таблице Дата, ограниченной интервалом в пять (или сколько вам угодно) лет.
|
|
20.06.2007, 13:37 | #30 |
Участник
|
Репорт.
Верхний датаайтем на вирт таблице Дата. Код: Дата - OnPreDataItem(). Дата.SETRANGE("Тип периода", "Тип периода"::Год); Дата.SETRANGE("Начало периода", CALCDATE('<-CY-5Y>', TODAY()), CALCDATE('<-CY>', TODAY())); Код: ItemLedgerEntry - OnPreDataItem(). MyWorkDate := DMY2DATE(1, RepMonth + 1, DATE2DMY(Дата."Начало периода", 3)); // 1я дата нужного месяца нужного года SETRANGE("Posting Date", Дата."Начало периода", NORMALDATE(Дата."Конец периода")); FILTERGROUP(4); SETRANGE("Posting Date", CALCDATE('<-CM>', MyWorkDate), CALCDATE('<CM>', MyWorkDate)); FILTERGROUP(0); ПС. Писал не проверяя. Может где лишняя скобка затесалась ... |
|
20.06.2007, 17:13 | #31 |
Участник
|
Цитата:
Сообщение от romeo
Репорт.
Верхний датаайтем на вирт таблице Дата. Код: Дата - OnPreDataItem(). Дата.SETRANGE("Тип периода", "Тип периода"::Год); Дата.SETRANGE("Начало периода", CALCDATE('<-CY-5Y>', TODAY()), CALCDATE('<-CY>', TODAY())); Код: ItemLedgerEntry - OnPreDataItem(). MyWorkDate := DMY2DATE(1, RepMonth + 1, DATE2DMY(Дата."Начало периода", 3)); // 1я дата нужного месяца нужного года SETRANGE("Posting Date", Дата."Начало периода", NORMALDATE(Дата."Конец периода")); FILTERGROUP(4); SETRANGE("Posting Date", CALCDATE('<-CM>', MyWorkDate), CALCDATE('<CM>', MyWorkDate)); FILTERGROUP(0); ПС. Писал не проверяя. Может где лишняя скобка затесалась ... |
|
09.07.2007, 12:24 | #32 |
Участник
|
Группа ключей, вопрос очень интересный, находится он по пути Файл-База данных-Информация-Таблицы-Группы ключей (путь не близкий). Тут мы по необходимости включаем и выключаем группу ключей ручками, а программно как это сделать?
|
|
09.07.2007, 14:50 | #33 |
Участник
|
вообще, можно использовать программно следующую логику.
по виртуальной таблице Date ставить фильтр Тип периода -Месяц Период Но. - 5 (в данном случае, но вполне можно это выбирать программно) по интересующим данным установить ключ по дате. Найти минимальную дату (FINDFIRST), и найти Максимальную дату (FINDLAST). Установить соответстующий фильтр на поля Начало периода и конец периода в виртуальной таблице, так что виртуальная таблица будет содержать только интересующие месяца интересующих лет, а потом создать текстовую переменную(до 2000 символов), которая будет хранить фильтр на дату Str:=Str+ FORMAT(Date."Начало Периода)+'..'+FORMAT(Date."Конец Периода")+ '|' проходя по всем записям виртуальной таблицы, а потом просто необходимо будет установить этот сложный фильтр на поле дата по интересущим данным |
|