Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 57
1

Обновление данных в DBgrid

16.04.2015, 01:58. Показов 5186. Ответов 24
Метки нет (Все метки)

Доброй ночи! Delphi + Access 2010. Забегая вперед, скажу, что вычисляемые поля сделанные в БД - это обдуманный подход, который в моем случае наиболее подходящий. В общем ситуация такая, в таблице имеются 4 вычисляемых поля. Данные изменяются через программу напрямую в DBGRID. После изменения данных, в базе данных вычисляемые поля срабатывают, пересчитывают результат, но в DBGRID значения старые. Вопрос вот в чем... Какое событие отвечает за изменение данных в ячейке и каким образом обновить данные конкретно в редактируемой строке? Сразу хочу сказать, что после изменения данных, пользователь может нажать enter, может стрелками перейти в вниз или вверх, а может и вообще кликнет мышкой в другом месте, а быть может изменив их, ничего не сделает, а просто закроет программу. Как это все учесть? Спасибо!
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.04.2015, 01:58
Ответы с готовыми решениями:

Обновление данных в dbgrid
Как обновить данные в дбгриде после добавления? вот код добавления Form1.ADOQuery1.Close();...

Обновление данных в DBGrid после изменения данных
Значит имеется кнопка удаления с DBGrid поля procedure TForm2.Button3Click(Sender: TObject); var...

Обновление выводимых данных в DBGrid
Имеется многотабличный запрос, который исполняется и корректно выводится на DBGrid Необходимо...

DBGRID сложная проверка на обновление данных
Здравствуйте. Есть DBGRID DATASOURCE ADOQUERY всё связанно между собой. Данные берутся из db файла...

24
пофигист широкого профиля
4463 / 2948 / 833
Регистрация: 15.07.2013
Сообщений: 16,950
16.04.2015, 02:07 2
Цитата Сообщение от Евгений Стронг Посмотреть сообщение
Какое событие отвечает за изменение данных в ячейке
Никакого такого события нет, ибо в "ячейке" нет никаких данных и отродясь никогда не было.
После изменения данных в БД единственный способ отобразить изменения в "ячейках" - это перечитать БД заново.
Цитата Сообщение от Евгений Стронг Посмотреть сообщение
каким образом обновить данные конкретно в редактируемой строке?
Никаким.
0
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 57
16.04.2015, 02:16  [ТС] 3
А на каком этапе обновлять БД? Я же должен как-то понять, когда данные поменялись. И ещё... Ведь база будет расти. Если после каждого изменения перечитывать, не будет ли она через пол года перечитываться по пол часа?
0
пофигист широкого профиля
4463 / 2948 / 833
Регистрация: 15.07.2013
Сообщений: 16,950
16.04.2015, 02:33 4
Цитата Сообщение от Евгений Стронг Посмотреть сообщение
А на каком этапе обновлять БД? Я же должен как-то понять, когда данные поменялись.
Когда обновлять вывод базы в DBgrid решает обычно пользователь. Если данные в базе поменялись в результате выполнения твоей программы, то ты и так знаешь когда обновить показ их в DBGrid. Если изменения сделаны не через твою программу, то тебе об этом никто не сообщит. Даже не надейся.
Цитата Сообщение от Евгений Стронг Посмотреть сообщение
Ведь база будет расти. Если после каждого изменения перечитывать, не будет ли она через пол года перечитываться по пол часа?
Может и будет, если ни она, ни программа для работы с ней не продумана заранее.
0
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 57
16.04.2015, 02:46  [ТС] 5
Пользователь меняет данные в гриде по подобию таблицы Excel. Изменил значение в ячейке и пошел дальше, а может и не пошел, изменив только одно значение, после чего, должны сразу перечитаться 4 вычисляемых поля. Просто я подумал, будет к примеру 500 000 записей, для Access я так думаю будет не так так просто вытаскивать данные с такой скоростью.
0
пофигист широкого профиля
4463 / 2948 / 833
Регистрация: 15.07.2013
Сообщений: 16,950
16.04.2015, 02:53 6
Цитата Сообщение от Евгений Стронг Посмотреть сообщение
Пользователь меняет данные в гриде по подобию таблицы Excel.
Ну так пусть он и работает в Ёкселе. Зачем ты ему пытаешься предложить тухлый вариант с БД?
Ну и.
Разве какой-нибудь пользователь работает с Ёкселевским файлом с таким количеством строк 500 000?
0
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 57
16.04.2015, 03:06  [ТС] 7
Вот я приложил два скрина. На первом, слева выезжает панель с которой по двойному клику добавляется продукт, по умолчанию с весом 100 грамм, соответственно с БЖУ, рассчитанным на 100 грамм. На втором скрине меняю на 50, соответственно в БД, в вычисляемых полях, данные пересчитались, у меня пока нет. Но дело в том, что с самой левой стороны в гриде идет разбивка по дням, где данные по БЖУ суммируются по результатам моих вычисляемых полях. Тут Excel никак не предложить, тут все очень сложно. Это один из элементов, а в программе ещё идут тренировки, антропометрия, графическая статистика, завязанная на эти данные. Я вот думаю... может сделать кнопку, нажав на которую все данные пересчитаются... Так наверно разумнее всего. Просто намного круче было бы, если бы данные менялись он-лайн.
Миниатюры
Обновление данных в DBgrid   Обновление данных в DBgrid  
0
пофигист широкого профиля
4463 / 2948 / 833
Регистрация: 15.07.2013
Сообщений: 16,950
16.04.2015, 03:19 8
Цитата Сообщение от Евгений Стронг Посмотреть сообщение
Вот я приложил два скрина.
Зачем приложил? То что ты хочешь понятно и без скриншотов. То что тебе нужно делать чтобы обновлять показ данных я тоже уже сказал.

Добавлено через 1 минуту
Ах да.
Забыл напомнить что волшебная палочка существует только в сказках.
1
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 57
16.04.2015, 03:29  [ТС] 9
Ну я к тому, что ты говоришь о том, что может программа или бд не продуманна и что быть может лучше работать в excel. Тут только бд. И рост данных постоянно будет, так как на каждый день указываются продукты. Эта таблица хочешь не хочешь, а будет "пухнуть". В общем спасибо за ответ. Главное, что я понял, так это то, что не вытащить отдельную строку с обновленными данными. Ну я могу конечно взять id записи, пробежаться по таблице и вынести эти обновленные поля... Но тут быстрее будет переоткрыть кверик, как мне кажется. В общем нужно делать кнопку. Нажал - увидел обновленные данные, не нажал - не увидел. Спасибо за ответы!
0
5086 / 3966 / 1309
Регистрация: 14.04.2014
Сообщений: 18,253
Записей в блоге: 18
16.04.2015, 09:53 10
давай немного учебника
вводные
1. на экран всегда выводится ВЫБОРКА из БД.
2. человеку таблица более тысячи, ну двух тысяч строк никогда не нужна. Если все правильно спроектировано, строк вообще 10-100
3. процедура датасета Refresh может считать (и обновить в гриде, о!) одну нужную строку
ну и очевидные вещи - обновлять суммы после добавления в заказ - не слишком тяжелая операция
0
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 57
16.04.2015, 12:06  [ТС] 11
Из всего того, что ты написал, у меня в голову только одна идея возникла. Создать ещё одну таблицу, в которую будут скидываться данные, после закрытия программы. Своего рода архив. А на счет Refresh спасибо! Я думал он обновляет весь набор данных. Но опять же, а как понять, что данные поменялись? Можно конечно условием на dataset.modify, но это условие должно же запустить какое-то событие.
0
5086 / 3966 / 1309
Регистрация: 14.04.2014
Сообщений: 18,253
Записей в блоге: 18
16.04.2015, 12:22 12
блииин
только не
Цитата Сообщение от Евгений Стронг Посмотреть сообщение
Создать ещё одну таблицу
чем тебе существующая таблица не угодила?

надо почитать что-нибудь про базы данных вообще, про параметры запросов
задумайся:
SQL
1
SELECT f1, f2 FROM table1 WHERE F5<=:Date1
и ты получаешь "архив"
SQL
1
SELECT f1, f2 FROM table1 WHERE F5>=:Date1
и - та-дааам - только свежак
для этого не нужно никаких еще одних таблиц...
0
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 57
16.04.2015, 12:58  [ТС] 13
Да я все это знаю про базы данных и запросы. Я веду к тому, что критерий отбора в первом случае будет из 100 строк, а через год уже из 100 000 строк. Вот в чем дело. И я сомневаюсь, что рефреш будет так же быстро работать, как сейчас. Поэтому я и вижу один единственный выход - это архивация в отдельную таблицу старых данных, которые при необходимости будут подтягиваться из другой таблы, в соответствии с запросом. У меня по сути стандартная структура - "голова" и "тело". В одной дата, время и несколько числовых полей, а в другой уже основная информация связанная по id из первой таблицы.
0
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 57
16.04.2015, 13:06  [ТС] 14
Скрин
Миниатюры
Обновление данных в DBgrid  
0
5086 / 3966 / 1309
Регистрация: 14.04.2014
Сообщений: 18,253
Записей в блоге: 18
16.04.2015, 13:24 15
Лучший ответ Сообщение было отмечено Евгений Стронг как решение

Решение

для 100000 не забивай голову
у меня по сложному условию из 15 млн выборка 1500 с джойнами с сервера в лок. сети идет 1.5 сек
1
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 57
16.04.2015, 13:26  [ТС] 16
Ого! Ну тогда у меня больше нет вопросов. Спасибо!
0
2648 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,725
16.04.2015, 13:30 17
Цитата Сообщение от Евгений Стронг Посмотреть сообщение
рефреш будет так же быстро работать, как сейчас
Конечно не будет если вся запрашиваемая выборка целиком фётчится на сторону клиента, в то время как для показа/изменения в данный момент нужна лишь малая часть выборки.
И вот чтобы этого не происходило, нужно с умом и полной серьезностью подходить к вопросу о выборе типа курсора НД. В случае с СУБД Access выбор невелик - серверные типы курсоров напрочь отсутствуют (в некоторых файл-серверных СУБД они могут только эмулироваться драйверами соответствующих СУБД-клиентов), что рано или поздно заведет решение проблемы в тупик. Потому пока не поздно нужно переводить свое приложение на платформу полноценной клиент-серверной СУБД.
0
5086 / 3966 / 1309
Регистрация: 14.04.2014
Сообщений: 18,253
Записей в блоге: 18
16.04.2015, 13:42 18
я с access не работал, а что, в нем другой принцип работы SQL ??
0
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 57
16.04.2015, 13:48  [ТС] 19
Я с большим удовольствием бы использовал MySQL с хранимыми процедурами, но это нужно арендовать vps/vds. При минимальных возможностях - 565р. в месяц. Сумма конечно же не большая, но тем не менее, для проекта, который себя ни как не зарекомендовал, пока рановато. Но в будущем планирую. Правда потом придется ещё поплясать с миграцией данных тех, которые у пользователя есть в БД.
0
2648 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,725
16.04.2015, 14:07 20
Сам SQL ни причем.
Вопрос в том, кто и как исполняет клиентские SQL-запросы
В СУБД Access нет автономного высокопроизводительного SQL-сервера, потому его роль берет на себя драйвер-посредник с убогими (в сравнении с полноценными SQL-серверами) возможностями.

Добавлено через 6 минут
бы использовал MySQL .., но это нужно арендовать
Ну а сейчас-то ты где базу хранишь - прямо на машине пользователя твоего приложения или на машине в его частной лок.сети ?
И ничего ведь не арендуешь при этом ?)
Ну так а какая нафих разница - хранить там базу Мускула или базу Access ?
Придет время и необходимость - купишь/арендуешь серверные ресурсы и уберешь туда базу.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.04.2015, 14:07

Обновление данных в строке DbGrid-а при клике на эту строку
по клику на строку dbgrid требуется обновить данные в определенной строке. запрос на обновление...

DBGrid и обновление.
Здравствуйте, у меня есть БД Access, подключено все через ADOTAble. На форме1 у меня происходит...

обновление DBGrid
Всем доброго вечера. Возник вопрос. Есть 1 DBGrid и 2 DataSource. Как сделать как чтобы сразу...

Обновление DBGrid
Здравствуйте! Обновить дбгрид, чтобы фокус остался в той же ячейке. При двойном клике у меня...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru