Форум » Clipper » тривиальная задачка » Ответить

тривиальная задачка

Pasha: имеется справочник населенных пунктов: 2 поля, код и наименование 2-я - таблица: рассояние между нп: 3 поля - код1, код2 и км (километраж) как лучше сделать индексы, чтобы, имея 1 запись для расстояния: скажем Франкфурт-на-Одере - Дортмунд 570 км (записи Дортмунд - Франкфурт-на -Одере нет) выбирать по SCOPE все расстояния и для Франуфурта и для Дортмунда вне зависимости, в каком поле: код1 или код2 находится код нужного нп

Ответов - 12

MMK: Смотря какой клиппер :)) На хХарборе можно было бы так - index on Любой to Test' CUSTOM ADDITIVE go top while !eof() if &uslov //uslov:='код1="ляля" .OR. код2="ГаГа"' ORDKEYADD("TEST","test.cdx",Любой) endif Dbskip() enddo MsgWait( " Фильтр установлен",,1 )

Dima: Не очень понял ;) Имеем записи 1. 1 2 2. 8 1 3. 1 4 4. 1 6 5. 4 6 Нужно показать 1,2,3,4 записи для кода 1 , так ?

MMK: Dima пишет: Нужно показать 1,2,3,4 записи для кода 1 , так ? Я понял так :)))


Dima: Ходил , думал , пил кофе , ходил.........не вижу вариантов со SCOPE и хитрым ключиком. Если используется SIX , тогда и думать не чего ;) Создаем индекс и ставим оптимизированный фильтр к примеру. Все остальные варианты так же сводятся к SIX.

AM: Можно вот что: во-первых, перелопатить базу, чтобы код1 всегда был, скажем, больше код2. Если же это сложно или невозможно, то так: index on (if(код1>код2,код1+код2,код2+код1)) - это если коды символьные, если числа, то str() - в общем, надеюсь, в целом идея понятна. Конечно, и поиск придётся делать немного по-другому, с учётом "<>".

ММК: Dima пишет: не вижу вариантов со SCOPE и хитрым ключиком SCOPE это лишь один из вариантов работы с индексами. Пример другого варианта , создание временных индексов смотри выше :)) Не сложнее и не медленнее :))) Для клиппера 5.3 годится, к тому же можно и более сложные выборки создавать. Без SIX'а

petr: Предложение - автоматически добавлять вторую запись - для комбинации {K1, K2, X} ->{K2,K1,X} - при корректировке одной из них - корректировать вторую. Результат поиска - не зависит от порядка следования - всегда найдется одна из двух записей

VivaVO: Pasha пишет: скажем Франкфурт-на-Одере - Дортмунд 570 км (записи Дортмунд - Франкфурт-на -Одере нет) Добавь поле код3, которое должно автоматически заполняться/коррек-ся при вводе/коррек-ки поля код1. При вводе комбинации "Фр.-на-Од. - Дор.", будешь иметь и комбинацию "Дор.- Фр.-на-Од." Создаешь индексы: код1+код2 и код2+код3 и выбирай на здоровье по scope ...

Petr: Индекс = iif(kod1<kod2,kod1+kod2,kod2+kod1) Поиск - по (x1+x2) где x1 код первой точки x2 = второй

Pasha: Всем спасибо за советы Красивого решения так и не придумал Создавать временные индексы каждый раз при выборе маршрута - не хочется, скажем от Донецка до Амстердама может быть десяток промежуточных пунктов Добавлять для каждого расстояния 2 записи - именно этого я хотел избежать Решил поступить тривиально: создать 2 индекса по K1 и K2 Для выборки всех маршрутов от определенного пункта создаю пустой массив, добавляю в него все записи по нужному значению по 1-му и по 2-му индексу и затем задаю запрос не по рекордсет, а по массиву с возможность добавления в него нового маршрута при его отсутствии: добавления в массив приведет к добавлению в файл

suv3: А какие проблемы? 1) любой рдд: CODE1="V1" .or. CODE1="V2".or.CODE2="V1".or.CODE2="V2" 2) рдд с оптимизатором - то же самое выражение. Фильтр будет оптимизитрованным, если есть индексы по CODE1 и CODE2 3) Отдельная фича сикс (возможно, работает и в АДС) CODE1 $ "V1 V2" .or. CODE2 $ "V1 V2" Фильтр будет оптимизитрованным, если есть индексы по CODE1 и CODE2

suv4: updated: оператор $ КАТЕГОРИЧЕСКИ не рекомендуется к использованию в выражениях фильтра совместно с SIx Знал, но забыл, опять нарвался :-( на отдельных выражениях глючит так, что мало не покажется в фильтре - полное говно, как это ни печально



полная версия страницы