Имя: Пароль:
1C
1С v8
Возвращает не число
,
0 alexoren
 
24.02.16
15:00
Доброго дня всем!

Вопрос кажется простой, но не вижу решения =(

Есть функция:

[code]

Функция СуммаПоБезналуЗаПериод( КассаККМ )
    
    Сумма = 0;
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    СУММА(ЧекККМОплатаПлатежнымиКартами.Сумма) КАК Сумма
        |ИЗ
        |    Документ.ЧекККМ.ОплатаПлатежнымиКартами КАК ЧекККМОплатаПлатежнымиКартами
        |ГДЕ
        |    ЧекККМОплатаПлатежнымиКартами.Ссылка.КассаККМ = &КассаККМ
        |    И ЧекККМОплатаПлатежнымиКартами.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаКонца";
    
    Запрос.УстановитьПараметр("ДатаНачала", ЭтотОбъект.ДатаНачалаПериода);
    Запрос.УстановитьПараметр("ДатаКонца", ЭтотОбъект.ДатаКонцаПериода + 24*60*60 - 1);
    Запрос.УстановитьПараметр("КассаККМ", КассаККМ);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        
        Сумма = ВыборкаДетальныеЗаписи.Сумма;
        
    КонецЦикла;

    Возврат Сумма;
    
КонецФункции

[/code]

Если ничего не находит, то при попытке

[code]

СуммаПоСертификатам = Число( СуммаПоСертификатамЗаПериод( ВыборкаДетальныеЗаписи.Касса ) );

[/code]

Выдаётся ошибка преобразования к числу, что не так то?
1 zenik
 
24.02.16
15:02
ISNULL(ЧекККМОплатаПлатежнымиКартами.Сумма,0)
2 alexoren
 
24.02.16
15:03
(1) Эм, так ведь я изначально задал Сумма = 0
Или он воспринимает, как булево?
3 zenik
 
24.02.16
15:03
ISNULL = ЕстьNULL :)
4 zenik
 
24.02.16
15:03
Не, у тебя может не быть документов в этом периоде, тогда будет NULL а не 0
5 alexoren
 
24.02.16
15:05
(4)
Эм, ещё раз я до цикла задал сумму 0, а в цикле её меняю, если не изменилась возратиться должен 0 =) Нет?
6 alexoren
 
24.02.16
15:06
(4) гляньте код функции )
7 alexoren
 
24.02.16
15:07
(1) Кстати 8.3.7.1917 не знает такой функции )
УТ 11.2 =)
8 Fragster
 
гуру
24.02.16
15:07
(5) с чего это?
9 Fragster
 
гуру
24.02.16
15:07
(7) это в запросе
10 Lexey_
 
24.02.16
15:07
(4) в этом запросе не будет NULLа
(5) как связана функция СуммаПоБезналуЗаПериод() со строкой "СуммаПоСертификатам = Число( СуммаПоСертификатамЗаПериод( ВыборкаДетальныеЗаписи.Касса ) );" ?
11 Fragster
 
гуру
24.02.16
15:07
только ЕстьNULL(Сумма(...), 0)
12 zenik
 
24.02.16
15:07
> если не изменилась возратиться должен 0
А есть изменилась, то ?
Код глянул - значит меняется. Значит выборка не пустая, значит глядите что вам запрос возращает
13 Fragster
 
гуру
24.02.16
15:08
(10)
ВЫБРАТЬ
    СУММА(133) КАК Поле1
ГДЕ
    ЛОЖЬ
14 ObjectRelation Model
 
24.02.16
15:10
(10) может быть NULL
15 Lexey_
 
24.02.16
15:12
(13), (14), да, на СУММА не обратил внимания
16 alexoren
 
24.02.16
15:12
(10) Сори мой косяк не ту строку бросил

&НаСервере
Функция СуммаПоСертификатамЗаПериод( КассаККМ )
    
    Сумма = 0;
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    СУММА(ЧекККМПодарочныеСертификаты.Сумма) КАК Сумма
        |ИЗ
        |    Документ.ЧекККМ.ПодарочныеСертификаты КАК ЧекККМПодарочныеСертификаты
        |ГДЕ
        |    ЧекККМПодарочныеСертификаты.Ссылка.КассаККМ = &КассаККМ
        |    И ЧекККМПодарочныеСертификаты.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаКонца";
    
    Запрос.УстановитьПараметр("ДатаНачала", ЭтотОбъект.ДатаНачалаПериода);
    Запрос.УстановитьПараметр("ДатаКонца", ЭтотОбъект.ДатаКонцаПериода + 24*60*60 - 1);
    Запрос.УстановитьПараметр("КассаККМ", КассаККМ);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Сообщить( ВыборкаДетальныеЗаписи.Количество() );
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        
        Сумма = ВыборкаДетальныеЗаписи.Сумма;
        
    КонецЦикла;
    
    Возврат Сумма;    
    
КонецФункции
17 hhhh
 
24.02.16
15:12
(14) не, СУММА() всегда дает число.
(10)+  текст функции СуммаПоСертификатамЗаПериод в студию.
18 alexoren
 
24.02.16
15:13
(17) Скинул чуть выше (16)
19 alexoren
 
24.02.16
15:14
(17) да не ту записей в таблице ) уже проверил, должно вернуться 0 - число а не пойми что возвращается
20 Fragster
 
гуру
24.02.16
15:14
(17) -> (13)
21 Fragster
 
гуру
24.02.16
15:14
(19) консоль запросов есть?
22 ObjectRelation Model
 
24.02.16
15:15
(17) ты путаешь СУММА с КОЛИЧЕСТВО
23 hhhh
 
24.02.16
15:27
(19) не, ребята правы. Если пишешь

  СУММА(ЧекККМПодарочныеСертификаты.Сумма) КАК Сумма

то запись есть. Запрос выдаст одну пустую строчку.
24 НЕА123
 
24.02.16
15:30
возврат (?ВыборкаДетальныеЗаписи.Следующий(),  
        Сумма = ВыборкаДетальныеЗаписи.Сумма,
0)
25 НЕА123
 
24.02.16
15:31
*
возврат ?(ВыборкаДетальныеЗаписи.Следующий(),  
        ВыборкаДетальныеЗаписи.Сумма,
0)
26 alexoren
 
24.02.16
16:39
(25) та же фигня..
27 alexoren
 
24.02.16
16:41
Дело в запросе! )))

Ну как никто не заметил, а ступил... (

    Запрос.Текст =
        "ВЫБРАТЬ
        |    СУММА(ЧекККМПодарочныеСертификаты.Сумма) КАК Сумма,
        |    ЧекККМПодарочныеСертификаты.Ссылка.КассаККМ
        |ИЗ
        |    Документ.ЧекККМ.ПодарочныеСертификаты КАК ЧекККМПодарочныеСертификаты
        |ГДЕ
        |    ЧекККМПодарочныеСертификаты.Ссылка.КассаККМ = &КассаККМ
        |    И ЧекККМПодарочныеСертификаты.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
        |
        |СГРУППИРОВАТЬ ПО
        |    ЧекККМПодарочныеСертификаты.Ссылка.КассаККМ";


Добавить надо было группировочное поле!
28 Nuobu
 
24.02.16
16:46
(27) Не совсем.
Если ты отбираешь так записи, что у тебя нет ни одной записи, а в полях есть только одно поле: Сумма, Количество, или еще какая-то агрегатная функция, то оно возвращает ОДНУ строку с этим полем, но не с нульом, как может показаться, а с NULL. А вот если добавить группировку, то всё нормально выводится, то бишь ноль, а не NULL.
В твоём случае, не меняя запрос, т.к. ты выбираешь только одну кассу и получать её в запросе не имеет смысла, можно было изменить строку:
Сумма = ВыборкаДетальныеЗаписи.Сумма;
на эту
Сумма = ?(ВыборкаДетальныеЗаписи.Сумма = NULL, 0, ВыборкаДетальныеЗаписи.Сумма);
29 alexoren
 
24.02.16
17:23
(28) Да спасибо, так будет лаконичнее )
Сверху ребята писали, но не глянул что поряд условий не тот.

Всём спасибо )
30 alexoren
 
24.02.16
21:12
В общем опять та же песня...

    Сумма = 0;
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    СУММА(ЧекККМПодарочныеСертификаты.Сумма) КАК Сумма,
        |    ЧекККМПодарочныеСертификаты.Ссылка.КассаККМ
        |ИЗ
        |    Документ.ЧекККМ.ПодарочныеСертификаты КАК ЧекККМПодарочныеСертификаты
        |ГДЕ
        |    ЧекККМПодарочныеСертификаты.Ссылка.КассаККМ = &КассаККМ
        |    И ЧекККМПодарочныеСертификаты.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
        |
        |СГРУППИРОВАТЬ ПО
        |    ЧекККМПодарочныеСертификаты.Ссылка.КассаККМ";
    
    Запрос.УстановитьПараметр("ДатаНачала", ЭтотОбъект.ДатаНачалаПериода);
    Запрос.УстановитьПараметр("ДатаКонца", ЭтотОбъект.ДатаКонцаПериода + 24*60*60 - 1);
    Запрос.УстановитьПараметр("КассаККМ", КассаККМ);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Возврат ?(ВыборкаДетальныеЗаписи.Следующий() = NULL,  
            0, ВыборкаДетальныеЗаписи.Сумма);
31 alexoren
 
24.02.16
21:13
Да же при условии группировки, если не было сертификатов за период, то кажет фигу и выводит не число
32 alexoren
 
24.02.16
21:17
Нееее, стоп наоборот если сертификаты пустые то всё норм, а если есть то косяк
33 hhhh
 
24.02.16
21:28
ВыборкаДетальныеЗаписи.Следующий() = NULL - сколько литров выпил, прежде чем родить этот бред?
34 alexoren
 
24.02.16
21:31
(33) Сори мужик, каюсь (
Завтра сдавать отчёт директору уже вторые сутки.. Балда я в общем )


Спс, ещё раз )
35 youalex
 
25.02.16
00:39
(0) не понял,  код выдает ошибку? :
"Число( СуммаПоСертификатамЗаПериод( ВыборкаДетальныеЗаписи.Касса ) );"
36 youalex
 
25.02.16
00:39
(35) этот код?