Имя: Пароль:
1C
1С v8
Полное соединение не работает.
0 Lama12
 
22.08.13
15:40
Может кому интересно будет.
Делаю отчет по сверке регл и упр кадрового учета. Почему-т оне работает полное соединение. Не могу понять почему :(
Запрос не маленький. Может кому пригодится. УПП.


ВЫБРАТЬ
    ВложенныйЗапрос.Сотрудник,
    ВложенныйЗапрос.СотрудникФизлицо,
    ВложенныйЗапрос.ЗанимаемыхСтавокРУ КАК ЗанимаемыхСтавокРУ,
    Работники.ЗанимаемыхСтавок КАК ЗанимаемыхСтавокУУ,
    ВложенныйЗапрос.ДолжностьРУ КАК ДолжностьРУ,
    Работники.Должность КАК ДолжностьУУ,
    ВложенныйЗапрос.ГрафикРаботыРУ КАК ГрафикРаботыРУ,
    Работники.ГрафикРаботы КАК ГрафикРаботыУУ,
    ВложенныйЗапрос.ПодразделениеОрганизации,
    Работники.Подразделение,
    ВложенныйЗапрос.ПериодРУ КАК ПериодРУ,
    Работники.Период КАК ПериодУУ,
    Работники.ФизЛицо,
    Работники.Регистратор КАК РегистраторУУ,
    ВложенныйЗапрос.Регистратор КАК РегистраторРУ
ИЗ
    (ВЫБРАТЬ
        РаботникиОрганизаций.Сотрудник КАК Сотрудник,
        РаботникиОрганизаций.Сотрудник.Физлицо КАК СотрудникФизлицо,
        РаботникиОрганизаций.ЗанимаемыхСтавок КАК ЗанимаемыхСтавокРУ,
        РаботникиОрганизаций.Должность КАК ДолжностьРУ,
        РаботникиОрганизаций.ГрафикРаботы КАК ГрафикРаботыРУ,
        РаботникиОрганизаций.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
        РаботникиОрганизаций.Период КАК ПериодРУ,
        СоответствиеПодразделенийИПодразделенийОрганизаций.Подразделение КАК ПодразделениеСоответствия,
        РаботникиОрганизаций.Регистратор КАК Регистратор
    ИЗ
        РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоответствиеПодразделенийИПодразделенийОрганизаций КАК СоответствиеПодразделенийИПодразделенийОрганизаций
            ПО РаботникиОрганизаций.ПодразделениеОрганизации = СоответствиеПодразделенийИПодразделенийОрганизаций.ПодразделениеОрганизации
                И РаботникиОрганизаций.Организация = СоответствиеПодразделенийИПодразделенийОрганизаций.Организация
    ГДЕ
        РаботникиОрганизаций.Активность
        И РаботникиОрганизаций.Период МЕЖДУ &ДатаНач И &ДатаКон
        И РаботникиОрганизаций.Сотрудник.Физлицо = &Физлицо) КАК ВложенныйЗапрос
        ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.Работники КАК Работники
        ПО ВложенныйЗапрос.СотрудникФизлицо = Работники.ФизЛицо
            И ВложенныйЗапрос.ДолжностьРУ = Работники.Должность
            И ВложенныйЗапрос.ЗанимаемыхСтавокРУ = Работники.ЗанимаемыхСтавок
            И ВложенныйЗапрос.ПодразделениеСоответствия = Работники.Подразделение
            И ВложенныйЗапрос.ГрафикРаботыРУ = Работники.ГрафикРаботы
ГДЕ
    Работники.Активность
    И Работники.Период МЕЖДУ &ДатаНач И &ДатаКон
    И Работники.ФизЛицо = &ФизЛицо

УПОРЯДОЧИТЬ ПО
    ПериодРУ,
    ПериодУУ
1 zbv
 
22.08.13
15:42
вот тут собака зарыта:

ГДЕ
    Работники.Активность
    И Работники.Период МЕЖДУ &ДатаНач И &ДатаКон
    И Работники.ФизЛицо = &ФизЛицо
2 Rie
 
22.08.13
15:42
(0) А может, оно работает - только выдаёт местами NULL, из-за которого условия в ГДЕ не выполняются?
3 Lama12
 
22.08.13
15:43
(2) Нет. Просто часть записей из обоих связываемых таблиц пропадают. :(
4 Lama12
 
22.08.13
15:44
Например при увольнении из Упр учета в ГрафикРаботы пишется пустая ссылка. Так вот эта собака, не хочет запись с пустой ссылкой связывать и вообще ее не выводит.
5 Lama12
 
22.08.13
15:45
(1) А почему тут?
Вроде разъименования дополнительного не ввожу. Условия только на одну таблицу.
6 zbv
 
22.08.13
15:47
а так:

И (ВложенныйЗапрос.ГрафикРаботыРУ = Работники.ГрафикРаботы
или Работники.ГрафикРаботы = Значение(пустая ссылка))
7 Lama12
 
22.08.13
15:48
(6) Так работает, только я не понимаю почему :)
8 zbv
 
22.08.13
15:49
(5) ну у тебя сначала идет полное соединение, а потом на результат соединения накладывается условие. И если в результате полного соединения полчилось NULL, то условие отработает как ЛОЖЬ.

Следовательно никаким полным соединением и не пахнет. ЛЕВОЕ, точнее ПРАВОЕ тут поуместнее будет.
9 Lama12
 
22.08.13
15:49
(7) + Связь то полная.
10 Lama12
 
22.08.13
15:50
(8) Понял :)
НЕ сразу врубился что Активность дает косвенное ограничение и все остальные условия :)
11 zbv
 
22.08.13
15:50
(7) ну дык соединение выполнено, если условие соединения равно ИСТИНА.
12 Lama12
 
22.08.13
15:51
Спасибо!
Блин... надо больше практиковаться. А то все бумажки перекладываю :(
13 m-serg74
 
22.08.13
15:51
(2) Вам грех должно быть такое говорить
14 Lama12
 
22.08.13
15:56
Если вдруг интересно кому.
Решение.


ВЫБРАТЬ
    ВложенныйЗапрос.Сотрудник,
    ВложенныйЗапрос.СотрудникФизлицо,
    ВложенныйЗапрос.ЗанимаемыхСтавокРУ КАК ЗанимаемыхСтавокРУ,
    Работники.ЗанимаемыхСтавок КАК ЗанимаемыхСтавокУУ,
    ВложенныйЗапрос.ДолжностьРУ КАК ДолжностьРУ,
    Работники.Должность КАК ДолжностьУУ,
    ВложенныйЗапрос.ГрафикРаботыРУ КАК ГрафикРаботыРУ,
    Работники.ГрафикРаботы КАК ГрафикРаботыУУ,
    ВложенныйЗапрос.ПодразделениеОрганизации,
    Работники.Подразделение,
    ВложенныйЗапрос.ПериодРУ КАК ПериодРУ,
    Работники.Период КАК ПериодУУ,
    Работники.ФизЛицо,
    Работники.Регистратор КАК РегистраторУУ,
    ВложенныйЗапрос.Регистратор КАК РегистраторРУ
ИЗ
    (ВЫБРАТЬ
        РаботникиОрганизаций.Сотрудник КАК Сотрудник,
        РаботникиОрганизаций.Сотрудник.Физлицо КАК СотрудникФизлицо,
        РаботникиОрганизаций.ЗанимаемыхСтавок КАК ЗанимаемыхСтавокРУ,
        РаботникиОрганизаций.Должность КАК ДолжностьРУ,
        РаботникиОрганизаций.ГрафикРаботы КАК ГрафикРаботыРУ,
        РаботникиОрганизаций.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
        РаботникиОрганизаций.Период КАК ПериодРУ,
        СоответствиеПодразделенийИПодразделенийОрганизаций.Подразделение КАК ПодразделениеСоответствия,
        РаботникиОрганизаций.Регистратор КАК Регистратор
    ИЗ
        РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоответствиеПодразделенийИПодразделенийОрганизаций КАК СоответствиеПодразделенийИПодразделенийОрганизаций
            ПО РаботникиОрганизаций.ПодразделениеОрганизации = СоответствиеПодразделенийИПодразделенийОрганизаций.ПодразделениеОрганизации
                И РаботникиОрганизаций.Организация = СоответствиеПодразделенийИПодразделенийОрганизаций.Организация
    ГДЕ
        РаботникиОрганизаций.Активность
        И РаботникиОрганизаций.Период МЕЖДУ &ДатаНач И &ДатаКон
        И РаботникиОрганизаций.Сотрудник.Физлицо = &Физлицо) КАК ВложенныйЗапрос
        ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.Работники КАК Работники
        ПО ВложенныйЗапрос.СотрудникФизлицо = Работники.ФизЛицо
            И ВложенныйЗапрос.ПодразделениеСоответствия = Работники.Подразделение
            И ВложенныйЗапрос.ЗанимаемыхСтавокРУ = Работники.ЗанимаемыхСтавок
            И ВложенныйЗапрос.ГрафикРаботыРУ = Работники.ГрафикРаботы
            И ВложенныйЗапрос.ДолжностьРУ = Работники.Должность
ГДЕ
    ЕСТЬNULL(Работники.Активность, ИСТИНА)
    И ВЫБОР
            КОГДА Работники.Период ЕСТЬ NULL
                ТОГДА ИСТИНА
            ИНАЧЕ Работники.Период МЕЖДУ &ДатаНач И &ДатаКон
        КОНЕЦ
    И ВЫБОР
            КОГДА Работники.ФизЛицо ЕСТЬ NULL
                ТОГДА ИСТИНА
            ИНАЧЕ Работники.ФизЛицо = &ФизЛицо
        КОНЕЦ

УПОРЯДОЧИТЬ ПО
    ПериодРУ,
    ПериодУУ
15 Lama12
 
22.08.13
15:57
Но честно говоря стыдно :(
16 viktor_vv
 
22.08.13
16:03
(14) А не проще ли было эти условия засунуть в условие соединения ПО ?

ПО ВложенныйЗапрос.СотрудникФизлицо = Работники.ФизЛицо
            И ВложенныйЗапрос.ПодразделениеСоответствия = Работники.Подразделение

и т. д.
17 viktor_vv
 
22.08.13
16:05
Хотя так сразу не пойму, то же самое это будет или нет

ПО ВложенныйЗапрос.СотрудникФизлицо = Работники.ФизЛицо
            И ВложенныйЗапрос.ПодразделениеСоответствия = Работники.Подразделение
И Работники.Активность
    И Работники.Период МЕЖДУ &ДатаНач И &ДатаКон
    И Работники.ФизЛицо = &ФизЛицо
18 zbv
 
22.08.13
16:09
(17) будет тоже самое, что и в (14).
19 Lama12
 
22.08.13
16:11
(16) Одинаково будет :)
Это я ошибку искал, вот и вынес в подзапрос.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.