Ваши фрагменты кода, кажется, показывают, что вы не совсем правильно делаете это, потому что:
a) Вы используете тот же FDQuery для редактирования пользовательских данных, что и для заполнения ComboBox1.
b) Поскольку все столбцы в Select в вашем Button2Click
взяты из вашей таблицы protocols
, неясно, почему вы думаете, что вам нужно какое-либо из внутренних объединений.
c)Вам будет намного проще отлаживать и продолжать писать приложение, если вы начнете давать своим компонентам осмысленные имена, а не ComboBox1
, FDQuery1
и т. Д.
d) То, что вы спросили в своем вопросе q, подсказываетчто вы, возможно, не знакомы с тем, как работают наборы данных Delphi, включая TFDQuery, потому что если бы вы это делали, вы бы не задавали вопрос в первую очередь.Я думаю, вы представляете, что вам нужно реализовать код для выполнения ваших вставок, обновлений и удалений.Фактически, функциональность для выполнения этих операций встроена в TFDQuery и других потомков TDataSet, которые работают с таблицами SQ для автоматического выполнения этих операций.Ниже я объясню, как это сделать.
Сначала попробуйте это
Переименуйте ваши компоненты следующим образом
FDQuery1 -> qProtocols ComboBox1 -> cbxDepartmenteButton4 -> btnOpenProtocols Button2 -> btnLoadDepartments
Добавьте дополнительный запрос TFDQuery к вашему модулю данных и назовите его, скажем, qDepartmentList
Измените свой код какпоказано ниже.
Код:
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, а также и другие, обернуты им.Как вы увидите, он также автоматически включает и отключает некоторые из своих скоростных кнопок в зависимости от того, просматривается или редактируется набор данных.