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

Вниз

модификация записей и отражение изменений на экране   Найти похожие ветки 

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

Наверх




Память: 0.56 MB
Время: 0.02 c
14-44350
daan_m
2003-03-29 11:31
2003.04.14
Раздел алгоритмы


3-44069
AlexanderSK
2003-03-26 15:01
2003.04.14
Как получить данные из DOMAIN-а?


3-44018
ManYury
2003-03-25 12:59
2003.04.14
IB5.5 и хранимая процедура


1-44149
EthernalWonderer
2003-04-03 13:04
2003.04.14
Немодальный ShowMessage()


14-44328
Николай Быков
2003-03-30 18:47
2003.04.14
Кто какие новостные серверы (да и сайты-новости) знает?