Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.042 c
9-1075885289
Rudi
2004-02-04 12:01
2004.05.30
Вектор нормали


8-1079261589
Evrp
2004-03-14 13:53
2004.05.30
Пожалуйста помогите!!! Не передвигаеться канва у TImage


1-1084605159
AlexLebed
2004-05-15 11:12
2004.05.30
Проблема при переходе из одного типа в другой.


1-1084615074
Dhg
2004-05-15 13:57
2004.05.30
Tcanvas


1-1084608983
AlexZ_CRC
2004-05-15 12:16
2004.05.30
Fofm1.Button*.Caption:=massiv[i];





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский