Witam.
Mam do napisania procedurę która będzie wyświetlała w dbgridzie tabele które są umieszczone w listboxie. W listboxie tabele z bazy wyświetlone są za pomocą polecenia gettablenames.
bardzo proszę o pomoc
nodobra ale w czym problem bo jak juz pobrałas do listoxa to wczym problem zeby tez w dbgrid je wyswietlic?
Problem w tym zeby klikajac na poszczegolne tabele w ktore sa zamieszczone w listboxie wyswietlaly sie one w dbgridzie.
Paula musisz pod zdazenie OnClick, Twojego listboxa podpiac procedure wyswietlajaca ta tabele. Np. w ten sposob:
procedure TForm.ListBoxClick(Sender: TObject);
begin
if Sender is TListBox then
with Sender as TListBox do
begin
if ItemIndex > -1 then
// tutaj wyswietl tabele
end;
end;
Do wyswietlenia dowolnej tabeli, mozesz uzyc bardzo prostego zapytania:
<sql>SELECT * FROM /TABELA/</sql>
to zapytanie przed uruchomieniem musisz sobie przeksztalcic za pomoca ReplaceStr i zamienic /TABELA/ na wlasciwa nazwe tabeli uzyskana z ListBoxa.
Jakich komponentow uzywasz do podlaczenia z baza?
Tylko że chodzi mi o to żeby to było automatycznie wyświetlane w zależności od tabeli która się wybierze z listboxa a nie na sztywno wpisana nazwa tabeli. A do podłączenia z bazą wykorzystuję komponenty ibdatabase i ibtransaction. Wydaje mi sie że tutaj trzeba by kombinować coś z dbgrid.datasource bo w tej właściwości występuje połączenie z tabelą. Wykorzystywałam tez zdarzenie on click dla listboxa. Próbowałam na wiele sposobów i niestety sie to nie wyświetla.
paulina213 napisał(a)
Tylko że chodzi mi o to żeby to było automatycznie wyświetlane w zależności od tabeli która się wybierze z listboxa a nie na sztywno wpisana nazwa tabeli.
Dlatego tez pisze Ci, ze przed uruchomieniem zapytania nalezy je zmodyfikowac za pomoca podanej przeze mnie funkcji.
Czy jestes w stanie cokolwiek wyswietlic na tym gridzie?
Zrob tak aby po kliknieciu na listboxa, pojawila sie jakakolwiek tabela w gridzie. Niech bedzie na sztywno przypisana. Zrob to i pokaz tutaj jak to zrobilas, wtedy to zautomatyzujemy.
Po edycji:
Jesli nie wiesz jak to zrobic to zrob tak:
0. Upewnij się, ze polaczenie z baza jest skonfigurowane wlasciwie i IBDatabase.Connected = True.
- Poloz na forme komponent IBQuery.
- Polacz IBQuery z IBTransaction poprzez property Transaction.
- Polacz IBQuery z IBDatabase poprzez property Database.
- Napisz zapytanie do dowolnej tabeli z bazy danych. Robisz to poprzez IBQuery.SQL.
- Ustaw IBQuery.Active na True. W przypadku bledu, wroc do pkt 0. (sprawdz tez czy IBTransaction polaczone jest z IBDatabase, powinnas to juz miec zrobione).
- Poloz na forme komponent DataSource.
- Polacz go z IBQuery za pomoca property DataSet.
- Polacz komponent DBGrid z DataSource poprzez property DataSource na DBGrid.
- Ustaw property IBQuery.Active na True, o ile polaczenie z baza jest aktywne. Jesli tak, to juz bedziesz widziala co znajduje sie w tabeli.
Jesli uda Ci sie to osiagnac, to mozna przejsc do dynamicznego wyswietlania zawartosci.
mam cos takiego ale nie chodzi
procedure TForm2.ListBox1Click(Sender: TObject);
var nr:string;
i:integer;
begin
for i := 0 to Listbox1.Count - 1 do
begin
nr:=listbox1.items.Names[i];
edit1.text:=nr;
DataModule3.zmiana.TableName:=edit1.Text;
DataModule3.zmiana.Active:=true;
Dbgrid1.datasource:=datamodule3.szmiana;
end;
datamodule3.zmiana.close;
end;
zmiana jest to IBTable1 a szmiana to Datasource dla IBTable1
mamo kochana...
jeśli otworzysz dataset i po chwili go zamkniesz to chyba logiczne, że nic nie zobaczysz...
jeżeli napiszę w ten sposób wpisując tabelę na sztywno to się wyswietla w gridzie
procedure TForm2.ListBox1Click(Sender: TObject);
begin
if Sender is TListBox then
with Sender as TListBox do
begin
if ItemIndex > -1 then
begin
DataModule3.ibquery2.Active:=false;
datamodule3.IBDatabase1.connected:=true;
DataModule3.ibquery2.database:=datamodule3.IBDatabase1;
datamodule3.IBtransaction1.active:=true;
DataModule3.ibquery2.Transaction:=datamodule3.IBTransaction1;
datamodule3.ibquery2.sql.text:='SELECT * FROM Maszyny';
DataModule3.ibquery2.Active:=true;
Dbgrid1.datasource:=datamodule3.DataSource1;
end;
end;
end;
tylko sęk w tym żeby tam była automatyczna zmiana nazwy tej tabeli
niby takie łatwe a tu niestety... :-(
Zrób tak ja w kodzie ponizej. Dodatkowo przeczytaj kroki ktore Ci opisalem. Mozesz pominac IBQuery zastepujac je IBTable ale pamietaj o ustawieniach property.
procedure TForm2.ListBox1Click(Sender: TObject);
begin
if Sender is TListBox then
with Sender as TListBox do
begin
if ItemIndex > -1 then
begin
DataModule3.zmiana.Active := False;
DataModule3.zmiana.TableName := Items[Itemindex];
DataModule3.zmiana.Active := True;
end;
end;
end;
Po edycji:
mozesz tez tak:
procedure TForm2.ListBox1Click(Sender: TObject);
begin
if Sender is TListBox then
with Sender as TListBox do
begin
if ItemIndex > -1 then
begin
DataModule3.ibquery2.Active:=false;
datamodule3.IBDatabase1.connected:=true;
DataModule3.ibquery2.database:=datamodule3.IBDatabase1;
datamodule3.IBtransaction1.active:=true;
DataModule3.ibquery2.Transaction:=datamodule3.IBTransaction1;
datamodule3.ibquery2.sql.text:='SELECT * FROM ' + Items[Itemindex];
DataModule3.ibquery2.Active:=true;
Dbgrid1.datasource:=datamodule3.DataSource1;
end;
end;
end;
DZIAłA :-)
dziękuje bardzo Wodzu za pomoc :-)
dodam jeszcze ze oba sposoby napisane przez Ciebie Wodzu działają
:-)