Имя: Пароль:
1C
 
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) не приведешь :)
Основная теорема систематики: Новые системы плодят новые проблемы.