|
v7: 1с++ и периодические реквизиты. | ☑ | ||
---|---|---|---|---|
0
Skom
17.04.14
✎
12:26
|
Имеем:
СправочникА: Наименование, Контрагент (периодический) + другие поля СправочникБ: Наименование, Контрагент (периодический) + другие поля СправочникБ подчинен справочнику А. Необходимо выбрать все элементы из СправочникБ, где Контрагент = СправочникБ.Контрагент на текущую + !!!Внимание!!! Выбрать все элементы из СправочникБ, где Контрагент = пустое значение, но контрагент у родителя = исходному контрагенту. У меня лично получается очень долгий запрос. Всего в справочнике 500000 элементов. |
|||
1
Skom
17.04.14
✎
12:27
|
сейчас примерный текст запроса прриведу
|
|||
2
Skom
17.04.14
✎
12:33
|
| SELECT
| ОЦВодила.ParentExt as ОЦПредприятие, | ОЦВодила.ID as ИД, | $ПоследнееЗначение.ОЦВодила.Контрагент(ОЦВодила.ID,:ВыбДата),' 0 ') as Контрагент | FROM | $Справочник.ОЦВодила as ОЦВодила (NoLock) | WHERE | $ПоследнееЗначение.ОЦВодила.Контрагент(ОЦВодила.ID,:ВыбДата) = "+текКонтрагент+" | | UNION ALL | | SELECT | ОЦВодила2.ParentExt as ОЦПредприятие, | ОЦВодила2.ID as ИД, | isnull($ПоследнееЗначение.ОЦВодила.Контрагент(ОЦВодила2.ID,:ВыбДата),' 0 ') as Контрагент | FROM $Справочник.ОЦВодила as ОЦВодила2 (NoLock) | WHERE | isnull($ПоследнееЗначение.ОЦВодила.Контрагент(ОЦВодила2.ID,:ВыбДата),' 0 ') = "+текКонтрагент+") | And ОЦВодила2.ParentExt IN | ( | Select | ОЦПредприятия.ID | From | $Справочник.ОЦПредприятия as ОЦПредприятия (NoLock) | WHERE | $ПоследнееЗначение.ОЦПредприятия.Контрагент(ОЦПредприятия.ID,:ВыбДата) = "+текКонтрагент | ) |
|||
3
Maxus43
17.04.14
✎
12:33
|
это клюшки же, переношу
|
|||
4
Skom
17.04.14
✎
12:34
|
ага. перенеси плиз, не обратил внимания на секцию
|
|||
5
Skom
17.04.14
✎
12:34
|
ОЦВодила - это справочникБ
ОЦПредприятия - СправочникА |
|||
6
Skom
17.04.14
✎
12:35
|
в общем, такая реализация запроса выполняется довольно долго.
|
|||
7
ТогдаКонецЕсли
17.04.14
✎
12:47
|
посмотри отдельно - сколько выполняется первый запрос, до union all, и второй.
Вообще то есть хранимые процедуры, получающие значение периодического реквизита на дату. Тогда все вообще упрощается. |
|||
8
Ёпрст
17.04.14
✎
12:47
|
нет сравнения на пустого контрагента во втором запросе
|
|||
9
КонецЦикла
17.04.14
✎
12:50
|
Называй нормально, что значит "ОЦВодила2"?
|
|||
10
Skom
17.04.14
✎
12:54
|
(8) не совсем понял
|
|||
11
Ёпрст
17.04.14
✎
12:55
|
(10)
>>>>Выбрать все элементы из СправочникБ, где Контрагент = !!!!!!!пустое значение!!!!!!!!!, но контрагент у родителя = исходному контрагенту |
|||
12
Skom
17.04.14
✎
12:55
|
(9) то же самое что и ОЦВОдила просто. второй запрос просто.
|
|||
13
Skom
17.04.14
✎
13:01
|
вот этот вариант выполняется 10 сек. но для табличного поля не подходит(
| SELECT --TOP 10000 | ОЦВодила.ParentExt as ОЦПредприятие, | ОЦВодила.ID as ИД, | CASE isnull($ПоследнееЗначение.ОЦВодила.Контрагент(ОЦВодила.ID,:ВыбДата),"+ПустойИД9+") | WHEN "+ПустойИД9+" THEN isnull($ПоследнееЗначение.ОЦВодила.Контрагент(ОЦВодила.ParentExt,:ВыбДата),"+ПустойИД9+") | ELSE isnull($ПоследнееЗначение.ОЦВодила.Контрагент(ОЦВодила.ID,:ВыбДата),"+ПустойИД9+") | END as Контрагент | FROM | $Справочник.ОЦВодила as ОЦВодила (NoLock) | WHERE | CASE isnull($ПоследнееЗначение.ОЦВодила.Контрагент(ОЦВодила.ID,:ВыбДата),"+ПустойИД9+") | WHEN "+ПустойИД9+" THEN isnull($ПоследнееЗначение.ОЦВодила.Контрагент(ОЦВодила.ParentExt,:ВыбДата),"+ПустойИД9+") | ELSE isnull($ПоследнееЗначение.ОЦВодила.Контрагент(ОЦВодила.ID,:ВыбДата),"+ПустойИД9+") | END = "+текКонтрагент+" |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |