Привязка внешнего ключа при добавлении нового значения в таблицу master-detail Delphi - PullRequest
0 голосов
/ 29 марта 2020

Есть 2 таблицы, связанные по master-detail. При добавлении нового значения в таблицу сведений внешний ключ, выбранный из основной таблицы, не привязывается.

Само соединение MD выполняется в форме с использованием двух Dblookupcombobox и DataSource, ADOQuery для каждого, соответственно. введите описание изображения здесь

С помощью кнопок [+] добавляются новые значения, которых нет в выпадающем списке. Но проблемы начинаются со второго [+] (он же подробно), когда вы создаете новую строку, вам нужно привязать внешний ключ от предыдущего LookUpComboBox (Master). Код кнопки второй кнопки [+]:

begin
Form4.ADOQuery1.SQL.Clear;
Form4.ADOQuery1.SQL.Add('Select City from City WHERE   City='+#39+Form5.DBEdit1.Text+#39); //checking for duplicates
Form4.ADOQuery1.Open;
if Form4.ADOQuery1.IsEmpty then
  begin
  Form4.Query_city.FieldByName('City').AsString := Form5.DBEdit1.Text; //The PROBLEM is  SOMEWHERE HERE! It Adds a new value without binding the foreign key
  Form4.Query_city.Open;
  Form4.Query_city.Post;
  MessageBox(Handle, 'New data entered','Adding a new value',MB_ICONINFORMATION);
  end
 else
  begin
  Form4.Query_spec.Cancel;
  Form4.ADOQuery1.Cancel;
  MessageBox(Handle,PChar(''+Form5.DBEdit1.text+' already on the list!'),'Error',MB_ICONWARNING);
  end;
 end;

Новое значение записывается в DBEdit1. Имеет соответствующую привязку к таблицам. Так как же я могу вставить поле с соответствующим внешним ключом?

1 Ответ

0 голосов
/ 30 марта 2020

Вы делаете это излишне трудным из-за структуры вашего кода. Вместо этого попробуйте что-то вроде этого:

Откройте ADOQuery1, ВЫБЕРИв все его содержимое, например,

procedure TForm4.OpenCitiesTable;
begin
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('Select City from City');
  ADOQuery1.Open;
end;

, и оставьте его открытым, пока пользователь выполняет любые операции, которые приводят к желанию добавить новый город.

Затем, когда пользователи хотят добавить город, вызовите эту процедуру, например, указав значение City из Form5.DBEdit1.Text.

procedure TForm4.AddCity(ACity : String);
begin
  ACity := Trim(ACity);  // remove any leading or trailing blanks
  //  Do any formatting checks on ACity here, re.g convert it to Proper case

  //  check for adding a duplicate
  if ADOQuery1.Locate('City', ACity, []) then begin
    ShowMessageFmt('%s is already in the City table', [ACity]);
    Exit;
  end;

  try
    ADOQuery1.Insert;
    ADOQuery1.FieldByName('City').AsString := ACity;
  finally
    ADOQuery1.Post;
    //  at this point you might want to refresh the contents of whatever source
    //  you are populating Form5.DBEdit1.Text from
  end;
end;

Я предполагаю, что вы можете настроить код, относящийся к TForm4.Query_spe c самостоятельно;

Кстати, вы можете рассмотреть возможность использования TDBLookUpComboBox вместо вашего DBEdit1.

...