14 / 14 / 0
Регистрация: 24.09.2015
Сообщений: 208
|
|
1 | |
Составление (генерация) сложных SQL запросов к Access16.06.2019, 13:03. Показов 1425. Ответов 15
День добрый, уважаемые участники форума!
Требуется консультация по вопросу как правильно организовать группу запросов из VВ.Nеt к Access и помощь в реализации данной задумки. Есть форма с комбобоксами которые при запуске содержат в себе основные списки данных из подключенной БД. Далее при выборе значения из любого комбобокса у нас должны подгрузиться только те значения которые имеют отношение к выбранному значению в комбобоксе. С этим сложностей вроде нет. Основная сложность заключается в том, чтобы выполнялась фильтрация не по одному значению из комбобокса а с учётом всех комбобоксов в которых уже произведен выбор значений. Можно прописать на каждую выборку отдельный запрос и получится километровая портянка(частично уже начал так делать), а можно написать код который будет собирать запрос проверив наличие значений в комбобоксах и на основании этих данных составлять запрос. В принципе если получится создать нечто подобное, то в дальнейшем можно написать отдельную библиотеку) Прилагаю файлы проекта вместе с БД.
0
|
16.06.2019, 13:03 | |
Ответы с готовыми решениями:
15
Составление сложных SQL запросов к Access из VB.Net Несколько задач на составление сложных запросов Генератор (сложных) SQL-запросов Разработка сложных и коррелированных SQL-запросов |
17.06.2019, 12:43 | 2 |
Евгений_Пермь, а как именно влияют на запрос комбобоксы? Допустим, если это речь о фильтрации по определенному полю, которое задано для каждого комбобокса, то, по всей видимости, на запросе это будет отражаться дополнительным AND в кляузе WHERE. Ну если так, то можно сопоставить каждому комбобоксу то поле по которому он фильтрует (это можно сделать в свойстве Tag или словарик составить) и дальше проходишься в цикле по всем таким комбобоксам и если в нем выбрано значение, то добавляешь в текст
" AND " & [имя поля соответствующее комбобоксу] & " = " & [Имя комбобокса].Value . Потом полученную строку добавить к WHERE и дело в шляпе. Если случай более сложный, то надо его описать подробнее.
1
|
14 / 14 / 0
Регистрация: 24.09.2015
Сообщений: 208
|
|
17.06.2019, 13:23 [ТС] | 3 |
Тут еще нужно использовать INNER JOIN
Т.е. если откроете исходник, то там в общем модуле написаны 4 запроса, которые как раз и связаны с комбобоксами. Чуть позже смогу привести примеры для остальных комбобоксов. А так мысль верная)
0
|
14 / 14 / 0
Регистрация: 24.09.2015
Сообщений: 208
|
|||||||||||
17.06.2019, 20:46 [ТС] | 4 | ||||||||||
Вот такой вот запрос к примеру сформировать...
diadiavova, при первом запуске или когда все комбобоксы "пустые", у нас грузятся все данные в списки. Дальше например выбрали мы "Производителя станка", все остальные поля должны обновиться в соответствии со связями с данным производителем. Дальше например выбрали "Город" и о5-же у нас остальные комбобоксы должны обновить данные в соответствии с производителем и городом и т.д... Если на каждое условие прописывать отдельный запрос, то получится довольно ГРОМОЗДКА и плохо читаемая и редактируемая портянка... Как я это примерно вижу, нужно описать "все" SQL функции, которые будут использоваться, дальше из этих функций написать метод который будет собирать запрос и дальше уже отправлять его к Access.
0
|
18.06.2019, 01:16 | 5 |
Евгений_Пермь, я смотрел проект, но из проекта, равно как и из приведенного здесь кода, достаточно сложно понять как должен меняться код запроса, в зависимости от выбора того или иного комбобокса.
По генерации текста могу дать пару советов. Во-первых, если у тебя версия языка не очень старая, то с некоторых пор бейсик поддерживаетИнтерполированные строки, формировать текст с ними намного легче. Если же требуется более сложный вариант, то обрати внимание на вот такую штуку Создание кода и текстовые шаблоны T4 - Visual Studio | Microsoft Docs, особое внимание обрати на это Создание текста во время выполнения с помощью текстовых шаблонов T4 - Visual Studio | Microsoft Docs. Лучше использовать с расширением студии, например таким T4 Editor - VS add-in for editing T4 templates | Devart, или поищи в расширениях студии, там есть еще пара вариантов. В общем и целом, вставишь в шаблон полный текст запроса, а те элементы, которые зависят от комбобоксов обернешь условиями и вставишь значения. В шаблон можно передавать аргументы, так что там есть возможность достаточно тонкой настройки генерации текста.
1
|
14 / 14 / 0
Регистрация: 24.09.2015
Сообщений: 208
|
|
18.06.2019, 21:34 [ТС] | 6 |
diadiavova, попробую еще раз описать нужный алгоритм работы)
Имеем производителей станков с различным модельным рядом. Модели подразделяются на типы, т.е. "Тип1" "Тип2" и т.д... Дальше нам нужно узнать в каких городах находятся станки производителя №1. Выбрали производителя №1, в списке "города" сформировался список городов отфильтрованный по производителю №1. Теперь мы хотим посмотреть какие именно модели производителя №1 находятся в городе Омске. Выбрали "Омск" и в спике моделей должен сформироваться список моделей производителя №1 которые находятся в Омске. Или например в обратном порядке: выбрали город - получили список производителей, выбрали производителя - получили список моделей выбранного производителя в данном городе. И так со всеми списками, модели, города, организации, производители ЧПУ, модели ЧПУ, серийные номера... Получается взаимо-исключающая выборка...
0
|
258 / 199 / 49
Регистрация: 18.12.2015
Сообщений: 416
|
|
18.06.2019, 22:01 | 7 |
Евгений_Пермь, а есть смысл писать такие "полотна" и каждый раз дергать базу?
Может загнать один раз в DataTable всю таблицу общим запросом и потом ее фильтровать по нужным вам условиям? Вот недавняя тема. Если конечно у вас там данных не мильоны строк.
1
|
14 / 14 / 0
Регистрация: 24.09.2015
Сообщений: 208
|
|
18.06.2019, 22:12 [ТС] | 8 |
Jungl, не миллионы конечно, но десятки тысяч точно могут быть...
Не плохая идея, попробую развить данное направление. По сути что-так, что-так мы грузим данные из базы в оперативку. Просто планируется еще делать поиск по частичному вводу данных в комбобокс, но это уже другая тема)
0
|
19.06.2019, 07:42 | 9 |
Евгений_Пермь, то есть иными словами код запроса зависит не только от выбора в комбобоксах, но и от того, в каком порядке был сделан этот выбор? Да еще и при выборе в одном комбобоксе содержимое остальных меняется? А как быть, если пользователь вдруг решит изменить выбор в одном из комбобоксов, где он уже раньше что-то выбрал? Ну или вообще как предусмотреть незапланированное поведение пользователя? Мне что-то думается, что в данной ситуации надо действовать как-то иначе. Например сделать что-то типа визарда, где каждое новое окошко будет содержать только те варианты, которые зависят от ранее сделанного выбора и т. п. Тогда и промежуточные запросы будет формировать проще.
1
|
1135 / 876 / 152
Регистрация: 25.07.2015
Сообщений: 1,954
|
|
19.06.2019, 08:21 | 10 |
Не самая лучшая идея.
Отнюдь. Ваш запрос выгружает в ОП отфильтрованные данные , т.е. некий укороченный набор, Jungl же по сути предлагает слить все таблицы , участвующие в запросе. Не далеко налететь на исключение "Out of Memory" . Причём количество записей не столь важно : можно разместить в память миллионы записей типа boolean без рисков переполнения и без потери производительности , а можно тысячью-другой записей типа Text (я уж молчу про Memo) уложить память в аут. (Все приведённые данные от access, вы же его используете как хранилище.) Плюс механизмы реализации выборки (запросы) бывают очень энергоёмкие без оптимизации. У меня были случаи , когда при копировании 5-7 тыс. строк из access 8-гиговый ноут отваливался в недостаток памяти. Воспользуйтесь лучше советом diadiavova и пересмотрите саму концепцию.
1
|
14 / 14 / 0
Регистрация: 24.09.2015
Сообщений: 208
|
|
19.06.2019, 08:40 [ТС] | 11 |
diadiavova, на случай если пользователь захочет изменить уже отфильтрованный комбобокс, потребуется сделать сброс запросов. Т.е. нажать на кнопку например "сброс" и данные в списках комбобоксов должны вернуться к исходному варианту как при загрузке формы. Я так это вижу, вчера тоже про это подумал.
А если прописывать каждый запрос по отдельности без автоматизации составления запроса, то получается порядка 100 отдельных вариантов запросов, а тут и запутаться не долго да и в случае редактирования будет куча проблем. Думал еще о возможности в условиях для составления запросов указать связи полей которые имеются в БД, но пока не продумал как это можно задействовать.
0
|
1135 / 876 / 152
Регистрация: 25.07.2015
Сообщений: 1,954
|
|
19.06.2019, 11:18 | 12 |
К сожалению, Евгений, почти всегда вИдение разработчика в плане функционала и тем более последовательности
действий и конечного юзера практически всегда не одно и то же. diadiavova, предложил вам найти некое соломоново решение , чтобы и юзеру было максимально удобно, и ваша прога не падала каждый раз , когда юзер что-то жмакнул не то ))) Не зря же существует присказка, возведённая практически в степень истины : " Любую инструкцию по применению надо начинать словами : " ну что, дурачок, уже сломал ?"
3
|
14 / 14 / 0
Регистрация: 24.09.2015
Сообщений: 208
|
|
19.06.2019, 12:04 [ТС] | 13 |
Kulma, тут по сути не то и не жамкнешь, данные в списках из бд, если и будут выборки по части слова, то можно состряпать проверку на возврат пустого результата запроса и выдачу предупреждения, в крайнем случае нажал на сброс и данные в первоначальном виде во всех комбобоксах.
А так полностью согласен, но думаю тут будет достаточно кнопки "отмена/сброс".
0
|
1135 / 876 / 152
Регистрация: 25.07.2015
Сообщений: 1,954
|
|
19.06.2019, 12:33 | 14 |
Не по теме: Флудливое настроение...не обессудьте ...
1
|
19.06.2019, 12:54 | 15 |
А я об этом и не говорю, мало того подбросил идей о том, как это реализовать. Ну просто давай возьмем, например, запрос для заполнения одного комбобокса и для всех сразу. Просто сравни их и все увидишь сам. Для заполнения одного комбобокса потребуется одно поле в селекте, фильтры в вэа и никаких иннерджоинов. Допустим, ты не хочешь сильно усложнять интерфейс, тогда можно формировать список каждого комбобокса в обработчике события DropDown и заполнять только его, а не все сразу. Просто чтобы не вызывать конфликтов. Кроме того, в том же обработчике желательно заморозить все комбобоксы, в которых значение уже выбрано, иначе, если пользователь снова туда полезет, то весь процесс будет сбит. Ну хотя бы так.
2
|
14 / 14 / 0
Регистрация: 24.09.2015
Сообщений: 208
|
|
19.06.2019, 18:02 [ТС] | 16 |
Kulma,
Не по теме: Сталкивался я с подобным, когда умудрялись впихнуть невпихуемое, казалось бы, ну вот в этом месте уже всё предусмотрел от ошибок, ан нет оказывается не всё и на вопрос зачем это сделали, как правило не следует внятных ответов.)))
0
|
19.06.2019, 18:02 | |
19.06.2019, 18:02 | |
Помогаю со студенческими работами здесь
16
Составление запросов SQL Динамическое создание запросов в MS Access как в MS SQL Вывод данных в БД Access 2003 при использование SQL запросов. Delphi Создание баз и таблиц в Access при помощи SQL-запросов типа DDL Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |