|
Подскажите по запросу | ☑ | ||
---|---|---|---|---|
0
Barbossa
17.08.11
✎
13:36
|
Доброе время суток.
Не получается построить такой запрос: Обращаемся к регистру, оттуда получаем поля "Документ" и "Дата" и в эту же табличку нужно вывести еще одну расчетную дату, которая будет либо равна полю "Дата", либо, если "Дата" - выходной, равна ближайшему предыдущему рабочему дню (т.е. ближайший рабочий день находим в прошлом периоде). Подскажите как можно получить такую выборку. |
|||
1
John83
17.08.11
✎
13:54
|
делай соединение с производственным календарем - там ищи ближайший рабочий день
|
|||
2
Barbossa
17.08.11
✎
14:01
|
(1) Это понятно. Но как из той таблицы вытянуть ОДНУ запись, не целый набор ?
|
|||
3
DrHiHi
17.08.11
✎
14:10
|
если посмотришь в УТП, то там устанавливается в заказе покупателя дата оплата, в договоре устанавливается количество дней просрочки, а в константе определяется по какому методу (по календарным или по рабочим дням)
|
|||
4
Barbossa
17.08.11
✎
14:20
|
(3) Так...а чем это мне поможет ?
Я сам делал этот функционал в самописке, реализовать это не вопрос для такого не критичного по производительности места. У меня огромная выборка и хочу сделать все в одном запросе, но никак не допрет, как получить соответствие 1 к 1 (1 дата из регистра = 1 дата предыдущего рабочего дня) |
|||
5
Barbossa
17.08.11
✎
16:52
|
Возник еще вопрос в процессе разбирательств:
Есть некая заранее сформированная выборка данных. В СКД есть вычисляемая переменная, расчитывается в общем модуле. Есть ли возможность при расчете данной переменной использовать вышеупомянутую выборку? Как ее можно передать в общий модуль ? |
|||
6
mikecool
17.08.11
✎
16:54
|
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Календарь.ДатаКалендаря КАК ДатаКалендаря, | КОЛИЧЕСТВО(*) КАК Ранг |ПОМЕСТИТЬ Календарь |ИЗ | РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК КалендарьКопия | ПО Календарь.ДатаКалендаря <= КалендарьКопия.ДатаКалендаря |ГДЕ | Календарь.ДатаКалендаря >= ДОБАВИТЬКДАТЕ(&КонецПериода, ДЕНЬ, -365) | И Календарь.ДатаКалендаря <= &КонецПериода | И (Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий) | ИЛИ Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)) | И КалендарьКопия.ДатаКалендаря >= ДОБАВИТЬКДАТЕ(&КонецПериода, ДЕНЬ, -365) | И КалендарьКопия.ДатаКалендаря <= &КонецПериода | И (КалендарьКопия.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий) | ИЛИ КалендарьКопия.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)) | |СГРУППИРОВАТЬ ПО | Календарь.ДатаКалендаря | |ИНДЕКСИРОВАТЬ ПО | ДатаКалендаря, | Ранг |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗРЕШЕННЫЕ | Календарь.ДатаКалендаря КАК ДатаКалендаря, | КОЛИЧЕСТВО(*) КАК Ранг |ПОМЕСТИТЬ КалендарьБудущий |ИЗ | РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК КалендарьКопия | ПО Календарь.ДатаКалендаря >= КалендарьКопия.ДатаКалендаря |ГДЕ | Календарь.ДатаКалендаря > &КонецПериода | И Календарь.ДатаКалендаря <= ДОБАВИТЬКДАТЕ(&КонецПериода, ДЕНЬ, 365) | И (Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий) | ИЛИ Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)) | И КалендарьКопия.ДатаКалендаря > &КонецПериода | И КалендарьКопия.ДатаКалендаря <= ДОБАВИТЬКДАТЕ(&КонецПериода, ДЕНЬ, 365) | И (КалендарьКопия.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий) | ИЛИ КалендарьКопия.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)) | |СГРУППИРОВАТЬ ПО | Календарь.ДатаКалендаря | |ИНДЕКСИРОВАТЬ ПО | ДатаКалендаря, | Ранг |; |
|||
7
mikecool
17.08.11
✎
16:54
|
первая часть - предыдущий год
вторая - следующий |
|||
8
Barbossa
17.08.11
✎
17:16
|
(6) Большое спасибо за код, но мне несколько иное надо.
Пример: Документ Дата ДатаКорректная Документ1 14.08.11 12.08.11 Так как 14 - выходной, выставляется ближайший в прошлом рабочий день - 12. |
|||
9
mikecool
17.08.11
✎
17:25
|
(8) ну дык - бери из календаря ближайшую рабочую
|
|||
10
Barbossa
17.08.11
✎
17:32
|
Так в этом то у меня и вопрос!
Как мне взять соединением из второй выборки одну запись, причем для каждой строки первой выборки. |
|||
11
Barbossa
17.08.11
✎
17:34
|
т.е. вот примерная "идеальная таблица"
Документ Дата ДатаКорректная Документ1 14.08.11 12.08.11 Документ2 13.08.11 12.08.11 Документ1 15.08.11 15.08.11 Документ1 14.08.11 12.08.11 Документ1 12.08.11 12.08.11 |
|||
12
mikecool
17.08.11
✎
17:37
|
| ЛЕВОЕ СОЕДИНЕНИЕ Календарь КАК Календарь
| ПО (НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(РеализацияТоваровУслуг.ДатаПоставки, ДЕНЬ, ВЫБОР | КОГДА ДЕНЬНЕДЕЛИ(РеализацияТоваровУслуг.ДатаПоставки) = 6 | ТОГДА 2 | КОГДА ДЕНЬНЕДЕЛИ(РеализацияТоваровУслуг.ДатаПоставки) = 7 | ТОГДА 1 | ИНАЧЕ 0 | КОНЕЦ), ДЕНЬ) = Календарь.ДатаКалендаря) | ЛЕВОЕ СОЕДИНЕНИЕ Календарь КАК КалендарьНаДоговор | ПО (ВЫБОР | КОГДА РеализацияТоваровУслуг.ДоговорКонтрагента.КонтролироватьЧислоДнейЗадолженности | ТОГДА ВЫБОР | КОГДА Календарь.Ранг ЕСТЬ NULL | ТОГДА 0 | ИНАЧЕ Календарь.Ранг - (РеализацияТоваровУслуг.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности - 1) | КОНЕЦ | ИНАЧЕ 0 | КОНЕЦ = КалендарьНаДоговор.Ранг) | ЛЕВОЕ СОЕДИНЕНИЕ КалендарьБудущий КАК КалендарьБудущий | ПО (НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(РеализацияТоваровУслуг.ДатаПоставки, ДЕНЬ, ВЫБОР | КОГДА ДЕНЬНЕДЕЛИ(РеализацияТоваровУслуг.ДатаПоставки) = 6 | ТОГДА 2 | КОГДА ДЕНЬНЕДЕЛИ(РеализацияТоваровУслуг.ДатаПоставки) = 7 | ТОГДА 1 | ИНАЧЕ 0 | КОНЕЦ), ДЕНЬ) = КалендарьБудущий.ДатаКалендаря) | ЛЕВОЕ СОЕДИНЕНИЕ КалендарьБудущий КАК КалендарьНаДоговорБудущий | ПО (ВЫБОР | КОГДА РеализацияТоваровУслуг.ДоговорКонтрагента.КонтролироватьЧислоДнейЗадолженности | ТОГДА ВЫБОР | КОГДА КалендарьБудущий.Ранг ЕСТЬ NULL | ТОГДА 0 | ИНАЧЕ КалендарьБудущий.Ранг + (РеализацияТоваровУслуг.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности - 1) | КОНЕЦ | ИНАЧЕ 0 | КОНЕЦ = КалендарьНаДоговорБудущий.Ранг) может так будет понятнее )) а из календаря брать ДатаКалендаря |
|||
13
Barbossa
17.08.11
✎
17:48
|
(12)
Такая идея была, но у контрукции есть минус. Например - многодневные праздники или спец. дни отдыха компании будут пролетать мимо, если я ничего под вечер не путаю :) |
|||
14
mikecool
17.08.11
✎
17:48
|
(13) если они будут отмечены в произв. календаре, то нет
|
|||
15
Barbossa
17.08.11
✎
17:53
|
(14) Ладно, спасибо большое за идею, буду осуществлять реализацию :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |