Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/47: Рейтинг темы: голосов - 47, средняя оценка - 4.68
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
MS Access

Не работает рабочий запрос Access в ADOQuery

15.10.2023, 15:59. Показов 15347. Ответов 5

Студворк — интернет-сервис помощи студентам
Всем здравствовать!
Спасите ибо совсем потерялся
С трудом и помощью старших братьев из ветки Access уговорил выполняться запрос:

SQL
1
2
3
4
SELECT LAT, LON
FROM (SELECT LAT FROM Latitude WHERE LAT BETWEEN :pLAT - :pREZ - 1 AND :pLAT + :pREZ - 1 AND (LAT MOD :pREZ) = 0)  AS qLat, 
(SELECT LON FROM Longitude  WHERE LON BETWEEN :pLON - :pREZ - 1 AND :pLON + :pREZ - 1 AND (LON MOD :pREZ) = 0)  AS qLon
WHERE ((LAT - :pLAT) ^ 2 + (LON - :pLON)^2) < :pREZ * :pREZ;
перенес его в прогу в виде:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    TADOQuery* AQ = new TADOQuery(NULL);
    AQ->Connection = MainForm->MDBConnect;
    AQ->Close();
    AQ->SQL->Clear();
    AQ->SQL->Add("SELECT LAT, LON ");
    AQ->SQL->Add(
        "FROM (SELECT LAT FROM Latitude WHERE LAT BETWEEN :pLAT - :pREZ - 1 AND :pLAT + :pREZ - 1 AND (LAT MOD :pREZ) = 0)  AS qLat,");
 AQ->SQL->Add("(SELECT LON FROM Longitude WHERE LON BETWEEN :pLON - :pREZ - 1 AND :pLON + :pREZ - 1 AND (LON MOD :pRREZ) = 0)  AS qLon");
    AQ->SQL->Add(" WHERE ((LAT - :pLAT)^2 + (LON - :pLON)^2) < :pREZ * :pREZ");
 
    AQ->Parameters->ParamByName("pLAT")->Value = LAT;
    AQ->Parameters->ParamByName("pLON")->Value = LON;
    AQ->Parameters->ParamByName("pREZ")->Value = RezLat;
    AQ->Open();
и на одних и тех же исходных данных и 1 БД результы шокирующе несовпадают от слова вабще...
Где может быть косяк?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.10.2023, 15:59
Ответы с готовыми решениями:

Adoquery запрос в Access
Пишу так на не выходит SELECT * FROM Table_1 WHERE (дата=max(дата) and категория='Ежемесячные затраты' from table_1); Надо чтобы...

Не работает запрос через ADOQuery
Всем доброго времени суток. И так у меня есть таблица clients ID fio tel startdate enddate clients_type 1 Иванов Иван...

Запрос ADOQuery внутри другого ADOQuery реален?
Помогите сформировать запрос для двух ADOQuery. Есть 2 таблицы БД mssql: sotrudniki , table_hlp(Вспомогательная таблица для делания...

5
Модератор
 Аватар для D1973
9923 / 6459 / 2457
Регистрация: 21.01.2014
Сообщений: 27,409
Записей в блоге: 3
16.10.2023, 05:32
так не работает: в Delphi/C++ Builder в параметрическом запросе каждый параметр должен иметь уникальное имя. т.е. если в вашем запросе параметры подставляются в 14 местах, то и параметров должно быть ровно 14.
0
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
16.10.2023, 07:14  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
то и параметров должно быть ровно 14.
да я уж как не переписывал запрос, например:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    AQ->SQL->Add("SELECT LAT, LON FROM");
    AQ->SQL->Add(
        "(SELECT LAT FROM Latitude WHERE LAT BETWEEN :pLATn AND :pLATk AND (LAT MOD :pRLAT) = 0)  AS qLat,");
AQ->SQL->Add(
        "(SELECT LON FROM Longitude WHERE LON BETWEEN :pLONn AND :pLONk AND (LON MOD :pRLON) = 0)  AS qLon"); 
AQ->SQL->Add("WHERE (LAT - :pLAT)^2 + (LON - :pLON)^2  < :pREZ");
 
    AQ->Parameters->ParamByName("pLATn")->Value = LAT - RezLat - 1;
    AQ->Parameters->ParamByName("pLATk")->Value = LAT + RezLat - 1;
    AQ->Parameters->ParamByName("pLONn")->Value = LON - RezLon - 1;
    AQ->Parameters->ParamByName("pLONk")->Value = LON + RezLon - 1;
    AQ->Parameters->ParamByName("pRLAT")->Value = RezLat;
    AQ->Parameters->ParamByName("pRLON")->Value = RezLon;
 
    AQ->Parameters->ParamByName("pLAT")->Value = LAT;
    AQ->Parameters->ParamByName("pLON")->Value = LON;
    AQ->Parameters->ParamByName("pREZ")->Value = RezLat * RezLon;
    AQ->Open();
со множеством комбинаций скобок уточнения имен...
Все работает на уровне первых 3 строк, т.е. фильтрация по диапазону и шагу(разрешению)
а вот фильтрация по расстоянию приводит в упадок, на контрольном примере, где должно быть 3 точки либо 2 либо 0...
Либо, что еще хуже ошибка исполнения

Вообще иногда появлялась рекомендация разбить сложное для вычисления выражение на переменные - темный лес...

Добавлено через 4 минуты
Цитата Сообщение от D1973 Посмотреть сообщение
каждый параметр должен иметь уникальное имя.
Можно ссылочку или сий документ, абы почитать, тырнет столько хлама на поиск выдает, что уже читать и фильтровать противно

Добавлено через 25 минут
Вот последний вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    AQ->Close();
    AQ->SQL->Clear();
    AQ->SQL->Add("SELECT LAT, LON, ((DLAT + DLON)^(1/2)) AS DIST FROM");
    AQ->SQL->Add(
        "(SELECT LAT, ((LAT - :pLAT)^2) AS DLAT FROM Latitude WHERE LAT BETWEEN :pLATn AND :pLATk AND (LAT MOD :pRLAT) = 0)  AS qLat,"); //
    AQ->SQL->Add(
        "(SELECT LON, ((LON - :pLON)^2) AS DLON FROM Longitude WHERE LON BETWEEN :pLONn AND :pLONk AND (LON MOD :pRLON) = 0)  AS qLon"); //
    AQ->SQL->Add(
        "WHERE ((DLAT + DLON)^(1/2)) < :pREZ");
    AQ->Parameters->ParamByName("pLAT")->Value = LAT;
    AQ->Parameters->ParamByName("pLON")->Value = LON;
 
    AQ->Parameters->ParamByName("pLATn")->Value = LAT - RezLat - 1;
    AQ->Parameters->ParamByName("pLATk")->Value = LAT + RezLat - 1;
    AQ->Parameters->ParamByName("pLONn")->Value = LON - RezLon - 1;
    AQ->Parameters->ParamByName("pLONk")->Value = LON + RezLon - 1;
    AQ->Parameters->ParamByName("pREZ")->Value = float(RezLat) - 0.5; //  * RezLon
    AQ->Parameters->ParamByName("pRLAT")->Value = RezLat;
    AQ->Parameters->ParamByName("pRLON")->Value = RezLon;
    AQ->Open();
Я уж грешным делом подумал даже о несоответствии типов, но даже это не помогает...
Хотя расстояние в первой строке вычисляется на ура, и если убрать 4 строку, получаем 4 точки из контрольного примера вместо 3.
Это просто бред, неужели проще в С++ добавить сравнение и исключить лишний вариант, чем биться с SQL и ADO?

Добавлено через 11 минут
Цитата Сообщение от POJIBOX Посмотреть сообщение
и если убрать 4 строку, получаем 4 точки из контрольного примера вместо 3.
получаем 4 точки c хорошими данными по расстояниям.
Но почему на этапе сравнения вылетают 2! крайних значения с самым большим и самым маленьким расстоянием, откуда такая симметрия?
0
Модератор
 Аватар для D1973
9923 / 6459 / 2457
Регистрация: 21.01.2014
Сообщений: 27,409
Записей в блоге: 3
16.10.2023, 09:43
Цитата Сообщение от POJIBOX Посмотреть сообщение
Можно ссылочку
Да какая тут ссылочка - все же в справке! Все параметры содержатся в коллекции Parameters, каждый член этой коллекции имеет свое имя, по которому можно обратиться к этому элементу (метод ParamByName). Ну и что получится, если два элемента коллекции будут иметь одинаковое имя?
0
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
16.10.2023, 12:04  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
Ну и что получится, если два элемента коллекции будут иметь одинаковое имя?
Понимаете ли, в самой БД ACCESS параметр выступает как переменная и может использоваться многократно, так что одного вашего предложения:
Цитата Сообщение от D1973 Посмотреть сообщение
Все параметры содержатся в коллекции Parameters, каждый член этой коллекции имеет свое имя, по которому можно обратиться к этому элементу
недостаточно для такого определения.
А вот ваше утверждение:
Цитата Сообщение от D1973 Посмотреть сообщение
в параметрическом запросе каждый параметр должен иметь уникальное имя
- вполне однозначно

Поэтому мне стало интересно, где у вас такой конкретный и сжатый по смыслу справочник... Однако в голове, "опыт - сын ошибок..." у меня пока да и в будущем не планируется к масштабному расширению
0
Модератор
 Аватар для D1973
9923 / 6459 / 2457
Регистрация: 21.01.2014
Сообщений: 27,409
Записей в блоге: 3
16.10.2023, 13:02
Цитата Сообщение от POJIBOX Посмотреть сообщение
где у вас такой конкретный и сжатый по смыслу справочник
почитайте вот это. Ближе к середине текста рассмотрена как раз Ваша коллизия с использованием одного и того же имени параметра, начинается фрагмент с фразы: "Так вот, по индексу, к Parameters лучше никогда не обращаться..."
Надеюсь, после этого ситуация для Вас прояснится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.10.2023, 13:02
Помогаю со студенческими работами здесь

Access и Bilder. Запрос работает в access и не работает в билдере
Здравствуйте, уважаемые. Очень нужен совет очень мудрого человека. Делаю программу тестирования ординаторов для больницы. Ситуация...

Как из ADOQuery вызвать запрос как в Access?
здравствуйте мне надо сделать запрос на кнопку как и запрос в аксесе там просто выбираем в конструкторе уже существующий запрос и делаем...

Запрос работает через Access, но не работает ASP.
Привет Коллеги ! У меня возникла проблема с ADO В MS ACCESS базе данных есть табличка TABLE1 в ней 2 поля ID ( autonumber ) и...

SQL-запрос работает в Access, а в Delphi не работает :'(
Две связанные таблицы 1к1. Вводим данные в поле одной таблицы и во второй должны быть сделаны теже изменения в одноимённом поле, т.е....

Запрос работает в Access, но не работает в коде
Можете подсказать. Объединила Visual Studio(Basic) с Access, но на одной из форм не работает запрос, который в Access работает....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru