![]() |
![]() |
![]() |
|
CASE в запросе 1С ++ | ☑ | ||
---|---|---|---|---|
0
dimm7310
27.08.10
✎
13:14
|
в запросе есть строка
| , (CASE WHEN NOT $ВозвратыТовара.Ответ =:аОтвет THEN 0 ELSE 1 END) as Ответ в запрос передается параметр RS.УстановитьТекстовыйПараметр("аОтвет", Перечисление.Булево.Да); ошибок запрос не выдает, результатом для поля "Ответ" всегда 0 Это из-за того, что Оператор Case - может работать только с простыми типами данных ? (типа число, дата) |
|||
1
dimm7310
27.08.10
✎
13:15
|
Если Case в данном случае не применим, то как посчитать оличество положительных ответов "Да" в запросе?
|
|||
2
Sadovnikov
27.08.10
✎
13:18
|
(0) "Оператор Case - может работать только с простыми типами данных ? (типа число, дата)" - а много ты видел в скуле других типов?
|
|||
3
dimm7310
27.08.10
✎
13:22
|
(2) в скуле не очень силен, потому и спрашиваю. Может быть можно сравнить в текстовом виде?
|
|||
4
Sadovnikov
27.08.10
✎
13:25
|
(3) Так ты в текстовом виде и сравниваешь.
Больше запроса покажи. И не делай инверсных сравниваний. | , (CASE WHEN $ВозвратыТовара.Ответ =:аОтвет THEN 1 ELSE 0 END) as Ответ |
|||
5
dimm7310
27.08.10
✎
13:26
|
вот весь запрос
ТекстЗапроса = " |SELECT | $ВозвратыТовара.Контрагент [Контрагент $Справочник.Контрагенты] | , 1 as Счетчик | , $ВозвратыТовара.Сумма Сумма | , $ВозвратыТовара.Причина [Причина $Справочник.ПричиныВозвратаТовара] | , $ВозвратыТовара.Доставка Доставка | , $ВозвратыТовара.Коммент Коммент // | , $ВозвратыТовара.Ответ [Ответ $Перечисление.ВозвратОтвет] | , (CASE WHEN NOT $ВозвратыТовара.Ответ =:аОтвет THEN 0 ELSE 1 END) as Ответ | , $ВозвратыТовара.Компенсировано [Компенсировано $Перечисление.ВозвратКомпенсировано] |FROM $Регистр.ВозвратыТовара AS ВозвратыТовара | INNER JOIN _1SJourn Журн(nolock) on Журн.[IDDOC] = right(ВозвратыТовара.DATE_TIME_IDDOC, 9) |WHERE | Журн.Date_Time_IDDoc BETWEEN :Дата1 AND :Дата2~ "; Если ПустоеЗначение(аКонтра)=0 Тогда ТекстЗапроса = ТекстЗапроса + " | and $ВозвратыТовара.Контрагент =:аКонтра"; КонецЕсли; ТекстЗапроса = ТекстЗапроса + " | order by ВозвратыТовара.DATE_TIME_IDDOC |"; RS = СоздатьОбъект("ODBCRecordset"); RS.УстБД1С(); RS.УстановитьТекстовыйПараметр("Дата1", Дата1); RS.УстановитьТекстовыйПараметр("Дата2", Дата2); RS.УстановитьТекстовыйПараметр("аКонтра", аКонтра); RS.УстановитьТекстовыйПараметр("аОтвет", Перечисление.Булево.Да); ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса); |
|||
6
dimm7310
27.08.10
✎
13:27
|
(4) я пробовал так вначале - тот же результат
|
|||
7
Злой Бобр
27.08.10
✎
13:32
|
|SELECT
| $ВозвратыТовара.Контрагент [Контрагент $Справочник.Контрагенты] | , $ВозвратыТовара.Сумма Сумма | , $ВозвратыТовара.Причина [Причина $Справочник.ПричиныВозвратаТовара] | , $ВозвратыТовара.Доставка Доставка | , $ВозвратыТовара.Коммент Коммент | , $ВозвратыТовара.Компенсировано [Компенсировано $Перечисление.ВозвратКомпенсировано] |FROM $Регистр.ВозвратыТовара AS ВозвратыТовара | INNER JOIN _1SJourn Журн(nolock) on Журн.[IDDOC] = right(ВозвратыТовара.DATE_TIME_IDDOC, 9) |WHERE (Журн.Date_Time_IDDoc BETWEEN :Дата1 AND :Дата2~) | AND ($ВозвратыТовара.Ответ=$Перечисление.Булево.Да)"; ... |
|||
8
Sadovnikov
27.08.10
✎
13:32
|
(5) На первый взгляд, вроде, должно работать. Тип "Ответ" - точно перечисление Булево?
Ну и запрос я бы вот так чуток изменил бы: ТекстЗапроса = " |SELECT | $ВозвратыТовара.Контрагент [Контрагент $Справочник.Контрагенты] | , $ВозвратыТовара.Сумма Сумма | , $ВозвратыТовара.Причина [Причина $Справочник.ПричиныВозвратаТовара] | , $ВозвратыТовара.Доставка Доставка | , $ВозвратыТовара.Коммент Коммент | , (CASE WHEN $ВозвратыТовара.Ответ = :аОтвет THEN 1 ELSE 0 END) as Ответ | , $ВозвратыТовара.Компенсировано [Компенсировано $Перечисление.ВозвратКомпенсировано] |FROM | $Регистр.ВозвратыТовара (NoLock) ВозвратыТовара |WHERE | ВозвратыТовара.Date_Time_IDDoc BETWEEN :Дата1 AND :Дата2~ "; |
|||
9
Злой Бобр
27.08.10
✎
13:35
|
+7 Ну или если CASE принципиально то
(CASE WHEN NOT $ВозвратыТовара.Ответ =$Перечисление.Булево.Да THEN 0 ELSE 1 END) as Ответ |
|||
10
dimm7310
27.08.10
✎
13:41
|
(7) мне не нужно условие, я хочу посчитать сколько в том числе с ответом "Да"
(9) Попробовал, результат - тот же |
|||
11
Злой Бобр
27.08.10
✎
13:44
|
(10) Ну тогда у тебя в выборке только $ВозвратыТовара.Ответ <>$Перечисление.Булево.Да
или $ВозвратыТовара.Ответ не является этим перечислением. |
|||
12
Дык ё
27.08.10
✎
13:45
|
(8) судя по ремарке в (5) - тип "Ответ" точно не Булево :-)
|
|||
13
Ёпрст
гуру
27.08.10
✎
13:46
|
(0) ?
Сообщить(Метаданные.Регистр("ВозвратыТовара").Измерение("Ответ").Тип); Сообщить(Метаданные.Регистр("ВозвратыТовара").Измерение("Ответ").вид); |
|||
14
Sadovnikov
27.08.10
✎
13:48
|
(12) Кстати, да :)
|
|||
15
dimm7310
27.08.10
✎
13:51
|
Извините люди добрые, что отвлек (туплю к концу недели)
Действительно в регистре другое очень похожее по содержанию перечисление |
|||
16
Sadovnikov
27.08.10
✎
13:57
|
(15) Не извиню, пока запрос к виду в (8) не приведешь :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |