Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Access 2016)
タイムレコーダーで日付をまたぐ場合の処理について
投稿日時: 21/04/16 15:45:22
投稿者: ぽろんちょ

いつも大変お世話になっております。
 
出勤ボタン・退勤ボタンを押して時間を記録するだけの単純なタイムレコーダーを作成したのですが、
日付を跨いだ場合のデータの表示がうまくできません。
 
以下が出勤、退勤ボタンを押した時の処理です。
 
 
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
     
    Set cn = CurrentProject.Connection
     
    Set rs = New ADODB.Recordset
    rs.Open "Tデータ", cn, adOpenKeyset, adLockOptimistic
     
    rs.AddNew
        rs!作業員ID = txt作業員ID.Value
        rs!日付 = txt日付.Value
        rs!出退勤区分 = 1
        rs!時間 = Now()
    rs.Update
    MsgBox ("出勤時間を記録しました。")
 
txt作業員IDテキストボックスにIDを入力すると名前が表示され、その後に出勤・退勤のボタンを押して
記録します。txt日付にはその日の日付が表示されております。出退勤区分は1が出勤。2が退勤です。
作業員ID,日付,出退勤区分,時間が「Tデータ」テーブルに保存されます。
 
これらのデータを後からクエリで集計すると、出勤日と退勤日が同じであれば問題ないのですが、
退勤日が出勤日の翌日になる(日を跨いで退勤する)と以下のように退勤時間が一段下にずれてしまいます。
 
日付      作業員ID       出勤     退勤
2021/2/3    25    2021/2/3 12:50    2021/2/3 0:45
2021/2/4    25    2021/2/4 12:55    2021/2/4 1:08
2021/2/5    25    2021/2/5 12:55    2021/2/5 1:04
 
日付を結合しているのでこうなるのは当然なのですが、日付を跨いだ場合にずれることなく
レコードに表示させるようにするにはどうすればいいのでしょうか?
どなたかお分かりになる方、宜しくお願い致します。
 
 
 

回答
投稿日時: 21/04/16 17:09:35
投稿者: Suzu

時刻だけでなく、日付の データ も NOWから取得する事はできないのでしょうか?

投稿日時: 21/06/15 14:41:12
投稿者: ぽろんちょ

>Suzu様
 
早速のご返信ありがとうございます。また、返信が遅れて大変申し訳ありませんでした。
 
日付ですが、このtxt日付のテキストボックスのコントロースソースにはDateが設定されています。
(作る時に日付を確認しながら作ったので、わざわざテキストボックスに設定してました。)
 
 
〜現状のクエリで日付を結合したときの退勤時間〜
日付 作業員ID   出勤     退勤
2021/2/3 25 2021/2/3 12:50 2021/2/3 0:45
2021/2/4 25 2021/2/4 12:55 2021/2/4 1:08
2021/2/5 25 2021/2/5 12:55 2021/2/5 1:04
 
〜本来表示したい退勤時間〜
日付 作業員ID   出勤     退勤
2021/2/3 25 2021/2/3 12:50 2021/2/4 1:08
2021/2/4 25 2021/2/4 12:55 2021/2/5 1:04
2021/2/5 25 2021/2/5 12:55 2021/2/6 1:10
 
テーブルに登録する時点で、本来表示したい方法で登録できるのか、
現在出退勤のデータが保存されている、「Tデータ」テーブルからクエリで表示できるのか、
いろいろと考えましたが、出退勤の日付が変わってしまうとどうしてもうまく表示できませんでした。
なにか良い方法があれば教えていただけると大変助かります。宜しくお願いいたします。

回答
投稿日時: 21/06/15 16:44:35
投稿者: eden

出勤と退勤を「日付」と「時間」の時間部分で
表示しているからじゃないですか。
Now()なので「時間」には日付情報を持っていませんか。
書式設定で日付部分を表示すればいいのでは?
それか、「日付」ではなく「時間」の日付部分を使う。

回答
投稿日時: 21/06/15 17:30:35
投稿者: sk

引用:
作業員ID,日付,出退勤区分,時間が「Tデータ」テーブルに保存されます。

引用:
出退勤区分は1が出勤。2が退勤です。

引用:
rs!時間 = Now()

( SQL ビュー)
------------------------------------------------------------
SELECT [Tデータ].[作業員ID],
       [Tデータ].[日付],
       [Tデータ].[時間] AS [出勤],
       (SELECT Min(tmp.[時間])
        FROM [Tデータ] AS tmp
        WHERE tmp.[作業員ID] = [Tデータ].[作業員ID]
          AND tmp.[出退勤区分] = 2
          AND tmp.[時間] >= [Tデータ].[時間]) AS [退勤]
FROM [Tデータ]
WHERE [Tデータ].[出退勤区分] = 1
ORDER BY [Tデータ].[作業員ID],
         [Tデータ].[時間];
------------------------------------------------------------
 
上記のクエリのような結果を得ようとされているのだとして、
もし「出勤時刻と退勤時刻のいずれか一方を打刻し忘れたケース」が
含まれていたら、上記のロジックは容易く破綻するでしょう。
 
打刻忘れは現実的に起こり得る事象ですので、そういうことも
想定してフォームやクエリを設計されることをお奨めします。

投稿日時: 21/06/16 10:48:08
投稿者: ぽろんちょ

>eden様、sk様
 
ご返信ありがとうございます。大変助かりました。
sk様のSQLで望んでいたデータが得られましたので、参考にさせていただきます。
 
確かに打刻漏れは発生するので、回避できるように作っていたのですが、
これも出退勤が日付を跨ぐケースがあると、うまく動作しませんでした。
この辺ももう一度考えてみようと思います。
大変お忙しいところ、ありがとうございました。