• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Access2007で必要なレコードを抽出したい)

Access2007で必要なレコードを抽出したい

このQ&Aのポイント
  • Access2007を使用して特定のレコードを抽出する方法について説明します。
  • データベース内の複数のレコードから、特定の条件を満たすレコードを抽出する方法をご紹介します。
  • VBAを使用して、指定した日付と人物のレコードを抽出し、その空き時間を計算する方法について解説します。

質問者が選んだベストアンサー

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

はい。そのつもりで回答しました。 結果や如何に? ※時間が重複している場合は考えてません 2013/03/01  1111    AAA    09:00       10:00 ↓AAAさんが掛け持ちで何かやっている場合など 2013/03/01  1111    AAA    09:00       10:00 2013/03/01  1111    AAA    09:00       09:30 その他、未入力の場合など。 12~13時の処理ですが 前回回答では、8:40 ~18:00で考えてましたが 8:40 ~ 12:00 と 13:00 ~ 18:00 に分けて Where 終了時間 >= #12:00# Where 開始時間 <= #13:00# の二つのレコードセットでそれぞれ処理すれば良さそうです。 ただ、昼食時間をまたがっている場合があると・・・没。 2013/03/01  1111    AAA    11:00       13:30 もっと洗練された考え方が有るような気がします。

lienciel
質問者

お礼

ご回答ありがとうございます。 またご連絡が遅くなり申し訳ありません。 同時進行で他のものも作成しておりましたもので・・・。 おかげさまで空き時間が取得できましたので、まずは一つ解決しました。 昼食時間もアドバイスの感じで二つにわければよさそうです。 ただ、他にも条件がありますのでクリアしなければいけませんが、 ご教示いただいた内容でだいぶ感じがつかめましたので、 なんとかなりそうです。 本当に助かりました。ありがとうございました。 また何かありましたらよろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

変てこな考えかも(処理性能は考えてませんので・・・) 除外する・・・これは結構厄介なものと思います。 タイムスライスして、ある・ない・・・で結果を得ても良いのかも フィールド「時刻」(日付/時刻型:主キー)のみのテーブル「T時刻」を作り、 0:00 ~ 23:59 までのデータを入れておきます。(60 * 24 = 1440 レコード) この「T時刻」を基準に、対象者の予定日と開始時間、終了時間を結び付けて、 その結果、結びついていない時刻をグルグルとみて、空きの開始、終了を処理すれば・・・ 元テーブル名を★★と仮定すると SELECT Q1.時刻 FROM T時刻 AS Q1 LEFT JOIN (SELECT * FROM ★★ WHERE 予定日=#2013/3/1# AND 氏名='AAA') AS Q2 ON (Q1.時刻 Between Q2.開始時間 AND Q2.終了時間) WHERE (Q2.氏名 Is Null) AND ((Q1.時刻 Between #8:40# AND #12:00#) OR (Q1.時刻 Between #13:00# AND #18:00#)); の様な感じで・・・・ 得られる結果は、10:01 ~ 12:00 の 120レコードと 14:01 ~ 18:00 の240レコード 全体で 360レコードになるので、360分空いている事がわかります。 ただ、注意しないといけないのは、時刻の境目・・・・ 例えば、上記の空きで 15:00 ~ 15:30 を予定に入れたら、 14:01 ~ 14:59、15:31 ~ 18:00 に分かれます。 ということは、レコード数=分 ではなくなる? そこで、開始と終了の時刻が重ならないように、終了の方を1分前にします。 SELECT Q1.時刻 FROM T時刻 AS Q1 LEFT JOIN (SELECT * FROM ★★ WHERE 予定日=#2013/3/1# AND 氏名='AAA') AS Q2 ON (Q1.時刻 Between Q2.開始時間 AND DateAdd("n",-1,Q2.終了時間)) WHERE (Q2.氏名 Is Null) AND ((Q1.時刻 Between #8:40# AND #11:59#) OR (Q1.時刻 Between #13:00# AND #17:59#)); これで得られる結果は、10:00 ~ 11:59 の 120レコードと 14:00 ~ 17:59 の240レコード 上記の空きで 15:00 ~ 15:30 を予定に入れたら、 14:00 ~ 14:59、15:30 ~ 17:59 に分かれます。 (レコード数=分 でしょうか) (Q1.時刻 Between #8:40# AND #11:59#) は、 (Q1.時刻 >= #8:40# AND Q1.時刻 < #12:00#) の方が考えやすい/指定しやすいかも・・・ 上記を指定して Recordset を得て、グルグル回して、時刻差が 1 分でなかったら 開始の時刻はそのまま・・・ 終了の方は1分加算・・・・ で、求まっていくと思います。 空きの時間帯が複数あっても、グルグル回る時の処理を考えれば良いと思います。 また、どんな時間帯で登録されていようが、求まったものを処理するだけです。 ※ 上記では 1分間隔で「T時刻」内を作成していましたが、入力が 10分単位とかなら、 登録しておく「時刻」も 10分間隔で良いと思います。 グルグル回る時には、時刻差が 10分でなかったら・・・・とか ※ 上記記述をクエリとして作成した場合 保存・閉じた後、再度SQLビューで覗くと ON (Q1.時刻 Between Q2.開始時間 AND DateAdd("n",-1,Q2.終了時間)) 部分は ON Q1.時刻 Between Q2.開始時間 AND DateAdd("n",-1,Q2.終了時間) の様に ( ) が外れます。 編集等しなければ何も影響ありませんが、編集した後保存しようとするとエラーになります。 その時には、消えた ( ) を付け直してください。 (何故なのか・・・・わかりません) ※ 冒頭でも記述しましたが、処理性能は考えてませんので・・・

lienciel
質問者

お礼

ご回答ありがとうございます。 タイムテーブルは考えてなかったですね~。 予定を入力するフォームは5分刻みなので、その間隔で作成しておく ということですね。 ただご指摘の通り、処理能力がどうかというところですね。 空き時間を求めて予定を登録するのですが、実はそこに来るまでにも 少しぐるぐる回る処理をしていまして、使用者に遅いと思われないような くらいならOKですが、ちょっとやってみないと、ですね。 いろいろとたくさん考えていただきましてありがとうございます。 次への経路も見えて助かりました。 ちょくちょく息詰まりますので、また何かありましたらよろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

途中までですが・・・ 昼食時間を抜く処理が・・・ 例示された場合だけです・・・。 Sub b() Dim DB As DAO.Database Dim RS As DAO.Recordset Const tS As Date = #8:40:00 AM# Const tE As Date = #6:00:00 PM# Dim tT As Date Dim Ary() As Variant Dim i As Integer Set DB = CurrentDb Set RS = DB.OpenRecordset("SELECT 予定日, [コード], 氏名, 開始時間, 終了時間 FROM New1 ORDER BY 開始時間", dbOpenSnapshot) tT = tS Do Until RS.EOF If tT < RS!開始時間 Then ReDim Preserve Ary(i) Ary(i) = tT & " - " & RS!開始時間 _ & " 空き時間=" & CDate(tT - RS!開始時間) i = i + 1 End If tT = RS!終了時間 RS.MoveNext Loop If tT < tE Then ReDim Preserve Ary(i) Ary(i) = tT & " - " & tE _ & " 空き時間=" & CDate(tT - tE) i = i + 1 End If For i = 0 To UBound(Ary) Debug.Print Ary(i) Next End Sub

lienciel
質問者

お礼

nicotinism 様 ご回答ありがとうございます。 また返信がおそくなりましてすいません。 ご教示いただいた内容ですと、一番最初の開始時間と08:40の差、 次に終了時間と次の予定の開始時間の差、、、と続いて、そして最後の予定の終了時間と18:00の差を 求めればいい。 これに昼食時間を除く処理をかけばいい。 というふうに解釈しましたが、よろしいでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • アクセスで複数レコードを1レコードにできますか?

    アクセスで複数レコードを1レコードにできますか? お世話になります。 お教えください。 以下のようなレコード(テーブル)があります。 氏名 日付  金額 aaa 5/12 200 aaa 5/24 500 bbb 5/01 300 ccc 5/04 100 これを aaa 5/12 200 5/24 500 bbb 5/01 300 ccc 5/04 100 のようにデータを表示(クエリで)したいのですが どのようにしたらいいでしょうか?

  • SQLについて

    SQLについてわからないのでご教授ください。 TABLE AAA コード 適用開始日   適用終了日    ------ ----------- ----------- aaa 20100101 99999999 bbb 20100101 20100531 bbb 20100601 99999999 ccc 20100101 20110711 ccc 20110712 99999999 TABLE BBB コード 適用開始日   適用終了日    ------ ----------- ----------- aaa 20100101 99999999 bbb 20100101 20100531 ccc 20100101 20110711 ・テーブルBBBの適用終了日が'99999999'のコードは テーブルAAAでは適用終了日が'99999999'の1レコードのみ。 ・テーブルBBBの適用終了日が'20100531'などの'99999999'以外は テーブルAAAでは適用終了日が'20100531'のレコードと、翌日'20100601'が適用開始日に設定され '99999999'が適用終了日に設定されたレコードの2レコードが存在。 上記2つが正常の状態です。 これらの条件に反する異常を検知するようなSQLを作りたいです。 たとえば、テーブルAAAのレコード[bbb 20100601 99999999]がない場合、 実行結果としてコード「bbb」が出力されるようなSQLが欲しいです。 異常がなければ、「なにも選択されませんでした。」でよいです。 条件として、 ・テーブルAAAでは「コード」「適用開始日」がPK ・テーブルAAAでは同じコードの「適用開始日」「適用終了日」の期間がかぶることはない ・テーブルAAAでは同じコードで3レコード以上は存在しない   (たとえば20100101~20100531、20100601~20100931、20101001~20101231の3つの期間は存在しない) 実行結果はあくまで私の考えで、 異常を検知できればどのような形でも大丈夫です。 なにかあれば補足します。 どうぞよろしくお願い致します。

  • ユニークレコードの定義

    小さいことですが、気になったので質問させていただきます。 エクセルのユニークレコードでは文字通り重複のレコードが削除されますが、複数あるセルの、上がのこるのでしょうか? たとえば、 AAA 14 BAB 18 AKF 13 AAA 16 といった場合(文字のセルの横に数字のセルが続く)、 上のAAAが残るという理解で間違いないでしょうか?

  • Accessで複数のクエリの抽出条件

    Accessで複数のクエリの抽出条件にBetween[開始日]And[終了日]と入れて、マクロでその複数のクエリを次々に開いていくというものが入っているのですが、クエリが10以上あるので、[2005/01/01][2005/01/31]とを10セット以上入力しないとデーターが出てこない状態です。これを一度の期間指定入力で10個以上のクエリに同じ期間が自動で入るような方法を知りたいのです。 なにぶん、Accessが初心者で全くわからない状態ですので説明自体の意味がわからないかもしれません。よろしくお願いします。

  • Access2003はチューニングは可能ですか?

    以下のように、レコード1件ずつ処理させるVBAをAccess2003で書いているのですが、処理が遅いです。(1件ずつなので当たり前ですが・・・) AccessやWindows2000をチューニングして、早くすることは可能でしょうか? 基本的にCPUやメモリの増設は金欠のため考えておりません。 あと、開始から終了までミリ単位で計測するVBAの書き方も知りたいです。   '開始 '先頭のレコードに移動する DoCmd.GoToRecord , , acFirst Do '処理 ' ... '次のレコード DoCmd.GoToRecord , , acNext Loop While Me.NewRecord = False   '終了

  • Access 特定日のカウント

    こんにちは。 Access2002を使っています。 考え方がわからないので教えてください。 テーブルAには連続したユニークな「日付」列があります。 テーブルBには各会員の「開始日」列と「終了日」列があります。 知りたいことは、「日付」に対して、「開始日」と「終了日」の間に 何日分の有効レコードがあるかです。 [日付]の列にbetween [開始日] and [終了日]としてカウントを取れば 簡単に出そうなのですが、別々のテーブルです。 例えば「日付」には1/4からの連続した日付、 「開始日」-「終了日」には、 12/20-1/5 1/1-1/15 とあるとします。 導き出したい答えは 「日付」 1/4:有効2レコード 1/5:有効2レコード 1/6:有効1レコード 旨く説明できなくて済みません。 期間中の有効日付の数をどのように数えたらいいのか教えてください。 よろしくお願いします。 haru

  • 【ACCESS】重複チェック方法について

    下記のように、複数フィールドがあり、 フィールド1,2,3が全て同じレコードを抽出したいのですが 抽出する方法があれば、教えてください。 フィールド1 フィールド2 フィールド3 ・・・・ ――――――+――――――――+――――――――+――――― 12345 AAA aaa 12345 BBB aaa 12378 AAA aaa 12378 AAA bbb 23456 CCC bbb 23456 CCC bbb  ―>抽出したい!! 23456 CCC ccc

  • 何度もすいません アクセスにて

    アクセスにて テーブル 氏名 月 開始時間 終了時間 1日 2日 3日・・・31日 とデータを持っております。 氏名はそのまま 月は1~12の数字 開始時間 終了時間は23:00のような24時間表記  1日~31日までのデータは 該当するところに-1の表記があり非該当はnull値となっております フォームにて1日 と入力すると 1日に-1の入っているデータの 氏名 開始時間 終了時間 をすべて出したい場合 どのようにすればいいでしょうか? フォームはカレンダーで1~31のチェックボックスを作成する予定です フォームで入力した値で抽出をし レポートに出したいのですが いまいちやり方がわかりません ご示唆お願いいたします。

  • ACCESS クエリ 抽出条件が多い場合

    ACCESSの超初心者です。 選択クエリで、80件ほどの抽出条件を部分一致で 設定しています。(Likeを使用) 例えばこんな感じです。  フィールド   aaa1   bbb52   aaa33   aac8   bba35   bba115    抽出条件 Like "aaa*" Or Like "bba*" →抽出結果 aaa1,aaa33,bba35,bba115 今後も条件が増えていく予定なので、別の 良い方法がないかと思っています。 (できるかどうかわかりませんが、 別にテーブルを作り、その一覧内の文字が 含まれるレコードのみを抽出) 皆さんのお知恵をお貸しいただけないでしょうか。 宜しくお願いします。

  • Access2000: 複数のフィールド内の特定文字を含むレコードの検索・抽出をどのように設定方法

    一つのレコード内にField01, Field02, Field03があります。 Access2000を使用しています。 Main Form(MF)に設置したText Box01 とTex Box02に任意のあいまいな文字をエントリーした場合、 (1) その両方(2)そのいずれか、 の文字を含む複数のレコード検索・抽出を行いたいと思います。 事情に応じて(1)或いは(2)の結果をQuery(FormやReportのベース)に表示させる良い方法を 教えて下さい。(QueryやVBA等のコードの書き方等)