|
Вложенный запрос , как ? | ☑ | ||
---|---|---|---|---|
0
DES
27.06.22
✎
14:47
|
нужно найти кол-во праздничных дней в период отпуска сотрудника
КолВо праздников получаю так: ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК КолВоПД ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК К ГДЕ К.ДатаКалендаря МЕЖДУ ПериодыО.НачалоОтпуска И ПериодыО.КонецОтпуска И К.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Праздник) где алиас "ПериодыО" из следующего как бы запроса. периоды самих отпусков получаю так: (связь документа и его табличной части, в таблице диапазоны дат дней если отпуск переходит на разные месяца) ВЫБРАТЬ РасчетО.Сотрудник КАК Сотрудник, ПериодыО.НачалоОтпуска КАК НачалоОтпуска, ПериодыО.КонецОтпуска КАК КонецОтпуска ИЗ Документ.РасчетОтпускных.ПериодыОтпуска КАК ПериодыО ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасчетОтпускных КАК РасчетО ПО ПериодыО.Ссылка = РасчетО.Ссылка Вопрос как из количества дней отпуска вычесть количество дней праздников попадающих в диапазон отпуска ЗАПРОСОМ сделал бы так: ВЫБРАТЬ РасчетО.Сотрудник КАК Сотрудник, ПериодыО.НачалоОтпуска КАК НачалоОтпуска, ПериодыО.КонецОтпуска КАК КонецОтпуска, (ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК КолВоПД ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК К ГДЕ К.ДатаКалендаря МЕЖДУ ПериодыО.НачалоОтпуска И ПериодыО.КонецОтпуска И К.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Праздник) как колПД ИЗ Документ.РасчетОтпускных.ПериодыОтпуска КАК ПериодыО ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасчетОтпускных КАК РасчетО ПО ПериодыО.Ссылка = РасчетО.Ссылка но что то не хочет понимать... |
|||
1
Kigo_Kigo
27.06.22
✎
14:58
|
Во всех типовых есть функция которая тебе это посчитает, зачем изобретать велосипед?
|
|||
2
DES
27.06.22
✎
15:12
|
как звать эту функцию и у меня не совсем типовая
|
|||
3
Kigo_Kigo
27.06.22
✎
15:24
|
В упп ЗаполнениеДокументов.ОпределитьДату(НачалоМесяца(ТекущаяДата())-1, 16)
|
|||
4
Kigo_Kigo
27.06.22
✎
15:25
|
Функция ОпределитьДату(ДатаНач, ЧислоДней) Экспорт
Запрос = Новый Запрос; Запрос.УстановитьПараметр("ДатаНач", ДатаНач); Запрос.УстановитьПараметр("ЧислоДней", ЧислоДней); Запрос.УстановитьПараметр("РабочийДень", Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий); Запрос.УстановитьПараметр("ПредпраздничныйДень", Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный); Если ЧислоДней > 0 Тогда Запрос.Текст = " |ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ " + ЧислоДней + " | РегламентированныйПроизводственныйКалендарь.ДатаКалендаря |ИЗ | РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь |ГДЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря > &ДатаНач | И (РегламентированныйПроизводственныйКалендарь.ВидДня = &РабочийДень | ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = &ПредпраздничныйДень) |УПОРЯДОЧИТЬ ПО | ДатаКалендаря ВОЗР"; Иначе ЧислоДней = -ЧислоДней; Запрос.Текст = " |ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ " + ЧислоДней + " | РегламентированныйПроизводственныйКалендарь.ДатаКалендаря |ИЗ | РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь |ГДЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря < &ДатаНач | И (РегламентированныйПроизводственныйКалендарь.ВидДня = &РабочийДень | ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = &ПредпраздничныйДень) |УПОРЯДОЧИТЬ ПО | ДатаКалендаря УБЫВ |"; КонецЕсли; Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Количество() = ЧислоДней Тогда Пока Выборка.Следующий() Цикл ТекДата = Выборка.ДатаКалендаря; КонецЦикла; Возврат ТекДата; КонецЕсли; Возврат Неопределено; КонецФункции |
|||
5
Said_We
27.06.22
✎
16:33
|
(0) 1С НЕ умеет запрос такого вида:
select t1.a (select count(*) from t2 as t2 where t1.d = t2.d and t2.ww = 'праздник' ) from t1 as t1 В отличии от почти всех SQL серверов такая конструкция поддерживается. И это НЕ называется вложенный запрос. :-) |
|||
6
H A D G E H O G s
27.06.22
✎
16:46
|
(5) Это называется коррелирующий запрос и 1С это умеет
|
|||
7
Said_We
27.06.22
✎
16:48
|
В прямых запросах в 1С++ 7.7 подобной конструкцией значения периодических реквизитов доставалось.
Только вместо select АгрегатнаяФункция(*), в примере выше это count(*) использовалась конструкция select top 1 t.pole ... order by t.date desc Работала даже на версии 1С 7.7 в формате dbf, так как в качестве сервера работы с dbf в 1С++ использовался SQLite, который тоже поддерживает такие конструкции. Быстродействие очень хорошее. |
|||
8
Said_We
27.06.22
✎
16:49
|
(6) Не в таком виде 1С это умеет. Через Left join.
Это другой вид коррелирующего запроса. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |