Podtabela w BDE (TDbGrid)

0

Mam pytanie poradzilem sobie juz z tworzeniem bazy i prostych tabel ale napotkalem problem mianowicie jak zrobic jesli mam spis plyt robiony w TDbGrid 4 tabele : nr cd album wykonawca i utwory i teraz pytanie czy da sie jakos zrobic zeby po wcisnieciu pola utwory pokazala sie lista tych utworow (mozliwosc ich wpisania) lub jakos do pola "utwory" dodac te piosenki bo przeciez nie bede wpisywal do jednego pola kilkaset znakow w jednej lini :-/

0

Poczytaj o relacjach wielowartościowych master-details.

0

ja nie bardzo wiem, co chcesz zrobić ale widzę, że wypadało by najpierw poczytać o tworzeniu bazy danych, tzn o strukturze bazy. No i postaraj się może jaśniej, bo

mam spis plyt robiony w TDbGrid 4 tabele : nr cd album wykonawca

  1. TDBgrid nie trzyma danych - on je tylko wyświetla, dane są w tabelach
  2. nr, cd, album, wykonawca to nie tabele tylko pola tabeli

zeby po wcisnieciu pola utwory

  1. a konkretniej co chcesz wciskać, bo to mało precyzyjne

pokazala sie lista tych utworow (mozliwosc ich wpisania) lub jakos do pola "utwory" dodac te piosenki bo przeciez nie bede wpisywal do jednego pola kilkaset znakow w jednej lini

tego za cholere nie mogę rozgryźć :). Jaka lista, których utworów (wszystkich, dla danego wykonawcy, jakieś wybrane ...), dodać, czyli co?

Nie bierz tego posta za krytykę - po prostu widzę że to Twoje początki i staram się Ci pokazać gdzie masz błędy w nazewnictwie i gdzie mylisz pojęcia. Staraj się też jaśniej formułować swoje myśli :)

0

Misiekd masz racje faktycznie troche to zamotaem chodzi mi o to ze dane tabeli tajka jak napisales sa wyswietlae w DBGrid i mam kolumny(takie sa ich nazwy)" z nr cd, autor, utowory" i pozniej w nowe pole wpiuje pod kolumna cdnr daje 1 pod autorem daje jakiegos autora :) i tu problem bo w kolumnie utwory nie wpisze po kolei w pole 15 czy wiecej utowrow chodzi mi o to zeby po wcisnieciu tego pola wyswietlaly sie utowy w tabeli ktora by wyskakiwala lub rozwijala sie lista z tymi utorami cos na zasadzie comboboxa a nie wszystko pokolei w jednym polu no chyba mi sie udal troche jasniej ;)

0

No i od razu mi się rozjaśniło :P
a więc tak wypadało by to rozbić na conajmniej dwie (a lepiej na trzy) tabele:

cd
----
id_cd *
tytul
rok_wydania
nr_cd
inne_pola
wykonawca
------
id_wykonawca *
nazwa
jnne_pola
utwor
-----
id_utwor *
id_cd #
id_wykonawca #
tytul
track
typ_muzyki
inne_pola

jeśli w tabeli wykonawca były by tylko dwa pola (id_wykonawca i nazwa) to można nazwa przenieść do tabeli utwór. Poza tym typ muzyki powinien być w osobnej tabeli, a w tabeli utwor powinien być tylko id
i teraz tak
a) wszystkie utwory (w kolejności jak na cd) z cd nr 1
SELECT u.track, w.nazwa, u.tytul, u.typ FROM utwor u, wykonawca w, cd c WHERE u.id_cd = c.id_cd AND u.id_wykonawca = w.id_wykonawca AND c.nr_cd = 1 ORDER BY u.track
jeśli baza pozwala to można użyć JOIN

0

hehe dzieki cos zaczyna wychodzic jeszcze musze pogrzebac ale juz cos :)

0

mam podobny problem...
a rozwiazanie zasugerowane przez mojego poprzednika niezupelnie mnie satysfakcjonuje...

otoz:
mam dwa dbgridy oraz dwie tabele (w bazie danych) polaczone relacja...
Chcialbym aby po wybraniu pozycji w pierwszym gridze pojawiala sie jej relacja (relacja 1:n) w drugim...

Udalo mi sie to dokononac... Ale by to zrobic... musialem zdublowac takie komponenty jak:
-ADOConnection
-ADOQuery
-DataSource
I druga tabela (dbgrid) jest polaczona z drugim zestawem ow komponentow...

Mechanizm dziala... w polaczeniu z troszke zlozonymi zapytaniami SQL zreszta utworzonymi na wzor osoby ktora juz w tym poscie okazala sie wielce pomocna...

Moje pytanie brzmi...
Czy nie da sie tego zrobic w prostszy-szybszy-lepszy sposob?

Z gory dziekuje za pomoc :) :D

0
  1. ADOConnection potrzebjesz tylko jedno
  2. masz dwa gridy a w nich dwa zupełnie różne zestawy danych (np z przykładu wyżej w jednym wykonawców a w drugim utwory danego wykonawcy) to musisz mieć dwa zestawy Query i DataSource - inaczej nie da rady
  3. co do "prostszy-szybszy-lepszy sposob" to jedynie co możesz zrobić to pokazać zapytania - być może wcale niepotrzebne są "troszkę złożone" :)
0

OK mam dwa zapytania

  1. Do załadowania listy zamówień
    SELECT Zamówienia.Id, Zamówienia.Data, Kontrahenci.Nazwa, Suma FROM Zamówienia, Kontrahenci WHERE Zamówienia.IdDostawcy=Kontrahenci.Id

  2. Do zaprezentowania zamówienia
    SELECT Towary.Nazwa, Zamówienia2.Ilość, Zamówienia2.Cena FROM Zamówienia2, Towary WHERE Towary.Id=Zamówienia2.IdTowaru and Zamówienia2.IdZamówienia=1
    (1-przykladowa wartosc)

Od razu widac ze moja baza ma inne zadanie...
hmmm

tabele:
Zamówienia: Id(klucz), IdDostawcy, Data, Suma
Zamówienia2: Id, IdZamówienia, IdTowaru, Ilość, Cena
Kontrahenci: Id, Nazwa
Towary: Id, Nazwa, (...)

Ok i co mi jeszcze spac nie daje :)
Otoz baza dziala... ale...
hmm czy tu są wlasciwie relacje czy nie??
Bo ja ich nie definiowalem w Enterprise Manager-ze :)

Po prostu utworzylem odpowiednie zapytania i calosc spelnia swoje funkcje, ale ma wady...

Bo gdy usune np jakiegos konrahenta to zamowienie z nim zwiazane sie nie wyswietli...
Podobnie z towarami... usune towar... a on sie nie wyswietli na zamowieniu...

Czy te defekty sa wlasnie nastepstwem "symulowania" relacji z mojej strony?

Jak temu zapobiedz?
hmm
i ewentualnie jak tworzyc tabele w EM z relacjami 1:n...
Dlugo szperalem w google... na polskich stronach raczej nic nie ma....
Do naszych ojczystych witryn jednak sie nie ograniczylem...
W rezultacie niby znalazlem takie rozwiazanie jakie juz mam... badz nie na SQL SERVER 2000...

:) hmmm jakies wnioski:> ?

0
luster napisał(a)

OK mam dwa zapytania

  1. Do załadowania listy zamówień
    SELECT Zamówienia.Id, Zamówienia.Data, Kontrahenci.Nazwa, Suma FROM Zamówienia, Kontrahenci WHERE Zamówienia.IdDostawcy=Kontrahenci.Id

  2. Do zaprezentowania zamówienia
    SELECT Towary.Nazwa, Zamówienia2.Ilość, Zamówienia2.Cena FROM Zamówienia2, Towary WHERE Towary.Id=Zamówienia2.IdTowaru and Zamówienia2.IdZamówienia=1
    (1-przykladowa wartosc)

Od razu widac ze moja baza ma inne zadanie...
hmmm

tabele:
Zamówienia: Id(klucz), IdDostawcy, Data, Suma
Zamówienia2: Id, IdZamówienia, IdTowaru, Ilość, Cena
Kontrahenci: Id, Nazwa
Towary: Id, Nazwa, (...)

to bym ponazywał trochę inaczej.

kontrahent

*kontrachent_id
nazwa

towar

*towar_id
nazwa

zamowienie

  • zamowienie_id
  1. kontrahent_id
    data

pozycja

  • pozycja_id
  1. zamowienie_id
  2. towar_id
    lp
    ilosc

i teraz lista zamówień

SELECT z.data, k.nazwa, z.zamowienie_id FROM zamowienie z, kontrahent k WHERE z.kontrahent_id = k.kontrahent_id

lista pozycji do zamówienia

SELECT p.lp, t.nazwa, p.ilosc FROM pozycja p, towar t WHERE p.id_towaru = t.id_towaru AND p.zamowienie_id = :zamowienie:id

i w OI q2.MasterSource = ds1

Odnośnie nazewnictwa to o ile przy 2- 5 tabelach pola id jest powiedzmy akceptowalne to przy wiekszej ilości szybko się pogubisz. Dużo lepiej nazywać pola będące kluczem głównym tak nazwa_tabeli_id - wiadomo od razu wtedy "czyje" to pole jest.

A druga sprawa to o ile w zamówieniach jest to mniej ważne to przy np. faktórach może być to problemem. Chodzi mi o zapisywanie w tabelach samych odnośników do innych tabel, np
zamowienie

  • zamowienie_id
  1. kontrahent_id
    data

masz tu odnośnik do konkretnego rekordu w tabeli kantrahent. A co jeśli od momentu złożenia zamówienia zmieni się np. nazwa kontrahenta. O ile przy zamówieniu to nie ma większego znaczenia o tyle przy fakturze już tak bo na faktórze będziesz miał inne dane niż w bazie. Rozwiązaniem są nadmiarowe dane - dodatkowe pole w tabeli zmaówienia kontr_nazwa do którego wrzucasz nazwę kontrahenta. Z cenami jest podobnie bo np. ktoś składa zamówienie z ceną x a w miedzyczasie cena ta się zmienia i na fakturze już bedzie miał inną.

Ok i co mi jeszcze spac nie daje :)
Otoz baza dziala... ale...
hmm czy tu są wlasciwie relacje czy nie??
Bo ja ich nie definiowalem w Enterprise Manager-ze :)

jak już kiedyś gdzieś tu pisałem relacje to nie jest coś fizycznego jak tabela czy index. Tego się ie definiuje w SQLu. To jest bardziej twór logiczny, wirtualny dla nas (ludzi) żebyśmy mogli się połapać co z czym i jak :). Relacje po prostu mówią nam że tabela x jest połączona z tabelą y w taki a taki sposób. W samej bazie są jedynie mechanizmy, które potrafią pilnować poprawności tych relacji (o tym niżej)

Po prostu utworzylem odpowiednie zapytania i calosc spelnia swoje funkcje, ale ma wady...
Bo gdy usune np jakiegos konrahenta to zamowienie z nim zwiazane sie nie wyswietli...
Podobnie z towarami... usune towar... a on sie nie wyswietli na zamowieniu...
Czy te defekty sa wlasnie nastepstwem "symulowania" relacji z mojej strony?
Jak temu zapobiedz?

Do kontrolowania poprawności służą klucze obce.

[CONSTRAINT symbol] FOREIGN KEY (index_col_name, ...)
    REFERENCES tbl_name (index_col_name, ...)
    [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
    [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]

tu masz właśnie dwa warunki - On UPDATE i ON DELETE - określają one jak ma się zachować baza w momencie zmiany i usunięcia rekordu będącego kluczem obcym w jakiejś tabeli. Masz do wyboru
RESTRICT - jak NO ACTION
CASCADE - usuwa lub zmienia rekord w tabeli nadrzędnej i automatycznie w podrzędnej
SET NULL - wstawia NULL
NO ACTION - nie pozwala na usunięcie bądź zmiane nazwy

hmm
i ewentualnie jak tworzyc tabele w EM z relacjami 1:n...

ee tego nie bardzo rozumiem - tabela to tabela a relacja to relacja :)

Dlugo szperalem w google... na polskich stronach raczej nic nie ma....
Do naszych ojczystych witryn jednak sie nie ograniczylem...
W rezultacie niby znalazlem takie rozwiazanie jakie juz mam... badz nie na SQL SERVER 2000...
:) hmmm jakies wnioski:> ?

co do pytania jako całości to polecam kursy i strony o SQLu. W naszym języku, z tego co znalazłem, są tylko podstawy. W angielskim jest lepiej, chociażby z tego względu że cała dokumentacja standardu jest po angielsku. Jeśli chcesz nauczyć się dobrze SQLa dla konkretnej bazy to jesteś zmuszony czytać jej dokumentację bo nie widziałem jeszcze bazy w 100% zgodnej ze standardem, a już na pewno nie jest to MSSQL :P. Możesz też poszperać w bibliotece i poszukać książek do BD - ale pod kontem teorji i SQLa a nie konkretnego zastosowania (np. nie D7 i BD)

0

dziękuje za pomoc [soczek]

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