|   |   | 
| 
 | [Решено] Нужна идея, как лучше реализовать перебор таблицы и сравнивать её с другой | ☑ | ||
|---|---|---|---|---|
| 0
    
        Vladal 25.06.15✎ 09:58 | 
        Есть основная таблица значений, которую уже обработал пользователь. В ней содердится номенклатура и цена.
 Есть вторая таблица значений, в которой есть две колонки, содержащие диапазон цен - Нижний предел и Верхний предел. Вторая таблица выглядит примерно так: Текст = " |Наименование НижнийПредел ВерхнийПредел |Диапазон1 0.01 1000.00 |Диапазон2 1000.01 5000.00 |Диапазон3 5000.01 999999999999 Необходимо по цене из первой таблицы найти ее вхождение в диапазон, описанный во второй таблице. Я предполагаю такие варианты: - пройти циклом по первой таблице, сравнивая значение колонки цены со строками таблицы диапазонов; (самый очевидный, но менее эффективный) - запулить обе таблицы в запрос, пусть эти занимается движок запросов; - типовой процедурой ОбщегоНазначения.ОтобратьСтрокиПоКритериям для каждого диапазона выбрать соответствия из основной таблицы и уже порциями их обработать. Первый способ, думаю, самый ресурсоёмкий. Может какие другие идеи есть? | |||
| 1
    
        fisher 25.06.15✎ 10:03 | 
        Первый способ самый оптимальный. С учетом того, что диапазонов вряд ли может быть много, алгоритм отработает быстро даже на мобильном телефоне.
 Городить серверные вызовы с сериализацией туда-сюда и запросами - абсолютно лишнее. Даже если это серверный алгоритм - ломиться на сервер БД для такой простейшей вещи это оверкилл. | |||
| 2
    
        vde69 25.06.15✎ 10:04 | 
        если база серверная - то запросом
 если база файловая - http://wiki.mista.ru/doku.php?id=1c:v8:howto:algoritm_sravnenija_dvux_tablic_po_tekstovomu_polju | |||
| 3
    
        vde69 25.06.15✎ 10:08 | 
        кстати вторую таблицу если она не большая можно преобразовать в условие запроса "Где"     | |||
| 4
    
        fisher 25.06.15✎ 10:13 | 
        (1) + Если в таблица диапазонов большая, то можно двоичным поиском.     | |||
| 5
    
        zenik 25.06.15✎ 10:15 | 
        Я бы сперва прошелся по таблице 2, сформировал таблицу 3 вида: Наименование, СтрокаНачалаДиапазонаТ2, СтрокКонцаДиапазонаТ2. т.е. сформировать некий индекс, определяющий строки диапазона для каждого наименования. Потом цикл по первой таблице, с поиском наименования в 3-й и перебором диапазона из второй, но уже по заранее известным строкам. Понятно объяснил?     | |||
| 6
    
        marvak 25.06.15✎ 10:15 | 
        (0)
 А запросом может? Первую таблицу соединить со второй по условию вхождения цены в интервал? | |||
| 7
    
        Serg_1960 25.06.15✎ 10:19 | 
        Если вторая таблица небольшая, то можно обойтись вообще без соединений. Например, сформировать текст запроса циклом по второй таблице с формированием текста запроса типа "ВЫБОР КОГДА... ИНАЧЕ...КОНЕЦ КАК Диапазон"     | |||
| 8
    
        Гёдза 25.06.15✎ 10:19 | 
        (3) Проще соединение, а не через где     | |||
| 9
    
        Vladal 25.06.15✎ 10:20 | 
        Таблица диапазонов из трех строк. Максимум 4 (это политика ценнобразования компании)
 (3) Можно и так (6) Да. Я про этот вариант запросом и думал. (5) Я предполагаю так: выбрать каждый диапазон и применить его к основной таблице. Получу массив строк, удовлетворяющий условию НижнийИнтервал..ВерхнийИнтервал | |||
| 10
    
        ам794123 25.06.15✎ 10:23 | 
        (0) это стандартная задачка из экзамена специалист по платформе     | |||
| 11
    
        marvak 25.06.15✎ 10:26 | 
        (9)
 Запросом с соединением делай, типа ВЫБРАТЬ .... ПерваяТаблица.Номенклатура, ПерваяТаблица.Цена, ВтораяТаблица.Наименование ИЗ ПерваяТаблица ЛЕВОЕ СОЕДИНЕНИЕ ВтораяТаблица ПО (ПерваяТаблица.Цена <= ВтораяТаблица.ВерхнийПредел) И (ПерваяТаблица.Цена >= ВтораяТаблица.НижнийПредел) | |||
| 12
    
        fisher 25.06.15✎ 10:40 | 
        Я смотрю, это массовое заболевание - любые итерации заменять запросом к серверу БД. Я так понимаю, уверенность в том, что это быстрее и оптимальней базируется на оптической иллюзии количества элементарных операций. Там цикл (много), а там типа одна (запрос).
 Сабжевую таблицу диапазонов, кстати, можно вообще упорядоченным одномерным массивом представить. | |||
| 13
    
        Гёдза 25.06.15✎ 10:42 | 
        (12) Ты просто предлагаешь нестед лукап делать в циклах в коде 1с     | |||
| 14
    
        Гёдза 25.06.15✎ 10:44 | 
        (12) Или ты еще предлагаешь бинарный поиск делать в массиве из 3 элементов?     | |||
| 15
    
        fisher 25.06.15✎ 10:51 | 
        (13)(14) И что в этом плохого в данном случае?
 Хотя, если сабжевый алгоритм исполняется на сервере - то хрен с вами. Погоды не сделает. Просто с таким же подходом и на тонкий клиент лезут. Вместо простейшего быстрого алгоритма фигачат лишние серверные вызовы. | |||
| 16
    
        Ildarovich 25.06.15✎ 11:18 | 
        Есть другая идея:
 1) объединить две таблицы (дописать вторую в хвост первой), совместив колонки цена и нижний предел; выбросив колонку верхний предел, добавив колонку НаименованиеДиапазона; 2) отсортировать полученную таблицу по цене; 3) пробежаться по полученной таблице, присваивая колонку "НаименованиеДиапазона" на пустые места вниз. | |||
| 17
    
        Vladal 25.06.15✎ 11:23 | 
        (16) Хорошая идея, но я в ней сомневаюсь. Мне бы только найти соответствие таблицы диапазонов по цене из первой таблицы, потому как там дальше начинается пир по другим колонкам таблицы диапазонов, которые я не привёл.     | |||
| 18
    
        Мыш 25.06.15✎ 11:28 | 
        Сортировать обе таблицы по цене/верхнему диапазону.
 Из второй таблицы берем соответствие для условия. Перебор первой таблицы по условию "если меньше то истина". Как только ложь - убираем лишнее условие из соответствия, чтоб лишнего не перебирать. | |||
| 19
    
        Vladal 25.06.15✎ 11:59 | 
        (18) Тоже интересная мысль.     | |||
| 20
    
        Vladal 25.06.15✎ 12:00 | 
        только потом придется назад сортировать по группировкам номенклатуры/документов и т.п. Или хранить две ТЗ - оригинал и отсортированную, и сопоставлять одну с другой. Муторно и ресурсоёмко.     | |||
| 21
    
        Гёдза 25.06.15✎ 12:02 | 
        (16) Это ты мердж джойн сейчас описал )))     | |||
| 22
    
        Мыш 25.06.15✎ 12:07 | 
        (20) В исходной постановке не было требования сохранять сортировку )     | |||
| 23
    
        palpetrovich 25.06.15✎ 12:42 | 
        (0) модернизировать "- пройти циклом по первой таблице..."
 сортируем втрорую, анализируем на вхождение "с середины" по ВерхнийПредел, движемся вниз или вверх, соответсвенно до получения результата :) | |||
| 24
    
        Vladal 25.06.15✎ 16:03 | 
        Решил просто:
 // Поиск строки интервала в матрице цен СтрокаМатрицыЦен = ОбщегоНазначения.ОтобратьСтрокиПоКритериям(МатрицаЦен, Новый Структура("НижнийПредел, ВерхнийПредел", НоваяСтрока.Цена, НоваяСтрока.Цена), Новый Структура("НижнийПредел, ВерхнийПредел", ВидСравнения.МеньшеИлиРавно, ВидСравнения.БольшеИлиРавно)).Выгрузить(); | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |