All pastes #487585 Raw Edit

Something

public text v1 · immutable
·published 2007-05-14 15:13 UTC
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).