Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como preencher automaticamente várias tabelas com DBEdit


Espero ter entendido o que você está pedindo, dadas as estruturas das tabelas mostradas na captura de tela.

O código abaixo mostra como configurar um DBLookUPComboBox para exibir uma cidade para selecionar uma determinada pessoa em uma tabela de pessoas. Eu usei TClientDataSets para que seja autocontido abd para que toda a configuração seja feita em código, e não por configurações de propriedade no Inspetor de Objetos.

Obviamente, o DBGrid e o dbNavigator estão conectados à fonte de dados dsPerson.

Código
  TForm1 = class(TForm)
    cdsCity: TClientDataSet;
    cdsPerson: TClientDataSet;
    dsPerson: TDataSource;
    DBGrid1: TDBGrid;
    DBLookupComboBox1: TDBLookupComboBox;
    dsCity: TDataSource;
    DBNavigator1: TDBNavigator;
    procedure FormCreate(Sender: TObject);
  end;
  [...]
  procedure TForm1.FormCreate(Sender: TObject);
  var
    Field : TField;
  begin

    Field := TIntegerField.Create(Self);
    Field.FieldName := 'CityId';
    Field.DataSet := cdsCity;

    Field := TStringField.Create(Self);
    Field.FieldName := 'City';
    Field.Size := 40;
    Field.DataSet := cdsCity;

    cdsCity.CreateDataSet;
    cdsCity.InsertRecord([3, 'Moscow']);
    cdsCity.InsertRecord([4, 'Leningrad']);

    Field := TIntegerField.Create(Self);
    Field.FieldName := 'PersonId';
    Field.DataSet := cdsPerson;

    Field := TIntegerField.Create(Self);
    Field.FieldName := 'CityID';
    Field.DataSet := cdsPerson;

    Field := TStringField.Create(Self);
    Field.FieldName := 'Name';
    Field.Size := 40;
    Field.DataSet := cdsPerson;
    cdsPerson.CreateDataSet;

    cdsPerson.InsertRecord([1, 4, 'Ivan']);
    cdsPerson.InsertRecord([2, 3, 'Kate']);

    DBLookupComboBox1.DataField := 'CityID';
    DBLookupComboBox1.DataSource := dsPerson;
    DBLookupComboBox1.KeyField := 'CityID';
    DBLookupComboBox1.ListField := 'City';
    DBLookupComboBox1.ListSource := dsCity;

  end;

Observe que em vez de (ou também) usar um DBLookUpComboBox, você também pode definir um campo de pesquisa no conjunto de dados cdsPerson, adicionando o código abaixo antes da chamada para cdsPerson.CreateDataSet. Se você fizer isso, o cdsPerson terá uma coluna extra, CityName. Isso será exibido no DBGrid - talvez seja necessário rolar para a direita para vê-lo - e se você clicar em uma das células CityName, verá que ela ativa uma lista suspensa no local a partir da qual uma cidade pode ser selecionado, assim



Quando você seleciona um nome de cidade diferente, o CityID no registro da pessoa é atualizado automaticamente.
  Field := TStringField.Create(Self);
  Field.FieldName := 'CityName';
  Field.Size := 40;
  Field.DataSet := cdsPerson;
  Field.FieldKind := fklookUp;
  Field.LookUpDataSet := cdsCity;
  Field.LookUpKeyFields := 'CityID';
  Field.LookupResultField := 'CityName';
  Field.KeyFields := 'CityID';

Se entendi seu comentário corretamente, tente isto:

  • adicione um segundo DBGrid e DBNavigator e um DBEdit ao formulário.

  • defina todas as suas fontes de dados para dsCity e defina o DataField do DBEdit para CityName.

Você pode então adicionar uma nova cidade à tabela Cidade e especificar seu CityID (na grade) e CityName (na grade ou DBEdit). Observe que assim que você salvá-lo usando o segundo DBNavigator, você pode clicar na célula CityName da grade Person e o novo CityName estará na lista suspensa. Se você quiser fazer essa edição no registro atual da tabela Person, você poderia adicionar um manipulador de eventos AfterPost na tabela City e adicionar código a ele assim:
procedure TForm1.cdsCityAfterPost(DataSet : TDataSet);
begin
  cdsPerson.Edit;
  try
    cdsPerson.FieldByName('CityId').AsInteger := DataSet.FieldByName('CityId').AsInteger;
  finally
    cdsPerson.Post;
  end;
end;