| Pracujďż˝ od czasu do czasu w MSAccess 2003. Zamierzam zbudowaďż˝ bazďż˝,
| kt�ra przechowuje ksi��ki (do kupienia) oraz klient�w kupuj�cych te
| ksi��ki. Na pocz�tku zbudowa�em tabel� przechowuj�c� klient�w i tabel�
| przechowuj�c� ksi��ki. Chcia�bym, �eby Access tworzy� dokumenty
| wydania konkretnych ksi��ek konkretnym klientom (a wi�c tzw.
| "wuzetki", czyli dokumenty wydania ksi��ek z magazynu kontretnym
| kientom), na podstawie kt�rych mo�na b�dzie wystawia� faktury. Wiem,
| �e tworzenie nowych tabel mo�liwe jest za pomoc� kwerend tworz�cych
| tabele, jednak nie uda�o mi si� stworzy� takiej kwerendy. By� mo�e
| trzeba p�j�� inn� drog�, nie konstruuj�c kwerendy tworz�cej tabele.
Troszku chyba b��dzisz...
Tabele tworzy si� na samym pocz�tku tworzenia struktury bazy danych.
Potem w zasadzie juďż˝ nie powinno mieďż˝ to miejsca. Pomijam kwestiďż˝
rozbudowy aplikacji o nowe funkcjonalno�ci, wcze�niej nie przewidziane/nie
uzgodnione.
Akurat kwerenda tworz�ca tabele jest najmniej u�yteczna w odpowiednio
zaprojektowanej bazie.
Dobre to-to do ad-hoc robionych analiz w "brudnym" pliku mdb, traktowanym
zupe�nie roboczo.
Je�li dobrze zgaduj� Twoje intencje, potrzebujesz w tej chwili po prostu
tabeli tKlienciSprzedaz (a mo�e tak�e tKlienciSprzedazPozycje), gdzie dla
ka�dego klient_id i produkt_id zanotujesz dat� sprzeda�y, kwot�, dat�
wysy�ki (?), cen�, cen� przesy�ki, ilo�� sztuk itd, itp.
Takďż˝ tabelďż˝ stworzysz raz, zgodnie z wytycznymi czy przewidywaniami.
Za� osobna sprawa, jak do niej b�dziesz wpisywa� dane.
Mo�e to by� wpisywanie r�czne w oparciu o formularze/podformularze
zwi�zane, lub przy pomocy kodu i/lub kwerend DO��CZAJ�CYCH.
A je�li nie zgad�em prawid�owo, o co Ci chodzi, i pytasz jak za pomoc�
kwerendy stworzy� obiekt-tabela, to s�u�y do tego kwerenda DEFINIUJ�CA
DANE.
Jej SQL wygl�da zwykle tak (nie posiada odwzorowania w siatce QBE):
CREATE TABLE tKlienciSprzedaz
(
id counter primary key
, klient_id long
, produkt_id long
, data_sprzedaz datetime
, data_wysylki datetime
, cena_katalogowa money
, upust currency
, przesylka_rodzaj long
, przesylka_cena currency
, sztuk long
)
--
KN
archiwum grupy:
http://groups.google.pl/advanced_search
(grupa: pl*msaccess)
czyli co jest lepsze gdy uzywam tabeliTymczasowej ?
1. wykasowanie z niej danych i dodanie nowych (2 kwerendy)
2. utworzenie nowej tabeli za pomoca kwerendy tworzacej tabele (1
kwerenda)
z tego co mowi pan KN przypadek 1, czemu ? czy generalnie sa jakies
przeciwskazania co do 2 ?
pozdrawiam,
Marcin
Dzięki, Krzysztofie... Próbuję z kwerendą dołączającą, Zbudowałem
najpierw tabelę przypisującom klientom książki, które chcą kupić. Mam
jednak pewien kłopot: chciałbym aby w tej tabeli pojawiała się cena
książki. W tabeli Książki w jednej z kolumn są ceny każdej książki.
Tymczasem w mojej kwerendzie muszę wybierać jedną z tych cen, a
chciałbym, żeby w kwerendzie po wybraniu książki pojawiała
automatycznie jej cena. Wiesz, jak to zrobić?
P.S. Jak ustawić tę grupę dyskusyjną, żeby w mojej poczcie pojawiało
się zawiadomienie o otrzymaniu odpowiedzi?
Jacek
(...)
|| Troszku chyba b��dzisz...
|| Tabele tworzy si� na samym pocz�tku tworzenia struktury bazy danych.
|| Potem w zasadzie juďż˝ nie powinno mieďż˝ to miejsca. Pomijam kwestiďż˝
|| rozbudowy aplikacji o nowe funkcjonalno�ci, wcze�niej nie
|| przewidziane/nie uzgodnione.
|| Akurat kwerenda tworz�ca tabele jest najmniej u�yteczna w odpowiednio
|| zaprojektowanej bazie.
|| Dobre to-to do ad-hoc robionych analiz w "brudnym" pliku mdb,
|| traktowanym zupe�nie roboczo.
| czyli co jest lepsze gdy uzywam tabeliTymczasowej ?
| 1. wykasowanie z niej danych i dodanie nowych (2 kwerendy)
| 2. utworzenie nowej tabeli za pomoca kwerendy tworzacej tabele (1
| kwerenda)
|
| z tego co mowi pan KN przypadek 1, czemu ? czy generalnie sa jakies
| przeciwskazania co do 2 ?
C�, my�l�, �e to jest tak jak z deklarowaniem zmiennych w VBA.
Niby zmiennych deklarowaďż˝ nie trzeba, a jednak wszyscy zalecajďż˝ aby to
robiďż˝.
Dzi�ki temu pr�ba przypisania niew�a�ciwego tekstu do zmiennej datetime
wyzwoli jaki� b��d, i VBA poinformuje nas, �e robimy jakie� g�upstwo
(o co w �rednio rozbudowanym projekcie nie trudno, nawet przy bieg�ej
znajomo�ci tajnik�w access'a i programowania).
To samo z juz gotowďż˝ tabelďż˝. Zawiera jakieďż˝ konkretne pola, konkretnych
typ�w, ma indeksy (w tym np. unikalne), regu�y poprawno�ci itd.
Je�li przez nieuwag� spr�bujesz do niej doda� co�, co z ow� struktur� si�
k�uci, to Jet (i ewent. VBA) o tym Ci� poinformuje.
W przypadku baz produkcyjnych jest to jak najbardziej wskazane.
(pomijam bazy ad-hoc, w kt�rych cos tam sobie d�ubi� i obrabiam dane
pochodzenia wszelakiego)
Przyk�ad jaki mi si� nasun��: import danych z excela chyba zawsze ko�czy
si� stworzeniem p�l Double, nawet dla danych ca�kowitych.
A to potem uniemozliwia sprz�enia z innymi tabelami...
Inna sprawa, �e w bazie produkcyjnej mylisz si�, �e tworzenie tabeli to
tylko jeden krok.
S� dwa, bo musisz uprzednio istniej�c� tabel� skasowa�.
Jedynie r�czne uruchomienie kwerendy tworz�cej tabel� wyzwala monit o
usuni�ciu juz istniej�cej
(ewentualnie DoCmd.OpenQuery (?), ale juďż˝ nie CurrentDb.Execute)
Jest IMO tylko jeden argument kiedy kwerenda tworz�ca tabel� ma przewag�
(?) nad kwerend� do��czaj�c�.
Ot� pierwsza jest du�o szybsza w przypadku du�ego zestawu danych (m�wimy
o dziesi�tkach albo raczej setkach tysi�cy rekord�w).
Mo�e to mie� znaczenie przy tworzeniu bardzo skomplikowanych raport�w,
gdzie warto przemieli� dane w N-kwerendach po�rednicz�cych, tworz�cych
pomocnicze po�rednie tabele, ewent. z zak�adaniem indeks�w, by na ko�cu w
satysfakcjonuj�cym czasie wyplu� w�a�ciwe dane.
(...)
| Pr�buj� z kwerend� do��czaj�c�, Zbudowa�em
| najpierw tabel� przypisuj�com klientom ksi��ki, kt�re chc� kupi�. Mam
| jednak pewien k�opot: chcia�bym aby w tej tabeli pojawia�a si� cena
| ksi��ki. W tabeli Ksi��ki w jednej z kolumn s� ceny ka�dej ksi��ki.
| Tymczasem w mojej kwerendzie muszďż˝ wybieraďż˝ jednďż˝ z tych cen, a
| chcia�bym, �eby w kwerendzie po wybraniu ksi��ki pojawia�a
| automatycznie jej cena. Wiesz, jak to zrobiďż˝?
Ech, co� mi si� wydaje, �e kombinujesz jak ko� pod g�r�...
Naprawdďż˝ potrzebujesz kwerend?
Z poziomu formularzy robi siďż˝ to banalnie.
A mo�e po prostu poka� tu SQL swej kwerendy...
�atwiej b�dzie rozmawia�.
| P.S. Jak ustawi� t� grup� dyskusyjn�, �eby w mojej poczcie pojawia�o
| siďż˝ zawiadomienie o otrzymaniu odpowiedzi?
A z jakiego czytnika grup dyskusyjnych korzystasz?
Myślisz, że z formularzy? Dobrze, spróbuję.
Oto SQL mojej kwerendy (choć myślę, że Cię nie zadowoli):
INSERT INTO WZ ( Id, [Nazwa odbiorcy] )
SELECT Klienci.ID, Klienci.[Nazwa odbiorcy]
FROM Klienci INNER JOIN Tytuły ON Klienci.ID = Tytuły.ID
GROUP BY Klienci.ID, Klienci.[Nazwa odbiorcy], Tytuły.tytuł;
Pytasz, z jakiego czytnika grup dyskusyjnych korzystam? To zwykły IE8.
No i pierwszy raz korzystam z grup dyskusyjnych. Zwykle korzystam z
forów, w których jest opcja powiadamiania o uzyskanym poście.
(...)
|| Ech, co� mi si� wydaje, �e kombinujesz jak ko� pod g�r�...
|| Naprawdďż˝ potrzebujesz kwerend?
|| Z poziomu formularzy robi siďż˝ to banalnie.
||
|| A mo�e po prostu poka� tu SQL swej kwerendy...
|| �atwiej b�dzie rozmawia�.
||
| My�lisz, �e z formularzy? Dobrze, spr�buj�.
Oj, pr�buj, pr�buj...
Cos widz�, �e nie bardzo rozumiesz co robisz...
| Oto SQL mojej kwerendy (cho� my�l�, �e Ci� nie zadowoli):
| INSERT INTO WZ ( Id, [Nazwa odbiorcy] )
| SELECT Klienci.ID, Klienci.[Nazwa odbiorcy]
| FROM Klienci INNER JOIN Tytu�y ON Klienci.ID = Tytu�y.ID
| GROUP BY Klienci.ID, Klienci.[Nazwa odbiorcy], Tytu�y.tytu�;
No, nie zadowoli mnie :(
Co to ma niby robiďż˝ ???
Spr�bujmy zastanowi� si� co masz:
1. tabela Klienci z polami:
- ID long, autoincrement klucz g��wny
- nazwa_odbiorcy (nie stosuj spacji w nazwach obiekt�w! Zem�ci si�
szybko)
- jakie�_inne_pola
przyk�ad:
id nazwa_odbiorcy
----------------------
1 Kowalski
2 Malinowski
2. tabela Tytuly (nie u�ywaj polskich znak�w w nazwach obiekt�w! j.w.)
z polami:
- ID long, autoincrement klucz g��wny
- Tytul text(255)
- autor_id long (klucz obcy tabeli autorzy)
- cena money
- inne_pola
przyk�ad:
id tytul cena
-----------------------------------
1 ABC Accessa 3500
2 Chatka Puchatka 35
Powinieneďż˝ mieďż˝ tabelďż˝ WZ, z polami:
- ID long, autoincrement klucz g��wny
- klient_id long (klucz obcy tabeli Klienci)
- tytul_id long (klucz obcy tabeli Tytuly)
- data_zamowienia datetime
- data_sprzedazy datetime
- cena_sprzedazy datetime
- szt long
- inne_pola
Za ka�dym razem gdy dokonujesz jakiej� sprzeda�y chcia�by� to odnotowa� w
tabeli WZ.
Czyli:
- do pola klient_id chcesz wpisaďż˝ klucz konkretnego klienta
- do pola tytul_id chcesz wpisaďż˝ klucz konkretnej pozycji
- do pola cena_sprzedazy chcesz wpisa� _aktualn�_ cen� ksi��ki
Jak wspomnia�em, wpis *r�czny* z poziomu formularza, z wykorzystaniem pola
kombi, jest 100x prostszy i bardziej intuicyjny.
Je�li nie wiesz jak, to najwy�sza pora kupic jaki� podr�cznik do access'a.
A jesli kwerenda, to mog�aby wygl�da� nast�puj�co:
Insert into WZ (klient_id, tytul_id, data_zamowienia, cena_sprzedazy, ...)
Select
k.id, t.id, date(), t.cena, ...
From
klienci as k, tytyly as t
Where
k.id = [podaj klucz klienta]
and
t.id = [podaj klucz tytulu]
Zaďż˝ co robi Twoja kwerenda???
��czy Id klienta z ID tytu�u
(...FROM Klienci INNER JOIN Tytu�y ON Klienci.ID = Tytu�y.ID)
czyli ��czy arbitralnie
1 (Kowalski) <-> 1 (ABC Accessa)
2 (Malinowski) <-> 2 (Chatka Puchatka)
ma to jakiďż˝ sens ???
grupuje (nie wiadomo po co)
i taki zestaw "pi�ciuset" danych wstawia do WZ.
Ma to jakiďż˝ sens ???
| Pytasz, z jakiego czytnika grup dyskusyjnych korzystam? To zwyk�y IE8.
IE8 nie jest czytnikiem :)
Co najwy�ej z jego poziomu uruchamiasz np. groups.google.com...
| No i pierwszy raz korzystam z grup dyskusyjnych. Zwykle korzystam z
| for�w, w kt�rych jest opcja powiadamiania o uzyskanym po�cie.
To mo�e spr�buj stare�kiego OutlookExpress...
Powiadamiania nie ma, ale s� filtry widok�w, jak np.
"pokaďż˝ tylko odpowiedzi na moje pytania" i inne.
Korzystam z tego od 10-u lat i mnie wystarcza.