Wczytywanie danych z bazy do Combobox'a

0

Witam.
Mam mały problem odnośnie załadowania elementów bazy access'a do combobox'a
mianowicie korzystając z tego kodu:

unit Unit7; 

interface 

uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, StdCtrls, DB, Grids, DBGrids, ADODB; 

type 
  TForm7 = class(TForm) 
    ADOConnection1: TADOConnection; 
    ADOTable1: TADOTable; 
    DBGrid1: TDBGrid; 
    DataSource1: TDataSource; 
    Button1: TButton; 
    ComboBox1: TComboBox; 
    Tabele: TLabel; 
    Edit1: TEdit; 
    Label1: TLabel; 
    procedure Button1Click(Sender: TObject); 
    procedure ComboBox1Change(Sender: TObject); 
  private 
    { Private declarations } 
  public 
    { Public declarations } 
  end; 

var 
  Form7: TForm7; 

implementation 

{$R *.dfm} 

procedure TForm7.Button1Click(Sender: TObject); 
var 
 connSTR : string; 
begin 
 ConnStr:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source="'+Edit1.Text+'";Persist Security Info=False'; // utworzenie opisu połączenia do pliku MDB 
 if adoconnection1.Connected then adoconnection1.Close; //zamykamy poprzednio otwarte połączenie 
 adoConnection1.ConnectionString:=ConnStr; 
 adoconnection1.Open; //otwieramy połączenie 
 ComboBox1.Items.Clear; 
 Adoconnection1.GetTableNames(ComboBox1.Items,false); //pobranie nazw tabeli do ComboBox-a 
end; 

procedure TForm7.ComboBox1Change(Sender: TObject); 
begin 
 ADOTable1.Close; //zamykamy poprzednio otwartą tabele 
 ADOTable1.TableName:=ComboBox1.Items[ComboBox1.ItemIndex]; //podajemy nazwę wybraną w ComboBox-ie 
 if ADOTable1.connection.Connected then ADOTable1.Open; //otwieramy tabele 
end; 

end.

powyższy przykład jest jedynie pomocą z której korzystam pisząc program
potrafię odczytać nazwy poszczególnych tabeli z pliku, których zawartość jest automatycznie wyświetlana w DBGrig
ja natomiast potrzebuję wypełnić comboboxa danymi z konkretnej tabeli

np.

TABELA1
ID NAzwa1 NAzwa2
1 x 1
2 y 2
3 z 3
4 pq 7
itp.

chcę aby zawartość pola "NAzwa2" została odczytana do combobox'a

Proszę o wyrozumiałość i pomoc w tej kwestii.

0

Możesz zrobić np Tak:

var
 adoQuery : TadoQuery;
begin
 try
   adoQuery := TadoQuery.Create(nil);
   adoQuery.Connection := adoConnection1;
   adoQuery.SQL.Text := 'INSTRUKCJA';
   adoQuery.ExecSQL;
   While not adoQuery.Eof do Begin  //Kończy działanie jeśli wszystkie wiersze zostały odczytane
     combobox1.Items.Add(adoQuery.FieldByName('NAzwa2').AsString);   //Pobierz zawartość z  kolumny NAzwa2
     adoQuery.Next; //Skocz do następnego "wiersza" - pozycji w bazie
   End;
 finally
   adoQuery.Free
 end;
end;

Zamiast adoQuery możesz wykorzystać adoTable

0

gdy korzystałem z ADOTable
to miałem tylko do dyspozycji GetFieldName (czy coś takiego nie mam na tym kompie delphi to nie powiem)
mogłem pobierać jedynie nazwy tabel w bazie *.mdb
i nazwy pól w tabeli, ale z pobraniem zawartości konkretnego pola mam problemy i nie wiem jak miałbym to uczynić
tak jak w powyższym przykładzie
ustawiałem ADOConn i mogłem pobrać nazwy tabel
a z ADOTable po określeniu konkretnej tabeli jedyne co odczytywałem to nazwy kolumn

po podaniu polecenia ADOTable.open;
DBgrid wypełniał się wszystkimi kolumnami
a ja chciałbym konkretną kolumnę przenieść do COmbobox'a

trochę mieszam ale tak jak wspomniałem nie posiadam na tym komputerze środowiska
i nie potrafię przytoczyć oryginalnego fragmentu pisanego przeze mnie kodu.
ale wyglądało to mniej więcej tak:

 adoConnection1.ConnectionString:=ConnStr; 
 adoconnection1.Open; //otwieramy połączenie 
 ComboBox1.Items.Clear; 
 ADOTable1.Close; //zamykamy poprzednio otwartą tabele 
ADOTable1.TableName:='BAZA';

[...]

więc prosiłbym o informację jak / lub co wpisać
aby w tym miejscu wypełnić comboboxa jedną z kolumn tablicy BAZA

0

Rafał D czy możesz zamieścić również zawartość procedury 'Instrukcje' ?
Mam podobny problem jak big_zygi
Dzięki

0

Gotowiec:
http://www.dflex.pl/dflex-ftp/ADO-ComboBox-Fill.zip

Kod:

unit Unit21;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls;

type
  TForm21 = class(TForm)
    cbTables: TComboBox;
    cbFields: TComboBox;
    cbValues: TComboBox;
    edDBPath: TEdit;
    Label1: TLabel;
    btnOpenDB: TButton;
    l1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure btnOpenDBClick(Sender: TObject);
    procedure cbFieldsChange(Sender: TObject);
    procedure cbTablesChange(Sender: TObject);
    procedure FormShow(Sender: TObject);
  strict private
    FadoConn: TADOConnection;
    FadoQuery: TADOQuery;
    FBlockControls: Boolean;
    function GetadoConn: TADOConnection;
    function GetadoQuery: TADOQuery;
    procedure SetBlockControls(const aValue: Boolean);
  protected
    procedure dbAfterConnect(Sender: TObject);
    procedure FillFields(const ATabName: string);
    procedure FillTables;
    procedure FillValues(const ATabName, AFieldName: string);
    property adoConn: TADOConnection read GetadoConn;
    property adoQuery: TADOQuery read GetadoQuery;
    property BlockControls: Boolean read FBlockControls write SetBlockControls;
  public
  end;

var
  Form21: TForm21;

const
  cConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source="%s";Persist Security Info=False';
  cSelectField      = 'select %s from %s order by %s';

implementation

{$R *.dfm}

procedure TForm21.btnOpenDBClick(Sender: TObject);
begin
  if not FileExists(edDBPath.Text) then
    MessageBox(Application.Handle, PWideChar(Application.Title), 'Plik bazy danych nie istnieje!', MB_ICONWARNING + MB_OK)
  else
    begin
      BlockControls := True;
      adoConn.Close;
      try
        adoConn.ConnectionString := Format(cConnectionString, [edDBPath.Text]);
        adoConn.Open();
        FillTables;
        BlockControls := False;
      except
        on E: Exception do
          MessageBox(Application.Handle, PWideChar(E.Message), 'Błąd', MB_ICONSTOP + MB_OK);
      end;
    end;
end;

procedure TForm21.cbFieldsChange(Sender: TObject);
var
  lCB: TComboBox;
begin
  lCB := Sender as TComboBox;

  if lCB.ItemIndex >= 0 then
    FillValues(cbTables.Items[cbTables.ItemIndex], lCB.Items[lCB.ItemIndex])
  else
    lCB.Items.Clear;
end;

procedure TForm21.cbTablesChange(Sender: TObject);
var
  lCB: TComboBox;
begin
  lCB := Sender as TComboBox;

  if lCB.ItemIndex >= 0 then
    FillFields(lCB.Items[lCB.ItemIndex]);
end;

procedure TForm21.dbAfterConnect(Sender: TObject);
begin
  BlockControls := False;
end;

procedure TForm21.FillFields(const ATabName: string);
begin
  cbFields.Items.BeginUpdate;
  try
    cbFields.Items.Clear;
    adoConn.GetFieldNames(ATabName, cbFields.Items);
  finally
    cbFields.Items.EndUpdate;
  end;
end;

procedure TForm21.FillTables;
begin
  cbTables.Items.BeginUpdate;
  try
    cbTables.Items.Clear;
    adoConn.GetTableNames(cbTables.Items, False);
  finally
    cbTables.Items.EndUpdate;
  end;
end;

procedure TForm21.FillValues(const ATabName, AFieldName: string);
begin
  adoQuery.SQL.Text := Format(cSelectField, [AFieldName, ATabName, AFieldName]);
  cbValues.Items.BeginUpdate;
  Screen.Cursor := crHourGlass;
  try
    try
      cbValues.Items.Clear;
      adoQuery.Open;
      while not adoQuery.eof do
      begin
        cbValues.Items.Add(adoQuery.Fields[0].AsString);
        adoQuery.Next;
      end;
    except
      on E: Exception do
        MessageBox(Application.Handle, PWideChar(E.Message), 'Błąd', MB_ICONSTOP + MB_OK);
    end;
  finally
    cbValues.Items.EndUpdate;
    adoQuery.Close;
    Screen.Cursor := crDefault;
  end;
end;

procedure TForm21.FormShow(Sender: TObject);
begin
  BlockControls := True;
end;

function TForm21.GetadoConn: TADOConnection;
begin
  if not Assigned(FadoConn) then
  begin
    FadoConn                  := TADOConnection.Create(Self);
    FadoConn.ConnectionString := cConnectionString;
    FadoConn.LoginPrompt      := False;
    FadoConn.AfterConnect     := dbAfterConnect;
  end;
  Result := FadoConn;
end;

function TForm21.GetadoQuery: TADOQuery;
begin
  if not Assigned(FadoQuery) then
  begin
    FadoQuery            := TADOQuery.Create(adoConn);
    FadoQuery.Connection := adoConn;
  end;
  Result := FadoQuery;
end;

procedure TForm21.SetBlockControls(const aValue: Boolean);
begin
  if FBlockControls <> aValue then
  begin
    FBlockControls := aValue;

    cbTables.Enabled  := not FBlockControls;
    cbFields.Enabled  := not FBlockControls;
    cbValues.Enabled  := not FBlockControls;
  end;
end;

end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1