kolosy zebrane

background image

www.chomikuj.pl/MarWag987

SQL1


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;

background image

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;

background image

www.chomikuj.pl/MarWag987

SQL2


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

background image

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.

background image

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.

background image

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

background image

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;

background image

www.chomikuj.pl/MarWag987

zad B1
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

background image

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

background image

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

background image

www.chomikuj.pl/MarWag987

FOXPRO


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

background image

www.chomikuj.pl/MarWag987

SEEK ze.nrkz
* 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)

background image

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

background image

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

background image

www.chomikuj.pl/MarWag987



**********
clear
close 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

background image

www.chomikuj.pl/MarWag987

*dochody podwladnych
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

background image

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

background image

www.chomikuj.pl/MarWag987

set relation to nrz into pr

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

background image

www.chomikuj.pl/MarWag987

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

background image

www.chomikuj.pl/MarWag987

select do
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

background image

www.chomikuj.pl/MarWag987

select pr
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

background image

www.chomikuj.pl/MarWag987

do while found()
if te.nrkt=ze.nrkz
? ze.nrz
endif
continue
enddo
select do
continue
enddo
select ze
skip
enddo

close data
*********
CLOSE DATA
CLEAR
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

background image

www.chomikuj.pl/MarWag987

endif

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

background image

www.chomikuj.pl/MarWag987

continue
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

background image

www.chomikuj.pl/MarWag987

_nazwisko = space(15)
@ 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

background image

www.chomikuj.pl/MarWag987

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

background image

www.chomikuj.pl/MarWag987

close all


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

background image

www.chomikuj.pl/MarWag987

enddo
close database
close index
delete file i_t.idx
delete file i_z.idx

background image

www.chomikuj.pl/MarWag987

ACCESS


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

background image

www.chomikuj.pl/MarWag987

esle if ID_towaru = 2 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)+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.
-----------------------------------------------------------------

background image

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)

background image

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

background image

www.chomikuj.pl/MarWag987

doch.Update
End If
doch.MoveNext
Loop




Wyszukiwarka

Podobne podstrony:
kolosy, zebrane
Power D, zebranie zarządu
Główne rodzaje zebrań i ich funkcje
Kolosy z biochemii
pytania zebrane, egzamin biosyf pytania
04 struktury ok, Technologia chemiczna pw, 1rok, chemia kolosy egz
Zebranie z rodzicami- prawa dziecka(1), Różne pracy z pedagogiki
02 rozkład ok, Technologia chemiczna pw, 1rok, chemia kolosy egz
DERMA zebrane B.G. (2), Choroby skórne i weneryczne, Dermatologia, giełdy
Referat - Rola Rodziców, KATECHEZA, Zebrania z rodzicami
PROTOKÓŁ Z OTWARTEGO ZEBRANIA ZARZĄDU 10 marca 2013, fireman, OSP
drugi kolos z zabytków, Archeologia, Archeologia Pradziejowa, materiały na kolosy
Kolosy Egzamin
testy?rma wyklady WSZYSTKIE testy zebrane
gielda pato pytania zebrane
gnozja pytania zebrane

więcej podobnych podstron