- ベストアンサー
Accessで時間外管理の作成方法について
- Accessを使用して時間外労働時間の管理をする方法について教えてください。
- Access2003にExcelで管理していた時間外労働時間を移行したいです。
- 具体的な管理方法や入力フォームの作成方法など、アドバイスをお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
私なりの回答を載せるかどうか昨日から迷っていたのですが。 (かなりの長文になります。MDBを渡す手段を知らないので) このような長文回答の是非について、ご意見ください。 (今後の参考にさせていただきます) (何らかの反応はしてください) 以下参考まで。(Access2000/2007では動いてます) 正式なやり方か、わかりません。 (1か月表示で、穴埋め的に入力:データは入力したものだけ格納) (見栄えや詳細部分は割愛します:はっきりとした仕様がわからないので) (「Microsoft Office Specialist Access2002」はどんなものかわかりません) (理解と裏付けはしっかりと行ってください) Access2000での手順になります。(2003でも同様かと) Access を起動し、新規MDBを作ります。 以下の条件でサンプルをテーブル「T_社員」として取込みます。 pno(長整数:主キー),pcode/pname(テキスト) "pno","pcode","pname" 1,"A0001","ああああ0001" 2,"B0001","いいいい0001" 以下の条件でサンプルをテーブル「T_時間外」として取込みます。 (このテーブルがメイン扱いになります) pno(長整数),日付(日付/時刻),休日区分(テキスト),他は倍精度浮動小数点 主キーは自動設定 "pno","日付","休日区分","平日_普通","平日_深夜","休日_普通","休日_深夜" 1,2009/3/1,"休日",0.00,2.00,2.50,0.00 2,2009/3/4,"休日",2.50,0.00,0.00,0.00 1,2009/3/3,"休日",2.50,1.00,0.00,0.00 1,2009/3/13,"休日",1.50,2.00,0.00,0.00 1,2009/3/10,"休日",4.00,1.50,0.00,0.00 2,2009/3/15,"休日",3.50,1.00,0.00,0.00 2,2009/3/17,"休日",0.00,0.00,1.50,1.50 T_時間外ができたら、デザインで 休日区分のフィールドサイズを10くらいに変更 倍精度浮動小数点のフィールドの既定値を 0 に設定 以下の条件でテーブル「T_月日」を作成します。 フィールド1つのみで、名前「日」を日付/時刻型、主キーなし。 使用するテーブルは「T_社員」「T_時間外」「T_月日」の3つです。 以下の内容で、クエリ「Q_時間外」を作ります。(SQLビューで貼り付け) SELECT T_月日.日, T1.休日区分, T1.平日_普通, T1.平日_深夜, T1.休日_普通, T1.休日_深夜, T1.pno, T1.日付 FROM T_月日 LEFT JOIN (SELECT * FROM T_時間外 WHERE T_時間外.pno = Nz([Forms]![F_時間外]![cbx01],0)) AS T1 ON T_月日.日 = T1.日付 ORDER BY T_月日.日; 以下の手順でフォーム「F_時間外」を作成します。 ・ウィザードを使用してフォームを作成するから ・クエリ:Q_時間外のフィールドを全て選択 ・表形式を選択 ・フォーム名を「F_時間外」とし、フォームのデザイン編集 フォームのデザイン画面になるので、プロパティを表示させます。 フォームの以下プロパティを変更 「追加の許可」->「いいえ」 「レコードセット」->「ダイナセット (矛盾を許す)」 フォームヘッダ部分右側にある「pno」「日付」を削除 詳細部分 ・右側にある「pno」「日付」を削除(もしくは、「可視」->「いいえ」) ・左側にある「日」のプロパティ 「書式」->「m/d」に、「編集ロック」->「はい」へ フォームヘッダ部分を縦方向に広げ、以下を追加。 ・社員コード表示用テキストボックス「txt00」を作成 プロパティで、「編集ロック」->「はい」 (コンボボックスで社員を選択した時に表示するだけに使用) ・社員選択用コンボボックス「cbx01」を作成 値集合ソースは以下 SELECT T_社員.pno, T_社員.pname, T_社員.pcode FROM T_社員 ORDER BY T_社員.pname; 列数:3 列幅:0cm;3cm;1.5cm 連結列:1 入力チェック:はい ・年月指定用テキストボックス「txt01」を作成 プロパティで、「IME 入力モード」->「オフ」 必要なVBA部分を記述して行きます。 コンボボックス「cbx01」のクリック時をイベントプロシージャにし、「・・・」ボタンをクリックします。 Private Sub cbx01_Click() End Sub の部分を、以下に書き換えます。(貼り付けます) つづく
その他の回答 (3)
- 30246kiku
- ベストアンサー率73% (370/504)
最後に この記述で動くものは確認できたでしょうか。 それだけが心配です。
- 30246kiku
- ベストアンサー率73% (370/504)
つづき ' 表示対象範囲(日付)生成 ' Public Sub MakeMonthDays(dt As Date) Dim rs As New ADODB.Recordset Dim wdt As Date Dim iDayCount As Integer Dim i As Integer wdt = DateValue(Format(dt, "yyyy/mm/01")) iDayCount = DateDiff("d", wdt, DateAdd("m", 1, wdt)) CurrentProject.Connection.Execute "DELETE * FROM T_月日;" rs.Open "T_月日", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic wdt = wdt + 10 For i = 1 To iDayCount rs.AddNew rs("日") = wdt rs.Update wdt = wdt + 1 Next rs.Close End Sub ' 行選択後削除されると「T_月日」「T_時間外」の対象レコードが削除されるので ' 表示対象範囲(日付)を再生成する ' Private Sub Form_AfterDelConfirm(Status As Integer) Call MakeMonthDays(DateSerial(CInt(Left(Me.txt01, 4)), CInt(Right(Me.txt01, 2)), 1)) Me.Requery End Sub ' 更新/追加の前で、「T_時間外」登録に必要な「日付」「pno」を他から設定 ' Private Sub Form_BeforeUpdate(Cancel As Integer) If (Not IsNull(Me.cbx01)) Then Me!日付 = Me.日 Me!pno = Me.cbx01 Else Cancel = True Me.Undo End If End Sub ' 初期表示、社員選択なし&表示対象範囲(日付)を今月へ ' Private Sub Form_Load() Me.txt00 = "" Me.cbx01 = Null Call MakeMonthDays(Date) Me.txt01 = Format(Date, "yyyymm") Me.Requery End Sub ' 社員変更 ' Private Sub cbx01_Click() If (Not IsNull(Me.cbx01)) Then Me.txt00 = Me.cbx01.Column(2) Else Me.txt00 = "" End If Me.Requery End Sub ' 表示月変更 ' 更新前処理では入力が正当か判別 ' 正当なら Tag へ処理年月格納、ダメなら Cancel=True ' 更新後処理では、Tag 経由で得られる処理年月で表示対象範囲を再生成 ' Private Sub txt01_BeforeUpdate(Cancel As Integer) Dim sTmp As String Dim sYear As String Dim sMonth As String Dim wdt As Date Dim iECount As Integer sTmp = Trim(Nz(Me.txt01.Text)) Select Case Len(sTmp) Case 1, 2 sYear = Format(Date, "yyyy") sMonth = sTmp Case 3 sYear = Left(Format(Date, "yyyy"), 3) & Left(sTmp, 1) sMonth = Right(sTmp, 2) Case 4 sYear = Left(Format(Date, "yyyy"), 2) & Left(sTmp, 2) sMonth = Right(sTmp, 2) Case 5 sYear = Left(sTmp, 4) sMonth = Right(sTmp, 1) Case 6 sYear = Left(sTmp, 4) sMonth = Right(sTmp, 2) Case Else sYear = "" End Select If (Len(sYear) = 0) Then Cancel = True Exit Sub End If On Error GoTo ERR_HAND iECount = 0 wdt = DateValue(sYear & "/" & sMonth & "/01") Me.txt01.Tag = Format(wdt, "yyyymm") Exit Sub ERR_HAND: iECount = iECount + 1 If (iECount <= 1) Then Select Case Len(sTmp) Case 2 sYear = Left(Format(Date, "yyyy"), 3) & Left(sTmp, 1) sMonth = Right(sTmp, 1) Resume Case 3 sYear = Left(Format(Date, "yyyy"), 2) & Left(sTmp, 2) sMonth = Right(sTmp, 1) Resume End Select End If Cancel = True End Sub Private Sub txt01_AfterUpdate() Me.txt01 = Me.txt01.Tag Call MakeMonthDays(DateSerial(CInt(Left(Me.txt01.Tag, 4)), CInt(Right(Me.txt01.Tag, 2)), 1)) Me.Requery End Sub Microsoft Visual Basic のメニュー「ツール」->「参照設定」で Microsoft ActiveX Data Objects 2.1 Library が追加されていることを確認します。 フォームのデザイン画面に戻り、イベントが関連付けられているか確認します。 ・フォーム 更新前処理 / 削除後確認 / 読み込み時 ・コンボボックス「cbx01」 クリック時 ・テキストボックス「txt01」 更新前処理 / 更新後処理 関連付けが正しければ、保存し、フォームビューで動きを確かめてみます。 概要 テーブル「T_月日」は処理対象の日付が入るワーキング用テーブルです。 複数人同時に処理するのであれば、操作する人個々に必要なものなので工夫が必要です。 入力したデータのみ、テーブル「T_時間外」に格納されて行きます。 社員とデータの関連付けは、「pno」で行います。 (コードや名前は付属情報として扱います) 年月指定用テキストボックス「txt01」の表示は、YYYYMM です。 が、入力は月だけで・・・等の判別処理します。 後々の集計作業では、テーブル「T_時間外」を操作します。 フォーム上でも「平日_普通」,「平日_深夜」,「休日_普通」,「休日_深夜」の 合計を確認したい場合には、フォームのデザインで詳細部分の 「平日_普通」,「平日_深夜」,「休日_普通」,「休日_深夜」を選択後コピーを選び フォームヘッダ/フッタどちらかに貼り付けします。 貼り付け後、プロパティでコントロールソースを =Sum([平日_普通]) のように変更します。 テーブルの各フィールドに対してのインデックス設定は適宜行ってください。 休日区分はコンボボックス化し、決まった文字列を入れるようにするとか、社員テーブルのように外出しして番号のみで管理するなど、いろいろ変更点があると思います。
- orangezzzz
- ベストアンサー率35% (401/1119)
こんにちは。 どこまでできて、どこからできないのか具体的な内容でなければ回答できませんよ。
補足
すみませんm(_ _)m 自分ではなるべく具体的に書いたつもりでしたが まだ自分の力量が無くうまく表現出来ていなかったようですね。 Accessも慣れておらずこのサイトでの質問も初めてだったもので。。。 もっと自分で頑張ってみて、もう少し踏み込んだ質問が出来るようにしてみます。 ありがとうございました。
お礼
長文での回答、ホントにありがとうございます。 正直分からない部分も多くありますが、 そこらへんはネットや本で知らべ理解出来るよう頑張ります。 テーブル「T_社員」「T_時間外」はほぼ同じでしたが、 「日」だけの「T_月日」は考えもしませんでした。 これを参考にして勉強しながら進めていきたいと思います。 このような丁寧な回答を頂けると もっと頑張って勉強しよういう気持ちが沸いてきます。 ありがとうございました。