Имя: Пароль:
1C
1С v8
Небольшой вопрос по функции МАКСИМУМ()
0 stateg
 
06.11.14
12:51
Добрый день.

В запросе есть проверка поля на NULL. В случае отлова нулла хочется видеть максимальное значение поля, но на 1 больше. То есть если значение не указано, то оно должно быть больше всех имеющихся. Возможно ли это реализовать непосредственно в запросе, а не постобработке результата? И если да, то каким образом, спасибо

зы ISNULL(Поле, 9999...) не предлагать :D
1 vicof
 
06.11.14
12:53
ISNULL(Поле, 9999) чем не устраивает?
2 stateg
 
06.11.14
12:55
(1) Как-то не по феншую. А если однажды появится значение 10000? Тогда 9999 уже не будет наибольшим
3 Фокусник
 
06.11.14
12:56
(2) Не жадничай, добавь девяток побольше ;)
4 Timon1405
 
06.11.14
12:57
ОченьБольшоеЧисло = 9999999999; © УТ11(!)
5 stateg
 
06.11.14
13:04
Так значит к значению поля прибавить единицу никак не представляется возможным внутри запроса?
6 Жан Пердежон
 
06.11.14
13:11
объединения/соединения, вариантов масса
7 VladZ
 
06.11.14
13:12
(4) Это решение еще в семерке попадалось.
8 KAO111
 
06.11.14
13:14
а в чем проблема, для простоты можно максимум получить в первом пакете, тут вроде как раз спокойно можно эту задачу решить
9 КонецЦикла
 
06.11.14
13:16
(5) К нулл прибавить единицу? Тогда уж вложенным запросом для записей имевших там нулл прибавить к максимальному значению еще 1. Но нафига?
10 Fragster
 
гуру
06.11.14
13:22
если это тупо для сортировки, то сделать поле ПорядокNULL, и заполнять его 1 и 0 для NULL и не NULL, соответственно, сортировать по нему в первую очередь (в нужном направлении)
11 Зеленый пень
 
06.11.14
13:23
(0)
ВЫБРАТЬ
ВЫБОР
КОГДА МАКСИМУМ(Поле) ЕСТЬ NULL
  ТОГДА  1
КОГДА МАКСИМУМ(ВЫБОР КОГДА Поле ЕСТЬ NULL ТОГДА 1 ИНАЧЕ 0 КОНЕЦ) = 1
  ТОГДА МАКСИМУМ(Поле) + 1
ИНАЧЕ МАКСИМУМ(Поле)
КОНЕЦ
12 Ненавижу 1С
 
гуру
06.11.14
13:24
ВЫБРАТЬ
    Контрагенты.Ссылка,
    ЕСТЬNULL(ПродажиОбороты.СтоимостьОборот, ВложенныйЗапрос.Поле1) КАК Поле1
ИЗ
    Справочник.Контрагенты КАК Контрагенты
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
        ПО (ПродажиОбороты.Контрагент = Контрагенты.Ссылка),
    (ВЫБРАТЬ
        МАКСИМУМ(ПродажиОбороты.СтоимостьОборот) + 1 КАК Поле1
    ИЗ
        РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты) КАК ВложенныйЗапрос
13 stateg
 
06.11.14
13:38
(10) В моем случае сортировка производится по нескольким полям. Это получается "костыль" для "костыля", еще больше не по фен шую, чем ОченьБольшоеЧисло
(11) За "МАКСИМУМ(Поле) + 1" я был послан отладчиком
(12) Пожалуй это будет самое правильное решение, спасибо :)
14 Fragster
 
гуру
06.11.14
13:42
(12) а если несколько полей с NULL?
15 Fragster
 
гуру
06.11.14
13:42
(14)* строк
16 stateg
 
06.11.14
14:06
(12) Рано я обрадовался. У вас тот же МАКСИМУМ() + 1, отладчик выдает на нем ошибку (Неверные параметры "+"). Собственно из этого я и исходил при создании названия топика, но потом меня слегка унесло))
17 vicof
 
06.11.14
14:13
(16) Нечего радоваться, тут серьезный форум. Давай, рассказывай задачу.
18 dk
 
06.11.14
14:14
(16) ну и вынеси +1 выше
19 stateg
 
06.11.14
14:23
(16)Даже в таком случае:

ВЫБРАТЬ ПЕРВЫЕ 1
  (Значение + 1) КАК Максимум
ИЗ ...
УПОРЯДОЧИТЬ ПО
  (Значение + 1) УБЫВ

выдает ошибку на строке где + 1. Получается, что в запросе можно складывать значения полей, но нельзя прибавить к значению единицу?
Пруф: i.imgur.com/w0GdfGR.png

(17) Задача банальна - настраиваемая сортировка. Поля с заданными значениями выводятся по возрастанию значения, поля с NULL выводятся после

Пока что из рабочих вариантов только ISNULL(Поле, 9999)
20 13_Mult
 
06.11.14
14:26
(19) ВЫРАЗИТЬ как число?
21 vicof
 
06.11.14
14:28
(20) Какой выразить, он к нулл прибавляет единицу
22 13_Mult
 
06.11.14
14:34
вот изварт ))
МАКСИМУМ(ВЫРАЗИТЬ(ЕстьNULL(ВашеЗначение, 0) КАК ЧИСЛО(15, 2)))+1 КАК МАКСИМУМ
23 stateg
 
06.11.14
14:35
(20) Никто не прибавляет единицу к нуллу =/ Или отладчик на момент компиляции уже знает, что там может быть нулл? Скрин я сделал просто для демонстрации ошибки
24 stateg
 
06.11.14
14:38
(20) За ВЫРАЗИТЬ() спасибо, этого не хватало в (12), теперь должно быть все ок. Хотя и все равно костыль для костыля)
25 13_Mult
 
06.11.14
14:45
Да получи Максимум по таблице, прибавь единицу и подставь потом туда где NULL
26 13_Mult
 
06.11.14
14:49
(24) Ни чего не костыль )) (12) нормальная запросина
27 chudishe
 
06.11.14
14:54
Все тлен. Вот тебе правильное решение:

ВЫБРАТЬ
    Таблица.Поле1,
    Таблица.Поле2
ПОМЕСТИТЬ ВТ_Таблица
ИЗ
    &Таблица КАК Таблица
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Таблица.Поле1,
    МАКСИМУМ(ЕСТЬNULL(ВТ_Таблица.Поле2, ВложенныйЗапрос.Поле2)) КАК Поле3
ИЗ
    ВТ_Таблица КАК ВТ_Таблица
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ВТ_Таблица.Поле1 КАК Поле1,
            МАКСИМУМ(ВТ_Таблица.Поле2) КАК Поле2
        ИЗ
            ВТ_Таблица КАК ВТ_Таблица
        
        СГРУППИРОВАТЬ ПО
            ВТ_Таблица.Поле1) КАК ВложенныйЗапрос
        ПО ВТ_Таблица.Поле1 = ВложенныйЗапрос.Поле1

СГРУППИРОВАТЬ ПО
    ВТ_Таблица.Поле1
28 chudishe
 
06.11.14
14:55
(27) +1 забыл.

ВЫБРАТЬ
    Таблица.Поле1,
    Таблица.Поле2
ПОМЕСТИТЬ ВТ_Таблица
ИЗ
    &Таблица КАК Таблица
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Таблица.Поле1,
    МАКСИМУМ(ЕСТЬNULL(ВТ_Таблица.Поле2, ВложенныйЗапрос.Поле2)) КАК Поле3
ИЗ
    ВТ_Таблица КАК ВТ_Таблица
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ВТ_Таблица.Поле1 КАК Поле1,
            МАКСИМУМ(ВТ_Таблица.Поле2 + 1) КАК Поле2
        ИЗ
            ВТ_Таблица КАК ВТ_Таблица
        
        СГРУППИРОВАТЬ ПО
            ВТ_Таблица.Поле1) КАК ВложенныйЗапрос
        ПО ВТ_Таблица.Поле1 = ВложенныйЗапрос.Поле1

СГРУППИРОВАТЬ ПО
    ВТ_Таблица.Поле1
29 13_Mult
 
06.11.14
14:59
(28) упадет на этом (ВТ_Таблица.Поле2 + 1) если Поле2 = NULL ))
30 stateg
 
06.11.14
15:09
(27) Спасибо, но правильное решение (12) + (20)
31 chudishe
 
06.11.14
17:17
(29) Нет, не упадет. Результатом любой операции с NULL будет внезапно NULL.

(30) Давай ты для начала проверишь эти решения, ага?
Давай я даже для тебя разберу по-порядку. Вложенный запрос этого товарища (12) вычислит максимум ПО ВСЕМУ ЧТО У ТЕБЯ ЕСТЬ.

Т.е. есть у тебя, например, таблица:

Контрагент | Номенклатура | Количество
Василий    | Ватник       | 5
Василий    | Шапка-ушанка | 10
Василий    | Новая машина | NULL
Анатолий   | Путинка      | 15
John Smith | Burgers      | NULL


Так вот как ты думаешь, что ты получишь в результате выполнения его запроса?

Ты получишь вот это:

Контрагент | Количество
Василий    | 16
Анатолий   | 16
John Smith | 16


Если тебе так и надо, то пожалуйста, дерзай!
32 stateg
 
07.11.14
08:32
(31) мне и нужен был максимум по всему что есть, а упадет, т.к. как оказалось недостаточно просто взять поле и прибавить к нему + 1. Надо использовать функцию ВЫРАЗИТЬ(), в этом собственно и была главная загвоздка

(ВЫРАЗИТЬ(ВТ_Таблица.Поле2 КАК Число) + 1) если Поле2 = NULL
33 chudishe
 
07.11.14
09:16
(32) У меня почему-то ничего не упало. Я свой запрос протестировал, например.
34 МишельЛагранж
 
07.11.14
10:04
(32)>>если Поле2 = NULL
- так прямо и напиши в запросе