|
МоментВремени в условии ГДЕ в Запросе. | ☑ | ||
---|---|---|---|---|
0
PuhUfa
20.07.20
✎
17:14
|
Есть простой запрос:
ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ | ОтбираемыйДокумент.Ссылка |ПОМЕСТИТЬ ТаблицаДокументов |ИЗ | Документ.РеализацияТоваров КАК ОтбираемыйДокумент |ГДЕ | ОтбираемыйДокумент.Проведен | И ОтбираемыйДокумент.МоментВремени >= &ДатаНачала | И ОтбираемыйДокумент.МоментВремени <= &ДатаОкончания |"; ДатаНачала и ДатаОкончания - МоментВремени Запрос работает, вот только в выборку не попадают документы на основании которых создан момент времени. Делал через МЕЖДУ - результат тот же. Это нормально и просто нужно смириться или как то можно в результат запроса включить граничные документы? |
|||
1
lodger
20.07.20
✎
17:20
|
ВидГраницы - Определяет набор видов границ по отношению к граничному значению:
ВидГраницы.Включая - Граница включает граничное значение. ВидГраницы.Исключая - Граница исключает граничное значение. |
|||
2
PuhUfa
20.07.20
✎
17:23
|
(1) и с чем сравнивать Границу в условии ГДЕ? Что при сравнении с Дата, что при сравнении с МоментВремени получаю ошибку о том, что сравнивать можно только одинаковые типы.
|
|||
3
ZDenis
20.07.20
✎
17:23
|
Запрос.УстановитьПараметр("ДатаНачала", Новый Граница(Отчет.НачалоПериода, ВидГраницы.Включая) );
Запрос.УстановитьПараметр("ДатаОкончания", Новый Граница(Отчет.КонецПериода, ВидГраницы.Включая) ); |
|||
4
RomanYS
20.07.20
✎
17:40
|
(0) Условие ">=" вроде корректно работает с моментами, а вот "<=" почему-то возвращает ложь при равенстве.
Делай отдельно условия на дату и на ссылку. |
|||
5
PuhUfa
20.07.20
✎
17:43
|
(4) Понятно. Значит буду извращаться. Спс.
|
|||
6
fisher
20.07.20
✎
17:43
|
(0)(4) Странно. Выглядит ненормально. Но я в таком варианте и не использовал никогда.
|
|||
7
PuhUfa
20.07.20
✎
17:46
|
(6) Как минимум не логично это выглядит -)
|
|||
8
RomanYS
20.07.20
✎
17:52
|
(6) Там вообще странно
В консоли запросов УПП (на построителе) ВЫБРАТЬ АвансовыйОтчет.Ссылка, АвансовыйОтчет.Представление, АвансовыйОтчет.МоментВремени, &МоментВремени КАК МоментВремениПараметр, АвансовыйОтчет.МоментВремени <= &МоментВремени КАК Поле1, АвансовыйОтчет.МоментВремени >= &МоментВремени КАК Поле2, &МоментВремени <= &МоментВремени КАК Поле3, &МоментВремени >= &МоментВремени КАК Поле4 ИЗ Документ.АвансовыйОтчет КАК АвансовыйОтчет ГДЕ АвансовыйОтчет.МоментВремени >= &МоментВремени МоментВремени - нормально выводится, МоментВремениПараметр - выдает ошибку (Неверные параметры <<?>>&МоментВремени КАК МоментВремениПараметр) Поле1 и Поле2 - выводятся, Поле3 и Поле4 - выдают ошибку (Неверные параметры в операции сравнения. Нельзя сравнивать поля неограниченной длины и поля несовместимых типов. &МоментВремени <<?>><= &МоментВремени КАК Поле3) Проще считать, что запрос просто не умеет работать с моментами, проблем меньше будет |
|||
9
PuhUfa
20.07.20
✎
18:02
|
(8) Да уж. При таком раскладе лучше вообще отказаться от момента времени. Не ясно, что 1С еще не включит в запрос. Хотелось сделать красиво, а получится как всегда -)
|
|||
10
Конструктор1С
20.07.20
✎
18:19
|
Эээ... А в документе-то нафига отбирать по моменту времени? МВ создан для регистров
|
|||
11
RomanYS
20.07.20
✎
18:25
|
(10) нафига это ТС конечно интересно. А вот с "МВ создан для регистров" можно поспорить. Границы - да, вероятно для запросов к виртуальным таблицам, с МВ не так однозначно.
|
|||
12
Конструктор1С
20.07.20
✎
18:35
|
(11) ни разу в жизни даже в голову не пришло фильтровать документы по моменту времени. Они прекрасно отбираются по дате. Все документы внутри одной секунды неминуемо загребутся запросом, если эта секунда входит в диапазон отбора. А если нужно отобрать только часть документов внутри одной секунды... тут уже нужно сперва задуматься, для нафига оно надо
попробовал сейчас сделать отбор в документе по МВ (внутри МВ дата и ссылка), получилось вот такое уродство исходный запрос: ВЫБРАТЬ ПриходнаяНакладная.Ссылка КАК Ссылка, ПриходнаяНакладная.Номер КАК Номер, ПриходнаяНакладная.Дата КАК Дата, ПриходнаяНакладная.МоментВремени КАК МоментВремени ИЗ Документ.ПриходнаяНакладная КАК ПриходнаяНакладная ГДЕ ПриходнаяНакладная.МоментВремени >= &МоментВремени прилетело в СУБД: exec sp_executesql N'SELECT T1._IDRRef, T1._Number, T1._Date_Time, T1._Date_Time, T1._IDRRef FROM dbo._Document34 T1 WHERE (T1._Date_Time >= P1 AND (T1._Date_Time > @P2 OR (T1._Date_Time = @P3 AND (T1._IDRRef >= @P4))))',N'P1 datetime2(3),@P2 datetime2(3),@P3 datetime2(3),@P4 varbinary(16)','4020-01-01 00:00:00','4020-01-01 00:00:00','4020-01-01 00:00:00',0x831DB06EBF821FE511EAA1BCF0CEC88A |
|||
13
Йохохо
20.07.20
✎
18:38
|
(12) но ведь порядок не гарантирован
|
|||
14
RomanYS
20.07.20
✎
18:50
|
(12) а сделай условие "<="
|
|||
15
PuhUfa
20.07.20
✎
18:53
|
(10)(11) Своя последовательность. Свой РН. Документы при проведении движения по своему РН НЕ формируют. Движения потом доформировываются отдельным модулем. Движения зависимы от последовательности документов. ДатаНачала формируется как раз из текущей границы последовательности и от нее потом по порядку формируются/переформировываются движения по РН. Понятно, что брать все документы попавшие в секунду дополнительной нагрузки не дадут. Подумаешь, по каким то документам они сформируются без необходимости. Но поскольку, в запросе, можно выбрать МоментВремени то хотел сделать красиво -)
|
|||
16
Конструктор1С
20.07.20
✎
19:16
|
(13) но не в отборе же. Вот есть, допустим, 1000 документов первой секундой дня. Какой смысл отбирать из всей тыщи документы, которые позже ПриходнойНакладной №598? Технически-то оно возможно, но вот на бизнес-логику такой подход не натянуть
(14) то же самое exec sp_executesql N'SELECT T1._IDRRef, T1._Number, T1._Date_Time, T1._Date_Time, T1._IDRRef FROM dbo._Document34 T1 WHERE (T1._Date_Time <= P1 AND (T1._Date_Time < @P2 OR (T1._Date_Time = @P3 AND (T1._IDRRef <= @P4))))',N'P1 datetime2(3),@P2 datetime2(3),@P3 datetime2(3),@P4 varbinary(16)','4020-01-01 00:00:00','4020-01-01 00:00:00','4020-01-01 00:00:00',0x831DB06EBF821FE511EAA1BCF0CEC88A |
|||
17
Конструктор1С
20.07.20
✎
19:22
|
(15) и что, сильно много документов внутри одной секунды сидит?
|
|||
18
Йохохо
20.07.20
✎
19:23
|
(16) "но вот на бизнес-логику такой подход не натянуть " повторяемость это то что должен делать момент времени, решения не знаю
|
|||
19
PuhUfa
20.07.20
✎
19:35
|
(17) Нет не много. В моем случае вообще не критично. Говорю же - хотел сделать красиво раз в запросе есть МоментВремени. Уже переделал.
|
|||
20
RomanYS
20.07.20
✎
22:14
|
(16) интересно почему "<=" не корректно отрабатывает, если в SQL так переводится. Или криво только в файловой?
|
|||
21
Конструктор1С
21.07.20
✎
06:36
|
(20) вот такой странный отбор получился, если в отбор передать МВ с датой и ссылкой
ВЫБРАТЬ ПриходнаяНакладная.Ссылка КАК Ссылка, ПриходнаяНакладная.Номер КАК Номер, ПриходнаяНакладная.Дата КАК Дата ИЗ Документ.ПриходнаяНакладная КАК ПриходнаяНакладная ГДЕ ПриходнаяНакладная.МоментВремени >= &НачалоПериода И ПриходнаяНакладная.МоментВремени <= &КонецПериода exec sp_executesql N'SELECT T1._IDRRef, T1._Number, T1._Date_Time FROM dbo._Document34 T1 WHERE (T1._Date_Time >= P1 AND (T1._Date_Time > @P2 OR (T1._Date_Time = @P3 AND (T1._IDRRef >= @P4)))) AND (T1._Date_Time <= @P5 AND (T1._Date_Time < @P6 OR (T1._Date_Time = @P7 AND (T1._IDRRef <= @P8))))',N'P1 datetime2(3),@P2 datetime2(3),@P3 datetime2(3),@P4 varbinary(16),@P5 datetime2(3),@P6 datetime2(3),@P7 datetime2(3),@P8 varbinary(16)','4020-05-01 00:00:00','4020-05-01 00:00:00','4020-05-01 00:00:00',0x8325B06EBF821FE511EACB02EE9F02CB,'4020-07-01 00:00:00','4020-07-01 00:00:00','4020-07-01 00:00:00',0x831DB06EBF821FE511EAA1BCF0CEC88A |
|||
22
RomanYS
21.07.20
✎
11:00
|
(21) почему странный, вроде норм как и в (16). Почему глючит непонятно.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |