Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Обновление данных... Requery


Автор: Treefeed 15.4.2005, 15:57
Доброго времени суток.
Такая ситуация:
Использую ADO, Microsoft.Jet.OLEDB.4.0.
В главной форме открыт ADODataSet. Для редактирования данных использую модальную форму, которую динамически загружаю из Dll.
В модальной форме открываю другой ADODataSet(соответственно и ADOConnection другой) и беру те же данные, что и в главной форме. После закрытия модальной формы в главной делаю ADODataSet1.Requery.
Вопрос: почему обновление в главной форме иногда происходит а иногда нет? Если после изменения данных опять открою модальную форму для изменения, то предыдущие изменения видны, хотя в главной их не видно.
Может можно как-то заставить обновить какую-то определенную запись?

Автор: offline 15.4.2005, 16:22
>и беру те же данные, что и в главной форме
ты радотаешь с одной базой или с несколькими и вообще БД какая?

А зачем в другой форме открывать дубликат набора данных. Просто перенеси данные текущей записи (которую хочешь редактировать) в модальную форму, меняй их там как душе угодно, а при закрытии этой формы (или по нажатию кнопочки) делай проверку на данные. Если они тебя удавлетворяют, то просто меняй их в первом наборе данных. Может и Requery не понадобиться. Но второй ADOConnection и второй ADODataSet это иж точно.

Автор: Guest 15.4.2005, 17:08
Работаю с одной базой(Access 2003)
А данные как переносить? Просто прередавать строковые константы?

Автор: Treefeed 15.4.2005, 17:17
kirilllius Или может можно как-то передать курсор?

Кстати после того, как повторно(или третий раз.... smile ) сделать Requery, то изменение все-таки видны. И все дальнейшие изменения работают нормально.

Автор: offline 15.4.2005, 17:37
Да, просто строковые константы в TEdit или TMemo и т.п.
А после внесения изменений, что-то типа

Процедура кнопки принять
проверка введеных данных на удовлетворение условий и если
что-то не нравиться то прекратить выполнение процедуры (Exit)
(ну конечно если нужно проверять введенные данныее)

набор данных открыть для редактирования или для вставки (Edit или Append)
передать данные в базу
принять изменения в наборе данных (Post)

и затем закрыть наше окошко (Close)

Автор: Treefeed 16.4.2005, 11:09
И что, передавать в Dll около 15 строк? Это конечно можно... Я думал что может есть что-то получше, чем передавать строки... smile

Автор: offline 16.4.2005, 18:45
А для каких челей dll нужен?

Автор: Treefeed 17.4.2005, 12:50
А для чего вообще Длл-ки нужны? smile

Автор: offline 17.4.2005, 13:19
Если у тебя там только модальное окно храниться то smile

Автор: Treefeed 17.4.2005, 19:18
Это уже smile
А по делу?

Автор: offline 17.4.2005, 19:21
Что по делу? Я не понял. Что тебя интересует, опиши задачу и что делает твоя dll.

Автор: Treefeed 18.4.2005, 11:08
В модальном окне редактирую данные. А при выходе:
Код

 if ModalResult = mrOk then
 Begin
   ADODSFactories.Edit; // ADODSFactories: TADODataSet
   ADODSFactories.FieldByName('A_REGION').AsInteger := ADODSRegions.FieldByName('CODE').AsInteger; // ADODSRegions: TADODataSet
   ADODSFactories.FieldByName('GROUP').AsInteger := ADODSGroups.FieldByName('GROUP_CODE').AsInteger; // ADODSGroups: TADODataSet
   ADODSFactories.Post;
 End;


В главной форме:
Код

  AddDlg(Application, ADODataSet1CODE.AsInteger); // Вызываю модальное окно для изменений
  ADODataSet1.Requery;


Но изменения видны не сразу, а после того как сделаю ADODataSet1.Requery 2-3, а то и больше раз. smile

Автор: offline 18.4.2005, 15:30
А зачем в модальной форме пользоваться компонентами ADO. Я же говорил, просто переноси в простые компоненты, а затем назад

TFORM1. DataSet.Edit; // ADODSFactories: TADODataSet
TFORM1. DataSet.FieldByName('A_REGION').AsInteger := StrToInt(Edit1.Text);
TFORM1. DataSet.FieldByName('GROUP').AsInteger := StrToInt(Edit2.Text);
...
TFORM1. DataSet.Post;

TFORM1. DataSet - это DataSet находящийся на главной форме

а перед вызовом модального окна

ТМодальное окно.Edit1.Text := DataSet.FieldByName('A_REGION').AsString;
ТМодальное окно.Edit2.Text := TFORM1. DataSet.FieldByName('GROUP').AsString;

и удали из модального окна все компоненты ADO заменив их на простые и DataSet ведь он открыт у тебя в главном окне. Зачем два раза открывать одни и те же данные это ведь память жрет.



Автор: Treefeed 18.4.2005, 17:38
В базе добавление планируется производить редко, а редактирование - еще реже. Поэтому я использую динамическую загрузку модальной формы(она используется для редактирования и добавления) из Dll. Так я меньше жру память - форма то динамически загружается. Если же делать модальную форму в Exe-файле так тогда память будет постоянно выделяться под модальную форму.

Но я так и не понял, почему обновления видны не сразу... smile

Автор: offline 18.4.2005, 18:17
Цитата
Если же делать модальную форму в Exe-файле так тогда память будет постоянно выделяться под модальную форму.


А попробуй
Форма.Showmodal - для показа
Форма.Free - для удаления ее из памяти после Форма.Close

Модальная форма занимает намного меньше памяти чем второй экземпляр набора данных (на мой взгляд).

Цитата
Но я так и не понял, почему обновления видны не сразу


Попробуй внести изменения не во второй открытый набор данных (вообще его не открывай), а непосредственно в самнабор данных вот и посмотришь результат. Обнавления будут ведны сразу. Поэтому делай, как писал выше smile

Автор: Treefeed 18.4.2005, 21:37
Ок. Проверю. Спасибо за информацию

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)