Работа с БД и CheckListBox

Есть такая ситуацыя. У меня есть на форме CheckListBox1 который заполняется данными из поля "Услуга", таблицы Услуги. Как записать в таблицу Заказы данные. Эти данные берутся из таблицы Услуги по полю которое пользователь отметил флажком Пробую следующим методом:
for i  := 0 to (CheckListBox1.Items.Count -1) do
    begin
      if CheckListBox1.Checked[i] = true then
      begin
        DataModule7.ADOQuery1.Active := false;
        DataModule7.ADOQuery1.SQL.Clear;
 
        id_poslug := DataModule7.ADOQuery1.SQL.Add('SELECT id_послуги FROM Послуги WHERE Послуга = ''' + CheckListBox1.Items[i] + '''');
        DataModule7.ADOQuery1.SQL.Clear;
        kHour := DataModule7.ADOQuery1.SQL.Add('SELECT Кількість_годин FROM Послуги WHERE Послуга = ''' + CheckListBox1.Items[i] + '''');
        DataModule7.ADOQuery1.SQL.Clear;
        price := DataModule7.ADOQuery1.SQL.Add('SELECT Ціна FROM Послуги WHERE Послуга = ''' + CheckListBox1.Items[i] + '''');
        DataModule7.ADOQuery1.SQL.Clear;
 
 
        Memo3.Lines.Add(id_poslug.ToString());
        Memo3.Lines.Add(kHour.ToString());
        Memo3.Lines.Add(price.ToString());
 
        DataModule7.ADOQuery1.SQL.Add('SELECT * FROM Замовлення');
        DataModule7.ADOQuery1.Active := true;
        DataModule7.ADOQuery1.Refresh;
 
 
        Datamodule7.ADOQuery1.Insert;
 
        Datamodule7.ADOQuery1.FieldByName('id_замовлення').AsInteger:= Datamodule7.ADOQuery1.RecordCount + 1;
 
        Datamodule7.ADOQuery1.FieldByName('id_послуги').AsInteger :=
          id_poslug;
 
        Datamodule7.ADOQuery1.FieldByName('id_шаблону').AsInteger:= 1;
 
        Datamodule7.ADOQuery1.FieldByName('id_price').AsInteger:= 1;
 
        Datamodule7.ADOQuery1.FieldByName('id_техніки').AsInteger:=
          DataModule7.ADODataSet3.FieldByName('id_техніки').AsInteger;
 
        Datamodule7.ADOQuery1.FieldByName('Години').AsInteger:=
          kHour;
 
        Datamodule7.ADOQuery1.FieldByName('Ціна').AsInteger:=
          price;
 
 
        Datamodule7.ADOQuery1.FieldByName('Замовник').AsString:= Edit1.Text;
        Datamodule7.ADOQuery1.FieldByName('Модель_техніки').AsString:= Edit2.Text;
        Datamodule7.ADOQuery1.FieldByName('Серійний_номер_техніки').AsString:= Edit3.Text;
        Datamodule7.ADOQuery1.FieldByName('Менеджер').AsString:= ComboBox1.Text;
 
 
 
      end;
 
    end;
1 ответ

Можно динамический insert запрос собрать. Проверяй установлена ли галочка и добавляй параметр. А потом в цикле присваивай значения. На примере стринглиста это будет выглядеть примерно так:
for i := 0 to Chieffs.Count-1 do
  ch:=ch+':n'+IntToStr(i)+',';//дополняем уже готовый запрос в ch параметрами
i:=Length(ch);
Delete(ch,i,1);//удаляем последнюю запятую
Query.sql.Text:=ch;
for I := 0 to Query.Parameters.Count-1 do
      if Parameters.Items[i].Name='n'+IntToStr(i) then
          Parameters.ParamByName('n'+IntToStr(i)).Value:=Chieffs[i];
Query.ExecSql;