Имя: Пароль:
1C
1C 7.7
v7: 1c++, помогите с запросом
,
0 Skom
 
06.08.14
13:57
|SELECT
|    Выборка.ИД as ИД,
|    Выборка.Код as Код,
|    Выборка.Наименование as Наименование,
|--срок действия
|CASE Выборка.СрокДействияНев
|    WHEN '17530101' THEN Выборка.СрокДействия
|    ELSE Выборка.СрокДействияНев
|    END as СрокДействия
|FROM (
|    Select
|       Кошелек.ID as ИД,
|        Кошелек.CODE as Код,
|        Кошелек.DESCR as Наименование,
|        $Кошелек.Топливо as Топливо,
|        $Кошелек.ТипЛимита as ТипЛимита,
|        $Кошелек.Лимит as Лимит,
|        $Кошелек.СрокДействия as СрокДействия,
|        $ПоследнееЗначение._кошелькиТоплив.СрокДействияНев(Кошелек.ID, :ВыбДата) as СрокДействияНев
|    FROM
|        $Справочник._кошелькиТоплив as Кошелек (NoLock)
|    WHERE
|        Кошелек.ParentExt = ?ВыбВладелец(14,9)
|        ) as Выборка
|";
1 Ёпрст
 
06.08.14
13:57
Помогаю, это не снеговик.
2 Skom
 
06.08.14
13:57
Вот этот блок не отрабатывает как мне надо
|CASE Выборка.СрокДействияНев
|    WHEN '17530101' THEN Выборка.СрокДействия
|    ELSE Выборка.СрокДействияНев
|    END as СрокДействия
3 ДенисЧ
 
06.08.14
13:58
"Кошелек.ParentExt = ?ВыбВладелец(14,9)"

Это что за конструкция??

(2) Напиши его так, чтобы отрабатывал как надо...
4 Skom
 
06.08.14
13:58
(1) ну елы палы. ну ошибся секцией, с кем не бывает)

В общем вопрос такой, если в периодических реквизитах НЕТ записи с датой, то вернется null или вернется пустая дата?
5 Skom
 
06.08.14
13:59
(3) параметризированный запрос это
6 ДенисЧ
 
06.08.14
14:00
(4) а с чего она должна вернуться пустой?
7 Skom
 
06.08.14
14:01
Изначально было
|CASE Выборка.СрокДействияНев
|    WHEN NULL THEN Выборка.СрокДействия
|    ELSE Выборка.СрокДействияНев
|    END as СрокДействия

но так тоже не работает
8 Ёпрст
 
06.08.14
14:01
(4) ну есжели сумневаешься, воткни case isnull (Выборка.СрокДействияНев,'17530101')
9 Skom
 
06.08.14
14:02
мне не важно на что проверять, важно то, что ни с одним из вариантов не прокатило.
10 Skom
 
06.08.14
14:03
делаю проверку и на null и на '17530101', т.е. на пустую дату.
ни так ни так не работает.
СрокДействия = 31.12.2015
СрокДействияНев - нет такой даты, в любом варианте выдает пустую дату
11 Ёпрст
 
06.08.14
14:04
СрокДействияНев - rfrjuj [jnm nbgf nj gthbjlbxtcrbq htrdbpbn &
njxyj lfnf nj &
12 Skom
 
06.08.14
14:12
э
13 Андрюха
 
06.08.14
14:13
СрокДействияНев - какого хоть типа то периодический реквизит ?
точно дата?
14 mikecool
 
06.08.14
14:16
(10) пустая дата точно без времени?
15 MrKartez
 
06.08.14
14:19
думал, что 1с++ это стеб какой-то :D
16 Skom
 
06.08.14
14:35
(14) да, там нет времени. типа ДАТА
17 Skom
 
06.08.14
14:35
оба реквизита тип ДАТА
18 mikecool
 
06.08.14
14:36
(16) я про то, как пустая дата отображается в скуле, может надо нули во время записать, что бы совпадала
19 Skom
 
06.08.14
14:36
(15) мало ты повидал еще)
20 mikecool
 
06.08.14
14:37
а синтаксис кейса точно такой?
21 Skom
 
06.08.14
14:37
(18) '17530101' - пустая дата в скуле
22 Skom
 
06.08.14
14:37
такой.
23 Ёпрст
 
06.08.14
14:46
yf (11),(13) есть ответ ?
24 Skom
 
06.08.14
14:55
(23) точно дата, я же написал
25 Skom
 
06.08.14
14:56
ну немного промахнулся с номером поста)
26 Ёпрст
 
06.08.14
14:59
Ну и такой запрос чего хоть возвращает ?

Select
$ПоследнееЗначение._кошелькиТоплив.СрокДействияНев(Кошелек.ID, :ВыбДата) as СрокДействияНев
    FROM
        $Справочник._кошелькиТоплив as Кошелек (NoLock)
27 Ёпрст
 
06.08.14
15:01
и в зависимости от того, чего он возвращает лепи свой case

например так
case when Выборка.СрокДействияНев = Вася then Федя else Ваня end as наташа
28 trad
 
06.08.14
15:38
можно выразить все одним выражением и даже без подзапроса
29 trad
 
06.08.14
15:40
|Select
    |   Кошелек.ID as ИД,
    |    Кошелек.CODE as Код,
    |    Кошелек.DESCR as Наименование,
    |    $Кошелек.Топливо as Топливо,
    |    $Кошелек.ТипЛимита as ТипЛимита,
    |    $Кошелек.Лимит as Лимит,
    |    isnull(nullif($ПоследнееЗначение._кошелькиТоплив.СрокДействияНев(Кошелек.ID, :ВыбДата), {d '1753-01-01'}), $Кошелек.СрокДействия) as СрокДействия
    |FROM
    |    $Справочник._кошелькиТоплив as Кошелек (NoLock)
    |WHERE
    |    Кошелек.ParentExt = ?ВыбВладелец(14,9)
30 trad
 
06.08.14
15:42
(4) если на указанную дату нет значения, то вернется null
31 Ёпрст
 
06.08.14
15:47
(29) с nuliff красиво
32 Skom
 
06.08.14
16:34
завтра попробую.
мне проще через подзапрос сделать, более читабельно для меня получается. потому как полный текст запроса немного больше чем тот кусок, который я показал.
33 trad
 
06.08.14
17:27
(32) надо делать не как читабельнее для тебя, а, в первую очередь, как эффективнее с точки зрения плана выполнения запроса с учетом специфики поставщика ТП.
Если эффективно и читабельно одновременно, то гуд.
34 trad
 
06.08.14
17:43
Специфика ТП в первую очередь заключается в том, что к исходному запросу поставщик дорисовывает top N и условие по КП
А это может повлиять на план выполнения
35 Skom
 
07.08.14
05:23
(34) Данный код выполняется не часто, потому как этот запрос это третье ТП на форме и оно обновляется не часто. и данных там по 1-2 строке всего.
А вот то ТП, которое обновляется постоянно и автоматически, там да, нужно оптимизировать запросы. Согласен.
36 Skom
 
07.08.14
07:54
В sql выполняю, тип поля NULL
но все равно не работает как надо
37 Skom
 
07.08.14
07:56
Select
case vib.d2
when NULL then vib.d1
else vib.d2 end as d3,
vib.d1, vib.d2
From
(
select
Кошелек.sp8718 as d1,
(
select top 1
cast(case when c8965_vv.value = '  .  .    '
                     then '17530101'
                     else substring(c8965_vv.value, 7, 4) + substring(c8965_vv.value, 4, 2) + substring(c8965_vv.value, 1, 2)
                     end as datetime)
from
_1sconst as c8965_vv (nolock)
where
c8965_vv.id = 8965 and
c8965_vv.objid = '  DETW1  ' and
(c8965_vv.date <= '20140807')
order by c8965_vv.date desc, c8965_vv.time desc, c8965_vv.docid desc, c8965_vv.row_id desc
) as d2
FROM
sc8721 as Кошелек (NoLock)    

) as vib

в итоге имею таблицу

d1 - NULL
d2 - указана дата
d3 - NULL
38 Skom
 
07.08.14
08:00
ах блин. мистика. поставил
case isnull(vib.d2,'17530101')
when '17530101' then vib.d1

и все заработало.
39 trad
 
07.08.14
09:18
(37) с null нельзя сравнивать (точнее можно, только результат сравнения всегда false)
Для null есть только оператор is и две функции isnull, nullif
40 Skom
 
07.08.14
09:29
я знаю эти операторы, часто ими пользуюсь)
41 Дык ё
 
07.08.14
09:37
(40) sure? если бы знал, написал бы

case when vib.d2 is NULL then vib.d1 else vib.d2 end
42 trad
 
07.08.14
09:48
(41) по задаче вернее будет так
case when vib.d2 is NULL or vib.d2 = '17530101' then vib.d1 else vib.d2 end
43 Skom
 
07.08.14
10:03
(41) isnull() и is null немного разные...
Каюсь, забыл что надо is null писать((
Один фиг, через $ПоследнееЗначение долго отрабатывает.
Придется переписывать немного иначе.
44 Skom
 
07.08.14
10:03
всем спасибо.
45 trad
 
07.08.14
10:07
(43) "Один фиг, через $ПоследнееЗначение долго отрабатывает."
переиндексируй _1sconst
46 Skom
 
07.08.14
10:35
(45) ты имеешь в виду добавить индекс? или сделать реиндексацию таблицы? если второе, то планы обслуживания с этим справляются
47 trad
 
07.08.14
10:44
(46) ок
48 Skom
 
07.08.14
10:57
Просто у меня 4 периодических реквизита подобным образом сравниваются. придется переписать на такую конструкцию

(SELECT
        |            Период.objid as objid,
        |            Период.value as Значение
        |        FROM _1SCONST as Период
        |        WHERE
        |            Период.id = 1036 AND
        |            Период.date IN
        |                        (SELECT
        |                            MAX(Константа.date)
        |                        FROM _1SCONST as Константа
        |                        WHERE (Константа.date <= :ВыбДата) AND (Константа.id = 1036) AND (Константа.objid = Период.objid))
        |        ) as Период ON Период.Objid = ОЦВодила.ID
49 Skom
 
07.08.14
10:59
точнее такую.

                |SELECT
        | а,б,в,г,д,е,
                |        isnull(Период.Значение,"+ПустойИД9+") as Контрагент,
        |    FROM $Справочник.ОЦВодила as ОЦВодила (NoLock)
        |        LEFT JOIN
        |        (SELECT
        |            Период.objid as objid,
        |            Период.value as Значение
        |        FROM _1SCONST as Период
        |        WHERE
        |            Период.id = 1036 AND
        |            Период.date IN
        |                        (SELECT
        |                            MAX(Константа.date)
        |                        FROM _1SCONST as Константа
        |                        WHERE (Константа.date <= :ВыбДата) AND (Константа.id = 1036) AND (Константа.objid = Период.objid))
        |        ) as Период ON Период.Objid = ОЦВодила.ID
50 Skom
 
07.08.14
11:00
в общем, еще раз спасибо