|
Как реализовать сопоставление товаров в выборке по артикулу? | ☑ | ||
---|---|---|---|---|
0
MathaiShung
30.05.16
✎
14:39
|
Задача: Сопоставить номенклатурные позиции по артикулу. Если точного совпадения артикула не найдено, тогда - по фрагменту артикула (с шагом в минус один знак справа), до минимум 4 знаков слева.
Пока единственное, что приходит на ум это перебор Выборки с помощью НайтиСледующий, если нет совпадений - изменение Артикулов в всей Выборке и новый цикл с аналогичными действиями, пока не выявится совпадение, или не достигнет минимального предела знаков артикула. Но по-моему это очень громоздко получится и неоптимально, да и слишком сложно. Кто-нибудь знает как сделать это правильнее и проще? Всё что есть пока на данный момент: Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура, | ТоварыНаСкладахОстатки.КоличествоОстаток |ПОМЕСТИТЬ Товары |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК ТоварыНаСкладахОстатки | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВложенныйЗапрос.НоменклатураАртикул КАК Артикул, | ВложенныйЗапрос.Номенклатура, | МАКСИМУМ(ПоступлениеТоваровУслугТовары.Цена) КАК Цена, | МАКСИМУМ(ВложенныйЗапрос.КоличествоОстаток) КАК Остаток |ИЗ | (ВЫБРАТЬ | ПоступлениеТоваровУслугТовары.Номенклатура.Артикул КАК НоменклатураАртикул, | ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура, | МАКСИМУМ(ПоступлениеТоваровУслугТовары.Ссылка.Дата) КАК Дата, | МАКСИМУМ(Товары.КоличествоОстаток) КАК КоличествоОстаток | ИЗ | Товары КАК Товары | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары | ПО Товары.Номенклатура = ПоступлениеТоваровУслугТовары.Номенклатура | ГДЕ | ПоступлениеТоваровУслугТовары.Номенклатура В | (ВЫБРАТЬ | Товары.Номенклатура | ИЗ | Товары КАК Товары) | И ПоступлениеТоваровУслугТовары.Ссылка.Дата <= &Дата | И ПоступлениеТоваровУслугТовары.Ссылка.Проведен = ИСТИНА | | СГРУППИРОВАТЬ ПО | ПоступлениеТоваровУслугТовары.Номенклатура.Артикул, | ПоступлениеТоваровУслугТовары.Номенклатура) КАК ВложенныйЗапрос | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары | ПО ВложенныйЗапрос.Номенклатура = ПоступлениеТоваровУслугТовары.Номенклатура | И ВложенныйЗапрос.Дата = ПоступлениеТоваровУслугТовары.Ссылка.Дата |ГДЕ | ПоступлениеТоваровУслугТовары.Номенклатура В | (ВЫБРАТЬ | Товары.Номенклатура | ИЗ | Товары КАК Товары) | И ПоступлениеТоваровУслугТовары.Ссылка.Дата <= &Дата | И ПоступлениеТоваровУслугТовары.Ссылка.Проведен = ИСТИНА | |СГРУППИРОВАТЬ ПО | ВложенныйЗапрос.НоменклатураАртикул, | ВложенныйЗапрос.Номенклатура"; Запрос.УстановитьПараметр("Дата", Объект.Дата); Запрос.УстановитьПараметр("Склад", Объект.Склад); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); |
|||
1
Маратыч
30.05.16
✎
14:45
|
Сделай соединением точной выборки и ПОДОБНО, дальше по ЕСТЬNULL(ВыборкаТочно.Значение,ВыборкаПодобно.Значение) получай результат.
|
|||
2
Маратыч
30.05.16
✎
14:46
|
Хз правда, как это в плане оптимизации, но уж всяко быстрее перебора.
|
|||
3
MathaiShung
30.05.16
✎
14:53
|
(1) О, спасибо, уже лучше. Попробую...
|
|||
4
Маратыч
30.05.16
✎
14:57
|
(3) Угу, правда, для четырех знаков придется четыре выборки делать, но с учетом кэширования не должно сильно тормозить.
|
|||
5
hhhh
30.05.16
✎
15:12
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |