Форум: "Базы";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];
ВнизМожно ли обновить конкретную запись в запросе? Найти похожие ветки
← →
SergP © (2004-05-04 22:29) [0]Есть проблема... Писал про нее в другом топике, но решил переформулировать вопрос, так как навряд ли мне кто-то ответит в предыдущем топике.
Вобщем есть запрос, типа
"select DISTINCT a.* "
+" from topics as a,posts as b "
+" where a.topic_id=b.topic_id and b.post_text like "%"+edit1.Text+"%""
+" order by a.top_time";
В результате запроса выбираются записи только из таблицы topics. В ней есть поле checked (выбираемое в запросе, но не участвующее в условиях выборки).
Например сделан запрос. Мы получаем совокупность записей.
В некоторый момент в БД в таблице topics меняется значение поля checked.
при этом мне нужно обновить запрос, чтобы иметь достоверные данные.
Но запрос может выполняться долго.
Можно ли обновить только одну запись из этого запроса в которой менялось значение поля checked (если при этом она присутствует в результатах выполнения запроса), оставив остальные записи запроса как есть?
если да, то как это сделать?
Юзаю TADOQuery
← →
Курдль © (2004-05-04 22:34) [1]Если известно, какая крнкретно запись изменилась и ее новые значения - то можно просто подменить их в наборе данных. Но при этом набор данных не будет достоверным точно так же, как и если бы значения этой записи были взяты от сервера (остальные-то записи не известно как поменялись).
← →
SergP © (2004-05-04 22:40) [2]дело в том что я точно знаю что остальные записи не менялись и знаю какая запись поменялась. (СУБД Access). Базу использует только одна моя прога (т.е. однопользовательский вариант). Но даже если я смогу "просто подменить их в наборе данных." мне нужно чтобы я ее мог модифицировать из этого запроса (в смысле TADOQuery) не нарываясь на сообщения об ошибке...
← →
Курдль © (2004-05-04 22:52) [3]
> мне нужно чтобы я ее мог модифицировать из этого запроса
> (в смысле TADOQuery) не нарываясь на сообщения об ошибке...
Что значит "из этого запроса"? Приведенный в [0] запрос - на выбор данных. Подробнее, плз.
← →
SergP © (2004-05-04 23:03) [4]>Что значит "из этого запроса"? Приведенный в [0] запрос - на выбор
>данных. Подробнее, плз.
Имеется ввиду то что я сделал запрос, а затем например модифицирую запись этого же датасета с помощью FieldByName("Checked").asBoolean:=false;
но если эта запись после выполнения запроса на выбор данных была модифицирована в БД (с помощью другого датасета в этой же проге) то при попытке ее модифицировать выдается сообщение об ошибке...
← →
Курдль © (2004-05-04 23:37) [5]Вы что, не используете кэшированные обновления? Или это у меня "лыжи не едут..."? :(
← →
SergP © (2004-05-05 00:10) [6]В упрощенном варианте:
ADOQuery1.SQL.Texts:="select a.* from table1 as a, table2 as b .....";
ADOQuery1.open;
ADOQuery2.SQL.Texts:="select a.* from table1 as a, table2 as b .....";
ADOQuery2.open;
// выбирается какая-нить запись в ADOQuery1
// затем
Adoquery1.edit;
Adoquery1.fieldByName("MyField").asBoolean:= not Adoquery1.fieldByName("MyField").asBoolean;
Adoquery1.post;
//затем выбирается какая-нить запись в ADOQuery2
// и
Adoquery2.edit;
Adoquery2.fieldByName("MyField").asBoolean:= not Adoquery2.fieldByName("MyField").asBoolean;
Adoquery2.post;
Если в обоих случаях мы "нарвались" на одну и ту же запись таблицы table1, то во втором случае вылазит ошибкане удается найти строку для обновления. Некоторые значения могли быть изменены со времени ее последнего чтения.
Вот и нужно избавится от этого, Т.е. после изменения данных в ADOQuery1 нужно привести в достоверность данные в ADOQuery2 не обновляя запрос полностью, так как он долго выполняется...
2 Курдль © (04.05.04 23:37)
вот насчет этого можно поподробнее?
← →
Курдль © (2004-05-05 00:39) [7]
> вот насчет этого можно поподробнее?
Насчет кэшированных изменений? Подробнее - долго. Это из любой стандартной книжки типа "Delphi и БД". Вы хоть одну такую смотрели?
ЗЫ. И пожалуйста, не называйте Access СУБД, - побойтесь Бога!
← →
sniknik © (2004-05-05 01:18) [8]SergP © (05.05.04 00:10) [6]
в "table1 as a" есть ключевое поле? если нет сделай, и укажи какая таблица главная раз у тебя их несколько в запросе.
http://www.delphikingdom.ru/asp/viewitem.asp?UrlItem=/helloworld/ado03.htm
> И пожалуйста, не называйте Access СУБД
а чем плохо?
← →
SergP © (2004-05-05 01:24) [9]>Насчет кэшированных изменений? Подробнее - долго. Это из любой
>стандартной книжки типа "Delphi и БД". Вы хоть одну такую смотрели?
Ну нашел я в одной из книжек нечто про это, и как понял оно к сабжу не имеет никакого отношения..
>ЗЫ. И пожалуйста, не называйте Access СУБД, - побойтесь Бога!
Ну пусть не СУБД, а такая себе маленькая локальная СУБД"эшка, но суть от этого не меняется....
← →
sniknik © (2004-05-05 01:28) [10]> Ну пусть не СУБД, а такая себе маленькая локальная СУБД"эшка, но суть от этого не меняется....
ну ни хрна себе маленькая! а если под ней MSSQL работает? одна из самых больших баз.
← →
SergP © (2004-05-05 01:56) [11]>в "table1 as a" есть ключевое поле? если нет сделай, и укажи какая
>таблица главная раз у тебя их несколько в запросе.
ключевое поле есть.
А насчет главной таблицы ИМХО мне не обязательно ее указывать, так как изменять приходится поле таблицы table1 которое не имеет никакого отношения к условию выборки данных из БД.
>http://www.delphikingdom.ru/asp/viewitem.asp?UrlItem=/helloworld/ado03.htm
ИМХО Вот это уже ближе к делу...
Спасибо за ссылку... Думаю это должно мне помочь...
← →
sniknik © (2004-05-05 08:11) [12]ссылка дана как пример где есть задание главной таблицы (та что будет обновлятся хотя в условии их несколько), по моему твоя ситуация.
почему подумал что ключа нет, он обычно уникален правильно?
тогда запись
> "select DISTINCT a.* " ...
безсмыслена, а раз так (и его нет) то запрос на обновление строится по совокупности данных имеющихся полей(уникальность по данным в них) которые ты изменяеш... естественно запись после не находится.
ошибся, ну извини, спасение утопающих дело самих утопающих. ;о) мы толко направление подсказываем.
← →
Курдль © (2004-05-05 10:11) [13]
> sniknik © (05.05.04 01:28) [10]
> ну ни хрна себе маленькая! а если под ней MSSQL работает?
> одна из самых больших баз.
Кто под кем, простите, работает? MSSQL под Access-ом? :)
И что, по-вашему, "большая база"? Я могу напендюрить записей в IB-базу столько, что она распухнет больше оракла!
← →
sniknik © (2004-05-05 10:36) [14]> И что, по-вашему, "большая база"?
гдето около (больше) 10гиг, уже большая. есть примерно такая в работе (даже без mssql) рабочая ~ 500мг + пять архивов в среднем по 1,5гиг. архивы естественно доступны из конфигурации (единственное отличие только на чтение изменять их идеологически неверно, но можно хотя и геморно)
> Я могу напендюрить записей в IB-базу столько, что она распухнет больше оракла!
напендюрить это не главное. :) главное чтобы нормально работало.
← →
sniknik © (2004-05-05 10:37) [15]> Кто под кем, простите, работает? MSSQL под Access-ом? :)
имел ввиду программу access которая может управлять базой MSSQL.
← →
SergP © (2004-05-05 13:15) [16]
> sniknik © (05.05.04 08:11) [12]
> ссылка дана как пример где есть задание главной таблицы
> (та что будет обновлятся хотя в условии их несколько), по
> моему твоя ситуация.
> почему подумал что ключа нет, он обычно уникален правильно?
>
> тогда запись
> > "select DISTINCT a.* " ...
> безсмыслена,
Почему бессмысленна?
Ключ у таблицы table1 есть. но дело в том что запрос такой что одна запись из этой таблицы может выбираться несколько раз, если не использовать DISTINCT
← →
sniknik © (2004-05-05 13:43) [17]SergP © (05.05.04 13:15) [16]
вот! если есколько раз то значит данные в связке с другой таблицей, а это значит нужно указать главную (что ты отверг). но тут либо одно либо другое.
← →
SergP © (2004-05-05 14:39) [18]2 sniknik © (05.05.04 13:43)
Данные выбираются из одной таблицы а в условиях выбора есть связки с другими таблицами, но данные которые мне нужно модифицировать не участвуют в связке, т.е. их модификация не нарушает саму связку...
Т.е.при модификации данных в одном TADOQuery все проходит нормально, а в самой базе и в выбраных данных этого TADOQuery тже в результате модицикации все нормально. Но вот мне нужно при этом обновить данные в другом TADOQuery, а делать
Query2.close;
Query2.Open;
я не хочу из за долгого времени выборки. Причем модификация нужных мне данных никак не повлияет на совокупность выбранных записей Query2 если я захочу полностью обновить запрос.
Мне достаточно обновить из выбраного набора в Query2 только одну запись, которая была модифицирована в Query1. Вот с этим и проблема. По вашей ссылке я кое-что нашел... Но пока не пробовал, (днем нет на это времени).
И разве что-нить измениться если я укажу главную таблицу? Как я понял это предназначено немного для других ситуаций....
← →
sniknik © (2004-05-05 14:48) [19]наверное ты прав. (ближе к проблеме, видней ;о)) хотя ссылку давал совсем не поэтому поводу.
← →
SergP © (2004-05-05 16:56) [20]
> хотя ссылку давал совсем не поэтому поводу.
Как я понял мне должен помочь Resync Command?
правильно?
← →
sniknik © (2004-05-05 17:11) [21]проверь, точнее никто не скажет
придется делать на каждое сохранение, в бефоре пост к примеру
1 сохранение измененных данных
2 апдейт записи
3 восстановление сохраненных изменений
... все вроде (?)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.053 c