Dopisanie danych o członkach jednoski administracyjnej do bazy danych.

0

Witam. Jestem nowym użytkownikiem w tym serwisie. Bardzo proszę o wyrozumiałość i cierpliwość. Przeglądałem trochę wątków z tego forum, ale nie do końca znalazłem odpowiedź na swój problem.
Mianowicie chodzi mi o to, że zacząłem nie dawno bawić się Delphi i aplikacjami do obsługi bazy danych.
Zbudowałem bazę danych, bardzo prostą z dwóch tabel Jednostka_organizacyjna ( składająca się z id_jed i nazwy) oraz druga tabela Członkowie ( składająca się z id_członka, id_jed (wynika z utworzonej relacji między tabelami), imie, nazwisko.
Sedno mojego problemu to, zrobiłem aplikację ( formularz ) do wprowadzania nowego członka do bazy, kilka etykietek i editów to wprowadzenia danych oraz przycisk zapisz, przy dodawaniu członka jego id_członka generowane jest automatycznie, jednak danemu członkowi chcę przyporządkować Jednostkę_organizacyjną i jak mam to zrobić żeby wykorzystać do tego dane z pierwszej tabeli, aby wybrać odpowiednią jednostkę i żeby klucz jednostki przechodził do tabeli członkowie.
Chciałem zrobić to za pomocą komponentu DBLookupComboBox, w którym po rozwinięciu było by id_jednostki i jej nazwa i użytkownik mógł by sobie wybrać do jakiej jednostki chce przypisać członka. I to mi nie wychodzi. Niby wszystkie parametry DBLookupComboBox są ustawione poprawnie, ale dziwny jest komponent, strasznie nie mobilny, lista wyświetla raz cała, raz z dziwnym małym suwakiem i nie można nic na niej wskazać. Jak mogę sobie poradzić z takim dodawaniem danych do bazy pochodzącymi z innej tabeli.

3

Musisz zmienić coś w kodzie i powinno działać.

0
targ4 napisał(a):

Niby wszystkie parametry DBLookupComboBox są ustawione poprawnie, ale dziwny jest komponent, strasznie nie mobilny, lista wyświetla raz cała, raz z dziwnym małym suwakiem i nie można nic na niej wskazać. Jak mogę sobie poradzić z takim dodawaniem danych do bazy pochodzącymi z innej tabeli.
To zależy od liczby wczytanych rekordów w komponencie który pobiera dane z tabeli słownikowej. Nie wiem jakiego komponentu używasz, ale możesz w OnFormCreate wywołać FetchAll() albo Last() a następnie First() powinno pomóc. Chyba, że nie o to pytasz. Bo opis jest ubogi. Zero kodu, nic.

0

Bez głębszego zapoznawania z tematem(głównie z powodu braku szczegółowych informacji), obstawiam że skoro w bazie masz X rekordów a combobox pokazuje jeden to jednak jest on źle ustawiony. Poniżej przykładowy sposób użycia DBLookupComboBox oczywiście można to "wyklinać" na formie.

 
Var
  query: TADOQuery;
  src: TDataSource;
begin
  query:= TADOQuery.Create(self);
  src:= TDataSource.Create(self);
  src.DataSet:= query;
  query.ConnectionString:= //ustaw połączenie do bazy
  query.SQL.Text:= //ustawiasz zapytanie
  DBLookupComboBox1.ListSource := src;
  DBLookupComboBox1.KeyField:= //nazwa kolumny z id
  DBLookupComboBox1.ListField:= //nazwa kolumny którą chcesz wyświetlać
  query.Open;
  query.First;
  ShowMessage(IntToStr(DBLookupComboBox1.KeyValue));//wyświetli id aktualnie zaznaczonego rekordu
0

Chyba nie poradzę sobie z tym DBLookupComboBox, może postaram inaczej określić mój problem, jak dodać do komponentu typu np.ComboBox wartości z bazy danych. Tak aby, nie były one w nim wpisywane na sztywno, a zawartość pochodziła z bazy danych i aby było możliwość wybrania wartości z tego komponentu.
P.S. Jeśli chodzi o jakieś kody programu , aktualnie mam napisany tylko kod pod przycisk zapisywania do bazy i stworzoną formatkę z etykietami i komponentami Edit dostępnymi w RAD Studio No ale moje pytanie dotyczy innej kwestii.

1

@targ4 nie mogę po prostu ... to jest tak proste, że nikomu się nie chce nawet pisać gotowego kodu. Kolega Wielki Samiec napisał Ci konkretnie co masz zrobić mało tego efekt inserta do bazy możesz uzyskać nawet nie pisząc jednej linijki kodu bo możesz wszystko wyklikać w Delphi. Jeżeli jednak chcesz na upartego dziergać ręcznie to do komponentu TComboBox możesz wpisać dane w ten sposób:

procedure TForm.ZaladujDoCombo(Sender: TObject)
var
  q: TZQuery;
begin
  q := TZQuery.Create(Self);
  try
    q.Connection := db;// połączenie do bazy danych
    q.sql.text := '';//tu podajesz zapytanie select * from tabela_slownikowa
    q.Open;
    q.first;
    (Sender as TComboBox).items.clear;//czyścisz swoj TComboBox
    while not q.eof do
    begin
      (Sender as TComboBox).items.add(q.FieldByName('nazwa_pola_ktore_chcesz_wyswietlic_w_combo').AsString);
      q.next;
    end;
  finally  
    q.free;
  end;
end;

To spowoduje, że w TComboBox będziesz miał wartości ze słownika (

select * from tabela_slownikowa

). Napisałem Ci to z parametrem Sender abyś mógł sobie tą prockę podpiąć pod zdarzenie jakieś (np OnDataChange twojego DataSeta). Następnie na zdarzeniu OnChange (lub jakimś innym) comboboxa będziesz musiał odpowiednio na podstawie nazwy zweryfikować identyfikator z tabeli_slownikowej, który będziesz chciał przypisać do tabeli właściwej.

Jest to straszna rzeźba i używając TLookupComboBox możesz wszystko załatwić automatycznie.

2

Moim zdaniem pytacz niech ogarnie tego DBComboBoxa, bo przy większej liczbie formatek i comboboxów na formie się zajeździ. A to przecież 30 sekund wyklikać ustawienia... Albo jak nie umie niech poczyta ksiażkę. Nawet powstała książka o tym jak pisać programy bazodanowe w Delphi i tam jest to pokazane co i jak.

0

Dziękuje za odpowiedzi, doszedłem jak załadować zawartość do zwykłego ComboBoxa ,z DBLookupComboBox też doszedłem co i jak . Dzięki. Temat do zamknięcia.

0

@targ4 nie ma za co :)

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