Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.04.21;
Скачать: [xml.tar.bz2];

Вниз

Создание базы заказов с условиями отбора товара   Найти похожие ветки 

 
ruslanyd   (2003-04-01 16:40) [0]

Народ, с 1 апреля всех! :)

Подскажите, pls, как наилучшим образом можно
организовать базу для хранения условий отбора
записей из таблицы каким-нибудь универсальным способом?

Предусмотреть необходимо следующие:

1 возможности отбора :
=, <>, >, <
Null, not Null
отбор по контексту (только для строк)

2. на одно поле наложение нескольких условий

3. возможность обратного поиска, т.е. для такой-то записи
подобрать все запросы, которым удовлетворяет эта запись
Проблема именно в этом пункте, т.к. все варианты
хранения запроса, которые мне пришли в голову,
будут сильно тормозить :(

Вообщем, типичная задача для подбора товара по заказу
и подбора клиентов по имеющемуся товару

Задача решалась, наверно, тысячи раз, но я сней
столкнулся первый. Не хотелось бы изобретать велосипед ...


 
Соловьев   (2003-04-01 16:43) [1]

F1


 
ruslanyd   (2003-04-01 16:49) [2]

неудачная шутка


 
MsGuns   (2003-04-01 16:50) [3]

Если делается что-то типа универсальной системы поиска (т.е. некая форма, на которой контролы для масок значений полей без привязки на контретные таблицы, то надо оперировать понятием "объект". Для них (объектов) сохранять-поднимать (к примеру из спец.Ini-файла) значения, а потом соотв. алгоритмом производить "шуршание" по БД.


 
Yfhjl? c 1 fghtkz dct[! ^)   (2003-04-01 17:07) [4]

понятие "объект" присутствовать будет, т.к. поиск будет производиться по разным таблицам с разной структурой
будет отдельная база с таблицами и полями, по которым будет возможен поиск, их названия и т.д.

проблема не в общей организации системы поиска, а только в способе хранения запроса
можно хранить, например, в виде обычного SQL запроса, то тогда обратный поиск будет выполняться нелправдано долго




 
MsGuns   (2003-04-01 17:17) [5]

>Yfhjl? c 1 fghtkz dct[! ^) (01.04.03 17:07) или как тебя там

Я так и не врубился, чего ты хо сделать ? Хранить параметрические запросы "где-то" в БД ? Строить из динамически из значений полей, которые тоже где-то хранятся ? Муть голубая или одно из двух ";))

Ты скажи мне, Русланчик, че те надо, че те надо,
Може дам я тебе то что хошь ;)))


 
ruslanyd   (2003-04-01 17:33) [6]

это имячко я случайно из буфера вставил, сорри :)

>Я так и не врубился, чего ты хо сделать ?
>Хранить параметрические запросы "где-то" в БД ?
именно, только запросы эти будут формироваться
при оформлении заказа и сам запрос будет представлять
из себя условия заказа


 
MsGuns   (2003-04-01 18:32) [7]

>ruslanyd (01.04.03 17:33)

Короче, делай так:
У тебя в модуле "Менеджер Запросов" (назовем это так, для краткости - МЗ) долен быть предусмотрен набор "болванок", т.е. комбинаций полей, в который юзер должон ввести свои значения. Ну, к примеру:
1. Запрос на допоставку
Поля:
<Поставщик>
<Группа товаров>
<Предельный запас на складе>
2. Запрос по задолженности
Поля:
<Поставщик>
<Пред.сумма задолженоости>
<Период приходов>

и т.д.

Все эти запросы ты хранишь в спец. объектах-контейнерах, которые загружаются по мере необходимости, к примеру, из текстового файла (я б делал TIniFile - удобно и можно если че ручками поправить). Объекты создашь как класс, нисходящий, например из TCollection. Каждый объект (запрос) содержит итемы (поля) со св-вами "Имя таблицы", "Имя поля", "Связка", "Ширина кол-ки грида", "граничные значения" и т.д. Кроме этого сам объект-запрос имеет свои, "родительские" св-ва: "Заголовок", "Пункт в меню", "Шаблон запроса" и т.д.

Юзеру МЗ дает меню, которое формируется динамически исходя из содержимого контейнера (который предв-но списком грузится из ini-файла). По выбору юзера на форму динамически кидаешь соотв.контролы типа TEdit и даешь ему их ввести. Потом опять же динамически создаешь SQL-запрос по описанию, хранящемуся в соотв.элементе контейнера (читаешь опять же ini, но уже "подробно") и запускаешь его. В гриде, настраиваемом динамически, отображаешь рез-ты поиска.

Если хочешь совсем круто (типа чтоб узер сам создавал запросы), напиши спец.конструктор, где бушь показывать структуры таблиц БД и связь между ними, проверять корректность и записывать в тот же ini-файл. Но я бы лично такую офигень делал бы только за ОЧЕНЬ хорошие бабки !


 
ruslanyd   (2003-04-01 19:30) [8]

С интерфейсной частью программы проблема не стоит
Это будет конструктор, но все будет гораздо проще:
юзверь выбирает то, что он хочет искать, откроется
стандартное для этой системы окно для поиска, состоящее всего
из трех основных элементов - список полей, к которым можно
применить условия поиска (загружается из базы или ini-файла),
условные операции (что-то вроде radio-buttons)
и создаваемый запрос

выбираешь поле, выбираешь условие и нажимаешь кнопку "добавить"
оно попадает в запрос
все достаточно просто и наглядно, позволяет задать несколько условий для одного поля
и не надо заниматься довольно неприятной вещью - динамические контролы, а если учесть, что их может быть около сотни на объект, то это уже становится проблемой

но я ушел от вопроса
как я уже говорил, проблема в том как хранить этот запрос в БД
и при этом обеспечить быстрый "обратный поиск",
который я описал выше


 
MsGuns   (2003-04-01 20:24) [9]

Создай подкаталог TovSQL там же, где и БД, и все запросы складывай/поднимай оттуда (SQL.SaveToFile/LoadFromFile)

И все недолга ! Не делать же спец. таблицу для хранения эскюэлей


 
ruslanyd   (2003-04-02 12:22) [10]

>И все недолга !
уже проверено - долго
прямой поиск выполняется, ессно, нормально
а обратный, который возвращает все запросы, удовлетворяющей заданной записи - неоправданно долго
это из-за того, что перед проверкой выполняется
парсинг каждого запроса

>Не делать же спец. таблицу для хранения эскюэлей
именно так
во-первых, у меня распределенная база данных и я написал универсальную прогу для репликации
занеся запросы в базу мне почти не надо что-либо предпринимать
для репликации запросов (заказов)
во-вторых, именно таким способом, как мне кажется можно существенно ускорить выполнение "обратного поиска", если
в таблице (допустим, "запросы") хранить в отдельной записи одно условие этого запроса тогда для проверки отдельного поля достаточно отобрать для него все условия конкретного
запроса из таблицы запросов и проверить их
думаю, что на порядок быстрее будет



 
MsGuns   (2003-04-02 12:30) [11]

Я, наверное, чего-то недопонимаю ! Этих запросов что, сотни тысяч ? Т.е.хранятся не "болванки" а собственно готовые запросы с подставленными вариантами значений ?


 
ruslanyd   (2003-04-02 13:58) [12]

>Я, наверное, чего-то недопонимаю ! Этих запросов что, сотни тысяч ?
ну не сотни тысяч, но около пяти тысяч есть уже сейчас

>Т.е.хранятся не "болванки" а собственно готовые запросы
>с подставленными вариантами значений ?
допустим, я делаю такой запрос:
найти все объекты, у которых a=1 или a=2 и b<>"aaa"
в этом случае записываю в базу три записи:

IDзапроса поле условие значение
1432 a = 1
1432 a = 2
1432 b <> "aaa"



 
ruslanyd   (2003-04-02 14:11) [13]

вот я тормоз! :) кажись, я уже все придумал!
можно без проблем записывать все запросы в виде SQL
и в случае с обратным поиском можно почти всю работу
возложить на сервер БД
нужно только в WHERE первым добавить еще одно условие,
которое отбирает по превичному ключу проверяемой записи

и если такой запрос вернул эту запись, то мы нашли то что надо



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.04.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.008 c
14-67444
Evgeny
2003-04-04 07:07
2003.04.21
метод POST


14-67476
Феликс
2003-04-02 21:52
2003.04.21
Чудеса какие :)


7-67589
romychk
2003-03-04 11:16
2003.04.21
Запуск приложения на перле из Д под FreeBSD


14-67448
Satirus
2003-04-04 18:55
2003.04.21
Опять о взаимоотношениях:)


3-67087
AlexAvz
2003-04-03 14:13
2003.04.21
БД PARADOX в многооконном документе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский