С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.66/65: Рейтинг темы: голосов - 65, средняя оценка - 4.66
Ksenya100
72 / 64 / 3
Регистрация: 13.05.2010
Сообщений: 349
1

Изменение данных через Query

08.07.2010, 15:39. Просмотров 11794. Ответов 76
Метки нет (Все метки)

пожалста -пожалста, помогите

у меня идет выборка с помощью Query из таблицы .DBF и мне надо, чтоб пользователь мог изменить данные в Grid и чтоб в исходной таблице (DBF) это изменение тоже произошло.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2010, 15:39
Ответы с готовыми решениями:

Работа с базами данных через компонент Query. SQL-запросы. Программа «Семейный бюджет»
Работа с базами данных через компонент Query. SQL-запросы. Программа «Семейный...

Изменение данных в IBExperte через Delphi
При создании приложения в делфи столкнулся с такой проблемой... В самой...

Создание/изменение/удаление данных в Excel подключеную через ADO Delphi
Здравствуйте люди добрые. Помогите с такой ситуацией. 2 формы в delphi, на...

Поиск через query
Доброго времени суток! Есть база, DBGrid подключен к query. Я хочу сделать...

Не изменяется строка в BD с через Query
Такой код: procedure TRegionRepository.UpdateObject(obj: TRegion); var ...

76
Lord_Voodoo
Супер-модератор
8611 / 2245 / 133
Регистрация: 07.03.2007
Сообщений: 10,840
Завершенные тесты: 1
08.07.2010, 15:59 2
Ksenya100, не понял, вы хотите данные с помощью запроса изменить или в дбгриде, у которого источником данных является TQuery? если второе вам надо в Options дбгрида разрешить редактирование и прилепите еще TDBNavigator (он вам в реализации разных методов работы с гридом жизнь упростит)
0
Ksenya100
72 / 64 / 3
Регистрация: 13.05.2010
Сообщений: 349
08.07.2010, 17:37  [ТС] 3
у меня такая ситуация:
пользователь из большой таблицы отбирает несколько строк (это уж его дело по каким критериям). этот отбор происходит через query. и вот, после нажатия на кнопку перед ним возникает grid, в котором отображается результат запроса. тут вдруг пользователь хочет изменить какое-то значение (из любой ячейки grid'a) и это изменение должно сохраняться в той большой таблице.

Добавлено через 1 час 10 минут
думала что-нить с update намутить ... - ничего не могу придумать =(
0
Lord_Voodoo
Супер-модератор
8611 / 2245 / 133
Регистрация: 07.03.2007
Сообщений: 10,840
Завершенные тесты: 1
08.07.2010, 18:34 4
Ksenya100, а у вас запрос из одной таблицы делается или нескольких? или просто накладываются условия, но данные тянуться из одной таблицы?
0
Ksenya100
72 / 64 / 3
Регистрация: 13.05.2010
Сообщений: 349
08.07.2010, 18:50  [ТС] 5
из одной таблицы, а условия накладываются - вы правильно поняли
0
Lord_Voodoo
Супер-модератор
8611 / 2245 / 133
Регистрация: 07.03.2007
Сообщений: 10,840
Завершенные тесты: 1
08.07.2010, 19:01 6
Ksenya100, ну тогда решение я вам уже сказал, Options - открыть для редактрования, TDBNavigator - для самих операций редактирования
0
Ksenya100
72 / 64 / 3
Регистрация: 13.05.2010
Сообщений: 349
09.07.2010, 11:06  [ТС] 7
в grid'e редактируется, в базе не сохраняются изменения.

ну, когда в DBGrid...DataSet=Table - всё ок (ну это логично)
а когда DBGrid...DataSet=Query - база не редактируется, что в принципе тоже ясно. а мне оч надо чтоб редактировалась.....
0
Larsus
64 / 64 / 10
Регистрация: 19.10.2009
Сообщений: 234
09.07.2010, 11:21 8
Цитата Сообщение от Ksenya100 Посмотреть сообщение
в grid'e редактируется, в базе не сохраняются изменения.

ну, когда в DBGrid...DataSet=Table - всё ок (ну это логично)
а когда DBGrid...DataSet=Query - база не редактируется, что в принципе тоже ясно. а мне оч надо чтоб редактировалась.....
А почему бы просто не сделать на событие двойного клика по записи в гриде создание дополнительной формочки с выводом в ней полей записи, ну и две кнопки "Сохранить" "Закрыть", по нажатию на сохранить делай запрос с update и обновляй поля это таблицы, только не забудь по двойному клику передавать id записи, ну и после сохранить не забудь сделать рефреш запроса который выводит у тебя записи в грид. удачи...
0
Ksenya100
72 / 64 / 3
Регистрация: 13.05.2010
Сообщений: 349
09.07.2010, 11:55  [ТС] 9
ну мне бы конечно лучше без дополнительных окон.......
но если ничего не придумаю то воспользуюсь советом..
0
SAMZ
1261 / 704 / 61
Регистрация: 21.12.2009
Сообщений: 2,255
09.07.2010, 12:04 10
По умолчанию объекты TQuery не редактируемые. Для обеспечения редактируемости этого объекта необходимо использовать его свойство CachedUpdates установив его в true. Кроме того вместе с TQuery следует использовать объект типа TUdateSQL. Бросаета на форму экземпляр типа TUdateSQL и его имя прописываете в свойстве UpdateObject объекта TQuery. В UdateSQL задаете DeleteSQL, InsertSQL и ModifySQL. В результате ваш Query и будет знать, как взаимодействовать с БД, кога вы что-то удаляете, добавляете или изменяете.

Позволю себе одино примечание и совет. Все это справедливо, если вы используете компоненты из группы BDE. Так вот, если это так, то учтите, BDE - это устаревший продукт, который много лет не развивается и не поддерживается. В новых проектах пользоваться им не рекомендуется. Да и формат dbf тоже раннее утро позавчерашнего дня. (Это мое мнение)
2
Larsus
64 / 64 / 10
Регистрация: 19.10.2009
Сообщений: 234
09.07.2010, 12:48 11
Цитата Сообщение от SAMZ Посмотреть сообщение
Да и формат dbf тоже раннее утро позавчерашнего дня. (Это мое мнение)
Присоединяюсь
0
Lord_Voodoo
Супер-модератор
8611 / 2245 / 133
Регистрация: 07.03.2007
Сообщений: 10,840
Завершенные тесты: 1
09.07.2010, 12:55 12
SAMZ, только для разрешения редактирования сейчас опытным путем установил, что нужен RequestLive... 100 лет не работал с БДЕ, да и в других пакетах компонентов, что я встречал, запросы редактируются без всяких настроек...
Цитата Сообщение от SAMZ Посмотреть сообщение
Позволю себе одино примечание и совет. Все это справедливо, если вы используете компоненты из группы BDE. Так вот, если это так, то учтите, BDE - это устаревший продукт, который много лет не развивается и не поддерживается. В новых проектах пользоваться им не рекомендуется. Да и формат dbf тоже раннее утро позавчерашнего дня. (Это мое мнение)
я уже ей это говорил, верит, но переделывать проект не хочет)))
0
SAMZ
1261 / 704 / 61
Регистрация: 21.12.2009
Сообщений: 2,255
09.07.2010, 13:05 13
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
100 лет не работал с БДЕ, да и в других пакетах компонентов, что я встречал, запросы редактируются без всяких настроек
Да и я давно и бесповоротно с BDE распрощался, пишу по памяти. А в других пакетах, о которых ты говоришь эти механизмы встроены в DataSetы. Например, TpFIBDataSet и не только
0
Lord_Voodoo
Супер-модератор
8611 / 2245 / 133
Регистрация: 07.03.2007
Сообщений: 10,840
Завершенные тесты: 1
09.07.2010, 13:08 14
SAMZ, я DAC пользуюсь. хотя я вообще ничего не редактирую в дбгриде... все в формы для редактирования выношу
0
Ksenya100
72 / 64 / 3
Регистрация: 13.05.2010
Сообщений: 349
09.07.2010, 15:01  [ТС] 15
я написала в modifySQL нужный текст
теперь мне надо вставить вот такую штуку ??

Delphi
1
2
3
4
if DataSource2.DataSet.State in [dsEdit,dsInsert] then
Form2.DataSource2.DataSet.Post;
Form2.Query1.ApplyUpdates;
Form2.Query1.CommitUpdates;
не знаю куда..??
в смысле в процедуру изменения grid'a???

Добавлено через 1 час 5 минут
а можно вообще в modifySQL динамические запросы писать??

оправдываюсь =)) - DBF есть уже давно и менять не позволяют.

а можно примерчик проекта - как не пользоваться grid вообще?? плз.
0
SAMZ
1261 / 704 / 61
Регистрация: 21.12.2009
Сообщений: 2,255
09.07.2010, 17:02 16
Цитата Сообщение от Ksenya100 Посмотреть сообщение
я написала в modifySQL нужный текст
теперь мне надо вставить вот такую штуку ??
Это зависит от того, как Вы организуете интерфейс пользователя. Самый простой вариант (к нему чаще всего и прибегают новички) - редактирование в гриде. Ваш DataSet через DataSource связан с гридом. С этим же DataSource связан DBNavigator. Если, как описано выше Вы обеспечили редактируемость DataSet , то после редактирования можно просто нажать на навигаторе кнопку Post. Для редактируемого набора можно написать обработчик события AfterPost и в нем

Delphi
1
2
Form2.Query1.ApplyUpdates;
Form2.Query1.CommitUpdates;
По этим командам изменения сохраняться на сервере. Это только один из возможных вариантов. Можно вносить изменения в кокое-то множество записей, выполнять Post и по специальной кнопке "Сохранить изменения" инициировать отработку этих же команд. При этом фиксация изменений на сервере будет производиться для некоторой группы записей редактируемого DataSet. Все зависит от того, какие цели в проекте Вы преследуете.

Цитата Сообщение от Ksenya100 Посмотреть сообщение
а можно вообще в modifySQL динамические запросы писать??
МОЖНО, никто не запрещает в режиме выполнения изменять текст modifySQL


Цитата Сообщение от Ksenya100 Посмотреть сообщение
DBF есть уже давно и менять не позволяют
Очень плохо, двойка тем, кто не позволяет

Цитата Сообщение от Ksenya100 Посмотреть сообщение
а можно примерчик проекта - как не пользоваться grid вообще?? плз
Пример, вряд ли! Но это не очень и сложно.
1. Ваш датасет не делаете редактируемым, но в гриде показываете.
2. Пользователь выбирает нужную запись и производит действие, которое говорит системе, что он хочет редактировать выбранную запись. (Двойной клик, нажатие на Enter, что-то еще)
3. По этому действию (событию) открывается новый DataSet уже с одной выбранной записью, который Вы делаете редактируемым.
Некоторые продвинутые разработчики при этом на используют компоненты непосредственного доступа к DataSet (TDBEdit, TDBComboBox и т.д), а предпочитают загружать даннын редактируемой записи в элементы редактирования типа TEdit, TComboBox и т.д и после редактирования выгружают измененные данные в редактируемую запись.
Пожалую и вся премудрость.

Еще раз настоятельно советую, распрощайтесь с BDE и, заодно с dbf
1
Ksenya100
72 / 64 / 3
Регистрация: 13.05.2010
Сообщений: 349
12.07.2010, 10:21  [ТС] 17
спасибо большое!!! столько информации!!!
теперь точно разберусь =))

заменить на ADO??
0
SAMZ
1261 / 704 / 61
Регистрация: 21.12.2009
Сообщений: 2,255
12.07.2010, 10:26 18
Цитата Сообщение от Ksenya100 Посмотреть сообщение
теперь точно разберусь
УДАЧИ Вам!

Цитата Сообщение от Ksenya100 Посмотреть сообщение
заменить на ADO
Зависит от того, с какой СУБД будете работать. Если продолжите работу с dbf, то можно и ADO. Для некоторых СУБД (например FireBird) есть библиотеки прямого доступа (напрмер FIBPlus)
0
Ksenya100
72 / 64 / 3
Регистрация: 13.05.2010
Сообщений: 349
12.07.2010, 12:18  [ТС] 19
значит ADO меня ждет =)

я не могу сделать так, чтоб только одна строчка перезаписывалась в базе =( если я изменяю какую-то запись, то все строки таблицы перезаписываются (становятся одинаковыми)
0
SAMZ
1261 / 704 / 61
Регистрация: 21.12.2009
Сообщений: 2,255
12.07.2010, 12:24 20
Покажите свой вариант ModifySQL
0
12.07.2010, 12:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2010, 12:24

Добавление записи в dbgrid через query
На форму поместил компоненты dbgrid, button, datasource, query....при помощи...

Передача параметров через Query отчету QReport
Гуглила два дня, ответы вокруг да около. Есть корректно работающий отчет...

Обновление данных в Query (SQL)
Надо при клике на кнопку изменить значения поля "Количество", при условии, что...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru