Имя: Пароль:
1C
1C 7.7
v7: аналог функции в sql макс(а,б)
0 Skom
 
02.12.14
12:37
что-то туплю под конец рабочего дня

надо, если значение меньше 0 то вернуть 0
без кейса в зпросе sql можно так сделать?
по аналогии с функцией МАКС(a1,...,aN)
1 ДенисЧ
 
02.12.14
12:39
а чем тебе case не угодил?
2 Skom
 
02.12.14
12:39
(1) пока писал впосро, вспомнил про кейс)
3 Skom
 
02.12.14
12:40
макс(а,б)
короче и красивее выглядит
4 zulu_mix
 
02.12.14
12:40
max
5 Ёпрст
 
02.12.14
12:40
select (abs(a)+a)/2
6 ДенисЧ
 
02.12.14
12:41
(5) А если там строки?
7 Ёпрст
 
02.12.14
12:43
(6) >>>сли значение меньше 0  
это строки разве ?
речь же о числах, разве нет ?
8 Skom
 
02.12.14
12:43
(5) конструкция сильно большая получается((((

с кейсом не прокатило
ругается на
when < 0
9 Skom
 
02.12.14
12:43
у меня числа
10 Ёпрст
 
02.12.14
12:43
ну и если строки, то кастом их кастом сперва :)
мли конвертом
11 Ёпрст
 
02.12.14
12:44
(8) чей то ?
12 ДенисЧ
 
02.12.14
12:44
(7) "аа" < "0" ?
Не?
13 Ёпрст
 
02.12.14
12:46
(12) :)
да числа у него, числа..
14 Skom
 
02.12.14
12:47
(11) потому что А  у меня -
$?????.????? - ($?????????????????.?????????????.???????($?????.?????????, :???????)*$?????.?????????/1000)
15 Skom
 
02.12.14
12:47
$ДокТЧ.Масса - ($ПоследнееЗначение.РезервуарыБаз.Мертвый($ДокТЧ.Резервуар, :КонДата)*$ДокТЧ.Плотность/1000)
16 Skom
 
02.12.14
12:49
Сделал через кейс.
(5) отдельное спасибо за то, что в очередной раз заставил мой мозг уйти от шаблонов)
17 Ёпрст
 
02.12.14
12:50
(15) Ну и ?
в case тоже будет "не мало кода"
:)
18 zulu_mix
 
02.12.14
12:51
(16) так чем max c правильной группировкой не угодил
19 Skom
 
02.12.14
12:55
потому что не удобно


|SELECT
as ГруппировкаКод,
    |    rtrim($групп.ГруппировкаИмя)            as ГруппировкаИмя,
    |    $Док.НефтеБаза                            as [Склад $Перечисления.Нефтебазы],
    |    Ресурсы.ID                                 as [Ресурс $Справочник.Ресурсы],
    |    $ДокТЧ.Масса                             as Остаток,
    |    Case
    |    When $ДокТЧ.Масса - ($ПоследнееЗначение.РезервуарыБаз.Мертвый($ДокТЧ.Резервуар, :КонДата)*$ДокТЧ.Плотность/1000) < 0 Then 0
    |    Else $ДокТЧ.Масса - ($ПоследнееЗначение.РезервуарыБаз.Мертвый($ДокТЧ.Резервуар, :КонДата)*$ДокТЧ.Плотность/1000)
    |    End as ОстатокЭффективный
    |FROM
    |  $ДокументСтроки.ПередачаСмены as ДокТЧ
    |LEFT JOIN
    |  $Справочник.Ресурсы as Ресурсы ON Ресурсы.ID = $ДокТЧ.ГСМ
    |INNER JOIN
    |  $Справочник.КачествоРесурса as КачествоРесурса ON КачествоРесурса.ID = $Ресурсы.Качество
    |LEFT JOIN
    |  $Справочник._КО_НастройкиОтчетов as групп ON $групп.ГруппировкаЗначение = КачествоРесурса.ID
    |INNER JOIN
    |  $Документ.ПередачаСмены as Док ON Док.IDDoc = ДокТЧ.IDDoc AND $Док.НефтеБаза IN "+Условия+"
    |INNER JOIN
    |  _1SJourn as Жур ON RIGHT(Жур.DATE_TIME_IDDOC, 9) = ДокТЧ.IDDoc AND
    |                     Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND
    |                     Жур.Closed & 1 = 1
20 Skom
 
02.12.14
12:55
строку 2 не смотреть
ее там нет
21 Ёпрст
 
02.12.14
12:56
(18) :)

ну напиши нам текст запроса, как с помощью max для таблички вида

-10
23
-21

получить
0
23
0
22 Ёпрст
 
02.12.14
12:58
(19)
|   (( $ДокТЧ.Масса - ($ПоследнееЗначение.РезервуарыБаз.Мертвый($ДокТЧ.Резервуар, :КонДата)*$ДокТЧ.Плотность/1000))+
|    ( $ДокТЧ.Масса - ($ПоследнееЗначение.РезервуарыБаз.Мертвый($ДокТЧ.Резервуар, :КонДата)*$ДокТЧ.Плотность/1000)))/2
|     as ОстатокЭффективный


ну и ? вот без кейса.. тоже самое по длине
23 Ёпрст
 
02.12.14
12:59
ну там, abs еще не вставил :)
24 Ёпрст
 
02.12.14
13:00
+23

|   (abs($ДокТЧ.Масса - ($ПоследнееЗначение.РезервуарыБаз.Мертвый($ДокТЧ.Резервуар, :КонДата)*$ДокТЧ.Плотность/1000))+
|     $ДокТЧ.Масса - ($ПоследнееЗначение.РезервуарыБаз.Мертвый($ДокТЧ.Резервуар, :КонДата)*$ДокТЧ.Плотность/1000))/2
|     as ОстатокЭффективный
25 Skom
 
02.12.14
13:12
согласись, с кейсом более читабельно?
26 Skom
 
02.12.14
13:13
если бы я через подзапрос делал, то твой вариант более короткий будет, а на таком длинном, кейс более читабельный
27 КонецЦикла
 
02.12.14
13:23

меньше 0 то вернуть 0

max(0, значение) - почему не сработало?

28 Ёпрст
 
02.12.14
13:27
(27) сделаешь воспроизводимый тест с max для (21) ?
29 Ёпрст
 
02.12.14
13:28
max же агрегатная функция...
30 Ёпрст
 
02.12.14
13:28
(25) ну, просил же без case
31 КонецЦикла
 
02.12.14
14:14

Через жпо можно, но зависит от контекста :)

create table #t(id int identity(1,1), val numeric(10,0))

insert into #t values(-10)
insert into #t values(23)
insert into #t values(-21)

select z.id, MAX(z.val)
from (
select id id
, 0 val
from #t

union all

select id id
, val val
from #t
) as z
group by z.id

32 Ёпрст
 
02.12.14
14:17
(31) ну блин, тут еще и доп колонка...
:)
в общем, можно и через коррелированный подзапрос, но..думаю это всё аутору не надо.
33 КонецЦикла
 
02.12.14
14:18

(32) Да, автор сам сразу не понял что ему... :)

Основная теорема систематики: Новые системы плодят новые проблемы.