Zadanie z dnia 05.05.2000
(tylko tyle udało mi się zdobyc:)
1. Podac nazwy tematow w ktorych sumaryczny dochod jest wiekszy od sumarycznego dochodu w kazdym temacie w ktorym bralo udzial mniej niz 20 pracownikow
2. Podac nazwy tematow w ktorych sumaryczny dochod jest wiekszy od sumarycznego dochodu w kazdym temacie w ktorym bralo udzial mniej niz 20 pracownikow i w ktorym przynajmniej 1 osoba urodzila sie przed 1 stycznia 1970
1 Podać nazwę tematu 3;
SELECT NAZWATEMAT FROM TEMAT WHERE NRT=3;
2 Podać nazwy zespołów, których numer jest mniejszy od 10;
SELECT NAZWAZESP FROM ZESPOL WHERE NRZ < 10;
3 Podać nazwy tematów zaczynające się na A;
SELECT PRZEDMIOT FROM WYKLADOW WHERE PRZEDMIOT LIKE 'A%';
4 Podać nazwy tematów o numerach pomiędzy 2 a 7;
SELECT NAZWATEMAT FROM TEMAT WHERE NRT BETWEEN 2 AND 7;
5 Podać nazwiska studentek urodzonych przed 01.11.1977;
SELECT NAZWISKO FROM STUDENCI WHERE KOBIETA='T' AND (DATA_UR<'1977-11-01'); 6 Podać nazwiska studentów kierunku BUDOWA MC;
SELECT NAZWISKO FROM STUDENCI S, KIER_STU K WHERE K.STUDENT = S.STUDENT AND
KIERUNEK='BUDOWA MC';
7 Podać nazwiska studentów, którzy mają oceny < 3 z przedmiotu MIKROPROCESORY; SELECT NAZWISKO FROM STUDENCI S, OCENY O WHERE S.STUDENT = O.STUDENT AND
PRZEDMIOT='MIKROPROCESORY' AND OCENA<3 ;
8 Podać nazwy przedmiotów wg alfabetu;
SELECT PRZEDMIOT FROM WYKLADOW ORDER BY PRZEDMIOT;
9 Podać nazwiska pracowników wg zespołów. Nazwy zespołów mając być posortowane w kolejności alfabetycznej od Z do A;
SELECT NAZWISKO FROM ZESPOL Z, PRACOWNI P WHERE P.NRZ = Z.NRZ ORDER BY
NAZWAZESP DESC;
www.chomikuj.pl/MarWag987
10 Podać ilość sal wykładowych;
SELECT COUNT(SALA) FROM ROZM_SAL;
11 Podać ilość zespołów w Instytucie INFORMATYKI;
SELECT COUNT(NAZWAZESP) FROM ZESPOL Z, INST I WHERE I.NRZ=Z.NRZ AND INSTYTUT =
'INFORMATYKI';
12 Podać sumę dochodów zespołu nr 3;
SELECT SUM(KWOTA) FROM DOCHODY D, PRACOWNI P WHERE P.NRP=D.NRP AND NRZ=3; 13 Podać średnią ocen z przedmiotu MATEMATYKA
SELECT AVG(OCENA) FROM OCENY WHERE PRZEDMIOT = 'MATEMATYKA';
14 Podać numery sal, ich rozmiar, i ilość przedmiotów wykładanych w każdej z nich; SELECT S.SALA, ROZM_SALI,COUNT( DISTINCT PRZEDMIOT) FROM ROZKLAD R, ROZM_SAL S
WHERE S.SALA=R.SALA GROUP BY S.SALA, ROZM_SALI;
15 Podać numery zespołów i sumy dochodów pracowników każdego z nich;
SELECT SUM(KWOTA), NRZ FROM DOCHODY D, PRACOWNI P WHERE P.NRP=D.NRP GROUP
BY NRZ;
16 Podać wszystkie różne numery tematów w których pracownik GRZYBEK otrzymał wypłaty; SELECT DISTINCT NRT FROM DOCHODY D, PRACOWNI P WHERE P.NRP=D.NRP AND
NAZWISKO='GRZYBEK';
17 Podać różne godziny odbywania się zajęć i ilość wystąpień każdej godziny; SELECT DISTINCT GODZINA, COUNT(GODZINA) FROM ROZKLAD GROUP BY GODZINA;
18 Podać nazwiska studentów, którzy mają przynajmniej jedną ocenę taką, jak najwyższa ocena z przedmiotu PASCAL studenta nr 1;
SELECT DISTINCT NAZWISKO FROM STUDENCI S, OCENY O1 WHERE O1.OCENA=(SELECT
MAX(O2.OCENA) FROM OCENY O2 WHERE STUDENT=1 AND PRZEDMIOT ='PASCAL');
19 Podać studentów, którzy mają więcej niż 3 oceny;
SELECT NAZWISKO FROM STUDENCI S, OCENY O WHERE S.STUDENT=O.STUDENT GROUP BY
S.STUDENT, NAZWISKO HAVING COUNT(OCENA)>3;
www.chomikuj.pl/MarWag987
GRUPA A
1. Podaj numery i nazwiska pracowników, którzy w temacie 'DYSK' otrzymali wypłatę mniejszą od co najmniej jednej z wypłat pracownika o nazwisku NOWAK w dowolnym temacie.
SELECT DISCINT nrp, nazwisko
FROM pracowni p, dochody d, temat t
WHERE p.nrp=d.nrp AND d.nrt=t.nrt AND nazwatemat='DYSK' AND d.kwota < ANY
(
SELECT dd.kwota
FROM pracowni pp, dochod dd
WHERE pp.nrp=dd.kwota AND nazwisko='NOWAK')
2. Podaj numery i nazwiska pracowników, którzy pracują w jednym z tematów, w których pracuje MISIURA.
SELECT DISCINT nrp, nazwisko
FROM pracowni p, dochody d
WHERE p.nrp=d.nrp AND d.nrt IN (
SELECT dd.nrt
FROM dochody dd, pracowni pp
WHERE dd.nrp=pp.nrt AND pp.nazwisko='MISIRA')
3. Podaj numery i nazwiska studentów, mających z przedmiotu 'MATEMATYKA' ocenę równą jednej z ocen studenta o nazwisku KOWALSKI z tego przedmiotu.
SELECT s.student, s.nazwisko
FROM studenci s, oceny o
WHERE s.student=o.student and o.przedmiot='MATEMATYKA' and o.ocena in (
SELECT distinct o.ocena
FROM oceny o1, studenci s1
where o1.przedmiot='MATEMATYKA' and s1.student=o.student);
4. Podaj numery i nazwiska pracowników nie biorących udziału w żadnym z tematów, w którym pracuje pracownik NIEZALEZNY.
SELECT nrp,nazwisko
FROM Pracowni p, Dochody d
Where p.nrp=d.nrp and nrt NOT IN (
SELECT d1.nrt
FROM pracowni p1, dochody d1
WHERE p1.nrp=d1.nrp AND p1.nazwisko='NIEZALEZNY')
www.chomikuj.pl/MarWag987
5. Podaj numery, nazwiska i daty urodzenia mężczyzn zatrudnionych w zespole PIECE, którzy są młodsi od każdego pracownika zespołu BUDOWA.
SELECT p.nrp,p.nazwisko,p.data_ur
From ...
6. Podaj numery i nazwiska studentów kierunku INFORMATYKA, którzy z przedmiotu MATEMATYKA otrzymali oceny wyższe od każdego ze studentów kierunku ELEKTRONIKA z tego przedmiotu.
7. Podaj numery i nazwiska studentów - mężczyzn, którzy są starsi od co najmniej jednego z pracowników zespołu PIECE.
8. Podaj numery i nazwiska studentów, którzy mają oceny 5.0 z przedmiotów prowadzonych przez pracownika o nazwisku MISIURA.
9. Podaj numery sal, w których spotykają się na zajęciach pracownik TRUMAN i student KORUS.
10. Podaj nazwy przedmiotów, z których zajęcia zaczynają się po 1200 i odbywają się w tych salach, które należą do zbioru sal, w których są zajęcia z przedmiotu MATEMATYKA.
GRUPA B
1. Podaj liczbę tematów realizowanych przez pracowników w poszczególnych zespołach.
2. Dla każdego pracownika podaj sumę jego zarobków w każdym z tematów.
SELECT SUM(kwota) FROM pracowni P, dochody D WHERE p.nrp=d.nrp GROUP BY p.nrp, d.nrt;
3. Dla każdego pracownika podaj liczbę wypłat w każdym z tematów, w których brał udział.
4. Dla każdego tematu podaj liczbę pracowników biorących w nim udział.
5. Dla każdego kierunku podaj liczbę studentów będących na tym kierunku.
6. Dla poszczególnych ocen podaj liczbę studentów , którzy je uzyskali.
7. Dla każdego zespołu podaj średnią wartość wypłat, które otrzymali pracownicy tego zespołu.
8. Dla każdego studenta podaj liczbę uzyskanych przez niego ocen.
9. Dla każdego wykładowcy podaj liczbę prowadzonych przez niego przedmiotów.
www.chomikuj.pl/MarWag987
10. Dla każdego studenta podaj liczbę przedmiotów, z których uzyskał on oceny.
GRUPA C
1. Podaj nazwiska pracowników, którzy w poszczególnych tematach otrzymali łączne wypłaty większe niż 500 zł.
2. Podaj nazwy tych zespołów, w których liczba pracowników jest mniejsza od 5.
SELECT Z.NAZWAZESP
FROM PRACOWNI P, ZESPOL Z WHERE Z.NRZ=P.NRZ
GROUP BY Z.NAZWAZESP
HAVING COUNT(P.NRP)<5;
3. Podać nazwiska i średnią ocenę z przedmiotu MATEMATYKA tych studentów , którzy z tego przedmiotu mają więcej niż 1 ocenę.
4. Podaj nazwy tych kierunków, dla których istnieją przedmioty, z których ocena średnia jest mniejsza od 3.
5. Podaj kierunki, na których średnia ocen jest mniejsza niż 4.
6. Podaj nazwiska pracowników biorących udział w tematach, w których są zaangażowane co najwyżej 3 osoby.
7. Podaj nazwiska wykładowców, którzy prowadzą więcej niż 2 przedmioty.
8. Podaj numery sal, w których więcej niż jedne zajęcia rozpoczynają się później niż o godz.
18.00. Podać nazwy przedmiotów, z których są te zajęcia.
9. Podaj nazwy zespołów, w których pracuje więcej niż 2 pracowników urodzonych przed rokiem 1930.
10. Podaj nazwy przedmiotów, z których zajęcia odbywają się tylko w jednej sali.
GRUPA D
1. Podać nazwy zespołów, w których nie pracuje żadna kobieta.
2. Podaj numery sal, w których nie odbywają się zajęcia z przedmiotu MATEMATYKA.
3. Podaj nazwiska najstarszych studentów na poszczególnych kierunkach.
4. Podaj najstarsze alfabetycznie nazwiska studentów na poszczególnych kierunkach.
www.chomikuj.pl/MarWag987
5. Podaj nazwy zespołów, których liczebność przekracza średnią liczebność wszystkich zespołów.
6. Podaj dane o wypłatach (nrp, nrt) przekraczających średnią wartość wypłaty w danym temacie.
7. Podaj nazwiska najmłodszych pracowników w poszczególnych zespołach.
8. Podaj nazwy tematów, w których nie było jeszcze żadnej wypłaty.
9. Podaj dane o studentach, którzy nie mają jeszcze żadnej oceny.
10. Podaj numery sal, w których nie ma zajęć prowadzonych przez pracownika MISIURA.
GRUPA E
Utworzyć perspektywę zawierającą wyszczególnione informacje, oraz określić, czy można aktualizować dane w tej perspektywie. Jeżeli nie można - podać wszystkie tego przyczyny.
Po pomyślnym wykonaniu zadania należy usunąć utworzoną przez siebie perspektywę.
1. Zestawienie pracowników pracujących w poszczególnych tematach w postaci: (nrt,nazwatemat, nrp, nazwisko). Rekordy nie powinny powtarzać się nawet w sytuacji, gdy pracownik uzyskał wielokrotnie dochód w tym samym temacie.
2. Zestawienie łącznych dochodów osiągniętych w poszczególnych tematach w postaci: (nrt, nazwatemat, łączna_kwota).
3. Zestawienie dat zaliczeń uzyskanych przez poszczególnych studentów w postaci (przedmiot, student, data_zal).
4. Zestawienie liczby przedmiotów prowadzonych przez poszczególnych wykładowców w postaci (nazwisko, liczba_różnych_przedmiotów).
5. Zestawienie liczby studentów na poszczególnych kierunkach w ramach Instytutu Informatyki (kierunek, liczba_studentów ).
6. Zestawienie tematów, których odbioru dokonano w ostatnich trzech latach (nt, nazwatemat, nrpkt).
7. Zestawienie liczebności poszczególnych zespołów (nrz, nazwazesp, liczba_pracowników).
8. Zestawienie liczby zespołów w ramach instytutów (instytut, liczba zespołów).
9. Zestawienie wykorzystania poszczególnych sal (sala, liczba_zajec_w_sali). Liczba zajęć odpowiada liczbie wystąpień rekordów w tablicy Rozklad z różnymi wartościami trójki atrybutów (godzina, dzien, przedmiot).
10. Zestawienie sal i ich rozmiary (sala, rozm_sali).
www.chomikuj.pl/MarWag987
GRUPA F
Wykonać zadani, których wynikiem będą odpowiednie zestawienia:
1. Zespołów z liczbą pracowników (nrz, nazwazesp, liczebność). W zestawieniu powinny znaleźć się również zespoły z liczebnością zerową.
2. Tematów z liczbą pracowników pracujących w tych tematach (nrt, nazwatemat, liczba_pracowników). W zestawieniu powinny się również tematy z liczebnością zerową.
Należy uwzględnić fakt, że pracownik mógł pobrać wielokrotnie wypłatę za ten sam temat.
3. Pracowników z liczbą tematów, którymi kierują (nrp, nazwisko,
liczba_prowadzonych_temetów). W zestawieniu ująć również pracowników nie pracujących w żadnym z tematów.
4. Wykładowców z przedmiotami, które prowadzą (nazwisko, przedmiot). Wykładowcy, którzy aktualnie nie prowadzą żadnego przedmiotu, powinni znaleźć się w zestawieniu z pustym polem przedmiot.
5. Sal z liczbą różnych przedmiotów odbywających się w danej sali. Uwzględnić sale, w których nie odbywają się zajęcia.
6. Studentów ze średnią ocen (student, nazwisko, średnia). Uwzględnić studentów , którzy nie uzyskali jeszcze zaliczeń.
7. Tematów ze średnim dochodem uzyskanym za pracę w danym temacie. Uwzględnić tematy, które nie mają jeszcze wykonawców.
8. Kierunków z liczbą studentów zapisanych na ten kierunek. Uwzględnić kierunki, na które nie zapisał się jeszcze żaden student.
9. Liczebności kobiet w poszczególnych zespołach (nrz, nazwazesp, liczba_kobiet).
Uwzględnić zespoły, w których nie pracują kobiety.
10. Liczby mężczyzn biorących udział w poszczególnych tematach. Uwzględnić tematy, w których nie biorą udziału mężczyźni.
zad A1
Dla każdego studenta podaj liczbę przedmiotów, z których uzyskał on oceny select nazwisko,count(distinct przedmiot)
from oceny o,studenci s
where s.student=o.student
group by nazwisko;
www.chomikuj.pl/MarWag987
Podaj dane o tematach (nrt, nazwatemat), w których zaangażowane są co najwyżej 3 osoby select t.nrt, nazwatemat
from temat t, dochody d
where d.nrt=t.nrt
group by t.nrt, nazwatemat
having count(*) <= 3;
zad C1
Podaj numery i nazwiska studentów - mężczyzn, którzy są starsi od conajmniej jednego z pracowników zespołu 'PIECE'
select s.nazwisko, student
from studenci s
where s.kobieta = 'F' and s.data_ur < any
(select p.data_ur
from zespol z, pracowni p
where z.nrz=p.nrz and z.nazwazesp='PIECE');
zad C2
Podaj numery i nazwiska studentów kierunku 'INFORMATYKA', którzy z przedmiotu
'MATEMATYKA'
otrzymali oceny wyższe od każdego ze studentów kierunku 'ELEKTRONIKA' z tego przedmiotu select s.student, s.nazwisko
from studenci s, oceny o, kier_stu k
where k.kierunek='INFORMATYKA' and k.student=s.student and o.student=s.student and o.przedmiot='MATEMATYKA' and o.ocena > all
(select o.ocena
from studenci s, oceny o, kier_stu k
where k.kierunek='ELEKTRONIKA' and k.student=s.student and
o.student=s.student
and o.przedmiot='MATEMATYKA');
zad D1
Podaj dane o studentach, którzy nie mają jeszcze żadnej oceny
select student, nazwisko, data_ur, kobieta
from studenci
where student not in
(select s.student
from studenci s, oceny o
where s.student=o.student)
group by student, nazwisko, data_ur, kobieta;
zad E1
www.chomikuj.pl/MarWag987
Zestawienie tematów z liczbą pracowników pracujących w tych tematach (nrt, nazwatemat, liczba_pracowników). W zestawieniu powinny się również znaleźć tematy z liczebnością zerową.
Należy uwzględnić fakt, że pracownik mógł pobrać wielokrotnie wypłatę za ten sam temat.
select t.nrt, t.nazwatemat, count (distinct d.nrp)
from temat t, dochody d
where t.nrt=d.nrt(+)
group by t.nrt, t.nazwatemat;
zad F1
Utworzyć perspektywę: zestawienie łącznych dochodów osiągniętych w poszczególnych tematach
w postaci (nrt, nazwatemat, łączna_kwota)
create view ff(nrt,nazwatemat,laczna_kwota) as
select t.nrt, t.nazwatemat, sum(d.kwota)
from dochody d, temat t
where t.nrt=d.nrt
group by t.nrt, t.nazwatemat;
drop view ff;
commit;
Nie można aktualizować danych w tej perspektywie gdyż:
- użyto więcej niż jednej tablicy
- użyto frazy 'group by'
- użyto funkcji agregującej 'sum'
zad G1
Podaj nazwiska najmłodszych pracowników w poszczególnych zespołach
select p.nazwisko,p.data_ur
from pracowni p
where p.data_ur =
(select max(pp.data_ur)
from pracowni pp
where pp.nrz = p.nrz);
zad H1
Podaj numery i nazwiska pracowników nie biorących udziału w żadnym z tematów, którym kieruje
pracownik 'NIEZALEZNY'
select p.nrp,p.nazwisko
from pracowni p
where p.nrp not in
(select dd.nrp
www.chomikuj.pl/MarWag987
from pracowni pp,temat tt,dochody dd
where dd.nrp=pp.nrp and tt.nrt=dd.nrt and exists
(select ttt.nrt
from temat ttt,pracowni ppp
where ttt.nrpkt=ppp.nrp and ppp.nazwisko='NIEZALEZNY' and
dd.nrt=ttt.nrt));
zad I1
Wypisać nazwy tych zespołów, w których maksymalny zarobek najmłodszej pracownicy (kobiety)
jest większy od maksymalnej wypłaty jej kolegów (mężczyzn) z zespołu
select z.nazwazesp
from pracowni p, dochody d, zespol z
where p.nrp=d.nrp and p.nrz=z.nrz and p.kobieta='T' and p.data_ur=
(select max(pp.data_ur)
from pracowni pp
where pp.nrz=p.nrz and pp.kobieta='T')
group by z.nazwazesp, z.nrz
having max(kwota)>
(select max(kwota)
from pracowni ppp, zespol zzz, dochody ddd
where ppp.nrp=ddd.nrp and zzz.nrz=ppp.nrz and zzz.nrz=z.nrz and kobieta='F');
www.chomikuj.pl/MarWag987
Zadanie z dnia 12.05.2000
Napisać program w FOX-iewyświetlający listę: nazwisko, imię, sumaryczny dochód tych kierowników zespołów, którzy nie są kierownikami tematów i jednocześnie ich sumaryczny dochód jest mniejszy od co najmniej jednego sumarycznego dochodu podwładnych.
Lista powinna byc uporządkowana alfabetycznie wg nazwisk.
Przed programen zamieścic fragment programu mieszczący jedynie te indexy, które są nieznędne do realizacji tego zadania.
Można założyć, że jedna osoba może kierować co najwyżej tylko jednym zespołem, możliwe jest użycie : use <relacja> again.
zespoł(nrz, nazwazesp, nrkz)
pracowni(nrp, nazwisko, imię, nrz)
dochody(nrp, nrt, kwota)
tematy(nrt, nazwatemat, nrkt)
1. W rozwiazaniu nie uwzgledniona faktu, ze nazwiska powinny byc posortowane alfabetycznie.
2. Nie ma zalozonych indeksow (ja w mojej bazie mam pozakladane, dlatego dziala) - nalezy zalozyc indeks dla kazdego obszaru - INDEX ON... - indeksy zakladac tak, jak jest we frazie SET
ORDER dla danego obszaru.
CLEAR
CLOSE DATA
SELECT 0
USE temat ALIAS te
SET ORDER TO TAG nrkt
SELECT 0
USE pracowni ALIAS pr
SET ORDER TO TAG nrz
SELECT 0
* tablica do szukania kierownika po nrp
USE pracowni ALIAS pr1 again
SET ORDER TO TAG nrp
SELECT 0
USE dochody ALIAS DO
SET ORDER TO TAG nrp
SELECT 0
USE zespol ALIAS ze
SET ORDER TO TAG nazwazesp
GO TOP
DO WHILE .NOT. EOF()
SELECT te
www.chomikuj.pl/MarWag987
* czy jest kierownikiem tematu
IF .NOT. FOUND()
* obliczenie sum. dochodu kierownika
s=0
SELECT DO
SEEK ze.nrkz
DO WHILE FOUND()
s=s+DO.kwota
SKIP
ENDDO
* Wszyscy Ludzie Kierownika
F=0
SELECT pr
SEEK ze.nrz
DO WHILE F=0 .AND. FOUND()
* sum. dochod pracownika
p=0
SELECT DO
SEEK pr.nrp
DO WHILE FOUND()
p=p+DO.kwota
SKIP
ENDDO
IF s *? pr.nrp," ::::: ", p, "kkkkk", s
* szukamy danych o kierowniku
select pr1
SEEK ze.nrkz
? ze.nrkz, pr1.nazwisko, "suma", s
F=1
ENDIF
SELECT pr
SKIP
ENDDO
ENDIF
SELECT ze
SKIP
ENDDO
Zadanie z dnia 05.05.2000
(tylko tyle udało mi się zdobyc:)
Wyświetlić:
liste zespołów
- lista tematów
(posortowanych po nazwach czyli alfabetycznie i nazwy mają byc unikalne)
www.chomikuj.pl/MarWag987
Nie wolno tworzyć dodatkowych plików dbf
select 0
use temat alias tt
index on nazwatemat to i_t
select 0
use pracownik alias pp
select 0
use dochody alias dd
select 0
use zespol alias zz
index on nazwazesp to i_z
do while not eof()
disp nazwazesp
select pp
set filter to nrz=zz.nrz
select tt
go top
do while not eof()
select dd
locate for nrt=tt.nrt
do while not eof()
select pp
locate for nrp=dd.nrp
if found()
disp tt.nazwatemat
exit
endif
select dd
continue
enddo
select tt
skip
enddo
select zz
skip
enddo
close database
close index
delete file i_t.idx
delete file i_z.idx
Inne rozwiązanie powyższego zadania:
clear all
close databases
www.chomikuj.pl/MarWag987
select 0
use pracowni alias p
index on nrp to i_nrp
select 0
use zespol alias z
index on nazwazesp to i_nazwazesp
select 0
use temat alias t
index on nazwatemat to i_nazwatemat
select 0
use dochody alias dd
index on nrt to i_dnrt
select z
go top
do while .not. eof()
select p
set filter to nrz=z.nrz
select t
go top
do while .not. eof()
select dd
set filter to nrt=t.nrt
go top
jest = "F"
do while (.not. eof()) .and. (jest="F")
select p
seek dd.nrp
if .not.eof()
? z.nazwazesp, t.nazwatemat
jest = "T"
endif
select dd
skip
enddo
select t
skip
enddo
select z
skip
enddo
www.chomikuj.pl/MarWag987
**********
clearclose data
select 0
use zespol alias ze
select 0
use pracowni alias pr
index on nazwisko tag nazwisko
set order to tag nazwisko
select 0
use dochody alias do
select 0
use temat alias te
select 0
use pracowni alias pr1 again
index on nrz tag nrz
set order to tag nrz
select pr
go top
do while .not. eof()
select ze
locate for ze.nrkz=pr.nrp
select te
locate for te.nrkt=pr.nrp
if te.nrkt!=ze.nrkz
s=0
select do
go top
locate for do.nrp=ze.nrkz
do while found()
*suma dochodu kierownika
s=s+do.kwota
continue
enddo
F=0
select pr1
go top
seek ze.nrz
www.chomikuj.pl/MarWag987
do while found() and F=0
select do
ps=0
go top
locate for do.nrp=pr1.nrp
do while found()
ps=ps+do.kwota
continue
enddo
if ps>s
?pr.nazwisko, s
F=1
endif
select pr1
skip
enddo
endif
select pr
skip
enddo
rozwiązanie zadanań z instrukcji:
# Podaj nazwy tematów realizowanych przez pracowników zespołu PIECE # Metoda Seek clear
close data
select 0
use temat alias te
index on nrt tag nrt
set order to tag nrt
select 0
use dochody alias do
index on nrp tag nrp
set order to tag nrp
select 0
use pracowni alias pr
index on nrz tag nrz
set order to tag nrz
select 0
use zespol alias ze
index on nazwazesp tag nazwazesp
set order to tag nazwazesp
www.chomikuj.pl/MarWag987
seek "PIECE"
select pr
seek ze.nrz
do while nrz=ze.nrz .and. !eof()
select do
seek pr.nrp
do while nrp=pr.nrp
select te
seek do.nrt
? nazwatemat
select do
skip
enddo
select pr
skip
enddo
close data
**********
# Podaj nazwy tematów realizowanych przez pracowników zespołu PIECE# Metoda SET RELATION (with skip)
clear
close data
select 0
use temat alias te
index on nazwatemat tag nazwatemat
set order to tag nazwatemat
select 0
use dochody alias do
index on nrt tag nrt
set order to tag nrt
set relation to nrt into te
select 0
use pracowni alias pr
index on nrp tag nrp
set order to tag nrp
set relation to nrp into do
select 0
use zespol alias ze
index on nrz tag nrz
set order to tag nrz
www.chomikuj.pl/MarWag987
seek "PIECE"
set skip to pr,do
do while ze.nazwazesp="PIECE" .and. !eof()
? te.nazwatemat
skip
enddo
close data
********** # Podaj nazwy tematów realizowanych przez pracowników zespołu PIECE
# Metoda Set Relation
clear
close data
select 0
use temat alias te
index on nrt tag nrt
set order to tag nrt
select 0
use dochody alias do
index on nrp tag nrp
set order to tag nrp
set relation to nrt into te
select 0
use pracowni alias pr
index on nrz tag nrz
set order to tag nrz
set relation to nrp into do
select 0
use zespol alias ze
index on nazwazesp tag nazwazesp
set order to tag nazwazesp
set relation to nrz into pr
seek "PIECE"
select pr
do while nrz=ze.nrz .and. !eof()
select do
do while nrp=pr.nrp
select te
? nazwatemat
select do
www.chomikuj.pl/MarWag987
enddo
select pr
skip
enddo
close data
**********
# Podaj nazwy tematów w których co najmniej 1 wyplata byla wieksza# niz kazda wyplata JASKOLY za prace w temacie KARTA MONITORA
# Metoda Seek
clear
close data
select 0
use temat alias te
index on nazwatemat tag nazwatemat
set order to tag nazwatemat
select 0
use dochody alias do
*index on nrp tag nrp
*set order to tag nrp
select 0
use pracowni alias pr
*index on nazwisko tag nazwisko
*set order to tag nazwisko
mw=0
select pr
locate for nazwisko='JASKOLA'
select te
locate for nazwatemat='KARTA MONITORA'
select do
locate for do.nrt=te.nrt and do.nrp=pr.nrp
do while found()
mw=MAX(mw,do.kwota)
continue
enddo
select te
go top
do while not eof()
www.chomikuj.pl/MarWag987
go top
F=0
locate for do.nrt=te.nrt
do while found () and F=0
if do.kwota>mw
? te.nazwatemat, do.kwota
F=1
endif
continue
enddo
select te
skip
enddo
close data
**********
# Podaj nazwiska pracowników, których pojedyncza wypłata za pracę w dowolnym# temacie była większa niż maxymalna wypłata 'JASKÓŁY' w temacie 'DYSK'
clear
close data
select 0
use temat alias te
select 0
use dochody alias do
select 0
use pracowni alias pr
index on nazwisko tag nazwisko
* zapewnia porządek alfabetyczny
set order to tag nazwisko
select pr
locate for nazwisko='JASKOLA'
select te
locate for nazwatemat='KARTA MONITORA'
mw=0
select do
locate for do.nrt=te.nrt and do.nrp=pr.nrp
do while found()
mw=MAX(mw, do.kwota)
continue
enddo
www.chomikuj.pl/MarWag987
go top
do while not eof()
F=0
select do
locate for do.nrp=pr.nrp
do while found() and F=0
if do.kwota>mw
?pr.nazwisko, do.kwota
F=1
endif
continue
enddo
select pr
skip
enddo
close data
**********
# Podaj numery zespołów, w których pracują kierownicy tematów, w których# brał udział pracownik o zadanym nazwisku.
clear
close data
select 0
use temat alias te
select 0
use dochody alias do
select 0
use pracowni alias pr
select 0
use zespol alias ze
select pr
locate for nazwisko='GRZYBEK'
select ze
do while not eof()
select do
locate for do.nrp=pr.nrp
do while found()
select te
locate for te.nrt=do.nrt
www.chomikuj.pl/MarWag987
if te.nrkt=ze.nrkz
? ze.nrz
endif
continue
enddo
select do
continue
enddo
select ze
skip
enddo
close data
*********
CLOSE DATACLEAR
SELECT 0
USE temat ALIAS te
SELECT 0
USE pracowni ALIAS pr
SELECT 0
USE dochody ALIAS DO
SELECT 0
USE zespol ALIAS ze
SELECT pr
LOCATE FOR nazwisko="GRZYBEK"
IF .NOT. FOUND()
? "Nie ma takiego gościa"
RETURN
ENDIF
SELECT te
LOCATE FOR nazwatemat='KARTA MONITORA '
IF .NOT. FOUND()
? "Nie ma takiego tematu"
RETURN
ENDIF
mw=0
SELECT DO
LOCATE FOR DO.nrt=te.nrt AND DO.nrp=pr.nrp
if .not. found()
? "Grzybek tego nie robił"
return
www.chomikuj.pl/MarWag987
DO WHILE FOUND()
mw=MAX(mw, DO.kwota)
CONTINUE
ENDDO
GO TOP
DO WHILE .NOT. EOF()
IF DO.kwota>mw then
SELECT pr
LOCATE FOR pr.nrp=DO.nrp
SELECT ze
LOCATE FOR ze.nrz=pr.nrz
? ze.nazwazesp
SELECT DO
ENDIF
SKIP
ENDDO
Część A2)
Temat zadania: Obliczyć łączne dochody pracownika o zadanym nazwisku.
(Wykorzystywane tabele: PRACOWNI.DBF oraz DOCHODY.DBF)
1) Metoda LOCATE-CONTINUE
close all
select 0
use pracowni alias prac
select 0
use dochody alias doch
_nazwisko = space(15)
@ 0, 0 CLEAR
@ 10, 10 SAY "Podaj nazwisko" GET _nazwisko
read
_nazwisko = upper( trim( _nazwisko ) )
@ 0, 0 CLEAR
select prac
locate for NAZWISKO=_nazwisko
if found()
_suma=0
_nrp = NRP
select doch
locate for NRP=_nrp
do while found() .AND. .NOT. Eof()
_suma = _suma + KWOTA
www.chomikuj.pl/MarWag987
enddo
@ 2, 0 SAY "Suma dochodow:"
@ 2, 16 SAY _suma
endif
close all
2) Metoda SEEK-SKIP
close all
select 0
use pracowni alias prac
index on NAZWISKO to prac_naz
select 0
use dochody alias doch
index on NRP to doch_nrp
_nazwisko = space(15)
@ 0, 0 CLEAR
@ 10, 10 SAY "Podaj nazwisko" GET _nazwisko
read
_nazwisko = upper( trim( _nazwisko ) )
@ 0, 0 CLEAR
select prac
seek _nazwisko
if found()
_suma=0
_nrp = NRP
select doch
seek _nrp
if found()
do while _nrp=NRP .AND. .NOT. Eof()
_suma = _suma + KWOTA
skip
enddo
endif
@ 2, 0 SAY "Suma dochodow:"
@ 2, 16 SAY _suma
endif
close all
3) Metoda JOIN ... WITH
close all
select 0
use pracowni alias prac
select 0
use dochody alias doch
www.chomikuj.pl/MarWag987
@ 0, 0 CLEAR
@ 10, 10 SAY "Podaj nazwisko" GET _nazwisko
read
_nazwisko = upper( trim( _nazwisko ) )
@ 0, 0 CLEAR
select prac
set filter to NAZWISKO=_nazwisko
join with doch to tmp for doch->NRP=NRP
select 0
use tmp
sum kwota to _suma
use
@ 2, 0 SAY "Suma dochodow:"
@ 2, 16 SAY _suma
close all
4) Metoda SET RELATION ...
close all
select 0
use dochody alias doch
index on NRP to doch_nrp
select 0
use pracowni alias prac
index on NAZWISKO to prac_naz
set relation to NRP into doch
_nazwisko = space(15)
@ 0, 0 CLEAR
@ 10, 10 SAY "Podaj nazwisko" GET _nazwisko
read
_nazwisko = upper( trim( _nazwisko ) )
@ 0, 0 CLEAR
select prac
seek _nazwisko
select doch
_suma = 0
do while NRP=prac->NRP .AND. .NOT. Eof()
_suma = _suma + KWOTA
skip
enddo
@ 2, 0 SAY "Suma dochodow:"
@ 2, 16 SAY _suma
close all
Część B2)
Temat zadania: Podać nazwiska pracowników realizująych temat o zadanej
www.chomikuj.pl/MarWag987
(Wykorzystywane tabele: PRACOWNI.DBF, TEMAT.DBF, DOCHODY.DBF)
Do wykonania opisanego wyżej zadania wybrano metodę SET RELATION wraz
SET SKIP (charakterystyczna dla FoxPro). Metoda ta jest najbardziej efektywna sposród wszystkich przedstawionych powyżej metod.
Jej główne zalety to:
- stosowanie indeksów (plików o strukturze B+drzew) minimalizujących
czas wyszukiwania rekordów,
- dynamiczne połączenie tabel (za pomocą SET RELATION i SET SKIP)
Taka metoda łączenia tabel korzysta z uaktywnionych wcześniej indeksów
i nie powoduje utworzenia żadnych dodatkowych tabel (jak w przypadku
metody JOIN). Główna zasada działania tej metody opiera się jedynie
na uaktualnianiu bieżącego wskaźnika w obszarach dołączonych na podstawie bieżącego wskaźnika w obszarze bieżącym.
W odróżnieniu od metody SET RELATION metoda JOIN nie korzysta w ogóle
z indeksów. Poza tym powoduje ona utworzenie dodatkowej tabeli pomocniczej kosztem przeszukania obu łączonych tabel w całości, co daje złożoność
MxN (gdzie M-ilość rekordów w łączonej tabeli 1, N-ilość rekordów w łączonej tabeli 2). Taka złożoność w przypadku dużych tabel jest w ogóle nie do
zaakceptowania, tym bardziej w przypadku łączenia więcej niż 2 tabel.
To sprawia, że metoda JOIN jest najmniej efektywną spośród przedstawionych wyżej metod i może być jedynie stosowana w przypadku małych tabel.
close all
select 0
use temat alias tem
index on NAZWATEMAT to temat_na
select 0
use dochody alias doch
index on NRT to doch_nrt
select 0
use pracowni alias prac
index on NRP to prac_nrp
select doch
set relation to NRP into prac
select tem
set relation to NRT into doch
set skip to doch
_temat = Space( 30 )
@ 0, 0 clear
@ 10, 20 SAY "Podaj temat" GET _temat
read
_temat = Upper( Trim( _temat ) )
@ 0, 0 clear
select tem
seek _temat
browse fields NAZWATEMAT, prac->NAZWISKO
www.chomikuj.pl/MarWag987
Zadanie z dnia 05.05.2000
(tylko tyle udało mi się zdobyc:)
Wyświetlić:
liste zespołów
- lista tematów
(posortowanych po nazwach czyli alfabetycznie i nazwy mają byc unikalne) Nie wolno tworzyć dodatkowych plików dbf
select 0
use temat alias tt
index on nazwatemat to i_t
select 0
use pracownik alias pp
select 0
use dochody alias dd
select 0
use zespol alias zz
index on nazwazesp to i_z
do while not eof()
disp nazwazesp
select pp
set filter to nrz=zz.nrz
select tt
go top
do while not eof()
select dd
locate for nrt=tt.nrt
do while not eof()
select pp
locate for nrp=dd.nrp
if found()
disp tt.nazwatemat
exit
endif
select dd
continue
enddo
select tt
skip
enddo
select zz
skip
www.chomikuj.pl/MarWag987
close database
close index
delete file i_t.idx
delete file i_z.idx
www.chomikuj.pl/MarWag987
Zadanie z dnia 05.05.2000
Jest sobie hurtownia z różnymi materiałami przemysłowymi. Istnieje potrzeba zmiany stawki podatku VAT dla wybranej grupy towarów - trzeba napisać odpowiednią procedurkę. W
bazie są dwie tabele:
Typy_tow(id_typ, nazwa)
Dostawy(id_typ, data_przyj, cena, ilosc, vat)
Zmiany mają być wprowadzone w tabeli Dostawy. Jako parametr ma być podana data, od której wstecz należy zmienić stawkę dla przyjętych towarów. W tabeli Typy_tow są tylko : budowlane, ogrodowe i sportowe. W dostawach nie ma wyszczególnionych towarów tylko typy (np. dostawa 10 ton materiałów budowlanych).
Zakres zmian VAT jest wg zasady:
- dla budowlanych wszystkie pozycje z miesiąca przed datą zmiany
- dla sportowych 7 dni wstecz
- dla ogrodniczych 3 dni.
Dla procedury należy wymyśleć jeszcze inne przydatne parametry Można używać różnych funkcji accessa operujących na datach.
dostepne sa funkcje:
day() - zwraca dzień z daty, ktora jest parametrem month() i year()
Klucz byl chyba po ID_towaru:)
Rozwiazanie kolegi (ma nadzieje ze dobrze wszystko zapamiętał:)
sub zmien (ID_Towaru, data_biezaca, VAT) // VAT - nowa stawka VAT
dim db as database
dim towary as RecordSet
set db = DBEngine.Workspaces(0).Databases(0)
set towary as db.OpenRecordSet("Towary")
towary.Index="ID_Towaru"
if ID_towaru = 1 then
Do until towary.EOF
seek "=", ID_Towaru
if year(data_przyjecia)=year(data_biezaca) and month(data_przyjecia)=month(data_biezaca) then
towary.edit
towary!VAT=VAT
towary.update
end if
towary.MoveNext
Loop
www.chomikuj.pl/MarWag987
Do until towary.EOF
seek "=", ID_Towaru
if year(data_przyjecia)=year(data_biezaca) and month(data_przyjecia)=month(data_biezaca) and day(data_przyjecia)+3 >= day (data_biezaca) then
towary.edit
towary!VAT=VAT
towary.update
end if
towary.MoveNext
Loop
esle if ID_towaru = 3 then
Do until towary.EOF
seek "=", ID_Towaru
if year(data_przyjecia)=year(data_biezaca) and month(data_przyjecia)=month(data_biezaca) and day(data_przyjecia)+7 >= day (data_biezaca) then
towary.edit
towary!VAT=VAT
towary.update
end if
towary.MoveNext
Loop
towary.close
End Sub
Zadanie z zeszlego roku
Treść zadania:
W języku MS Access Basic napisać procedurę
Oblicz_stypendium (min_srednia, max_srednia, rok, miesiac, kwota)
dodającą studentom w roku akademickim "rok" i miesiącu "miesiac" stypendium w wysokości "kwota". Studenci ci muszą mieć w roku "rok" średnią ocen pomiędzy
"min_srednia" a "max_srednia". Jeśli dany student posiada już wygenerowane (przed wykonaniem procedury) stypendium na dany rok i miesiąc akademicki to należy mu do istniejącej kwoty stypendium dodać wartość "kwota".
Struktura bazy danych:
studenci(ALBUM, NAZWISKO, IMIE, ADRES_ZAMIESZKANIA, DATA_UR)
oceny(ALBUM, ROK, SEMESTR, PRZEDMIOT,OCENA)
stypendia(ALBUM, ROK, MIESIAC, KWOTA)
Uwaga:
1) Dla wszystkich tabel zdefiniowane są klucze główne mające nazwę PrimaryKey.
2) W zadaniu nie można wykorzystywać metody z rodziny Find.
-----------------------------------------------------------------
www.chomikuj.pl/MarWag987
Poniżej przedstawiono 2 przykładowe rozwiązania zadania z MS Access z II terminu kolokwium zaliczeniowego.
Sub przyklad_1(min_srednia, max_srednia, rok, miesiac, kwota)
Dim db As Database
Dim zap_sred As Recordset
Dim tb_styp As Recordset
Set db = DBEngine.Workspaces(0).Databases(0)
Set zap_sred = db.OpenRecordset("select album, avg(ocena) as srednia from oceny where rok = '" & rok & "' group by album")
Set tb_styp = db.OpenRecordset("Stypendia")
tb_styp.Index = "PrimaryKey"
Do Until zap_sred.EOF
If zap_sred!srednia >= min_srednia And zap_sred!srednia <= max_srednia Then tb_styp.Seek "=", zap_sred!ALBUM, rok, miesiac
If tb_styp.NoMatch Then
tb_styp.AddNew
tb_styp!ALBUM = zap_sred!ALBUM
tb_styp!rok = rok
tb_styp!miesiac = miesiac
tb_styp!kwota = kwota
tb_styp.Update
Else
tb_styp.Edit
tb_styp!kwota = tb_styp!kwota + kwota
tb_styp.Update
End If
End If
zap_sred.MoveNext
Loop
zap_sred.Close
tb_styp.Close
End Sub
-------
Sub przyklad_2(min_srednia, max_srednia, rok, miesiac, kwota)
Dim db As Database
Dim zap_sred As Recordset
Dim tb_styp As Recordset
Set db = DBEngine.Workspaces(0).Databases(0)
www.chomikuj.pl/MarWag987
Set zap_sred = db.OpenRecordset("select album from oceny where rok = '" & rok & "' group by album having avg(ocena)>= " & min_srednia & " and avg(ocena) <= " & max_srednia & "
;")
Set tb_styp = db.OpenRecordset("Stypendia")
tb_styp.Index = "PrimaryKey"
Do Until zap_sred.EOF
tb_styp.Seek "=", zap_sred!ALBUM, rok, miesiac
If tb_styp.NoMatch Then
tb_styp.AddNew
tb_styp!ALBUM = zap_sred!ALBUM
tb_styp!rok = rok
tb_styp!miesiac = miesiac
tb_styp!kwota = kwota
tb_styp.Update
Else
tb_styp.Edit
tb_styp!kwota = tb_styp!kwota + kwota
tb_styp.Update
End If
zap_sred.MoveNext
Loop
zap_sred.Close
tb_styp.Close
End Sub
Zadanie
Dla wybranego tematu znalezc te osoby, ktore nie maja wyplat i przypisac im wartosc 1000
zl.
Dim doch As Recordset
Dim tem As Recordset
Dim warunek As String
warunek = Me.Tekst1
Set doch = CurrentDb.OpenRecordset("dochody")
Set tem = CurrentDb.OpenRecordset("select nrt from tematy where nazwat='ada'") doch.MoveFirst
Do Until doch.EOF
If doch!nrt = tem!nrt And doch!kwota = 0 Then
doch.Edit
doch!kwota = 1000
www.chomikuj.pl/MarWag987
End If
doch.MoveNext
Loop
www.chomikuj.pl/MarWag987