rendered paste body%meno: Michal Ivanic
%oc: 23317
%zadanie 2: Zamestnanci
%-----pouzivatelske rozhranie-----
%run - hlavna ponuka programu
run:-
dynamic(zamestnanec/6), %deklaracia dynamickeho predikatu
abolish(zamestnanec/6), %vymazanie zaznamov z db
db_read, %nacitanie zo vstupneho suboru
repeat, nl,
write('/--------------------------\'), nl,
write('| 1 - zaradit zamestnanca |'), nl,
write('| 2 - vyradit zamestnanca |'), nl,
write('| 3 - vyhladat zamestnanca |'), nl,
write('| 4 - zoradit zamestnancov |'), nl,
write('|--------------------------|'), nl,
write('| subor = employee.txt |'), nl,
write('| 5 - nacitat zo suboru |'), nl,
write('| 6 - ulozit do suboru |'), nl,
write('|--------------------------|'), nl,
write('| 7 - koniec |'), nl,
write('\--------------------------/'), nl,
write('Zadaj svoju volbu: '),
sread(Choice),
choice(Choice),
Choice = 7, !. %koniec
%vyber - podla hlavnej ponuky programu
%zaradenie zamestnanca
choice(1):-
flush, nl,
write('zaradit zamestnanca'), nl,
%nacitanie udajov, vsetky su povinne
rread('Meno: ',Meno, (atom(Meno), len(Meno,M), M > 0 )),
rread('Priezvisko: ',Priezvisko, (atom(Priezvisko), len(Priezvisko,P), P > 0 )),
rread('Funkcia: ',Funkcia, (atom(Funkcia), len(Funkcia,F), F > 0 )),
rread('Nadriadeny: ',Nadriadeny, (atom(Nadriadeny), len(Nadriadeny,N), N > 0 )),
rread('Datum nastupu (DD-MM-RR): ',Datum, (len(Datum,D), D > 0 ,check_date(Datum))),
rread('Oddelenie: ',Oddelenie, (atom(Oddelenie), len(Oddelenie,O), O > 0 )),
db_add(Meno,Priezvisko,Funkcia,Nadriadeny,Datum,Oddelenie).
%vyradenie zamestnanca
choice(2):-
flush, nl,
write('vyradit zamestnanca'), nl,
%nacitanie udajov, oba su povinne
rread('Meno: ',Meno, (atom(Meno), len(Meno,M), M > 0 )),
rread('Priezvisko: ',Priezvisko, (atom(Priezvisko), len(Priezvisko,P), P > 0 )),
db_del(Meno,Priezvisko).
%vyhladanie zamestnanca - hlada sa, len ak je v db nejaky zamestnanec
choice(3):-
(clause(zamestnanec(_,_,_,_,_,_),_),
flush, nl,
write('vyhladat zamestnanca'), nl,
rread('Meno: ',Meno,atom(Meno)), %nacitanie udaju
ccheck(Meno,MMeno), %ak nebolo zadane,nahradi sa anonymnou premennou
rread('Priezvisko: ',Priezvisko,atom(Priezvisko)),
ccheck(Priezvisko,PPriezvisko),
rread('Funkcia: ',Funkcia,atom(Funkcia)),
ccheck(Funkcia,FFunkcia),
rread('Nadriadeny: ',Nadriadeny,atom(Nadriadeny)),
ccheck(Nadriadeny,NNadriadeny),
rread('Datum nastupu (DD-MM-RR): ',Datum, ((len(Datum,D),D=0);check_date(Datum))),
ccheck(Datum,DDatum),
rread('Oddelenie: ',Oddelenie,atom(Oddelenie)),
ccheck(Oddelenie,OOddelenie),
db_search(MMeno,PPriezvisko,FFunkcia,NNadriadeny,DDatum,OOddelenie,Result), %vyhladanie
showw(Result), %zobrazenie vysledkov vyhladavania
!);
(write('v db nie su ziadne zaznamy o zamestnancoch'), nl).
%zoradit zamestnancov
choice(4):-
flush, nl,
write('zoradit zamestnancov'), nl,
write('zvolte si kritetium, podla ktoreho chcete usporiadat zamestnancov: '), nl,
write('/--------------------\'), nl,
write('| 1 - Meno |'), nl,
write('| 2 - Priezvisko |'), nl,
write('| 3 - Funkcia |'), nl,
write('| 4 - Nadriadeny |'), nl,
write('| 5 - Datum nastupu |'), nl,
write('| 6 - Oddelenie |'), nl,
write('\--------------------/'), nl,
write('zadajte svoju volbu: '),
sread(Choice),
number(Choice), Choice > 0, Choice < 7,
(
(clause(zamestnanec(_,_,_,_,_,_),_), %len ak su v db nejake zaznamy
db_sort(Choice,Result), %zoradenie
showw(Result), ! )
;
(write('db neobsahuje ziadne zaznamy'), nl )
).
%nacitat zamestnancov zo suboru
choice(5):-
db_read.
%zapis zamestnancov do suboru
choice(6):-
db_write.
%koniec, aj ulozenie zamestnancov do suboru
choice(7):-
db_write.
%-----funkcie na pracu s db-----
%zaradenie do databazy
db_add(Meno, Priezvisko, Funkcia, Nadriadeny, Datum, Oddelenie) :-
assertz(zamestnanec(Meno, Priezvisko, Funkcia, Nadriadeny, Datum, Oddelenie)), %zapisanie do db
nl, write('Zamestnanic bol zaradeny'), nl.
%vyhladanie v db - vsetky pozadovane zaznamy
db_search(MMeno, PPriezvisko, FFunkcia, NNadriadeny, DDatum, OOddelenie,Result):-
findall([MMeno,PPriezvisko,FFunkcia,NNadriadeny,DDatum, OOddelenie],
zamestnanec(MMeno,PPriezvisko,FFunkcia,NNadriadeny,DDatum,OOddelenie),
Result).
%vyradenie z databazy
db_del(Meno, Priezvisko):-
((clause(zamestnanec(Meno, Priezvisko,_,_,_,_),_), %ak je zamestnanec v db
db_search(Meno,Priezvisko,_,_,_,_,Result), %vyhlada vyhovujuce zaznamy
len(Result,Pocet), %kolko je vyhovujucich zaznamov
((Pocet>1, %viac ako 1 vysledok, vyberie sa ktory zaznam zmazat
showw(Result), %zobrazenie zaznamov
rread( 'Zvol poradove cislo zamestnanca, ktoreho chces vyradit: ',No,true),
%write('Zvol poradove cislo zamestnanca, ktoreho chces vyradit: '),
%read(No),
number_atom(Noo,No),
member([Me,Pr,Fu,Na,Da,Od],Result,Noo),
retract(zamestnanec(Me,Pr,Fu,Na,Da,Od)), %vyradenie
nl, write('Zamestnanec vyradeny.'), nl, !
);
(Pocet=1, %existuje len jeden zaznam
retract(zamestnanec(Meno,Priezvisko,_,_,_,_)),
nl, write('Zamestnanec vyradeny.'), nl, !)), !
);
(nl, write('Pozadovany zaznam nebol najdeny.'),nl)
).
%nacitanie zo suboru do db
db_read:-
abolish(zamestnanec/6), %vycistenie db - zmazanie vsetkych zaznamov
see('employee.txt'), %presmerovanie vstupu na subor
inpos(0), %nastavenie pozicie na zaciatok suboru
repeat,
( (at_end_of_file, !, seen, nl, write('udaje boli uspesne nacitane'),nl);
(read(Line), assertz(Line), fail)
).
%zapisanie z db do soboru
db_write:-
(
clause(zamestnanec(_,_,_,_,_,_),_), %kontrola, ci su v db nejake zaznamy
db_search(_,_,_,_,_,_,Result), %vsetky zaznamy
del('employee.txt'), %zmazanie suboru
tell('employee.txt'), %presmerovanie vystupu na subor
%showw(Result),
db_wwrite(Result),
told,
nl,write('udaje boli uspesne ulozene'),nl, !
);
(write('databaza neobsahuje ziadne udaje na zapisanie'),nl).
%zapisanie do suboru
db_wwrite([]).
db_wwrite([[Meno,Priezvisko,Funkcia,Nadriadeny,Datum,Oddelenie]|T]):-
write('zamestnanec('''),
write(Meno),write(''','''),
write(Priezvisko),write(''','''),
write(Funkcia),write(''','''),
write(Nadriadeny),write(''','''),
write(Datum),write(''','''),
write(Oddelenie),write(''').'),nl,
db_wwrite(T).
%zoradenie zaznamov v db podla zadaneho kriteria
db_sort(Choice,Result):-
db_search(_,_,_,_,_,_,SResult), %vyhladanie vsetkych zaznamov
sort(SResult,Result,[Choice]),
abolish(zamestnanec/6), %vymazanie vsetkych zaznamov
db_reload(Result). %zapisanie usporiadanych
%zapisanie zaznamov do db
db_reload([]).
db_reload([[Me,Pr,Fu,Na,Da,Od]|T]):-
assertz(zamestnanec(Me,Pr,Fu,Na,Da,Od)),
db_reload(T).
%-----pomocne funkcie-----
%zobrazenie zaznamov zaslanych ako argument
showw([]).
showw([[Me,Pr,Fu,Na,Da,Od]|T]):-
nl,
write('Meno: '),write(Me),nl,
write('Priezvisko: '),write(Pr),nl,
write('Funckia: '),write(Fu),nl,
write('Nadriadeny: '),write(Na),nl,
write('Datum nastupu: '),write(Da),nl,
write('Oddelenie: '),write(Od),nl,
showw(T).
%nacitanie - vypisanie poziadavky, nacitanie, skontrolovanie podmienok
rread(Text,Reply,Test):-
write(Text),
%read(Reply),
fread(a,0,-1,Reply),
call(Test), !.
rread(Text,Reply,Test):- %ak neboli podmienky splnene, pokusi sa nacitat vstup opat
write('Nespravny format vstupu.'),nl,
rread(Text,Reply,Test).
%kontrola, ci nacitany datum ma spravny format
check_date(Dat):-
atom(Dat),
cat(DD,Dat,[2,1,2,1]), %rozdelenie datumu
DD = [D1,D2,D3,D4,D5],
D2=D4, %kontrola pomlciek
D2='-',
number_atom(DDD1,D1), %kontrola cisel
number_atom(DDD2,D3),
number_atom(DDD3,D5).
%ak nebola polozka zadana, nahradi ju anonymnou, inak ponech
ccheck('',_):-!.
ccheck(P,P).