Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
05 июл 2024, 21:46

Вычисление количества событий в периоде времени

Автор Morikama, 30 авг 2021, 16:56

0 Пользователей и 1 гость просматривают эту тему.

Morikama

Привет, друзья! Не соображу, как вычислить количество событий. Есть начало и окончание периода (объекты в упр. форме) и есть частота выполнения рейса, указанная в булево пн, вт, ср и т.д. до воскресенья. Необходим общий итог за период: сколько раз выполняется рейс в указанный диапазон времени от нач. до оконч. периода. Например 01.08.21 - 31.08.21 по средам и пятницам = 8 раз, и т.д. 

LexaK

похоже так (возможны еще варианты)
1.получаете календарь с указанием дня недели (пн,вт,ср,...) (возможно по вашим Нач.периода и оконч.периода)
2.соединяете со своей таблицей расписания (ср - Да (числовое выражение 1), пт - 1(Да),  и тд.
3.Суммируете колонку Рейс (Чило)

Выбрать
...
Сумма(ЕстьNull(Расписание.Рейс,0)) как КоличествоРейсов
...
Из
Календарь //таблица Дата/день - ДеньНедели
левое соединение втРасписание Расписание //таблица ДеньНедели - Рейс
по Календарь.ДеньНедели = Расписание.ДеньНедели //ср = ср или 3 = 3 смотря какой представление дня недели
если помогло нажмите: Спасибо!

Morikama

LexaK, а что означает получить календарь? Это в смысле в коде "Календарь.Получить()?"
Таблица с самим расписанием здесь не нужна, тут исходные параметры только период навигации и частота (дни выполнения)
 

LexaK

Morikama, так я и написал, "может быть много вариантов"
что такое календарь? эээ, ну календари тоже разные бывают...
в нашем варианте Календарь это таблица с последовательностью дней (01.05.21, 02.05.21, и т.д.)  со связкой/указанием что это за день недели (в принципе можно и без дней недели и рассчитывать их в запросе, да и таблицу с рейсами можно не формировать, достаточно передать массив дней недели,
тогда запрос может быть такой (какой-то облегченный, только для одного рейса)

Выбрать
Количество(1) как КоличествоРейсов
из
втКалендарь
где
 ДЕНЬНЕДЕЛИ(втКалендарь.Дата) в (&ДниРейсов) //массив с 1,3,5 (пн,ср,пт)
или &ВсеДни //Истина или Ложь (галочка Ежедневно)
если помогло нажмите: Спасибо!

Morikama

LexaK, вероятно, лучше сделать с двойной пользой - получить список дат, в которые выполняется рейс в указанный в рейсовой карточке период, а по датам просто тупо посчитать по количеству строк. Тогда какой запрос будет? Дату в отдельный реестр надо записывать.

Morikama

Я так и не понимаю, как реализовать. Смешно, видимо, для матёрых программистов это 45 секунд работы, а я сегодня бьюсь уже третий час. Пробовал вот такой код:

&НаСервере
Процедура ПодсчетКоличРейсов()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ Количество(1) как КоличествоРейсов
|ИЗ
| Документ.Расписание КАК Расписание
| ГДЕ
| Расписание.ДатаНачалаПериода = ДатаНачалаПериода,
| Расписание.ДатаОкончанияПериода = ДатаОкончанияПериода
| И ДеньНедели
    | Расписание.ПН = ПН,
| Расписание.ВТ = ВТ,
| Расписание.СР = СР,
| Расписание.ЧТ = ЧТ,
| Расписание.ПТ = ПТ,
| Расписание.СБ = СБ,
| Расписание.ВС = ВС";

Запрос.УстановитьПараметр("Количество", ДеньНедели);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Объект.РейсовЗаПериод = Количество;

КонецПроцедуры

Не соображу, что надо, чтобы реализовать подсчёт количества рейсов за период. Какой код и куда дописать, чтобы в промежуток между датой начала и окончания периода входили отмеченные булево "истина" дни недели.

Выше, где LexaK отвечал:
Выбрать
Количество(1) как КоличествоРейсов
из
втКалендарь
где
 ДЕНЬНЕДЕЛИ(втКалендарь.Дата) в (&ДниРейсов) //массив с 1,3,5 (пн,ср,пт)
или &ВсеДни //Истина или Ложь (галочка Ежедневно)

Совсем не понятно, что куда ставить.
Уж простите меня за тупость ((

Morikama

Одним словом, решение заработало такое:

&НаКлиенте
Процедура ДатаНачалаПериодаПриИзменении(Элемент)
Объект.РейсовЗаПериод = ПодсчетКоличРейсов();
КонецПроцедуры


&НаСервере
Функция ПодсчетКоличРейсов()
Результат = 0;

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Дни.ДеньНедели КАК ДеньНедели,
| РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, -Дни.ДеньНедели), НЕДЕЛЯ), НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&КонецПериода, ДЕНЬ, 1 - Дни.ДеньНедели), НЕДЕЛЯ), ДЕНЬ) / 7 КАК КоличествоДней
|ИЗ
| (ВЫБРАТЬ
| 1 КАК ДеньНедели
|
| ОБЪЕДИНИТЬ
|
| ВЫБРАТЬ
| 2
|
| ОБЪЕДИНИТЬ
|
| ВЫБРАТЬ
| 3
|
| ОБЪЕДИНИТЬ
|
| ВЫБРАТЬ
| 4
|
| ОБЪЕДИНИТЬ
|
| ВЫБРАТЬ
| 5
|
| ОБЪЕДИНИТЬ
|
| ВЫБРАТЬ
| 6
|
| ОБЪЕДИНИТЬ
|
| ВЫБРАТЬ
| 7) КАК Дни";

Запрос.УстановитьПараметр("КонецПериода", Объект.ДатаОкончанияПериода);
Запрос.УстановитьПараметр("НачалоПериода", Объект.ДатаНачалаПериода);

РезультатЗапроса = Запрос.Выполнить();

Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
Если Выборка.ДеньНедели = 1 и Объект.ПН Тогда
Результат = Результат + Выборка.КоличествоДней
КонецЕсли;
Если Выборка.ДеньНедели = 2 и Объект.ВТ Тогда
Результат = Результат + Выборка.КоличествоДней
КонецЕсли;
Если Выборка.ДеньНедели = 3 и Объект.СР Тогда
Результат = Результат + Выборка.КоличествоДней
КонецЕсли;
Если Выборка.ДеньНедели = 4 и Объект.ЧТ Тогда
Результат = Результат + Выборка.КоличествоДней
КонецЕсли;
Если Выборка.ДеньНедели = 5 и Объект.ПТ Тогда
Результат = Результат + Выборка.КоличествоДней
КонецЕсли;
Если Выборка.ДеньНедели = 6 и Объект.СБ Тогда
Результат = Результат + Выборка.КоличествоДней
КонецЕсли;
Если Выборка.ДеньНедели = 7 и Объект.ВС Тогда
Результат = Результат + Выборка.КоличествоДней
КонецЕсли;
КонецЦикла;

Возврат Результат;


КонецФункции

Теги: вычисления 

Похожие темы (5)

Рейтинг@Mail.ru

Поиск