Access2003について質問です。

[テーブル1]に入室時間、[テーブル2]に退室時間を入れ、[テーブル3]に人数を入れるとします。
入室から1h30を超えると退室までの30分ごとに\2,000×人数として計算する為には、どのような式を使えば良いでしょうか?
こんなAccess初心者にお知恵を貸して下さい。

回答の条件
  • 1人2回まで
  • 登録:2006/10/18 18:09:24
  • 終了:2006/10/19 11:59:15

ベストアンサー

id:hokuraku No.2

hokuraku回答回数530ベストアンサー獲得回数972006/10/18 20:45:33

ポイント90pt

(前の方とかぶってしまったら質問者様にはオープンポイントを、前の回答者様には当方へのポイント(あれば、ですが…)をそれぞれ送付させていただきます)


Accessでデータベースを作成し、テーブルを以下のように作成します。

http://www.tkadvance.com/database/access/chapter21.php

テーブル フィールド フィールド名 データ型 備考
テーブル1
フィールド1 ID オートナンバー型 主キー
フィールド2 入室時間 日付/時刻型
テーブル2
フィールド1 ID オートナンバー型 主キー
フィールド2 退室時間 日付/時刻型
テーブル3
フィールド1 ID オートナンバー型 主キー
フィールド2 人数 数値型

各IDは対応するようにしてください。また、入室/退室時間の書式は時刻(S)にします。

次に、テーブル同士のリレーションを作成します。

データベースのウィンドウでオブジェクトが選択されている状態で右クリックからリレーションを作成します。

http://makotowatana.ld.infoseek.co.jp/access/achowDefineRelation...

テーブル1~3をすべて追加し、テーブル1~3のidをすべてリレーションさせます。


次に作成したデータを基にクエリを作成し、計算結果の列を追加します。

http://mailsrv.nara-edu.ac.jp/~asait/visual_basic/access/part2.h...(「5.関数」参照)

「入室時間」「退室時間」「人数」の3つのフィールドからなるクエリの4番目に、式ビルダで以下の式を入れます。

式1: IIf(DateDiff("n", [テーブル1]![入室時間] , [テーブル2]![退室時間] )>90,Int((DateDiff("n", [テーブル1]![入室時間] , [テーブル2]![退室時間])-90)/30+0.9)*2000* [テーブル3]![人数],0)

これでクエリを作成すればOKです。

id:chig

最近のはてなはこんな表示もできるの!

hokuraku様、分かりやすい説明有難うございます!

ポイントの事は気にしないで下さい!

(返したりとかしないで下さいね!)

本当に有難うございました。

がんばります。

2006/10/19 10:38:12

その他の回答(1件)

id:Im_Me No.1

Im_Me回答回数301ベストアンサー獲得回数62006/10/18 19:17:52

ポイント80pt

ものすごくベタですが、クエリーを使った計算方法です。

まず最初に、

[テーブル1]に入室時間

[テーブル2]に退室時間

[テーブル3]に人数

それぞれの項目(明細)を一致させるKEYを各テーブルに持たせます。

(もしひとつのテーブルに各項目をフィールドとして持てればKEYは要りません)

[テーブル1]

KEY テキスト項目でも数値でも(但し全てのテーブルで統一)

入室時間 日付/時刻型

[テーブル2]

KEY テキスト項目でも数値でも

退室時間 日付/時刻型

[テーブル3]

KEY テキスト項目でも数値でも

人数 時刻型


次に選択クエリーを作ります。

SQLは以下のとおり



SELECT DateDiff("n",[入室時間],[退室時間]) AS 式1,

Int(DateDiff("n",[入室時間],[退室時間])/30) AS 式2,

IIf(DateDiff("n",[入室時間],[退室時間])>90,((Int(DateDiff("n",[入室時間],[退室時間])/30)-5)*2000)*[人数],0) AS 式3

FROM (テーブル1 INNER JOIN テーブル2 ON テーブル1.KEY = テーブル2.KEY) INNER JOIN テーブル3 ON テーブル2.KEY = テーブル3.KEY;


式1は入室時間と退室時間の差(分)を求めています。

式2は上記のテーブルを30分単位にしました。これが2000円の掛け数になります。

ただし、30分単位です。

それを踏まえて式3は、

入室時間と退室時間の差(分)が90分以上の場合(=一時間30分超え)

入室時間と退室時間の差(分)を30分単位で割り、更に一時間30分分(5)を差し引いた数に2000および人数を掛ける

…一時間30分Wを超えない場合は0

という内容のIF文になっています。


勝手にKEYをつけたりして解釈しましたが、もし意図する所が違っていたら補足お願いします。

あと、上記のIF文は30分とか一時間30分の線引き、2000円などがコテコテに書いてありますので、

それらはマスタ化した方が後々のメンテが良いかと思います。

id:chig

うわー。ありがとうございます。

もう、1人でもんもんと考えちゃってこんがらがっちゃって・・・

早速がんばってみます!

2006/10/19 10:31:30
id:hokuraku No.2

hokuraku回答回数530ベストアンサー獲得回数972006/10/18 20:45:33ここでベストアンサー

ポイント90pt

(前の方とかぶってしまったら質問者様にはオープンポイントを、前の回答者様には当方へのポイント(あれば、ですが…)をそれぞれ送付させていただきます)


Accessでデータベースを作成し、テーブルを以下のように作成します。

http://www.tkadvance.com/database/access/chapter21.php

テーブル フィールド フィールド名 データ型 備考
テーブル1
フィールド1 ID オートナンバー型 主キー
フィールド2 入室時間 日付/時刻型
テーブル2
フィールド1 ID オートナンバー型 主キー
フィールド2 退室時間 日付/時刻型
テーブル3
フィールド1 ID オートナンバー型 主キー
フィールド2 人数 数値型

各IDは対応するようにしてください。また、入室/退室時間の書式は時刻(S)にします。

次に、テーブル同士のリレーションを作成します。

データベースのウィンドウでオブジェクトが選択されている状態で右クリックからリレーションを作成します。

http://makotowatana.ld.infoseek.co.jp/access/achowDefineRelation...

テーブル1~3をすべて追加し、テーブル1~3のidをすべてリレーションさせます。


次に作成したデータを基にクエリを作成し、計算結果の列を追加します。

http://mailsrv.nara-edu.ac.jp/~asait/visual_basic/access/part2.h...(「5.関数」参照)

「入室時間」「退室時間」「人数」の3つのフィールドからなるクエリの4番目に、式ビルダで以下の式を入れます。

式1: IIf(DateDiff("n", [テーブル1]![入室時間] , [テーブル2]![退室時間] )>90,Int((DateDiff("n", [テーブル1]![入室時間] , [テーブル2]![退室時間])-90)/30+0.9)*2000* [テーブル3]![人数],0)

これでクエリを作成すればOKです。

id:chig

最近のはてなはこんな表示もできるの!

hokuraku様、分かりやすい説明有難うございます!

ポイントの事は気にしないで下さい!

(返したりとかしないで下さいね!)

本当に有難うございました。

がんばります。

2006/10/19 10:38:12
  • id:chig
    Im_Me様、hokuraku様、回答ありがとうございました。

    非常に有益な回答を得られたので、早いですがここで終了します。

    さて、がんばるか・・・・。
  • id:hokuraku
    いるか、ありがとうございます。
    多少アプローチが違うものの、Im_Meさんと同じような回答になってしまいましたね。すみません。

    ちょっと補足をしておきますと、Ime_Meさんの式はIntをそのまま使っており30分未満は切り捨て、私のほうは(泥臭くIntの中に0.9を足して無理やり)30分未満は切り上げとしています。
    転記される際はご利用の用途に合わせてお使いください。

    補足ついでに蛇足を。
    Ime_Meさんの式の中で、「30分単位での1時間30分分」は5ではなく3ですね。
    ケアレスミスだと思いますが(^^;
  • id:hokuraku
    お目汚しすみません。
    上記コメント、Ime_Meさん→Im_Meさんに2箇所脳内修正願います…。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません