このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1337692704/70
#  【 課題 】DB上に給与の支給テーブルがあります。 
#        支店・部・課・社員番号・基本給・役職手当・残業時間  
#        これらの情報をDBから読み込み、各支店ごとの部、課の合計、支店合計 
#        総合計を求めなさい。最後に全ての合計を印字する事。 
#        集計項目は基本給・役職手当・残業手当・総支給額の4項目とする。 
#  【 形態 】1. Javaアプリケーション(main()で開始すること) 
#  【期限】6/17 午後20時  
#  【Ver 】java version "1.7.0_02" 

#  【 補足 】
#  残業手当 =(基本給+役職手当)/160*1.2 
#  総支給額 = 基本給+役職手当+残業手当 で計算します。 
#  
#  データベースの設定ですが
#  支店varcher2(14)部varcher2(14)課varcher2(14)社員番号number(8)基本給number(20)役職手当number(20)
#  残業時間number(20)
#  一意キーは社員番号です
#  
#  追試の追試課題です。 
#  今晩がんばりますが、明日の21時にはメールで提出しないといけません。 
#  お力添えお願いします。 
# 

'DB上に給与の支給テーブルがあります。支店・部・課・社員番号・基本給・役職手当・残業時間、これらの情報をDBから読み込み、各支店ごとの部、課の合計、支店合計、総合計を求めなさい。 最後に全ての合計を印字する事。集計項目は基本給・役職手当・残業手当・総支給額の4項目とする。' :-
        鍵ならびを生成(_支店候補,_支店_部候補,_支店_部_課候補),
        支店の表示(_支店候補,_支店_部候補,_支店_部_課候補,_支店),
        fail;
        総合計の表示.

支店の表示(_支店候補,_支店_部候補,_支店_部_課候補,_支店) :-
        member([_支店,_部],_支店_部候補),
        '支店,部の表示'(_支店_部候補,_支店_部_課候補,_支店,_部),
        fail.
支店の表示(_支店候補,_支店_部候補,_支店_部_課候補,_支店) :-
        '支店を鍵に集約'(_支店候補,_支店,_基本給,_役職手当,_残業手当,_総支給額),
        writef('支店集約: 支店=%t: 基本給=%t,役職手当=%t,残業手当%t,総支給額=%t\n',[_支店,_基本給,_役職手当,_残業手当,_総支給額]).

'支店,部の表示'(_支店_部候補,_支店_部_課候補,_支店,_部) :-
        member([_支店,_部,_課],_支店_部_課候補),
        '支店,部,課の表示'(_支店_部_課候補,_支店,_部,_課),
        fail.
'支店,部の表示'(_支店_部_課候補,_支店,_部) :-
        '支店,部を鍵に集約'(_支店_部候補,_支店,_部,_基本給,_役職手当,_残業手当,_総支給額),        
        writef('支店・部集約: 支店=%t,部=%t: 基本給=%t,役職手当=%t,残業手当%t,総支給額=%t\n',[_支店,_部,_基本給,_役職手当,_残業手当,_総支給額]).

'支店,部,課の表示'(_支店_部_課候補,_支店,_部,_課) :-
        '支店,部,課を鍵に集約'(_支店_部_課候補,_支店,_部,_課,_基本給,_役職手当,_残業手当,_総支給額),        
        writef('支店・部・課集約: 支店=%t,部=%t,課=%t: 基本給=%t,役職手当=%t,残業手当%t,総支給額=%t\n',[_支店,_部,_課,_基本給,_役職手当,_残業手当,_総支給額]).

鍵ならびを生成(_支店候補,_支店_部候補,_支店_部_課候補) :-
        '支店を鍵'(_支店候補),
        '支店,部を鍵'(_支店_部候補),
        '支店,部,課を鍵'(_支店_部_課候補).

'支店を鍵'(_支店候補) :-
        setof([_支店],[_支店,_部,_課,_社員番号,_基本給,_役職手当] ^ (
                    給与(_支店,_,_,_社員番号,_基本給,_役職手当)),_支店候補).

'支店,部を鍵'(_支店_部候補) :-
        setof([_支店,_部],[_支店,_部,_課,_社員番号,_基本給,_役職手当] ^ (
                    給与(_支店,_部,_課,_社員番号,_基本給,_役職手当)),_支店_部候補).

'支店,部,課を鍵'(_支店_部_課候補) :-
        setof([_支店,_部,_課],[_支店,_部,_課,_社員番号,_基本給,_役職手当] ^ (
                    給与(_支店,_部,_課,_社員番号,_基本給,_役職手当)),_支店_部候補).

'支店,部,課を鍵に集約'(_支店_部_課候補,_支店,_部,_課,_基本給,_役職手当,_残業手当,_総支給額) :-
        member([_支店,_部,_課],_支店_部_課候補),
        findsum([_基本給,_役職手当,_残業手当,_総支給額],(
                    給与(_支店,_部,_課,_社員番号,_基本給,_役職手当),
                    _残業手当と総支給額の算出(_基本給,_役職手当,残業手当,_総支給額)),
                [_基本給,_役職手当,_残業手当,_総支給額]).

'支店,部を鍵に集約'(_支店_部候補,_支店,_部,_基本給,_役職手当,_残業手当,_総支給額) :-
        member([_支店,_部],_支店_部候補),
        findsum([_基本給,_役職手当,_残業手当,_総支給額],(
                    給与(_支店,_部,_,_社員番号,_基本給,_役職手当),
                    _残業手当と総支給額の算出(_基本給,_役職手当,残業手当,_総支給額)),
                [_基本給,_役職手当,_残業手当,_総支給額]).

'支店を鍵に集約'(_支店候補,_支店,_基本給,_役職手当,_残業手当,_総支給額) :-
        member([_支店],_支店候補),
        findsum([_基本給,_役職手当,_残業手当,_総支給額],(
                    給与(_支店,_,_,_社員番号,_基本給,_役職手当),
                    _残業手当と総支給額の算出(_基本給+_役職手当,残業手当,_総支給額)),
                [_基本給,_役職手当,_残業手当,_総支給額]).

すべての合計(_基本給,_役職手当,_残業手当,_総支給額) :-
        findsum([_基本給,_役職手当,_残業手当,_総支給額],(
                    給与(_,_,_,_社員番号,_基本給,_役職手当),
                    _残業手当と総支給額の算出(_基本給+_役職手当,残業手当,_総支給額)),
                [_基本給,_役職手当,_残業手当,_総支給額]).

残業手当と総支給額の算出(_基本給,_役職手当,_残業手当,_総支給額) :-
        残業手当の算出(_基本給,_役職手当,_残業手当),
        総支給額の算出(_基本給,_役職手当,_残業手当,_総支給額).

残業手当の算出(_基本給,_役職手当,_残業手当) :-
        _残業手当 is (_基本給+_役職手当)/160*1.2.

総支給額の算出(_基本給,_役職手当,_残業手当,_総支給額) :-
        _総支給額 is _基本給+_役職手当+_残業手当.