Имя: Пароль:
1C
1С v8
Помогите найти ошибку в запросе
0 Joshim
 
19.09.11
14:08
Запрос = Новый Запрос;
       Запрос.Текст = "ВЫБРАТЬ
                      |    ТоварыКПолучениюНаСкладыОстатки.Номенклатура КАК Номенклатура,
                      |    СУММА(ТоварыКПолучениюНаСкладыОстатки.КоличествоОстаток) КАК КоличествоОстатокКомпании
                      |ИЗ
                      |    РегистрНакопления.ТоварыКПолучениюНаСклады.Остатки(
                      |            ,
                      |            ДокументПолучения ССЫЛКА Документ.ПриходныйОрдерНаТовары
                      |                И (ДокументПолучения.Дата МЕЖДУ &ПарНачПериода И &ПарКонПериода)) КАК ТоварыКПолучениюНаСкладыОстатки
                      |
                      |СГРУППИРОВАТЬ ПО
                      |    ТоварыКПолучениюНаСкладыОстатки.Номенклатура
                      |
                      |УПОРЯДОЧИТЬ ПО
                      |    Номенклатура";
       
       
       Запрос.УстановитьПараметр("ПарНачПериода", НачПериода);
       Запрос.УстановитьПараметр("ПарКонПериода", КонПериода);

Условие по дате отрабатывает не верно?
1 cViper
 
19.09.11
14:10
Запрос.УстановитьПараметр("ПарКонПериода", КонецДня(КонПериода));
2 mzelensky
 
19.09.11
14:10
(0) вот объясни пожалуйста, что ты вообще ПРЕДПОЛАГАЕШЬ выбрать этим запросом?
3 cViper
 
19.09.11
14:10
НачалоДня для  НачПериода
4 aleks-id
 
19.09.11
14:11
(3) ты уже в v8: Переход в начало выборки офигенно помог.. ага...
5 cViper
 
19.09.11
14:13
(4) Что сказать то хотел?
6 Joshim
 
19.09.11
14:13
(2) Остатки по Приходному ордеру
7 Maxus43
 
19.09.11
14:13
(2) +1
8 Joshim
 
19.09.11
14:14
началоДня() добавил, только выборка все равно пустая
9 Joshim
 
19.09.11
14:16
(8) не не пустая, все работает. НачалоДня не хватало спасибо
10 mzelensky
 
19.09.11
14:17
(6) какие остатки? по какому "Приходному ордеру" ???
11 asady
 
19.09.11
14:17
(0) СГРУППИРОВАТЬ ПО выбрось
12 mzelensky
 
19.09.11
14:17
(0) там у тебя либо какая-то очень хитрая задача...либо ты не понимаешь что хочешь!
13 salvator
 
19.09.11
14:19
(9) Когда решаешь подобного рода задачи, нужно представлять, что делаешь. А не так - тяп-ляп запрос, один раз запустил - не получил что хотел. И бегом постить на мисту...
14 Joshim
 
19.09.11
14:30
(13) повозился сначала часок, потом постил..
А как проверить в запросе заполнение параметра ПарНачПериода??
15 salvator
 
19.09.11
14:31
(14) Отладчик не предлагать? (с)
16 Joshim
 
19.09.11
14:31
(14) Пробовал ЕстьNull(ПарНачПериода, 0) - не работает, как еще?
17 Joshim
 
19.09.11
14:32
(15) условие в запросе поставить хочу: если ПарНачПериода заполнен тогда ..
Как можно сделать?
18 Axel2009
 
19.09.11
14:34
построитель запроса
19 Joshim
 
19.09.11
14:35
можно конечно так:

"ВЫБРАТЬ
....
РегистрНакопления.ТоварыКПолучениюНаСклады.Остатки(
                      |            ,
                      |            ДокументПолучения ССЫЛКА Документ.ПриходныйОрдерНаТовары
                      |                И (

?(ЗначениеЗаполнено(ПарНачПериода),"ДокументПолучения.Дата МЕЖДУ &ПарНачПериода И &ПарКонПериода", "") +"...

а так чтоб в запросе?
20 asady
 
19.09.11
14:37
(0) и вот это плохо
ДокументПолучения.Дата

Замени на
ВЫРАЗИТЬ(ДокументПолучения КАК Документ.ПриходныйОрдерНаТовары).Дата
21 Joshim
 
19.09.11
14:41
(20)
Можете в двух словах сказать почему так лучше?
22 asady
 
19.09.11
14:42
(21) платформа может сгенерировать неоптимальный запрос
поскольку ДокументПолучения имеет составной тип
23 salvator
 
19.09.11
14:42
(19) Если через одно место, то динамически собирай
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
                      |    ТоварыКПолучениюНаСкладыОстатки.Номенклатура КАК Номенклатура,
                      |    СУММА(ТоварыКПолучениюНаСкладыОстатки.КоличествоОстаток) КАК КоличествоОстатокКомпании
                      |ИЗ
                      |    РегистрНакопления.ТоварыКПолучениюНаСклады.Остатки(
                      |            ,
                      |            ДокументПолучения ССЫЛКА Документ.ПриходныйОрдерНаТовары";
Если ЗначениеЗаполнено(НачПериода) Тогда
  Запрос.Текст = Запрос.Текст + "
                      |                И (ДокументПолучения.Дата МЕЖДУ &ПарНачПериода И &ПарКонПериода)";
КонецЕсли;
Запрос.Текст = Запрос.Текст + ") КАК ТоварыКПолучениюНаСкладыОстатки
                      |
                      |СГРУППИРОВАТЬ ПО
                      |    ТоварыКПолучениюНаСкладыОстатки.Номенклатура
                      |
                      |УПОРЯДОЧИТЬ ПО
                      |    Номенклатура";

А лучше - (18)
24 Joshim
 
19.09.11
14:49
(22) спасибо

Подскажите, почему:
И ВЫРАЗИТЬ(ДокументПолучения КАК Документ.ПриходныйОрдерНаТовары).Дата >= &ПарНачПериода И ВЫРАЗИТЬ(ДокументПолучения КАК Документ.ПриходныйОрдерНаТовары).Дата >= &ПарКонПериода
Не работает?

                      (ВЫРАЗИТЬ(ДокументПолучения КАК Документ.ПриходныйОрдерНаТовары).Дата МЕЖДУ &ПарНачПериода И &ПарКонПериода    - работает нормально)
?
25 Joshim
 
19.09.11
14:50
(24) все сам вижу ошибку
26 cViper
 
19.09.11
14:54
(20)У него  в условиях виртуальной таблицы ССЫЛКА стоит.
27 asady
 
19.09.11
14:55
(26) ну и что?
28 cViper
 
19.09.11
15:53
(27) Смысл дублировать?
29 Axel2009
 
19.09.11
15:57
(28) чтобы не присоединялись лишние таблицы
30 cViper
 
19.09.11
16:04
(29) Это понятно, а разве (26) не делает этого?
31 Axel2009
 
19.09.11
16:19
(30) не делает. левое соединение будет в любом случае для всех таблиц составного типа если не указано ВЫРАЗИТЬ.