К списку форумов К списку тем
Регистрация    Правила    Главная форума    Поиск   
Имя: Пароль:
Рекомендовать в новости

Как бы сделать красивый запрос...

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



1 - 21.04.2012 - 15:09
Т.е. имея спецификации
А: состав (Т1)
В: состав (Т1, Т2)
С: состав (Т1, Т2, Т3)
и заданный список (Т1, Т2)
получить на выходе спецификацию В
а при списке (Т1, Т3) не получить ничего.
2 - 21.04.2012 - 15:22
на каждую спецификацию сформируй хеш в момент формирования/изменения спецификации
по списку - построй хеш
хеш = ключ
поиск по ключу.
Гость
3 - 21.04.2012 - 15:59
отвлеченно:
"красивый" - это не критерий. сегодня программировать надо так, чтобы:
а) быстро получить работающий результат
б) иметь читаемый код, удобный для рефакторинга и реинжиниринга
а так согласен с предложением (2). кстати, в УТ11 это фактически стандарт для хранения многомерной инфы в регистрах
4 - 21.04.2012 - 16:10
2(2) Этот вариант я рассматривал, но, не хочется настолько сильно менять типовую. Потом другим с ней работать...
Гость
5 - 21.04.2012 - 16:39
4-bma1 >а что тебя в текущем решении не устраивает?
6 - 21.04.2012 - 16:44
2(5) чисто теоретический вопрос.
Гость
7 - 21.04.2012 - 21:28
// Осуществляет поиск варианта комплектации по переданному составу упаковок
//
// Параметры
// Номенклатура - <СправочникСсылка.Номенклатура> - номенклатура изделия, вариант комплектации которого необходимо найти
// ТаблицаУпаковок - <ТаблицаЗначений> - содержит упаковки по варианту. Колонки таблицы:
// Номенклатура - <СправочникСсылка.Номенклатура> - номенклатура упаковки
// Количество - <Число> - количество упаковок в варианте
//
// Возвращаемое значение:
// <СправочникСсылка.ВариантыКомплектации> - Ссылка на вариант комплектации, удовлетворяющий условиям. Если не найден - пустая ссылка.
//
Функция НайтиПоСоставу(Номенклатура, ТаблицаУпаковок) Экспорт

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

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

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

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

КонецЦикла;

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

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

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

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

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

КонецЕсли;

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

КонецФункции // НайтиПоСоставу()
8 - 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 - ответ неверный.
9 - 21.04.2012 - 22:17
В смысле вариант спецификации С3 (Т1,Т2)
Гость
10 - 21.04.2012 - 22:52
(8) Вот гребаный стыд, в понедельник нужно будет рабочую базу проверить, неужели и там эта порнография. А я то как парень, взял скопировал... facepalm. [*****]. и какого хрена автотесты пропустили это? ааааа, [*****]... чую неделя начнется с веселья...
11 - 23.04.2012 - 02:43
(10)


К списку вопросов






Copyright ©, Все права защищены