Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2011, 09:21   #1
grenles
минимакс
Участник клуба
 
Аватар для grenles
 
Регистрация: 11.06.2008
Сообщений: 1,143
По умолчанию работа c ADOQuery и одновременное изменение ADOTable

Пытался найти ответ, но не смог понять как. Вот такой вопрос

Есть компонент DBGrid в свойствах DataSource подвязан DataSource1. У компонента DataSource1 в DataSet могут быть подключены либо ADOTAble, либо ADOQuery. Когда там ADOTAble, то все перемещения по DBGrid паралелльно выполняются в ADOTable и соответственно при изменении записей можно не беспокоиться о попадании в выбранную позицию таблицы. Когда подключается ADOQuery, то я в ADOTAble постоянно выбранна первая запись. Подскажите, что сделать, чтобы перемещения по записям DBGrid, работающей с результатами выборки, паралелльно шли в ADOTable1.

И обратное, если я изменяю ADOTable (новая запись, правка, удаление) - чтобы у меня были видны изменения и не изменилась позиция в DBGrid, повязанной к ADOQUery, как поступить?

Я предполагаю, что где-то в свойствах DBGrid писать свой обработчик каждый раз при изменении получающей ключевое поле и выполняющей в ADOTAble соответствующий поиск. Наверное не удачное решение.

Спасибо.
и это пройдет...

Последний раз редактировалось grenles; 03.06.2011 в 09:24.
grenles вне форума Ответить с цитированием
Старый 03.06.2011, 09:39   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
Подскажите, что сделать, чтобы перемещения по записям DBGrid, работающей с результатами выборки, паралелльно шли в ADOTable1.
Перемешение идет по записям подключенного набора данных DataSet
(ADOQuery /ADOTable). DBgrid лишь отражает (показывает) данные перемещения.
Dataset.OnAfterScroll // cсобытие после перемещения
DataSet..Locate // установить на нужную запись
Это поиск только в готовом наборе данных (DataSet).

Цитата:
чтобы у меня были видны изменения и не изменилась позиция в DBGrid, повязанной к ADOQUery, как поступить?
повторюсь. позиция есть в DBgrid.DataSource.DataSet (=ADOQuery).
прочитать заново Requery или close + Open
и выставить на нужную запись Locate
сначала не вредно ее (точнее ЕЕ ключевые поля) запомнить. либо использовать данные ADOtable.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 03.06.2011 в 09:52.
evg_m вне форума Ответить с цитированием
Старый 03.06.2011, 09:40   #3
grenles
минимакс
Участник клуба
 
Аватар для grenles
 
Регистрация: 11.06.2008
Сообщений: 1,143
По умолчанию

Спасибо, попробую разобраться.
и это пройдет...
grenles вне форума Ответить с цитированием
Старый 03.06.2011, 09:42   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

1. В ADOQuery есть событие AfterScroll, в нем в ADOTable искать нужную запись, например с помощью Locate
2. Перед редактированием ADOTable - DBGrid.DattaSource.Enable:=False; запоминаем ид, редактируем, находим по ид, DBGrid.DattaSource.Enable:=True
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.06.2011, 10:03   #5
grenles
минимакс
Участник клуба
 
Аватар для grenles
 
Регистрация: 11.06.2008
Сообщений: 1,143
По умолчанию

Спасибо ВАМ за советы, помогло
Код:
var
     MainIndex : string; // имя индексного поля в выбираемой таблице
....
   MainIndex := 'idProj';
....
procedure TDataModule2.ADOQuery1AfterScroll(DataSet: TDataSet);
begin
// позиционирование в таблице по результатам запроса
with MainMod.Form1 do
begin
 AddMessage(DataSet.FieldByName(MainIndex).AsString);
 ADOTable1.Locate(MainIndex,DataSet.FieldByName(MainIndex).AsString,[loCaseInsensitive]);
end;

end;
....
Вопрос обновления DBGrid решил переоткрытием запроса и локацией на запись в запросе. А перед этим присваиваю номер изменяемой записи.
Код:
 
...
    // просто берем текущую запись
     KeyNo := ADOTable1.FieldByName(MainIndex).AsString;
...
      // переподключаем источник записей после изменений
    if QueryStr<>'' then begin
     ADOQuery1.Active := false;
     ADOQuery1.Active := true;
   // попытка установить курсор на измененную запись  
     ADOQuery1.Locate(MainIndex,KeyNo,[loCaseInsensitive]);
    end;
end;
и это пройдет...

Последний раз редактировалось grenles; 03.06.2011 в 10:56.
grenles вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
adoquery и adotable Jawakharlal БД в Delphi 4 06.05.2010 20:28
TBatchMove и ADOTable(ADOQuery) rockedit БД в Delphi 0 15.12.2009 21:00
работа с ADOQuery и ADOTable jediAlex БД в Delphi 1 12.10.2009 20:04
изменение свойства datasource c adotable на adoquery koma Общие вопросы Delphi 3 01.10.2009 13:47