Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Вернуть неповторяющиеся сочетания для связанных пар через запрос

Вернуть неповторяющиеся сочетания для связанных пар через запрос
Я
   maskitone
 
08.08.19 - 22:49
Доброго!
Нужна помощь, уже мозг сломал.
Имеется: в справочнике номенклатуры в ТЧ прописаны аналоги в виде ссылки на другую номенклатуру. Записи зеркальные, т.е. в номенклатуре 1 указана номенклатура 2, а в номенклатуре 2 - номенклатура 1. т.е получается поле аналогов, где каждый аналог указан у каждого аналога.
Надо: получить запросом (только запросом, т.к. там отчет на СКД) таблицу аналогов состоящую из двух колонок (номенклатура и аналог), но только по одной (любой) номенклатуре из каждого "поля" аналогов, а не по всему полю. Надо для группировки номенклатуры к "заказу" в отчетах по продажам и закупкам.
В чем сложность: допустим есть 3 номенклатуры. Запросом ТЧ аналогов можно получить таблицу пар аналогов, но связи в ней будут дублироваться (зеркально):
1-1
1-2
1-3
2-1
2-2
2-3
3-3
3-1
3-2

А мне на выходе надо получить:
1-1
1-2
1-3
или
2-1
2-2
2-3
или
3-1
3-2
3-3.
 
 
   Йохохо
 
1 - 08.08.19 - 22:59
и код больше
   RomanYS
 
2 - 08.08.19 - 23:01
(0) Если наличие зеркальных записей гарантировано и надо только их убрать, то:
"где спр.Ссылка <= Аналоги.Аналог"
только получишь
1-1
1-2
1-3
2-2
2-3
3-3
   RomanYS
 
3 - 08.08.19 - 23:03
Судя по примерам тебе надо

выбрать
минимум(ТЧ.Ссылка),
ТЧ.Аналог
ИЗ Справочник.Номенклатура.Аналоги как ТЧ
сгруппировать по ТЧ.Аналог
   RomanYS
 
4 - 08.08.19 - 23:04
+(3) но наличие зеркальных записей тоже обязательно
   assasu
 
5 - 09.08.19 - 04:19
(0) придумай новый показатель, который есть результат любой пары типа чч-зз.
но придумай его так что бы показатель 1-2 = показатель 2-1. потом по этому показателю группируй
   fgaabbb
 
6 - 09.08.19 - 04:33
отсортировать, меняя местами первую номенклатуру и вторую ("выбор когда ..."), к примеру, по коду номенклатуры, потом выбрать различные, не?
   Ботаник Гарден Меран
 
7 - 09.08.19 - 08:42
ВЫБРАТЬ 1 КАК П1,1 КАК П2
ПОМЕСТИТЬ ВТ
ОБЪЕДИНИТЬ
ВЫБРАТЬ    1,2
ОБЪЕДИНИТЬ
ВЫБРАТЬ    1,3
ОБЪЕДИНИТЬ
ВЫБРАТЬ    2,1
ОБЪЕДИНИТЬ
ВЫБРАТЬ    2,2
ОБЪЕДИНИТЬ
ВЫБРАТЬ    2,3
ОБЪЕДИНИТЬ
ВЫБРАТЬ    3,3
ОБЪЕДИНИТЬ
ВЫБРАТЬ    3,1
ОБЪЕДИНИТЬ
ВЫБРАТЬ    3,2
;

ВЫБРАТЬ
    ВТ.П1 КАК П1,
    ВТ.П2 КАК П2,
    ВЫБОР
        КОГДА ВТ_Зеркало.П1 ЕСТЬ NULL
            ТОГДА ЛОЖЬ
        ИНАЧЕ ИСТИНА
    КОНЕЦ КАК ЕстьПара
ПОМЕСТИТЬ ВТ_Результат
ИЗ
    ВТ КАК ВТ
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ_Зеркало
        ПО ВТ.П1 = ВТ_Зеркало.П2
            И ВТ.П2 = ВТ_Зеркало.П1
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВТ_Результат.П1 КАК П1,
    ВТ_Результат.П2 КАК П2
ИЗ
    ВТ_Результат КАК ВТ_Результат
ГДЕ
    (ВТ_Результат.П1 <= ВТ_Результат.П2
            ИЛИ НЕ ВТ_Результат.ЕстьПара)
   maskitone
 
8 - 09.08.19 - 11:40
(2) нет, на выходе получается что в первой колонке выборки не только ссылка, но и его аналоги.
   maskitone
 
9 - 09.08.19 - 12:02
(7) на выходе имеем
1-1
1-2
1-3
2-2
2-3
3-3
   Ботаник Гарден Меран
 
10 - 09.08.19 - 13:31
(9)
А что, вам травка животик не щекочет? (С)
   Cyberhawk
 
11 - 09.08.19 - 13:56
Бывает еще, что аналоги не взаимозаменяемы. Т.е. товар2 является аналогом товара1, а товар1 не является аналогом для товара2 :)
   maskitone
 
12 - 09.08.19 - 14:23
(10) смешно, да)
мне надо выбрать результаты только любой одной номенклатуры из всего "поля" аналогов с прописанными для нее аналогами во второй колонке  , ваш запрос этого не дает.
Спасибо за предложение, но это факт)
   maskitone
 
13 - 09.08.19 - 14:24
(11) Бывает, у меня такого нет)
   Ботаник Гарден Меран
 
14 - 09.08.19 - 14:26
(12)
GIGO
Garbage In - Garbage Out
ЗЫ.
Где П1 = &П1
   maskitone
 
15 - 09.08.19 - 15:20
(14) Читай внимательно описание проблемы)
   maskitone
 
16 - 09.08.19 - 15:56
(7) все оказалось просто - надо было добавить МИНИМУМ из (3) :

ВЫБРАТЬ
    МИНИМУМ(ВТ.СС) КАК СС,
    ВТ.Ном КАК Ном,
    ВЫБОР
        КОГДА ВТ_Зеркало.СС ЕСТЬ NULL
            ТОГДА ЛОЖЬ
        ИНАЧЕ ИСТИНА
    КОНЕЦ КАК ЕстьПара
ПОМЕСТИТЬ ВТ_результат
ИЗ
    ВТ КАК ВТ
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ_Зеркало
        ПО (ВТ.СС = ВТ_Зеркало.Ном)
            И (ВТ.Ном = ВТ_Зеркало.СС)

СГРУППИРОВАТЬ ПО
    ВТ.Ном,
    ВЫБОР
        КОГДА ВТ_Зеркало.СС ЕСТЬ NULL
            ТОГДА ЛОЖЬ
        ИНАЧЕ ИСТИНА
    КОНЕЦ
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВТ_результат.СС КАК СС,
    ВТ_результат.Ном КАК Ном
ИЗ
    ВТ_результат КАК ВТ_результат
ГДЕ
    (ВТ_результат.СС <= ВТ_результат.Ном
            ИЛИ НЕ ВТ_результат.ЕстьПара)

УПОРЯДОЧИТЬ ПО
    СС,
    Ном

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.