![]() |
|
![]() ![]() ![]() |
|
Lunatikus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 503 Регистрация: 29.6.2007 Репутация: 1 Всего: 6 |
Здравствуйте.Подскажите,пожалуйста,кто знает,как после ADOQuery.open получить все значения какого-то поля списком или массивом(чтобы значения шли в строгой последовательности как выдает запрос ADOQuery)?И возможно ли это?Просто перебор 1млн. записей с помощью next затормаживает.А перебор именно для считывания этих значений и на их основе вычисления новых для последующего апдейта таблицы в базе.База MS SQL Server 2000
Это сообщение отредактировал(а) Lunatikus - 10.9.2007, 12:37 -------------------- TheSin - небольшое игровое сообщество взрослых и молодых(L2,WoW,Aion,RFonline and other not mmorpg,not computer games). сайт гильдии |
|||
|
||||
Savek |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 355 Регистрация: 10.4.2006 Где: Воронеж Репутация: 7 Всего: 7 |
Вряд ли, да и чем массив или список лучше RecordSet-a?
|
|||
|
||||
Lunatikus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 503 Регистрация: 29.6.2007 Репутация: 1 Всего: 6 |
чем лучше,не знаю,не работал с рекордсетом.Какие методы мне надо знать,чтобы получить любое значение любого поля,зная его номер внутри рекордсета?Еще увидел,что у него,Как и у, ADOQuery етсь понятие текущей записи(если бы из адоквери можно было вытащить значение не текущей и я бы это знал,я бы не парился со списком отдельным).Каким образом ее передвигать?Спасибо за помощь =)
Это сообщение отредактировал(а) Lunatikus - 10.9.2007, 13:01 -------------------- TheSin - небольшое игровое сообщество взрослых и молодых(L2,WoW,Aion,RFonline and other not mmorpg,not computer games). сайт гильдии |
|||
|
||||
ZeroMem |
|
|||
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 24.8.2004 Где: Комсомольск-на-Ам уре Репутация: нет Всего: нет |
Используй компоненты EhLib MemTable. Там можно указать свойство загружать ВСЕ(!!!) в массив, а потом достаточно просто получить к нему доступ. Вот только кажется там каждый элемент будет типа Variant... кажется. А вообще куском лучше не грузить. Лучше попробовать кусками этим же компонентом тягать данные.
|
|||
|
||||
Lunatikus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 503 Регистрация: 29.6.2007 Репутация: 1 Всего: 6 |
представь себе хотя бы 10 полей типа врачар(255) в миллион строк...и все это вариант...
-------------------- TheSin - небольшое игровое сообщество взрослых и молодых(L2,WoW,Aion,RFonline and other not mmorpg,not computer games). сайт гильдии |
|||
|
||||
Savek |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 355 Регистрация: 10.4.2006 Где: Воронеж Репутация: 7 Всего: 7 |
First; Last; Next; Prior; MoveBy; Locate; lookup; FindFirst; FindNext; .. и т.д. Если работаешь с базами данных про массивы забудь! Опиши подробнее задачу попробуем найти правильное решение |
|||
|
||||
Lunatikus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 503 Регистрация: 29.6.2007 Репутация: 1 Всего: 6 |
задача уже решена,но выполнение процеса занимает три часа минимум.А все почему?Ситуация примерно такая,без улсожнений:
представьте календарь и несколько артикулов(товаров).ДЛя каждого артикула свой календарь,В котором ко дню привязан определенный остаток,прогноз(получается в минус остатка текущего),заказ(тоже в минус остатку),приход товара(в плюс).На основе этих полей надо просчитать остатки будущих дней(прогноз,заказы и приходы будущих дней известны и известен остаток на текущий день).Как я делал?В лоб.Я перебирал записи последовательно,сохранял остаток в переменную.Вычитал из нее значения из следующей записи и так далее....загрузка произошла изза того,что я каждый такой шаг выполняю запрос на запись в базу полученного остатка.А правильнее надо было бы делать один запрос в конце.Но тогда надо расчитать остатки программно опять же перебором,чтобы узнать значения поля остатка.Потому и хочу получить сразу весь список значений,чтобы работать с ним,а не использовать next,ибо это зло -------------------- TheSin - небольшое игровое сообщество взрослых и молодых(L2,WoW,Aion,RFonline and other not mmorpg,not computer games). сайт гильдии |
|||
|
||||
Savek |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 355 Регистрация: 10.4.2006 Где: Воронеж Репутация: 7 Всего: 7 |
||||
|
||||
Lunatikus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 503 Регистрация: 29.6.2007 Репутация: 1 Всего: 6 |
никаких таблиц.Есть запрос,результат которого-этот самый календарь на все артикулы:
---data-----------articul----ostatok----prognoz----zakaz---prihod--- 01.01.2007 A1 10 1 0 0 02.01.2007 A1 NULL 1 1 10 03.01.2007 A1 NULL 1 0 0 01.01.2007 A2 15 2 2 0 02.01.2007 A2 NULL 2 0 0 03.01.2007 A2 NULL 2 0 4 01.01.2007 A3 5 1 0 0 02.01.2007 A3 NULL 1 1 0 03.01.2007 A3 NULL 1 0 3 примерно это выдает запрос.И вот в этом наборе данных и перебираю по одной строке,считаю остаток следующей строки,записываю его апдейтом.Смещаюсь вниз,снова считаю...вот так ![]() елси бы я знал сразу все значения всех этих полей и мог к каждому элементу мгновенно доступиться,было бы проще и рациональнее.Но,увы,я не знаю другого метода,кроме как вот так,перебором с next'ом Это сообщение отредактировал(а) Lunatikus - 10.9.2007, 16:10 -------------------- TheSin - небольшое игровое сообщество взрослых и молодых(L2,WoW,Aion,RFonline and other not mmorpg,not computer games). сайт гильдии |
|||
|
||||
Savek |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 355 Регистрация: 10.4.2006 Где: Воронеж Репутация: 7 Всего: 7 |
||||
|
||||
ALeXandrK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 342 Регистрация: 31.1.2007 Где: Санкт-Петербург Репутация: 2 Всего: 6 |
А почему бы тебе в твой запрос не добавить стрку INSERT INTO temp,
чтобы этот запрос превратился в таблицу, а потом, соответственно, следующим запросом подсчитать тебе все, что нужно и удалить временную таблицу?! Самый быстрый способо в твоем случае - это именно в запросе все считать, т.к. это будет минимальный набор телодвижений (без переходов, подсчетов, записи и т.п.), т.е. сразу очень много лишнего уберешь. Это сообщение отредактировал(а) ALeXandrK - 10.9.2007, 17:17 -------------------- Богат не/ни тот, у кого много, а тот, кому хватает |
|||
|
||||
SergeBS |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 11 Всего: 22 |
Lunatikus,
К Delphi твои проблемы не относятся. Прочитай Грабера(Грубера) про SQL или в BOL. Есть такая штука: агрегатные функции. Например:
Догадайся, что эта строка вычислит ![]() ALeXandrK,
Не "ни тот", а "нЕ тот"! |
||||
|
|||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
||||
|
||||
Lunatikus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 503 Регистрация: 29.6.2007 Репутация: 1 Всего: 6 |
SergeBS, строка вычислит сумму остатков.Плин,Я ,конечно,новичок в программировании БД и составлении запросов SQL.Но не считайте меня совсем дибилом.Значит я не так задачу расписал,что ты предлагаешь мне сумму.Хотите,чтобы я показал вам запрос,который дает календарь?ну ловите.Запрос на столь сложное вычисление значения следующей строки на основе вычисленного уже значения предыдущей.Уже я сделал тему в разделе MS SQL на эту тему,как запросом сделать подобное вычисление.А теперь посмотрите на запрос,который выдает календарь.Писать все таблицы и объяснять,как создавался запрос смысла не вижу-никто не захочет разбираться во множественных связях 5 таблиц и таком вот запросе:
никто не захочет тратить время на разборку этого,или я не прав?) Добавлено через 1 минуту и 58 секунд Akella, как можно перевести в хранимую процедуру выполнение кода проги?Мне для начала тогда надо запросом вычисления сделать.А если это получится и так все будет сервер выполнять...чет я запутался... -------------------- TheSin - небольшое игровое сообщество взрослых и молодых(L2,WoW,Aion,RFonline and other not mmorpg,not computer games). сайт гильдии |
|||
|
||||
kobra |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 730 Регистрация: 15.6.2005 Где: Грузия, Тбилиси Репутация: 1 Всего: 9 |
честно скозать, не понял алгоритм, но в принципе наверное это не стол важно.
лично я, в любом случае сделал бы на сервере. хатя бы потому что гонять милион записеи по сети не етично. но что косается
|
|||
|
||||
Lunatikus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 503 Регистрация: 29.6.2007 Репутация: 1 Всего: 6 |
а как долго будет выполняться запрос лукапа в каждом шаге цикла на миллион шагов ?)
-------------------- TheSin - небольшое игровое сообщество взрослых и молодых(L2,WoW,Aion,RFonline and other not mmorpg,not computer games). сайт гильдии |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
это у тебя на клиенте молотится? так пусть на сервере Добавлено через 3 минуты и 8 секунд просто у меня тоже стоит задача, если ты видел мой пост здесь, в БД, я начал молотить циклы на клиенте, ОООчень долго, но мне помогли это перевести на сервер (FB), процедура отрабатывает за 4-5 секунд |
|||
|
||||
Lunatikus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 503 Регистрация: 29.6.2007 Репутация: 1 Всего: 6 |
у меня сервер MS SQL 2000.Как можно сделать процедуру,выполняемую сервером по вычислению полей?Без запроса ведь никак.Вот и думаю теперь как сделать запросом расчеты...а так все запросы у меня сервер выполняет,конечно
-------------------- TheSin - небольшое игровое сообщество взрослых и молодых(L2,WoW,Aion,RFonline and other not mmorpg,not computer games). сайт гильдии |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
||||
|
||||
Lunatikus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 503 Регистрация: 29.6.2007 Репутация: 1 Всего: 6 |
конечно позволяет.Мы не так друг друга поняли =) я говорю о цикле перебора записей while...do... разве такое можно сохранить в "хранимках"?
-------------------- TheSin - небольшое игровое сообщество взрослых и молодых(L2,WoW,Aion,RFonline and other not mmorpg,not computer games). сайт гильдии |
|||
|
||||
ALeXandrK |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 342 Регистрация: 31.1.2007 Где: Санкт-Петербург Репутация: 2 Всего: 6 |
А может я очень сильно отрицаю, тогда можно и НИ ![]() -------------------- Богат не/ни тот, у кого много, а тот, кому хватает |
||||
|
|||||
SergeBS |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 11 Всего: 22 |
Lunatikus,
Объясни все-таки понятнее, что вычисляешь. Именно для A1, например. Берешь на 02.01.2007 ostatok, из него вычитаешь на 01.01.2007 ostatok и т.д. до конца? Я ничего из этого не понял:
Что из чего вычитается и т.п.? |
|||
|
||||
Lunatikus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 503 Регистрация: 29.6.2007 Репутация: 1 Всего: 6 |
вычитаю из первого ostatka (т.е. на 01.01.2007) значения полей zakaz,prognoz.Полученное значение записываю под датой 02.01.2007 запросом в таблицу.Смещаюсь на 02.01.2007 и уже из нового остатка(он сохранен в переменной) вычитаю prognoz,zakaz текущей строки.И так до самого конца.Когда наталкиваюсь на смену артикула,сбрасываю значение переменной и заменяю стоящим в текущей строке.,хранящей убывающий остаток.Понятно объясняю?
Это сообщение отредактировал(а) Lunatikus - 11.9.2007, 16:05 -------------------- TheSin - небольшое игровое сообщество взрослых и молодых(L2,WoW,Aion,RFonline and other not mmorpg,not computer games). сайт гильдии |
|||
|
||||
SergeBS |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 11 Всего: 22 |
ALeXandrK,
Нельзя. НИ - только при перечислении. Lunatikus, Тогда BOL тебе в руки - CURSOR. Они как раз для таких построчных обработок сделаны. Или делай хранимку, которая будет высылать результат вычитания. БУдешь тогда смотреть только на дату и артикул - трафик сети резко упадет. И еще: если взять первый ostatok, из него вычесть суммы prognoz + zakaz для выбранного артикула, то по твоему описанию - получается сразу конечный результат. Или в описании что-то упущено. Например необходимость заполнения всех полей ostatok. |
|||
|
||||
Lunatikus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 503 Регистрация: 29.6.2007 Репутация: 1 Всего: 6 |
да,необходимость эта есть,не только изза того,что надо вносить новые значения остатков в каждой строке,но и потому,что вычисления надо делать до тех пор,пока остаток не станет нулем или отрицательным.НАсчет хранимок-наверное,стоит разобраться,что же это такое и как работает,буду искать...
-------------------- TheSin - небольшое игровое сообщество взрослых и молодых(L2,WoW,Aion,RFonline and other not mmorpg,not computer games). сайт гильдии |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
||||
|
||||
ALeXandrK |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 342 Регистрация: 31.1.2007 Где: Санкт-Петербург Репутация: 2 Всего: 6 |
![]() вот правила применения НЕ и НИ. Есть там пунктик "ни для усиления отрицания" - и написано там, что обычно оно применяется, когда уже есть отрицание, а обычно не значит обязательно... Я не говорю, что ты не прав, но вот НИ мне больше по-душе в этом случае ![]() ... ну это отвлечения... Lunatikus: Так может тебе создать запрос (в том же SQL, кот. будет тебе считать и обновлять), а уже в цикле вызывать этот запрос с помощью TADOStoredProc. Всяко будет быстрее, чем использовать Next, пробегая по всем полям. -------------------- Богат не/ни тот, у кого много, а тот, кому хватает |
||||
|
|||||
kobra |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 730 Регистрация: 15.6.2005 Где: Грузия, Тбилиси Репутация: 1 Всего: 9 |
SergeBS правильно скозал, тут хорошо сработает курсор в курсоре. можно конечно и табличними переменними ползоватся. нужно протестить что оптимальнее будет |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Базы данных и репортинг" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |