Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
6-44291
zxss
2003-02-20 08:42
2003.04.14
Взаимодействие сервиса NT с System Tray


4-44494
Slap
2003-02-12 16:40
2003.04.14
изменение формата даты в Windows


1-44116
Shirson
2003-04-03 08:54
2003.04.14
Как определить размер блока, полученного в pByte?


1-44241
BALU1111
2003-04-01 10:43
2003.04.14
Курсор в TextEdit


14-44365
Дмитрий К.К.
2003-03-31 11:46
2003.04.14
Именинники 30 марта





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский