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

Kwerenda aktualizująca-problem (początkujący)

227 views
Skip to first unread message

kakiet

unread,
Aug 20, 2004, 8:48:49 AM8/20/04
to
Witam wszystkich!

Mam problem z kwerenda aktualizacją! Otóż pod czas jej uruchamiania wyskakuje
komunikat
„Operacja musi wykorzystać kwerendę, która można aktualizować.”?! Po

czym kwerenda nic nie robi.

Ponieważ jestem początkującym mogłem gdzieś popełnić głupi błąd w
konstruowaniu bazy i dla dlatego pojawiają się problemy. W takim razie opisze
co dokładnie ma robić moja kwerenda i w jakim „środowisku działa”.

Otóż jest baza danych, która ma wyświetlać statystyki przejechanych kilometrów
pomiędzy
kolejnymi tankowaniami. Dane przechowywane są w tabelach „Kierowcy”

oraz „Stan”, która jest zbudowana następująco:
Idtankowania|Idkierowcy| Data |Stan licznika|Ilość przejechanych km na baku
1 | 1 | 19.02.02 | 20 | 20
2 | 1 | 19.03.02 | 100 | 80
3 | 1 | 19.04.04| 200 |

Chodzi o to aby Access automatycznie odejmował ostatni rekord od

rzedostatniego (a konkretnie ostatni „Stan licznika” od przedostatniego) i

zapisywał
wynik w komórce „Ilość przejechanych kilometrów na jednym baku” w

ostatnim rekordzie. Na przykład: [Stan licznika] z drugiego rekordu odejmujemy
od [Stanu licznika] z pierwszego rekordu. Otrzymujemy wynik 80 a następnie
zapisujemy go w [Ilość przejechanych kilometrów na jednym baku] drugiego
rekordu.

Jak to zrobić w przypadku gdy mam wielu kierowców?

Ja rozwiązałem to tworząc 5 kwerend! Może nie jest to zbyt eleganckie ale do
pewnego momentu spełnia swoją rolę:
1. Kwerenda 1
Wyświetla Idkierowcy oraz stan licznika przy ostatnim tankowaniu. W naszym
przypadku było by to :

Idkierowcy | Stan licznika
1 | 200

2. Kwerenda 2
Wyświetla ostatni uzupełniony rekord „Ilość przejechanych
kilometrów na jednym baku”. W naszym przypadku było by to:

Idkierowcy | Stan licznika | Ilość przejechanych kilometrów na jednym baku
1 | 100 | 80


3. Kwerenda 3
Jest
bardzo podobna do kwerendy 2 (wyświetla „Stan licznika” z ostatniego


zupełnionego rekordu „Ilość przejechanych kilometrów na jednym baku”, czyli :

Idkierowcy | Stan licznika
1 | 100

4. Kwerenda 4
Wyświetla
różnicę pomiędzy ostatnim rekordem „Stan licznika” a przedostatnim

rekordem (kolumny „Stan
licznika”) oraz „Idkierowcy” i „Date” (te ostatnie

kolumny są po aby kwerenda aktualizującą wiedziała gdzie wpisać). W naszym
przypadku będzie to:

Idkierowcy | Data | Różnica
1 | 19.04.04 | 100

5. Kwerenda aktualizująca
Która ma
za zadanie zaktualizować tabelę „Stan”. To znaczy wpisać w ostatnie

puste pole
„Ilość przejechanych kilometrów na jednym baku” wartość liczbową z

pola „Różnica” Kwerendy 4.


Ufff ..... to już koniec!!! Czy w moim postępowaniu jest coć co może być
przeszkodą do wykowania kwerendy aktualizującej?!!

Z góry dziękuję za pomoc


--
============= P o l N E W S ==============
archiwum i przeszukiwanie newsów
http://www.polnews.pl

slon4

unread,
Aug 20, 2004, 8:57:01 AM8/20/04
to

Użytkownik "kakiet" <kak...@interia.pl> napisał w wiadomości
news:04082014484972@polnews...

> Witam wszystkich!
>
> Mam problem z kwerenda aktualizacją! Otóż pod czas jej uruchamiania
wyskakuje
> komunikat
> &#8222;Operacja musi wykorzystać kwerendę, która można
aktualizować.&#8221;?! Po
poniewaz jako baze do aktualizacji uzywasz danych ktore tez mozna
aktualizowac. Po polskiemu to powinny byc dwie tablice jako kryteria czy tez
jako dane do zmian lub dane zmieniane.
Pozdr
TB


Piotr Kaliszek

unread,
Aug 20, 2004, 9:55:09 AM8/20/04
to
Jak uzyskales te kwerendy? (ew. podeslij kawalki SQLa)

Czy aby nie jakas funkcja agregujaca?
Czy pola wiazace tabele sa zindeksowane?
Bo to dwa podstawowe warunki, by kwerenda byla aktualizowalna (tzn
kwerenda nie moze nic agregowac i polaczenie kwerend musi odbywac sie na
zindeksowanych polach).

Mozna to obejsc tworzac nowa tabele lub dodajac rekordy - tu juz nie ma
wymagania, by kwerenda zrodlowa byla aktualizowalna.

W ogole dosyc ciekawe zagadnienie, jak to rozwiazac elegancko -
tzn w uproszczeniu - dwa pola - data i licznik i trzeba skonstruowac
odjecie licznika od licznika dla daty poprzedniej.

Bo tak naprwde to nie widze powodu zebys musial wpisywac roznice do
tabeli, mozna wszak dynamicznie uzyskiwac, ale faketm jest ze tak moze
byc latwiej do pozniejszego obrabiania.

ps.
slon4> Po polskiemu to powinny byc dwie tablice jako kryteria czy tez
slon4> jako dane do zmian lub dane zmieniane.

Oj, po polskiemu - nic nie rozumiem.

Grzegorz Milewski

unread,
Aug 22, 2004, 1:38:53 AM8/22/04
to
A nie prosciej byloby to zrobic poprzez ADO Recordets?
Byloby bardziej czytelne i latwiej sterowalne.

--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/

Piotr Kaliszek

unread,
Aug 22, 2004, 12:46:31 PM8/22/04
to
> A nie prosciej byloby to zrobic poprzez ADO Recordets?
> Byloby bardziej czytelne i latwiej sterowalne.
>
Prosciej tak. Moze nawet prostacko :)
Ale mam wrazenie, ze rozwiazania oparte o VBA sa wiele wolniesze niz na
zapytaniach (poprawcie mnie jesli sie myle, bardzo sie uciesze)
Po drugie sa nie do przeniesienia na serwery SQLowe
Po trzecie VBA znam, a SQLa nie :) wiec staram sie cwiczyc.

A zagadnienie naprawde wydaje sie ciekawe.

Piotr

kris o poranku

unread,
Aug 23, 2004, 5:14:46 AM8/23/04
to
> Prosciej tak. Moze nawet prostacko :)
> Ale mam wrazenie, ze rozwiazania oparte o VBA sa wiele wolniesze niz na
> zapytaniach (poprawcie mnie jesli sie myle, bardzo sie uciesze)
to zalezy od tego jak otwierasz rekordseta, nie wiem czy korzystales z
aktualizacji baczowej za pomoca ado, nalezy takze pamietac o
wlasciwosci CacheSize obiektu rekordset. W sumie wydaje mi sie, ze
silnik czy to JET czy jakis SQL powinien sobie szybciej poradzic z
aktualizacja w swojej bazie, ale nie zawsze mozesz napisac zapytanie
aby spelnialo wymogi aktualizacji i dlatego czasami nie mozna obejsc
sie bez ADO (DAO, RDO...), ale czy jest wolniejsze?, zalezy kiedy.
Przy prostych zapytaniach nie warto korzystac z ADO

> Po drugie sa nie do przeniesienia na serwery SQLowe
Przepraszam, ale jesli tylko zachowasz o drobine uwagi co do samego
SQL'a (nie kazda kwerenda z Accessa zadziala na np. SQL Server i
odwrptnie, ale te podstawowe tak) to jak najbardziej mozesz przeniesc
VBA na dowolne serwery SQL, zmieniasz tylko providera w polaczeniu

> Po trzecie VBA znam, a SQLa nie :) wiec staram sie cwiczyc.
W sumie jak otwierasz recordseta bez SQL, albo masz zapytanie w bazie
(opcja szybsza) albo wpisujesz zapytanie w chwili tworzenia
recordseta, ale tak czy siak korzystasz z SQL specyficznego dla danej
bazy
Kris

kakiet

unread,
Aug 23, 2004, 8:05:19 AM8/23/04
to
>Jak uzyskales te kwerendy? (ew. podeslij kawalki SQLa)

Otóż jest baza danych, która ma wyświetlać statystyki przejechanych kilometrów

pomiędzy
kolejnymi tankowaniami. Dane przechowywane są w tabelach &#8222;Kierowcy&#8221;

oraz &#8222;Stan&#8221;, która jest zbudowana następująco:
Idtankowania|Idkierowcy| Data |Stan licznika | Ilość przejechanych km

1 | 1 | 19.02.02 | 20 | 20
2 | 1 | 19.03.02 | 100 | 80
3 | 1 | 19.04.04 | 200 |

Chodzi o to aby Access automatycznie odejmował ostatni rekord od

rzedostatniego (a konkretnie ostatni &#8222;Stan licznika&#8221; od przedostatniego) i

zapisywał
wynik w komórce &#8222;Ilość przejechanych kilometrów na jednym baku&#8221; w

ostatnim rekordzie. Na przykład: [Stan licznika] z drugiego rekordu odejmujemy
od [Stanu licznika] z pierwszego rekordu. Otrzymujemy wynik 80 a następnie
zapisujemy go w [Ilość przejechanych kilometrów na jednym baku] drugiego
rekordu.

Jak to zrobić w przypadku gdy mam wielu kierowców?

Ja rozwiązałem to tworząc 5 kwerend! Może nie jest to zbyt eleganckie ale do
pewnego momentu spełnia swoją rolę:

1.Kwerenda 1


Wyświetla Idkierowcy oraz stan licznika przy ostatnim tankowaniu. W naszym
przypadku było by to :

Idkierowcy | Stan licznika
1 | 200

2.Kwerenda 2


Wyświetla ostatni uzupełniony rekord &#8222;Ilość przejechanych
kilometrów na jednym baku&#8221;. W naszym przypadku było by to:


Idkierowcy | Stan licznika | Ilość przejechanych kilometrów na jednym baku
1 | 100 | 80


3.Kwerenda 3


Jest
bardzo podobna do kwerendy 2 (wyświetla &#8222;Stan licznika&#8221; z ostatniego


zupełnionego rekordu &#8222;Ilość przejechanych kilometrów na jednym baku&#8221;, czyli :


Idkierowcy | Stan licznika
1 | 100


4.Kwerenda 4


Wyświetla
różnicę pomiędzy ostatnim rekordem &#8222;Stan licznika&#8221; a przedostatnim

rekordem (kolumny &#8222;Stan
licznika&#8221;) oraz &#8222;Idkierowcy&#8221; i &#8222;Date&#8221; (te ostatnie

kolumny są po aby kwerenda aktualizującą wiedziała gdzie wpisać). W naszym
przypadku będzie to:

Idkierowcy | Data | Różnica
1 | 19.04.04 | 100


5.Kwerenda aktualizująca

Która ma
za zadanie zaktualizować tabelę &#8222;Stan&#8221;. To znaczy wpisać w ostatnie

puste pole
&#8222;Ilość przejechanych kilometrów na jednym baku&#8221; wartość liczbową z

pola &#8222;Różnica&#8221; Kwerendy 4.

Zbudowana jest w następujący sposób:

Pole: | Ilość przejechanych km | Data | Idkierowcy
Tabela: | Stan | Stan | Stan
Zamiana na | [Kwerenda 4]![Różnica] | |
Kryteria | |[Kwerenda4]![Data]|[Kwerenda4]![Id kierow]


Nie jestem dobry w acces-ie, ale wydaje mi się ze wszystkie warunki są dobę i
wszystko powinno grac. Niestety nie jest tak :(


>Czy aby nie jakas funkcja agregujaca?

Jesli tymi funkcjami sa: Pirewszy, Ostatni itp. to tak.

>Czy pola wiazace tabele sa zindeksowane?

Tak

>W ogole dosyc ciekawe zagadnienie, jak to rozwiazac elegancko -
>tzn w uproszczeniu - dwa pola - data i licznik i trzeba skonstruowac
>odjecie licznika od licznika dla daty poprzedniej.
>

Wlasnie jak to zrobic najprosciej

Prosze o pomoc, lub przysługe za która moge sie jakos odwdzieczyc, powiedmy
gotówka:)

kakiet

unread,
Aug 23, 2004, 9:52:32 AM8/23/04
to
>Jak uzyskales te kwerendy? (ew. podeslij kawalki SQLa)

Otóż jest baza danych, która ma wyświetlać statystyki przejechanych kilometrów
pomiędzy kolejnymi tankowaniami. Dane przechowywane są w tabelach [Kierowcy]
oraz [Stan], która jest zbudowana następująco:


Idtankowania |Idkierowcy | Data |Stan licznika | Ilość przejechanych km

1 | 1 | 19.02.02 | 20 | 20
2 | 1 | 19.03.02 | 100 | 80
3 | 1 | 19.04.04| 200 |


Chodzi o to aby Access automatycznie odejmował ostatni rekord od

przedostatniego (a konkretnie ostatni [Stan licznika] od przedostatniego) i
zapisywał wynik w komórce [Ilość przejechanych km] w ostatnim rekordzie. Na

przykład: [Stan licznika] z drugiego rekordu odejmujemy od [Stanu licznika] z
pierwszego rekordu. Otrzymujemy wynik 80 a następnie zapisujemy go w [Ilość

przejechanych km] drugiego rekordu.

Jak to zrobić w przypadku gdy mam wielu kierowców?

Ja probowalem rozwiazac ten problem tworząc 5 kwerend! Może nie jest to zbyt

eleganckie ale do pewnego momentu spełnia swoją rolę:

1.Kwerenda 1


Wyświetla Idkierowcy oraz stan licznika przy ostatnim tankowaniu. W naszym
przypadku było by to :

Idkierowcy | Stan licznika
1 | 200

2.Kwerenda 2
Wyświetla ostatni uzupełniony rekord [Ilość przejechanych km]. W naszym
przypadku było by to:


Idkierowcy | Stan licznika | Ilość przejechanych km
1 | 100 | 80


3.Kwerenda 3


Jest bardzo podobna do kwerendy 2 (wyświetla &#8222;Stan licznika&#8221; z

ostatniego uzupełnionego rekordu [Ilość przejechanych km], czyli :

Idkierowcy | Stan licznika
1 | 100


4.Kwerenda 4
Wyświetla różnicę pomiędzy ostatnim rekordem [Stan licznika] a przedostatnim
rekordem (kolumny [Stan licznika]) oraz [Idkierowcy] i [Date] (te ostatnie

kolumny są po aby kwerenda aktualizującą wiedziała gdzie wpisać). W naszym
przypadku będzie to:

Idkierowcy | Data | Różnica
1 | 19.04.04 | 100


5.Kwerenda aktualizująca
Która ma za zadanie zaktualizować tabelę [Stan].To znaczy wpisać w ostatnie
puste pole [Ilość przejechanych km] wartość liczbową z pola [Różnica] Kwerendy

4.
Zbudowana jest w następujący sposób:

Pole: | Ilość przejechanych km | Data | Idkierowcy
Tabela: | Stan | Stan | Stan
Zamiana na | [Kwerenda 4]![Różnica] | |
Kryteria | |[Kwerenda4]![Data]|[Kwerenda4]![Id kierow]
Nie jestem dobry w acces-ie, ale wydaje mi się ze wszystkie warunki są dobę i
wszystko powinno grac. Niestety nie jest tak :(

>Czy aby nie jakas funkcja agregujaca?

Jesli tymi funkcjami sa: Pirewszy, Ostatni itp. to tak.

>Czy pola wiazace tabele sa zindeksowane?

Tak

>W ogole dosyc ciekawe zagadnienie, jak to rozwiazac elegancko -
>tzn w uproszczeniu - dwa pola - data i licznik i trzeba skonstruowac
>odjecie licznika od licznika dla daty poprzedniej.
>

Wlasnie jak to zrobic najprosciej

Prosze o pomoc, lub przysługe za która moge sie jakos odwdzieczyc, powiedmy
gotówka:)

kakiet

unread,
Aug 23, 2004, 9:55:56 AM8/23/04
to
>Jak uzyskales te kwerendy? (ew. podeslij kawalki SQLa

Otóż jest baza danych, która ma wyświetlać statystyki przejechanych kilometrów

Piotr Kaliszek

unread,
Aug 23, 2004, 12:08:54 PM8/23/04
to
Nie cytuj calych postow, do tego swoich.
Nie pisz 3 razy tego samego, bo to sprawy raczej nie przyspieszy a
najwyzej zniecheci.

A wracajac do problemu:


>> Czy aby nie jakas funkcja agregujaca?
> Jesli tymi funkcjami sa: Pirewszy, Ostatni itp. to tak.

wiec masz odpowiedz dlaczego nie dziala/nie jest aktualizowalna.

W dodatku raczej nalezaloby uzyc Max, Min, bo uzycie Pierwszy, Ostatni
zwarac pierwszy i ostani rekord w zbiorze, niekoniecznie ten ktory ma
date najpozniesza/najwczesniejsza.

Jesli bys przeslal choc kawalki SQLa (Widok->Widok SQL) mozna by cos wiecej.

Wg mnie na szybko to mozna:
1/Na podstawie tego co zrobiles (zakladajac, iz dziala prawidlowo)
zrobic kwerende tworzaca tabele i na niej sie opierac.
2/Jesli ma byc aktualizujaca probowac przeniesc agregowanie do warunkow
- czyli uzyc EXIST lub IN

Piotr

kakiet

unread,
Aug 24, 2004, 12:19:24 PM8/24/04
to

>Nie cytuj calych postow.

Sorry

>Nie pisz 3 razy tego samego.

Za kazdym razem gdy probowalem wyslac post na grupe przegladarka zawiszala
mi sie. Potem probowalem sprawdzic czy post zostal wyslanyna grupe.
Niestety nie bylo go, a dzis jaksie okazalo wyslalem ich az 3, z tego
powodu przepraszam za zasmiecanie grupy

>>> Czy aby nie jakas funkcja agregujaca?
>> Jesli tymi funkcjami sa: Pirewszy, Ostatni itp. to tak.
>wiec masz odpowiedz dlaczego nie dziala/nie jest aktualizowalna.

W takim razie jakich funkcji uzyc, dal uzyskania tego samego efektu?


>W dodatku raczej nalezaloby uzyc Max, Min, bo uzycie Pierwszy, Ostatni
>zwarac pierwszy i ostani rekord w zbiorze, niekoniecznie ten ktory ma
>date najpozniesza/najwczesniejsza.

Mi to nie przeszkadza, poniewaz aktualizacje chce wykonywac po
wprowadzeniu kazdego rekordu, lub serri danych.

>1/Na podstawie tego co zrobiles (zakladajac, iz dziala prawidlowo)
>zrobic kwerende tworzaca tabele i na niej sie opierac.

SUPER!!!!
Zupelnie przoczylem ten temat!! Chyba poprostu brakuje mi praktyki i
obycia w access-ie. Teraz wszystko dzila. Jak moge Ci sie odwdzieczyc?

>2/Jesli ma byc aktualizujaca probowac przeniesc agregowanie do warunkow
>- czyli uzyc EXIST lub IN

Szczeze mowiac nie slyszalem o tych funkcjach. Gdzie moge znalesc ich opis -
najlepiej po polsku:(

Jeszcze raz dzieki za pomoc!

Piotr Kaliszek

unread,
Aug 24, 2004, 12:56:26 PM8/24/04
to

> Szczeze mowiac nie slyszalem o tych funkcjach. Gdzie moge znalesc ich opis -
> najlepiej po polsku:(
To nie funkcje, tylko predykat (co za slowo!) w skaldni SQLa.
Niestety w Acc2000 po polsku, potem juz chyba po angielsku:
w 2000:
F1->Microsoft Jet SQL->Jezyk operowania danymi->Podkwerendy SQL

Piotr

0 new messages