Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   Как бы сделать красивый запрос... (http://forums.kuban.ru/f1040/kak_sdelat-_krasivyj_zapros-2521463.html)

bma1 21.04.2012 15:05

Как бы сделать красивый запрос...
 
Суть вопроса:
Есть справочник Спецификации. В нем перечень комплектующих с нормой. Надо, имея список неких комплектующих с нормой, найти (если существует) такую спецификацию, чтоб в ней состав комплектующих и норма ТОЧНО совпадал с заданным списком.
Делал так (пакетным запросом).
1. Отбирал все спецификации, где есть комплектующие с нормами из списка.
2. Исключал из результата п.1 все спецификации имеющие в составе комплектующие с нормами не из списка.
3. Пересечением списка спецификаций из п.2 и заданного списка комплектующих получал некую таблицу.
4. Из таблицы п.3 вычитал строки составов комплектующих спецификаций из п.2 (поиск спецификаций имеющих похожий состав, но не со всеми требуемыми комплектующими).
5. Из списка спецификаций п.2 выкидывал те спецификации, что остались в пункте 4 незакрытыми.
Что хочу:
Есть способ сделать алгоритм короче и красивее?

bma1 21.04.2012 15:09

Т.е. имея спецификации
А: состав (Т1)
В: состав (Т1, Т2)
С: состав (Т1, Т2, Т3)
и заданный список (Т1, Т2)
получить на выходе спецификацию В
а при списке (Т1, Т3) не получить ничего.

Чучундер 21.04.2012 15:22

на каждую спецификацию сформируй хеш в момент формирования/изменения спецификации
по списку - построй хеш
хеш = ключ
поиск по ключу.

Управление торговлей 11 21.04.2012 15:59

отвлеченно:
"красивый" - это не критерий. сегодня программировать надо так, чтобы:
а) быстро получить работающий результат
б) иметь читаемый код, удобный для рефакторинга и реинжиниринга
а так согласен с предложением (2). кстати, в УТ11 это фактически стандарт для хранения многомерной инфы в регистрах

bma1 21.04.2012 16:10

2(2) Этот вариант я рассматривал, но, не хочется настолько сильно менять типовую. Потом другим с ней работать...

Управление торговлей 11 21.04.2012 16:39

4-bma1 >а что тебя в текущем решении не устраивает?

bma1 21.04.2012 16:44

2(5) чисто теоретический вопрос.

Reaper 21.04.2012 21:28

// Осуществляет поиск варианта комплектации по переданному составу упаковок
//
// Параметры
// Номенклатура - <СправочникСсылка.Номенклатура> - номенклатура изделия, вариант комплектации которого необходимо найти
// ТаблицаУпаковок - <ТаблицаЗначений> - содержит упаковки по варианту. Колонки таблицы:
// Номенклатура - <СправочникСсылка.Номенклатура> - номенклатура упаковки
// Количество - <Число> - количество упаковок в варианте
//
// Возвращаемое значение:
// <СправочникСсылка.ВариантыКомплектации> - Ссылка на вариант комплектации, удовлетворяющий условиям. Если не найден - пустая ссылка.
//
Функция НайтиПоСоставу(Номенклатура, ТаблицаУпаковок) Экспорт

Результат = ПустаяСсылка();

ТаблицаДляЗапроса = Новый ТаблицаЗначений;
ТаблицаДляЗапроса.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
ТаблицаДляЗапроса.Колонки.Добавить("Количество", ОбщегоНазначения.ПолучитьОписаниеТиповЧисла(15, 3));

Для каждого СтрокаУпаковок Из ТаблицаУпаковок Цикл

ЗаполнитьЗначенияСвойств(ТаблицаДляЗапроса.Добавить(), СтрокаУпаковок);

КонецЦикла;

ТаблицаДляЗапроса.Свернуть("Номенклатура", "Количество");

Запрос = Новый Запрос("ВЫБРАТЬ
| ТаблицаУпаковок.Номенклатура КАК Номенклатура,
| ТаблицаУпаковок.Количество КАК Количество
|ПОМЕСТИТЬ ЭталонныйВариант
|ИЗ
| &ТаблицаУпаковок КАК ТаблицаУпаковок
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура,
| Количество
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВариантыКомплектации.Ссылка
|ПОМЕСТИТЬ ВариантыПоИзделию
|ИЗ
| Справочник.ВариантыКомплектации КАК ВариантыКомплектации
|ГДЕ
| ВариантыКомплектации.Владелец = &Владелец
| И (НЕ ВариантыКомплектации.ПометкаУдаления)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВариантыКомплектацииУпаковки.Ссылка,
| ВариантыКомплектацииУпаковки.Номенклатура КАК Номенклатура,
| СУММА(1) КАК Количество
|ПОМЕСТИТЬ ДоступныеВарианты
|ИЗ
| Справочник.ВариантыКомплектации.Упаковки КАК ВариантыКомплектацииУпаковки
|ГДЕ
| ВариантыКомплектацииУпаковки.Ссылка В
| (ВЫБРАТЬ
| ВариантыПоИзделию.Ссылка
| ИЗ
| ВариантыПоИзделию КАК ВариантыПоИзделию)
|
|СГРУППИРОВАТЬ ПО
| ВариантыКомплектацииУпаковки.Ссылка,
| ВариантыКомплектацииУпаковки.Номенклатура
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура,
| Количество
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДоступныеВарианты.Ссылка,
| ЭталонныйВариант.Номенклатура
|ПОМЕСТИТЬ ВариантыСИзбыткомУпаковок
|ИЗ
| ЭталонныйВариант КАК ЭталонныйВариант
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДоступныеВарианты КАК ДоступныеВарианты
| ПО ЭталонныйВариант.Номенклатура = ДоступныеВарианты.Номенклатура
| И ЭталонныйВариант.Количество = ДоступныеВарианты.Количество
|ГДЕ
| ДоступныеВарианты.Ссылка ЕСТЬ НЕ NULL
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВариантыСИзбыткомУпаковок.Ссылка
|ПОМЕСТИТЬ ЛишниеВарианты
|ИЗ
| ВариантыСИзбыткомУпаковок КАК ВариантыСИзбыткомУпаковок
|ГДЕ
| ВариантыСИзбыткомУпаковок.Номенклатура ЕСТЬ NULL
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1
| ВариантыСИзбыткомУпаковок.Ссылка
|ИЗ
| ВариантыСИзбыткомУпаковок КАК ВариантыСИзбыткомУпаковок
|ГДЕ
| (НЕ ВариантыСИзбыткомУпаковок.Ссылка В
| (ВЫБРАТЬ
| ЛишниеВарианты.Ссылка
| ИЗ
| ЛишниеВарианты КАК ЛишниеВарианты))
|АВТОУПОРЯДОЧИВАНИЕ");

Запрос.УстановитьПараметр("Владелец", Номенклатура);
Запрос.УстановитьПараметр("ТаблицаУпаковок", ТаблицаДляЗапроса);

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда

Результат = Выборка.Ссылка;

КонецЕсли;

Возврат Результат;

КонецФункции // НайтиПоСоставу()

bma1 21.04.2012 22:12

2(7) Странный запрос...
Пусть ищем вариант (Т1,Т2)
среди спецификаций:
С1 (Т1), С2 (Т1,Т2,Т3), С2 (Т1,Т2)
Первый запрос пакета дает:
Эталонный вариант
Т1
Т2
Второй запрос пакета дает
С1
С2
С3
Третий запрос пакета дает
С1 Т1 1
С2 Т1 1
С2 Т2 1
С2 Т3 1
С3 Т1 1
С3 Т2 1
Четвертый запрос пакета дает
С1 Т1
С2 Т1
С2 Т2
С3 Т1
С3 Т2
Пятый запрос пакета дает пустой список.
Шестой запрос пакета дает
С2 - ответ неверный.

bma1 21.04.2012 22:17

В смысле вариант спецификации С3 (Т1,Т2)

Reaper 21.04.2012 22:52

(8) Вот гребаный стыд, в понедельник нужно будет рабочую базу проверить, неужели и там эта порнография. А я то как парень, взял скопировал... facepalm. [filolog]сцуко[/filolog]. и какого хрена автотесты пропустили это? ааааа, [filolog]пля[/filolog]... чую неделя начнется с веселья...

EarlyBird 23.04.2012 02:43

(10)
[img]http://demotivation.me/images/20120418/aidpgyda5ett.jpg[/img]


Текущее время: 21:02. Часовой пояс GMT +3.