| Типы программирования, программирование, языки программирования, книги программирование | На сайте представлена информация про программирование в Интернете и работу |
|
Как Вы относитесь к курящим девушкам? Как связать ADOTable с DBGrid (Delphi)?, MS Access Сново запись данных в BD???!!! Как Вы относитесь к курящим девушкам? Пароль на DBase DBF файл?????!!!!!!, ХОЧУ ЗНАТЬ!!! Пропадают записи, в БД База данных на ClientDataSet!!!???, процедуры работы с ClientDataSet??? Установка BDE, как правильно устанавливать BDE TTable Добавление или замена данных в BD????!!!!!!, ОЧЕНЬ НАДО!!! Нашел старую лабу Навигация в BDE Delphi, BDE, Paradox, SQL запрос, как сделать запрос? пароль, bde administrator Параметры запроса, помогите Подключение к БД. Delphi+ADO Как заставить БДЕ не откатываться? Delphi, ADO, MS SQL 2000 Как определить номер текущей записи?, Использую Query (BDE). Sybase Создание инсталляции для BDE, помогите Case...of Где найти примеры БД на Delphi, inside База данных Первая колонка в базе!, хелп! BDE. Файл inmem000.rem, Почему "растет" файл inmem000.rem? Delphi & MSAccess, Можно ли в Delphi работать с MSAccess? Delphi, xml и БД Огромная проблема с BDE администратором! под win2k Ошибка в BDE Administrator Access+SQL, Ошибка в запросе Драйвера BDE, или как создать не Paradox Как запустить программу деинсталляции? пароль для поля таблицы, Help!!! БД в Delphi 6 Нужна помощь по запросу, Динамический запрос BDE, как она использует память Locate по нескольким полям в TADOQuery, Delphi, "Invalid variant type conversation" ADOQuery, CommandText does not return a result set Пароль на базу данных, использую BDE и DataBase Desktop Глюки BDE. Paradox., Пропадают данные. Прямой SQL - запрос., Subj MS Access 97 + пароль к ней + BDE Вопрос о ресурсах..., .................................. Переименование таблицы Как создать копию db таблицы? BDE Error: Index does not exist Как Вы относитесь к курящим девушкам? как добавлять, редактировать, удалять записи через, запросы SQL? Ошибка в запросе SQL Значение из таблицы получения списка таблиц Добавление изображений в базу, Подскажите пожалуста как это сделать DBgrid - Clear, как очистить DbGrid Событие OnFocus у Мемо?, Как сделать? БД Paradox Офигенно простой вопрос про TQuery TADOQuery, Как объявить параметры в TADOQuery? Delphi 5 & InterBase 6, Не могу создать хранимую процедуру Как Вы относитесь к курящим девушкам? Добавление в конец текста MS Word Своё popup меню для браузера TWebBrowser, FullScreen И снова TWebBrowser, Размер шрифта Word и компонент OleContainer, Отображаеться только одна страница Как передать параметры с hml в ocx HEX, FileStream Несколько одинаковых страниц в Word, как создать? TF1Book... |
Платные хостинги Раскрутка сайта Книги по программированию Delphi, BDE, Paradox, SQL запрос, как сделать запрос?
- Дело в том, что я уже месяц делаю программу по японскому морю. Сущность в том, что бы проставить на карте точки и получить отчёт - скорости звука в этих точках на разных глубинах. Но, как вы понимаете, проставить точки на карте в точности в том месте, которому соответствует запись в БД нереально. Поэтому метод простой - подбираем ближайшую существующую точку в БД. Таблица данных имеет 1'200'000 записей. Структура:idlat - широтаlon - долготаdeep - глубинаvelo - скорость звукаbe - номер дня в году, с которого началось измерениеee - -||- в котором закончилось измерение (они все длились ровно месяц)Т.о. задача такова: вход: lat_u, lon_u - координаты точки пользователя в морских координатахНапример lat_u = 43.0lon_u = 134.0Выходlat_u = 43.3lon_u = 134.34Вот так господа - Код Type TSeaPosition = record lat_u, lon_u: Real; end;function GetRealSeaPosition(SeaPosition: TSeapPosition): TSeaPosition;begin {Получаем первую ближайшую} Query.SQL.Text := 'SELECT Max(lat) FROM Table WHERE lat <= :lat_u'; Query.ParamByName('lat_u').AsFloat := SeaPosition.lat_u; Query.Open; Query.Close; Result.lat_u := Query.FieldByName('lat').AsFloat; {Получаем вторую ближайшею точку} Query.SQL.Text := 'SELECT Min(lat) FROM Table WHERE lat >= :lat_u'; Query.ParamByName('lat_u').AsFloat := SeaPosition.lat_u; Query.Open; Query.Close; {Находим ближаушую точку} if (SeaPosition.lat_u - Result.lat_u) > (Query.FieldByName('lat_u').AsFloat - SeaPosition.lat_u) then Result.lat_u := SeaPosition.lat_u; {тоже самое для lot_n}end;{далее где то используешь примерно так}var RealPosition: TSeaPosition;begin RealPosition.lat_u := 43.3; RealPosition.lon_u := 134.4; RealPosition := GetRealSeaPosition(RealPosition); Query.SQL.Text := 'SELECT velo FROM Table WHERE lat = :lat_u AND lon = :lon_u'; Query.ParamByName('lat_u').AsFloat := RealPosition.lat_u; Query.ParamByName('lon_u').AsFloat := RealPostition.lon_u; Query.Open; Query.Close; if not Query.IsEmpty then ShowMessage(FloatToStr(Query.FieldByName('velo').AsFloat));end;highlightSyntax('sqlxZjdkO','sql');Примерно так - я не проверял это код, но думаю идея понятна. Да, и в функции GetRealSeaPosition нет проверки на случай если точка не будет найдена - учти это. Добавлено @ 19:33 И еще одно замечание - у тебя 1 200 000 записей в базе. Даже если ты сделаешь индекс по полям lat и lon, то учитывая что проверка идет на больше\меньше, то индесы работать не будут, если я правильно помню одну статью - прийдется тут чего то выдумывать. Это сообщение отредактировал <Spawn> - 22.8.2004, 20:00 - Спасибо, как проверю сразу сообщу. - Да, работает. Но как тороз-з-з-з-ит! Около 7 секунд одну выборку! Лодку сто раз торпеда потопит, пока эта программа выдаст отчёт. (Шутка) Итого у меня получается 20 выборок.Тормоззз идёт две минуты. Это сообщение отредактировал Матроскин - 24.8.2004, 20:40 - Матроскин Думай чего то с индексами. - Или ставь какой-нибудь SQL - они обычно заточены на базы и работают гораздо быстрее, чем локальные базы большого размера. У тебя все-таки более миллиона записей. - Всё таки единственный выход, который я вижу это использование индексов. Как только найду решение сразу выложу. - Мужики оно работает!Создаём комплексный индекс по полям Lat и Lon. Table1.IndexName := 'iLatLon'; Table1.FindNearest([SeaPosition.lat_u, SeaPosition.lon_u]);Ищет в доли секунды |