Форум: "Базы";
Текущий архив: 2003.04.14;
Скачать: [xml.tar.bz2];
Внизмодификация записей и отражение изменений на экране Найти похожие ветки
← →
Инна (2003-03-24 17:11) [0]есть пара ADOQuery (с запросами по параметрам). так вот нужно, чтобы: клик по 1 запросу - запоминание данных - клик по второму запросу (ну по дбгриду) и перенос данных (т.е. модификация записи). я так понимаю, что для модификации записей нужен отдельный ADOQuery, и внесение через параметры. Но если так, то придется закрывать и открывать 2 запрос заново, для обновления данных в дбгриде. Но можно ли сделать как-нибудь по-другому, чтобы не мелькал на экране весь дбгрид, а обновлялась только одна строка, которую юзер меняет?
← →
sniknik (2003-03-24 17:16) [1]DisableControls
EnableControls
мелькать не будет. (+ позицию текущую сохранять востанавливать)
← →
Соловьев (2003-03-24 17:17) [2]Ничего не понятно...
> я так понимаю, что для модификации записей нужен отдельный
> ADOQuery
не обязательно...
> обновлялась только одна строка, которую юзер меняет?
ADODataset...
← →
Инна (2003-03-24 18:21) [3]sniknik, это свойства чего? как сохранять позицию? позицию грида или запроса?
Соловьев, мне тоже :) а как по-другому можно модифицировать записи в запросе?
еще раз объясню предметно: есть бланк расписания группы, есть учебный план (АДОзапрос1 , АДОзапрос2), нужно учебный план раскидать по дням (т.е. составить расписание). я сдалала по кликам - кликаешь по предмету, запоминаем предмет, препода. кликаем по бланку расписания, вносим предмет с преподом на определенную позицию + меняем количество часов в учебном плане.
объясняйте, плз, развернуто, ну как для тупых, я еще не так шарю, чтобы с полуслова...
← →
sniknik (2003-03-24 19:04) [4]> объясняйте, плз, развернуто, ну как для тупых, я еще не так шарю, чтобы с полуслова...
как ты так и тебе (прочитай свой вопрос много там информации? попытайся это понять считая что о своей программе ничего не знаеш а читаеш только вопрос. Понятно?)
> чтобы не мелькал на экране весь дбгрид
ADOQuery1.DisableControls;
ADOQuery1.Requery;
ADOQuery1.EnableControls;
позицию в которой курсор находится, сделай сначала так, поймеш зачем.
после запоминай позицию
можно использовать
GetBookmark
GotoBookmark
FreeBookmark
или Locate
или Filter и FindFirst
желательно чтобы был ключь (уникальное поле в таблице).
и в итоге делай так
BookPoint:= ADOQuery1.GetBookmark;
try
ADOQuery1.DisableControls;
ADOQuery1.Requery; //возможно придется заменить на close/open
ADOQuery1.GotoBookmark(BookPoint);
ADOQuery1.EnableControls;
finally
ADOQuery1.FreeBookmark(BookPoint);
end;
p.s. скажи ты на самом деле Инна, а не скажем Игорь?
(мучает меня этот вопрос, в жизни ни одной программистки не встречал, а на форуме их просто завались)
← →
Инна (2003-03-24 19:31) [5]так, спасибо, сегодня попробую, потом отчитаюсь или еще поспрашиваю.
:))) правда, правда. диплом пишу. а делфи последний раз курсе на 3 видела.
← →
Инна (2003-03-25 12:32) [6]snikinik, когда делаю без букмарка, то все почти отлично - изменение видно только после второго клика на дбгриде, хотя обработчик - по клику ячейки. не есть хорошо. когда с букмарком, то изменения вообще не видны, только после перезапуска приложения. это вообще не катит, как ты понимаешь. вот сижу, думу думаю, книжку читаю.... код
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
ID:=ADOQuery1.FieldByName("ID").AsInteger;
ADOQuery4.Close;
ADOQuery4.Parameters.ParamByName("PID").Value := ID;
ADOQuery4.Parameters.ParamByName("Ppr").Value := A;
if not ADOQuery4.Prepared then ADOQuery4.Prepared;
ADOQuery4.ExecSQL; (тот самый, который изменения в таблицу вносит)
BookPoint:= ADOQuery1.GetBookmark;
try
ADOQuery1.DisableControls;
ADOQuery1.Requery;
ADOQuery1.GotoBookmark(BookPoint);
ADOQuery1.EnableControls;
finally
ADOQuery1.FreeBookmark(BookPoint);
end;
end;
наверняка ошибка самая-пресамая простая, но я ее не вижу.
← →
Инна (2003-03-25 13:00) [7]в общем, простой Refresh дает такой же результат - изменения отражаются только при втором клике. а надо, чтобы сразу... и не моргал весь тдбгрид.
← →
sniknik (2003-03-25 13:36) [8]да нет код правильный, даже повторил (думал изза того что на клик по гриду повешен такая хрень, но нет срабатывает и не моргает)
procedure TForm1.Button5Click(Sender: TObject);
var BookPoint: TBookmark;
begin
if ADOQuery1.Active then begin
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add("INSERT INTO Table101 (ID,Otdel_ab,Tel) VALUES (1, ""Test"" ,""55555"")");
ADOQuery2.ExecSQL;
BookPoint:= ADOQuery1.GetBookmark;
try
ADOQuery1.DisableControls;
ADOQuery1.Requery;
ADOQuery1.GotoBookmark(BookPoint);
ADOQuery1.EnableControls;
finally
ADOQuery1.FreeBookmark(BookPoint);
end;
end else begin
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add("SELECT * FROM Table101");
ADOQuery1.Open;
end;
end;
и
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
Button5Click(self);
end;
а ошибка наверное в том что не тот грид и набор данный защищаеш, (обыкновенная путаница, у меня таблица выделена одна и таже а у тебя скорей всего разные, нет? и привязанные гриды различаются?).
← →
Инна (2003-03-25 13:58) [9]у тебя т.е. сразу обновляется, когда по таблице кликнуть попробовал?
может, потому что у меня update а не insert? уж не знаю, на что кивать....
← →
sniknik (2003-03-25 14:19) [10]именно без морганий ти тд. клики и по таблице и по кнопке. без разници.
изменил на апдейт ADOQuery2.SQL.Add("UPDATE Table101 SET ID=ID+1");
то же самое. все путем.
попробуй самое простое, собери програмку с 1и гридом 1м коннектом 2мя запросами, в обшем по минимуму. и попробуй (уверен будет работать, а ошибка изза путаници)
← →
Инна (2003-03-25 16:57) [11]пытаюсь на простом. у меня возникла совсем другая проблема - update она делать не хочет ни под каким соусом. может, я апдейт делать не умею...
так
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add("update ras set pr=ppr where id=pid");
ADOQuery2.ExecSQL;
не работает, со знаком : и ? тоже не работает - выдает ошибку синтаксиса. если делать через параметры, т.е. запрос определять заранее, а параметры в программе, т.е.
ADOQUery2.Parameters.ParamByName"PID").Value:=ADOQuery1.FieldByName("ID").Value;
ADOQUery2.Parameters.ParamByName("Ppr").Value:="проба";
тоже не работает!!!!!
ничего не вставляет!!!! вернее вставляет, но потом, когда приложение открываешь снова!
я уже устала и совсем запуталась. я не понимаю, почему один код работает и не работает одновременно.
← →
Соловьев (2003-03-25 17:07) [12]СУБД?
← →
sniknik (2003-03-25 17:37) [13]> не работает, со знаком : и ?
параметры со знаком :, генерируются автоматически при занесении запроса в компонент (должно стоять ParamCheck = true)
с ? должон создавать руками ParamCheck = false
раз добавляеш запросы в рантайме то должно
...SQL.Clear;
...SQL.Add("update ras set pr=ppr where id= :Ppr);
...ExecSQL;
когда передаеш через Value то и тип желательно указывать.
..ParamByName("Ppr").DataType:= ftString; //ну для ID надо ftInteger как понимаю
..ParamByName("Ppr").Value:= "проба";
или он у тебя десигне установлен?
(не время давать советы, но в ADO лутше пользоватся не ADOQUery а ADOCommand и ADODataSet)
← →
Инна (2003-03-25 18:00) [14]Соловьев, сейчас Access, но хотелось бы универсальности интерфейса, т.к. вот-вот буду к нормальной базе на MSSQL цеплять. Access-для того, чтобы хоть что-то в полях светилось. понимаю, что это неверный подход, но вот так просят меня :)
sniknik, щас попробую. только напишу уже к ночи ближе. Спасибо!
как раз самое время давать советы!!! я читала,что ADODATASET нельзя использовать для SQL-операторов, таких как DELETE, Insert, Update, потому что они не возвращают результатов. А Commsnd я еще даже не смотрела. думаешь, лучше через них и сразу? может, зря я здесь голову ломаю или там так же делается?
вообще-то задача максимум - сделать максимально универсальный интерфейс, котоорый после MSSQL может перекинут на Oracle (с минимальными правками). Это вообще возможно или из области фантастики? Еще раз спасибо!
← →
Соловьев (2003-03-25 18:05) [15]
> ADODATASET нельзя использовать для SQL-операторов, таких
> как DELETE, Insert, Update, потому что они не возвращают
> результатов.
ADODataSet это почти как Таблица, там есть DeleteSQL, UpdateSQL, InsertSQL.
← →
Инна (2003-03-26 14:28) [16]решила пока с этими параметрами не связываться - чтобы исключить ощибку при их использовании. привожу код
procedure TForm1.DBGrid1CellClick(Column: TColumn);
var BookPoint: TBookmark;
begin
if ADOQuery1.Active then begin
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add("update ras set pr=""работает"" where id=1");
ADOQuery2.ExecSQL;
BookPoint:= ADOQuery1.GetBookmark;
try
ADOQuery1.DisableControls;
ADOQuery1.Requery;
ADOQuery1.GotoBookmark(BookPoint);
ADOQuery1.EnableControls;
finally
ADOQuery1.FreeBookmark(BookPoint);
end;
end else begin
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add("SELECT * FROM ras");
ADOQuery1.Open;
end;
end;
НЕ работает. обновляет только после 2 или 3 клика по таблице.
может, у меня что с установками где-то не в порядке? за DataSET не бралась. хотя мне нужно, чтобы просто работало, а через query или set - все равно.
← →
Соловьев (2003-03-26 14:31) [17]
> НЕ работает. обновляет только после 2 или 3 клика по таблице
ты бысто нажимаешь? как вообще узнаешь что оно что-то поменяло, у тебя там довольно таки неоптимальный код(с параметрами быстрее будет на порядок)....
← →
Инна (2003-03-26 14:45) [18]да, быстро. ну не сверхбыстро, ну так, как будут нажимать пользователи. когда делала по шагам, то раз на раз не приходится - то сразу(!!!) цепляет (1 раз где-то из 5), то на 2, то на 3 раз. с параметрами я могу попробовать только, если код запроса написан заранее, и только параметры доопределяются. потому что в рантайме определить запрос и параметры у меня не получается.
← →
Соловьев (2003-03-26 14:46) [19]НАЖМИ РАЗ, И ЖДИ. у тебя просто код неоптимальный.
← →
Stas (2003-03-26 14:46) [20]Инна, а какая у тебя тачка ?
Поставь на DATASET CursorLacation:=ClServer;
← →
Инна (2003-03-26 14:52) [21]НАЖМИ РАЗ, И ЖДИ. у тебя просто код неоптимальный.
мне тоже такая мысль в голову приходила - не дожидаюсь. ну больше 30 секунд жду! ужас. вот пока пишу, типа даелается - ноль реакции, пока 2 раз не нажмешь.
а узнаю, потому что если второй раз не кликать, то при перезагрузке приложения, там уже новые данные. какой самый оптимальный? и потом, у меня все на одном компе, я понимаю, если бы по сетке так глючило...
Стас, что значит тачка? у меня ADOQuery - поставила, не работает. только по второму клику обновляет.
← →
Stas (2003-03-26 14:57) [22]Да я имею введу компьютер. Я к чему спрашиваю у меня PIII-1200 Работаю под MSSQL по сети, Обнавляю таким образом Close-Open, мерцания не заметно.
← →
Инна (2003-03-26 14:58) [23]ADOQuery1.Active then begin
ADOQuery2.Close;
ADOQuery2.Parameters.ParamByName("Ppr").Value:="строка";
ADOQuery2.ExecSQL;
есди вот так заменить+ в запросе написать update ras set pr=:Ppr where ID=1; тоже только по второму разу обновляется.
блин, тривиальная задача, и не идет...
← →
Инна (2003-03-26 15:04) [24]у меня тоже третий - 933, работаю на одном компе (а потом -то по сетке будет), мерцания нет, но сволочь, тоже обновляет не сразу. если по ADOQuery1.Refreshu делать. Может это гадский Access?
у тебя какая сетка?
← →
Stas (2003-03-26 15:08) [25]Сетка у меня 100 мб.
Но MSSQL значительно быстрее Access"a.
А у тебя случайно LookUp полей нет ?
← →
Инна (2003-03-26 15:12) [26]нет. я сделала по совету Sniknika простейшее приложение - 2 ADOQuery, один select, другой update, 1 датасорс, 1 ДБгрид.
← →
Stas (2003-03-26 15:23) [27]Проверь CursorLocation на 2 запросах и на ADOConnection должнобыть CLServer.
И делаешь так:
Выполняешь обновление данных (любым оьразом);
Query1.Close;
Query1.Open;
← →
Инна (2003-03-26 15:23) [28]народ, наверняка вы как-то делаете пободные действия (это не что-то экстраординарное, а самое обычное коррект записей), не могли бы вы привести коды, пусть через ADOQuery или ADODataSet, и тексты запросов. ну т.е. то, что у вас работает и как можно развернутей... буду очень признательна!!!!!
да, если это имеет какое-то значение, то доступ к базе у меня по udl-файлу.
← →
Инна (2003-03-26 15:27) [29]Проверь CursorLocation на 2 запросах и на ADOConnection должнобыть CLServer.
И делаешь так:
Выполняешь обновление данных (любым оьразом);
Query1.Close;
Query1.Open;
да, на 2 запросах посталвила, ADOConnection у меня на форме нет, так и делаю - не обновляется сразу. со второго раза. может, данные не сразу записываются?
← →
Инна (2003-03-26 15:34) [30]Ребята!!! кинула на форму ADOConnection- ВСЕ ПОЛУЧИЛОСЬ!!! и так и этак, прям как у Агнии Барто "Я и боком, и на месте, и двумя нгами вместе" - и через Open, Close и как Sniknik говорил, короче по-всякому!!! СПАСИБО ВАМ огромное!!! всех люблю и целую! фуффффф....
← →
Stas (2003-03-26 15:36) [31]Ты попробуй сделать так:
На нажатие Button1
AdoQuery1.Insert;
AdoQuery1.fieldByName ("Id").AsInteger:=5;
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.04.14;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.009 c