|
Помогите с условием в запросе, не работает | ☑ | ||
---|---|---|---|---|
0
saf112
16.09.11
✎
11:54
|
[code]
ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ ( ВЫБРАТЬ РАЗЛИЧНЫЕ регистр2.Регистратор КАК регистратор, регистр2.РегистраторПоТП.УвеличениеЗаявленнойМощности КАК мощность ИЗ РегистрСведений.ТП_СостоянияДокументов КАК Регистр1, РегистрСведений.ТП_СостоянияДокументов КАК Регистр2 ГДЕ Регистр1.РегистраторПоТП = Регистр2.РегистраторПоТП И Регистр2.СостояниеДокумента.Код = "3.60" //договор подписан обеими сторонами И НЕ Регистр1.СостояниеДокумента.Код = "7.40" //но не исполнен (нет подписанных актов) ) как колво =714 ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ ( ВЫБРАТЬ РАЗЛИЧНЫЕ регистр2.Регистратор КАК регистратор, регистр2.РегистраторПоТП.УвеличениеЗаявленнойМощности КАК мощность ИЗ РегистрСведений.ТП_СостоянияДокументов КАК Регистр1, РегистрСведений.ТП_СостоянияДокументов КАК Регистр2 ГДЕ Регистр1.РегистраторПоТП = Регистр2.РегистраторПоТП И Регистр2.СостояниеДокумента.Код = "3.60" //договор подписан обеими сторонами //И НЕ Регистр1.СостояниеДокумента.Код = "7.40" //но не исполнен (нет подписанных актов) ) как колво =714 ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ ( ВЫБРАТЬ РАЗЛИЧНЫЕ регистр2.Регистратор КАК регистратор, регистр2.РегистраторПоТП.УвеличениеЗаявленнойМощности КАК мощность ИЗ РегистрСведений.ТП_СостоянияДокументов КАК Регистр1, РегистрСведений.ТП_СостоянияДокументов КАК Регистр2 ГДЕ Регистр1.РегистраторПоТП = Регистр2.РегистраторПоТП И Регистр2.СостояниеДокумента.Код = "3.60" //договор подписан обеими сторонами И Регистр1.СостояниеДокумента.Код = "7.40" //но не исполнен (нет подписанных актов) ) как колво =281 [/code] 1-й вариант - это то, что мне нужно. Но, как показывают варианты 2 и 3, работает он не так, как я ожидаю. Может подкинет кто идею? |
|||
1
PEPEL_1C
16.09.11
✎
12:00
|
Раз 1 вариант - то что нужно, в чем вопрос?
|
|||
2
saf112
16.09.11
✎
12:47
|
[quote]
Но, как показывают варианты 2 и 3, работает он не так, как я ожидаю. [/quote] |
|||
3
saf112
16.09.11
✎
12:51
|
если быть точным, строка
И НЕ Регистр1.СостояниеДокумента.Код = "7.40" что есть, что нет - результат один. В то же время, третий вариант указывает, что документы с кодом состояния "7.40" таки есть. Вот я и хочу, чтобы первый мой запрос выдавал 714-281=433 записи. |
|||
4
forforumandspam
16.09.11
✎
12:54
|
Может так надо:
И Регистр1.СостояниеДокумента = ЗНАЧЕНИЕ(Перечисление.КакоеТоПеречисление.КакоеТоЗначение) |
|||
5
saf112
16.09.11
✎
13:21
|
forforumandspam, шило на мыло же. Попробовал так, разницы нет.
С точки зрения логики(моей), запрос должен посчитать документы, у которых есть состояние с кодом "3.60", исключая те документы, которые кроме этого имеют состояние "7.40". На практике же он(запрос) считает первые НЕ исключая вторые. Может есть какая-нибуть особенность у регистра сведений? Или дырка в моей логике? |
|||
6
Рыжий Лис
16.09.11
✎
13:34
|
(5) В регистре хранится история состояний документов?
01.01 Регистратор1 Документ1 3.60 01.02 Регистратор2 Документ1 7.40 Тогда первый запрос вернет -2, второй -2, третий -1. А как нужно? |
|||
7
saf112
16.09.11
✎
13:50
|
(6) Да, хранится история состояний документов.
Мне нужны те документы, у которых состояние 3.60 есть, а 7.40 нет. ГДЕ Регистр1.Регистратор = Регистр2.Регистратор |
|||
8
saf112
16.09.11
✎
13:57
|
(6) Да, хранится история состояний документов.
Мне нужны те документы, у которых состояние 3.60 есть, а 7.40 нет. Вот псевдокод с говорящими именами, и как я вижу его работу (в комментариях) [code] ... ИЗ РегистрСведений.СостоянияДокументов как Регистр1, РегистрСведений.СостоянияДокументов как Регистр2 ГДЕ Регистр1.Регистратор = Регистр2.Регистратор //и Регистр1 и Регистр2 ссылаются на один документ И Регистр1.Состояние = 3.60 //у этого документа есть запись состояния 3.60 И НЕ Регистр2.Состояние = 7.40 //но нет записи состояния 7.40 [/code] |
|||
9
Рыжий Лис
16.09.11
✎
14:17
|
ВЫБРАТЬ РегистраторПоТП ИЗ РегистрСведений.ТП_СостоянияДокументов ГДЕ Состояние = 3.60 И РегистраторПоТП НЕ В (ВЫБРАТЬ РегистраторПоТП ИЗ РегистрСведений.ТП_СостоянияДокументов ГДЕ Состояние = 7.40) |
|||
10
saf112
16.09.11
✎
14:31
|
(9)Спасибо, понял, сейчас попробую!
|
|||
11
saf112
16.09.11
✎
14:42
|
(9) Рыжий Лис, все работает как надо, спасибо.
Не затруднит пояснить, почему в (1) вариант 3 работал правильно, а вариант 1 - нет? то есть, Первое условие И второе условие -работало, а Первое условие И НЕ Второе условие -нет? |
|||
12
Рыжий Лис
16.09.11
✎
16:55
|
(11) В результате соединения по твоему запросу без условий получается табличка из 4 строк.
Регистратор1 Документ1 3.60 Регистратор1 Документ1 3.60 Регистратор2 Документ1 7.40 Регистратор1 Документ1 3.60 Регистратор1 Документ1 3.60 Регистратор2 Документ1 7.40 Регистратор2 Документ1 7.40 Регистратор2 Документ1 7.40 условие 1 запроса вернет 1-ю строку, 2 вернет 1 и 2, 3 вернет 2. Запрос можно переписать и с соединениями, но понимания я думаю он не добавит. |
|||
13
saf112
19.09.11
✎
16:18
|
(12) Спасибо, вроде понятно.
Еще возникла проблема в связи с изменениями. Теперь надо отобрать те же документы, только просроченные. Раньше, в варианте с соединениями, это выглядело так: И РАЗНОСТЬДАТ(Регистр1.Период,Регистр2.Период,День) > 30 А теперь не у чего разность дат считать. Пытался скормить вложенный запрос, как аргумент РАЗНОСТЬДАТ - ругается. |
|||
14
Рыжий Лис
20.09.11
✎
13:34
|
(13) Переписать на запрос с соединениями
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |