Delphi - FireDAC события - PullRequest
0 голосов
/ 19 мая 2018

У меня есть следующая форма в Delphi:

enter image description here

Примечание: я использую драйвер базы данных FireDAC и компонент TDBGrid.

Примечание: я использую имена тестовых столбцов и данные для этого вопроса.Если хотите, я могу отправить вам полные таблицы базы данных, но они на сербском языке.

Вот фрагмент кода для Загрузка значений событие (поле со списком), которое работает:

procedure TForm2.Button4Click(Sender: TObject);
begin
with DataModule1.FDQuery1 do
begin
 close;
 sql.Clear;
 sql.Text:='select distinct Department from protocols';
 open;

 DataModule1.FDQuery1.First;

 while not DataModule1.FDQuery1.Eof do
 begin
 ComboBox1.Items.Create.Add(DataModule1.FDQuery1['Department']);

 DataModule1.FDQuery1.Next;
 end;


end;

end;

Для Представления (записи) работает следующее:

procedure TForm2.Button2Click(Sender: TObject);
begin
DataModule1.FDQuery1.sql.Text:= ' select protocols.ID_Document, protocols.Document, protocols.ID_Customer, protocols.Customer, protocols.Department, protocols.Date, protocols.Protocol, protocols.ID_Registrator, protocols.Registrator '
+ ' from protocols '
+ ' inner join documents on documents.ID_Document=protocols.ID_Document '
+ ' inner join registrators on registrators.ID_Registrator=protocols.ID_Registrator '
+ ' inner join customers on customers.ID_Customer=protocols.ID_Customer '
+ ' inner join users on users.ID_User=protocols.ID_User ';


DataModule1.FDQuery1.open;

Теперь я не могу найти способ реализовать Добавить новую запись, Обновить (запись-запись), Удалить (запись-запись) .Может кто-нибудь показать, как реализовать эти события?

1 Ответ

0 голосов
/ 19 мая 2018

Ваши фрагменты кода, кажется, показывают, что вы не совсем правильно делаете это, потому что:

a) Вы используете тот же FDQuery для редактирования пользовательских данных, что и для заполнения ComboBox1.

b) Поскольку все столбцы в Select в вашем Button2Click взяты из вашей таблицы protocols, неясно, почему вы думаете, что вам нужно какое-либо из внутренних объединений.

c)Вам будет намного проще отлаживать и продолжать писать приложение, если вы начнете давать своим компонентам осмысленные имена, а не ComboBox1, FDQuery1 и т. Д.

d) То, что вы спросили в своем вопросе q, подсказываетчто вы, возможно, не знакомы с тем, как работают наборы данных Delphi, включая TFDQuery, потому что если бы вы это делали, вы бы не задавали вопрос в первую очередь.Я думаю, вы представляете, что вам нужно реализовать код для выполнения ваших вставок, обновлений и удалений.Фактически, функциональность для выполнения этих операций встроена в TFDQuery и других потомков TDataSet, которые работают с таблицами SQ для автоматического выполнения этих операций.Ниже я объясню, как это сделать.

Сначала попробуйте это

  1. Переименуйте ваши компоненты следующим образом

    FDQuery1 -> qProtocols ComboBox1 -> cbxDepartmenteButton4 -> btnOpenProtocols Button2 -> btnLoadDepartments

  2. Добавьте дополнительный запрос TFDQuery к вашему модулю данных и назовите его, скажем, qDepartmentList

  3. Измените свой код какпоказано ниже.

Код:

procedure TForm1.btnLoadDepartmentsClick(Sender: TObject);
begin
  // Re-written do avoid using "With ..."

  if DataModule1.qDepartmentList.Active then
    DataModule1.qDepartmentList.Close;

   DataModule1.qDepartmentList.Sql.Text := 'select distinct Department from protocols';
   DataModule1.qDepartmentList.Open;
  //  DataModule1.FDQuery1.First;  <_  You DON'T need First, because the call to Open does that

   cbxDepartmentList.Items.Clear;  // Clear the combo if it's already populated
   while  not DataModule1.qDepartmentList.Eof do begin
     // ComboBox1.Items.Create.Add(DataModule1.FDQuery1['Department']);
     //  You don't need ad should not call Create in the above

     cbxDepartmentList.Items.Add(DataModule1.qDepartmentList['Department']);
     DataModule1.qDepartmentList.Next;
   end;
end;

procedure TForm1.btnOpenProtocolsClick(Sender: TObject);
begin
  DataModule1.qProtocols.Sql.Text:= ' select protocols.ID_Document, protocols.Document, protocols.ID_Customer, protocols.Customer, protocols.Department, protocols.Date, protocols.Protocol, protocols.ID_Registrator, protocols.Registrator '
  + ' from protocols '
  + ' inner join documents on documents.ID_Document=protocols.ID_Document '
  + ' inner join registrators on registrators.ID_Registrator=protocols.ID_Registrator '
  + ' inner join customers on customers.ID_Customer=protocols.ID_Customer '
  + ' inner join users on users.ID_User=protocols.ID_User ';

  DataModule1.qProtocols.Open;
end;

На этом этапе сделайте паузу и убедитесь, что вы все еще можете скомпилировать свой код.Пожалуйста, не комментируйте, что я добавил о «С» - with доставляет гораздо больше проблем, чем стоит.

Тогда:

Добавьте следующие обработчики ButtonClick:

процедура TForm1.btnInsertClick (Отправитель: TObject);begin DataModule1.qProtocols.Insert;end;

процедура TForm1.btnSaveChangesClick (Отправитель: TObject);начало DataModule1.qProtocols.Delete;end;

процедура TForm1.btnDeleteClick (Отправитель: TObject);начало DataModule1.qProtocols.Delete;end;

Посмотрите в онлайн-справке, что делают методы TDataSet для вставки, публикации и удаления.

На данный момент мы почтисделанный.Единственное, что осталось сделать, - это обработать перемещение содержимого элементов управления для редактирования в qProtocols.Если вы использовали версию TEdit с поддержкой db, а именно TDBEDit, DBEdits выполнит обе операции автоматически.Если вы использовали TEdits, что, на мой взгляд, является ошибкой, вам необходимо скопировать данные из свойств Text TEdits, а также cbxDepartmentList в поля записи qProtocols.Лучшее место для этого, вероятно, было бы в qProtocols AfterInsertEvent.

Если вы хотите, чтобы я добавил некоторый код для использования TEdits, я мог бы, но вы сэкономите огромное количествовремя кодирования, отладки и обслуживания вашего кода, если вы используете TDBEdits, а не TEdits, и TDBComboBox, а не TComboBox

Я оставлю вам возможность изучить интерактивную справку, чтобы понять, как реализовать функцию CancelChanges.Кроме того, вам может показаться полезным добавить TDBNavigator в вашу форму, подключенную к тому же источнику TDataSource, что и ваш DBGrid, потому что он показывает, как все функциональные возможности ваших TButtons, а также и другие, обернуты им.Как вы увидите, он также автоматически включает и отключает некоторые из своих скоростных кнопок в зависимости от того, просматривается или редактируется набор данных.

...