Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Kwerenda tworząca tabele

71 views
Skip to first unread message

Jacek Obrębowski

unread,
Oct 11, 2009, 2:13:44 PM10/11/09
to
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.
Pomóżcie, proszę...
Trurl

Krzysztof Naworyta

unread,
Oct 11, 2009, 5:51:20 PM10/11/09
to
Juzer Jacek Obr�bowski <d...@o2.pl> napisa�

| 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)

mrymar

unread,
Oct 12, 2009, 5:12:35 AM10/12/09
to
On 11 Paź, 22:51, "Krzysztof Naworyta" <k.nawor...@datacomp.com.pl>
wrote:
> Juzer Jacek Obrębowski <d...@o2.pl> napisał
> 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

Jacek Obrębowski

unread,
Oct 12, 2009, 8:35:35 AM10/12/09
to
On 11 Paź, 23:51, "Krzysztof Naworyta" <k.nawor...@datacomp.com.pl>

wrote:
> Juzer Jacek Obrębowski <d...@o2.pl> napisał
>
> 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)

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

Krzysztof Naworyta

unread,
Oct 12, 2009, 10:50:16 AM10/12/09
to
Juzer mrymar <mry...@gmail.com> napisaďż˝


(...)


|| 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.

Krzysztof Naworyta

unread,
Oct 12, 2009, 10:55:16 AM10/12/09
to
Juzer Jacek Obr�bowski <d...@o2.pl> napisa�


(...)
| 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?

Jacek Obrębowski

unread,
Oct 13, 2009, 5:18:30 AM10/13/09
to
On 12 Paź, 16:55, "Krzysztof Naworyta" <k.nawor...@datacomp.com.pl>

wrote:
> Juzer Jacek Obrębowski <d...@o2.pl> napisał
>
> (...)

> | 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?
>
> --
> KN
>
> archiwum grupy:http://groups.google.pl/advanced_search
> (grupa: pl*msaccess)

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.

Krzysztof Naworyta

unread,
Oct 14, 2009, 4:08:55 PM10/14/09
to
Juzer Jacek Obr�bowski <d...@o2.pl> napisa�


(...)


|| 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.

0 new messages