Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как получить значения поля без перебора по запросу, безо всяких ADOQuery.next и запоминания 
:(
    Опции темы
Lunatikus
Дата 10.9.2007, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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).
сайт гильдии
PM MAIL   Вверх
Savek
Дата 10.9.2007, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 10.4.2006
Где: Воронеж

Репутация: 7
Всего: 7



Вряд ли, да и чем массив или список лучше RecordSet-a? 

PM MAIL   Вверх
Lunatikus
Дата 10.9.2007, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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).
сайт гильдии
PM MAIL   Вверх
ZeroMem
Дата 10.9.2007, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 24.8.2004
Где: Комсомольск-на-Ам уре

Репутация: нет
Всего: нет



Используй компоненты EhLib MemTable. Там можно указать свойство загружать ВСЕ(!!!) в массив, а потом достаточно просто получить к нему доступ. Вот только кажется там каждый элемент будет типа Variant... кажется. А вообще куском лучше не грузить. Лучше попробовать кусками этим же компонентом тягать данные.
PM MAIL ICQ   Вверх
Lunatikus
Дата 10.9.2007, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 29.6.2007

Репутация: 1
Всего: 6



представь себе хотя бы 10 полей типа врачар(255) в миллион строк...и все это вариант...


--------------------
TheSin - небольшое игровое сообщество взрослых и молодых(L2,WoW,Aion,RFonline and other not mmorpg,not computer games).
сайт гильдии
PM MAIL   Вверх
Savek
Дата 10.9.2007, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 10.4.2006
Где: Воронеж

Репутация: 7
Всего: 7



Цитата(Lunatikus @  10.9.2007,  13:01 Найти цитируемый пост)
бы из адоквери можно было вытащить значение не текущей и я бы это знал,я бы не парился со списком отдельным).Каким образом ее передвигать?


First;
Last;
Next;
Prior;
MoveBy;
Locate;
lookup;
FindFirst;
FindNext;
.. и т.д.

Если работаешь с базами данных про массивы забудь! Опиши подробнее задачу попробуем найти правильное решение 
PM MAIL   Вверх
Lunatikus
Дата 10.9.2007, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 29.6.2007

Репутация: 1
Всего: 6



задача уже решена,но выполнение процеса занимает три часа минимум.А все почему?Ситуация примерно такая,без улсожнений:
представьте календарь и несколько артикулов(товаров).ДЛя каждого артикула свой календарь,В котором ко дню привязан определенный остаток,прогноз(получается в минус остатка текущего),заказ(тоже в минус остатку),приход товара(в плюс).На основе этих полей надо просчитать остатки будущих дней(прогноз,заказы и приходы будущих дней известны и известен остаток на текущий день).Как я делал?В лоб.Я перебирал записи последовательно,сохранял остаток в переменную.Вычитал из нее значения из следующей записи и так далее....загрузка произошла изза того,что я каждый такой шаг выполняю запрос на запись в базу полученного остатка.А правильнее надо было бы делать один запрос в конце.Но тогда надо расчитать остатки программно опять же перебором,чтобы узнать значения поля остатка.Потому и хочу получить сразу весь список значений,чтобы работать с ним,а не использовать next,ибо это зло


--------------------
TheSin - небольшое игровое сообщество взрослых и молодых(L2,WoW,Aion,RFonline and other not mmorpg,not computer games).
сайт гильдии
PM MAIL   Вверх
Savek
Дата 10.9.2007, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 10.4.2006
Где: Воронеж

Репутация: 7
Всего: 7



Цитата(Lunatikus @  10.9.2007,  15:38 Найти цитируемый пост)
Я перебирал записи последовательно,сохранял остаток в переменную

Не совсем понятен алгоритм, но думаю этот перебор можно заменить одним запросом (знать бы структуру таблиц)
PM MAIL   Вверх
Lunatikus
Дата 10.9.2007, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
примерно это выдает запрос.И вот в этом наборе данных и перебираю по одной строке,считаю остаток следующей строки,записываю его апдейтом.Смещаюсь вниз,снова считаю...вот так  smile 
елси бы я знал сразу все значения всех этих полей и мог к каждому элементу мгновенно доступиться,было бы проще и рациональнее.Но,увы,я не знаю другого метода,кроме как вот так,перебором с next'ом

Это сообщение отредактировал(а) Lunatikus - 10.9.2007, 16:10


--------------------
TheSin - небольшое игровое сообщество взрослых и молодых(L2,WoW,Aion,RFonline and other not mmorpg,not computer games).
сайт гильдии
PM MAIL   Вверх
Savek
Дата 10.9.2007, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 10.4.2006
Где: Воронеж

Репутация: 7
Всего: 7



Цитата(Lunatikus @  10.9.2007,  16:08 Найти цитируемый пост)
Есть запрос,результат которого-этот самый календарь на все артикулы:

Т.е это промежуточное состояние данных? Здесь нужно плясать от того что мы имеем к тому что должны получить, возможно этот запрос не самый оптимальный. 
PM MAIL   Вверх
ALeXandrK
Дата 10.9.2007, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 342
Регистрация: 31.1.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 6



А почему бы тебе в твой запрос не добавить стрку INSERT INTO temp,
чтобы этот запрос превратился в таблицу, а потом, соответственно, 
следующим запросом подсчитать тебе все, что нужно и удалить
временную таблицу?!

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

Это сообщение отредактировал(а) ALeXandrK - 10.9.2007, 17:17


--------------------
Богат не/ни тот, у кого много, а тот, кому хватает
PM WWW   Вверх
SergeBS
Дата 11.9.2007, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



Lunatikus
К Delphi твои проблемы не относятся. Прочитай Грабера(Грубера) про SQL или в BOL. Есть такая штука: агрегатные функции. Например:
Код

select sum(ostatok) as sum_ostatok where articul = A1

Догадайся, что эта строка вычислит smile

ALeXandrK
Цитата

Богат ни тот, у кого много, а тот, кому хватает

Не "ни тот", а "нЕ тот"!
PM MAIL   Вверх
Akella
Дата 11.9.2007, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(Lunatikus @  10.9.2007,  15:38 Найти цитируемый пост)
Ситуация примерно такая,без улсожнений:

а ты это всё на клиенте считаешь? А если алгоритм перевести в хранимку и считать на сервере.... это значительно ускорит процесс
PM MAIL   Вверх
Lunatikus
Дата 11.9.2007, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 29.6.2007

Репутация: 1
Всего: 6



SergeBS, строка вычислит сумму остатков.Плин,Я ,конечно,новичок в программировании БД и составлении запросов SQL.Но не считайте меня совсем дибилом.Значит я не так задачу расписал,что ты предлагаешь мне сумму.Хотите,чтобы я показал вам запрос,который дает календарь?ну ловите.Запрос на столь сложное вычисление значения следующей строки на основе вычисленного уже значения предыдущей.Уже я сделал тему в разделе MS SQL на эту тему,как запросом сделать подобное вычисление.А теперь посмотрите на запрос,который выдает календарь.Писать все таблицы и объяснять,как создавался запрос смысла не вижу-никто не захочет разбираться во множественных связях 5 таблиц и таком вот запросе:

Код

SELECT A.data,A.univer,A.ostatok,A.prognoz,A.kolc,B.razmer,A.zayavka,A.x FROM 
         (
         SELECT deal_table.data,deal_table.univer,deal_table.ostatok,deal_table.prognoz,deal_table.zayavka,A.kolc,deal_table.x 
         FROM (
                    (
                    SELECT deal_table.data,deal_table.univer,deal_table.ostatok,deal_table.prognoz,deal_table.zayavka,
                                  sum(v_puti_msk.kolc)*univer_msk.[Коэффициент пересчета] as kolc,deal_table.x                       
                        FROM deal_table,univer_msk,v_puti_msk 
                     WHERE deal_table.x=''new'' AND 
                                 deal_table.univer=univer_msk.универартикул AND 
                                 univer_msk.COD_ARTIC=v_puti_msk.art AND 
                                 deal_table.data=v_puti_msk.date AND 
                                 univer_msk.[Пред-во]=''Питер'' 
                GROUP BY deal_table.x,deal_table.data,deal_table.univer,deal_table.ostatok,deal_table.prognoz,deal_table.zayavka,univer_msk.[Коэффициент пересчета]
                     ) AS A 
                     RIGHT JOIN deal_table 
                     ON A.univer=deal_table.univer AND A.data=deal_table.data AND A.x=''new''
                   )
          ) AS A INNER JOIN 
         (
         SELECT deal_table.data,deal_table.univer,deal_table.ostatok,deal_table.prognoz,deal_table.zayavka,B.razmer,deal_table.x 
         FROM (
                    (
                     SELECT deal_table.data,deal_table.univer,deal_table.ostatok,deal_table.prognoz,deal_table.zayavka,sum(ZAK.razmer)*univer_msk.[Коэффициент пересчета] as razmer ,deal_table.x 
                     FROM deal_table,univer_msk,zak_msk 
                     WHERE deal_table.x=''new'' AND 
                                 deal_table.univer=univer_msk.универартикул AND 
                                 univer_msk.универартикул=zak.univer AND 
                                 deal_table.data=zak.data_zak AND 
                                 univer_msk.[Пред-во]=''Питер'' 
                GROUP BY deal_table.x,deal_table.data,deal_table.univer,deal_table.ostatok,deal_table.prognoz,deal_table.zayavka,univer_msk.[Коэффициент пересчета]
                    ) AS B 
                    RIGHT JOIN deal_table 
                    ON B.univer=deal_table.univer AND B.data=deal_table.data AND B.x=''new''
                  )
          ) AS B 
         ON A.data=B.data AND A.univer=B.univer AND A.x=''new'' AND B.x=''new'' 
         ORDER BY A.univer,A.data

никто не захочет тратить время на разборку этого,или я не прав?)

Добавлено через 1 минуту и 58 секунд
Akella, как можно перевести в хранимую процедуру выполнение кода проги?Мне для начала тогда надо запросом вычисления сделать.А если это получится и так все будет сервер выполнять...чет я запутался...


--------------------
TheSin - небольшое игровое сообщество взрослых и молодых(L2,WoW,Aion,RFonline and other not mmorpg,not computer games).
сайт гильдии
PM MAIL   Вверх
kobra
Дата 11.9.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



честно скозать, не понял алгоритм, но в принципе наверное это не стол важно.
лично я, в любом случае сделал бы на сервере.  хатя бы потому что гонять милион записеи по сети не етично.
но что косается 
Цитата(Lunatikus @  10.9.2007,  13:01 Найти цитируемый пост)
если бы из адоквери можно было вытащить значение не текущей и я бы это знал,я бы не парился со списком отдельным
если точно помню эта функция называется lookup

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1337 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.