Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

Можно ли обновить конкретную запись в запросе?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.051 c
3-1083845681
Wolferio
2004-05-06 16:14
2004.05.30
Сервер!!!???


1-1084560173
Федя Мегатронов
2004-05-14 22:42
2004.05.30
Код исключения EidSockerError ???


1-1084793163
Alek_1
2004-05-17 15:26
2004.05.30
Как скопировать динамический масив?


3-1083217697
lightix
2004-04-29 09:48
2004.05.30
Проблемы с ADO + Oracle


3-1083913177
Violina
2004-05-07 10:59
2004.05.30
BDE 5: параметр BLOB SIZE, dead BLOBs <> live BLOBs