|
Запрос выбрать значение из регистра сведений | ☑ | ||
---|---|---|---|---|
0
x-a-d
29.11.12
✎
13:40
|
Тема не совсем корректно сформулирована, т.к. не знаю как точно ее сформулировать.
Вопрос следующий. В РС (например, РС производственный календарь в типовых) храним какое-то значение на дату. Дата1 "рабочий" Дата2 "выходной" Дата3 "рабочий" Дата4 "выходной" Дата5 "рабочий" и т.д. Делаю запрос к другим данным (неважно каким), где одно из полей дата. В зависимости от условий мне надо у этой дате прибавить "n" рабочих дней, чтобы получить Дату из производственного календаря. Например, мне надо получить третью рабочую дату. Т.е. из приведенного выше списка это "Дата5". Отобрать все рабочие даты и поместить во временную таблицу - не проблема (чтобы потом по левому соединению обратиться). Но не могу придумать алгоритм как получить именно "Дата5" |
|||
1
shuhard
29.11.12
✎
13:45
|
(0) я бы использовал HAVING
|
|||
2
LehhaK
29.11.12
✎
13:45
|
Я бы запросом выбрал даты, где условие = рабочий и выбрать первые 3. Перебором доходишь до последней и вот она твоя дата, например
|
|||
3
x-a-d
29.11.12
✎
13:47
|
(1) имеющие используется только к агрегатным функциям. В данном случае не пойму, что агрегировать.
|
|||
4
shuhard
29.11.12
✎
13:48
|
(0) количество
|
|||
5
МишКа
29.11.12
✎
13:48
|
(2)
|
|||
6
МишКа
29.11.12
✎
13:49
|
А первые n, как будешь выбирать? Текст запроса парсить?
|
|||
7
LehhaK
29.11.12
✎
13:50
|
(6)Запрос.Текст = "Выбрать первые"+"n"+"Блаблабла"
|
|||
8
x-a-d
29.11.12
✎
13:50
|
(2) мне надо выбирать может 3, может 5 и по левому соединению. Думаю может как-то пронумеровать даты. И потом к своей дате, от которой ищу, выбрать ближайшую из временной таблицы, а потом к ее "порядку" прибавить нужную разницу и выбрать уже нужную дату
(6) будет условие в запросе типа ВЫБОР КОГДА ... |
|||
9
bzaugolnov
29.11.12
✎
14:06
|
(8) Да, нумерация дат, кажется, самый простой способ. Можно в самой базе сделать нумерацию или добавить пару временных таблиц:
ВЫБРАТЬ Дата,Вид,1 КАК Позиция ПОМЕСТИТЬ ВТ_Даты ; ВЫБРАТЬ Даты1.Дата КАК Дата, СУММА(Даты2.Позиция) КАК Позиция ПОМЕСТИТЬ ВТ_Список ИЗ ВТ_Даты КАК Даты1 ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Даты КАК Даты2 ПО Даты1.Дата>=Даты2.Дата И Даты2.Вид = Рабочая Где Даты1.Вид = Рабочая |
|||
10
hhhh
29.11.12
✎
14:12
|
(8) как-то так
Выбрать Календарь2.Дата, СУММА(Календарь1.РабочийДень) ИЗ ПроизводственныйКалендарь КАК Календарь1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПроизводственныйКалендарь КАК Календарь2 ПО Календарь1.Дата <= Календарь2.Дата СГРУППИРОВАТЬ ПО Календарь2.Дата и потом для двух дат нужно взять две строчки этой таблицы и вычесть. |
|||
11
Kashemir
29.11.12
✎
14:34
|
ВЫБРАТЬ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря ПОМЕСТИТЬ Календарь ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь ГДЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &НачалоПериода И &КонецПериода И РегламентированныйПроизводственныйКалендарь.ВидДня = &РабочийВидДня ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Календарь.ДатаКалендаря КАК ДатаКалендаря, КОЛИЧЕСТВО(Календарь1.ДатаКалендаря) КАК НомерДня ПОМЕСТИТЬ НумерованныйКалендарь ИЗ Календарь КАК Календарь ЛЕВОЕ СОЕДИНЕНИЕ Календарь КАК Календарь1 ПО Календарь.ДатаКалендаря >= Календарь1.ДатаКалендаря СГРУППИРОВАТЬ ПО Календарь.ДатаКалендаря ИНДЕКСИРОВАТЬ ПО ДатаКалендаря, НомерДня ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВЫРАЗИТЬ(ТаблицаДатСОтстрочками.Дата КАК ДАТА) КАК Дата, ВЫРАЗИТЬ(ТаблицаДатСОтстрочками.ОтсрочкаВРабочихДнях КАК ЧИСЛО(19, 0)) КАК ОтсрочкаВРабочихДнях ПОМЕСТИТЬ ТЗДатОстрочек ИЗ &Тз КАК ТаблицаДатСОтстрочками ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВложенныйЗапрос.Дата, ВложенныйЗапрос.ОтсрочкаВРабочихДнях, ВложенныйЗапрос.НомерНужногоРабочегоДня, НумерованныйКалендарь.ДатаКалендаря КАК ДатаОкончанияОтсрочки ИЗ (ВЫБРАТЬ ВложенныйЗапрос.Дата КАК Дата, ВложенныйЗапрос.ОтсрочкаВРабочихДнях КАК ОтсрочкаВРабочихДнях, ВложенныйЗапрос.ОтсрочкаВРабочихДнях + ЕСТЬNULL(НумерованныйКалендарь.НомерДня, 0) КАК НомерНужногоРабочегоДня ИЗ (ВЫБРАТЬ ТЗДатОстрочек.Дата КАК Дата, ТЗДатОстрочек.ОтсрочкаВРабочихДнях КАК ОтсрочкаВРабочихДнях, МИНИМУМ(НумерованныйКалендарь.ДатаКалендаря) КАК ДатаБлижайшегоРабочегоДня ИЗ ТЗДатОстрочек КАК ТЗДатОстрочек ЛЕВОЕ СОЕДИНЕНИЕ НумерованныйКалендарь КАК НумерованныйКалендарь ПО ТЗДатОстрочек.Дата <= НумерованныйКалендарь.ДатаКалендаря СГРУППИРОВАТЬ ПО ТЗДатОстрочек.Дата, ТЗДатОстрочек.ОтсрочкаВРабочихДнях) КАК ВложенныйЗапрос ЛЕВОЕ СОЕДИНЕНИЕ НумерованныйКалендарь КАК НумерованныйКалендарь ПО ВложенныйЗапрос.ДатаБлижайшегоРабочегоДня = НумерованныйКалендарь.ДатаКалендаря) КАК ВложенныйЗапрос ЛЕВОЕ СОЕДИНЕНИЕ НумерованныйКалендарь КАК НумерованныйКалендарь ПО ВложенныйЗапрос.НомерНужногоРабочегоДня = НумерованныйКалендарь.НомерДня |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |