Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1376 / 2272 ツリー ←次へ | 前へ→

【7389】日報の作成 青首 06/2/25(土) 21:37 質問[未読]
【7394】Re:日報の作成 小僧 06/2/27(月) 10:45 回答[未読]
【7397】Re:日報の作成 青首 06/2/27(月) 19:45 お礼[未読]
【7398】Re:日報の作成 青首 06/2/27(月) 20:57 質問[未読]
【7401】Re:日報の作成 小僧 06/2/28(火) 8:58 回答[未読]
【7416】Re:日報の作成 青首 06/2/28(火) 22:08 質問[未読]
【7417】Re:日報の作成 小僧 06/3/1(水) 10:22 回答[未読]
【7419】Re:日報の作成 青首 06/3/1(水) 21:06 お礼[未読]
【7420】Re:日報の作成 青首 06/3/1(水) 22:00 質問[未読]
【7431】Re:日報の作成 青首 06/3/2(木) 22:27 質問[未読]
【7432】Re:日報の作成 青首 06/3/2(木) 22:41 発言[未読]
【7433】Re:日報の作成 小僧 06/3/3(金) 11:35 発言[未読]
【7434】Re:日報の作成 小僧 06/3/3(金) 11:56 回答[未読]
【7445】Re:日報の作成 青首 06/3/5(日) 18:08 質問[未読]
【7447】Re:日報の作成 小僧 06/3/6(月) 9:55 発言[未読]
【7457】Re:日報の作成 青首 06/3/6(月) 22:28 お礼[未読]

【7389】日報の作成
質問  青首  - 06/2/25(土) 21:37 -

引用なし
パスワード
   質問させていただきます。

会社に30人ほどの社員がおります。
その社員の日報を毎日入力するのですが、ACCESSでうまく作れたらなと思い
挑戦しています。

テーブル:T_社員
  
  フィールド名 データ型
   社員ID   オートナンバー型
   社員名   テキスト型

テーブル:T_日報情報

  フィールド名 データ型
  日報ID    オートナンバー型
  業務内容   テキスト型
  残業時間   数値型

とりあえず、こんなテーブルを作ってみました


希望するフォームの形は

-------------------------------------------------------
 ---------    ----------
 |社員名 |    | 日付 |
 ---------    ----------
 --------------------  
 |   業務内容   |   -------------
 |         |   | 残業時間 |
 --------------------   -------------

             -------------  ------------
             | 前のレコードへ|  |次のレコードへ|
             -------------  ------------
-----------------------------------------------------------

 フォームを開くとT_社員の一番初めに登録された社員名が
 表示されます。
 その社員の日報を入力したらコマンドボタン[次のレコードへ]を
 クリックすると、T_社員の2番目に登録された社員名が表示されます。
 こんな感じで一人一人社員の画面を表示させて入力していきます。

 テキストボックス[日付]には今日の日付が表示されます。

 次の日は、テキストボックス[日付]に次の日の日付が表示され、
 またT_社員の一番初めから順々に登録していけるような形にしたいです。

 テーブルの構成をどうしたら良いかも分からなかったため、日付は
 テーブルに入っていません。

 テーブルの構成から教えていただければと思います。


  

【7394】Re:日報の作成
回答  小僧  - 06/2/27(月) 10:45 -

引用なし
パスワード
   ▼青首 さん:
おはようございます。

>テーブル:T_日報情報
>
>  フィールド名 データ型
>  日報ID    オートナンバー型
>  業務内容   テキスト型
>  残業時間   数値型


まず、こちらのテーブルには T_社員 との関連がないので、
社員ID フィールドを追加します。

また、日付のフィールドも追加してみましょう。

テーブル:T_日報情報

  フィールド名 データ型
  日報ID    オートナンバー型
  社員ID    数値型
  日付     日付/時刻型
  業務内容   テキスト型
  残業時間   数値型
  

お望みの日報を作る方法は色々あると思われますが、
一案としてワークテーブル(一時的に使用するテーブル)を使った方法を紹介させて頂きます。

まず、下記の様なテーブルを用意します。

テーブル:T_Work

  フィールド名 データ型
  社員ID    数値型   (主キー)
  日付     日付/時刻型
  業務内容   テキスト型
  残業時間   数値型
  
そしてフォームはこのテーブルを元にウィザードで作成します。
社員名でなく、社員ID のテキストボックスができてしまうので、
こちらを不可視にして、テキストボックスを追加します。

テキストボックス:社員名
コントロールソース:=DLookUp("社員名","T_社員","社員ID=" & [社員ID])

あとは、こちらのフォームの「読み込み時」「読み込み解除時」に
T_Work のデータを出し入れする様な処理を加えてあげます。

Private Sub Form_Load()
Dim strSQL As String

  strSQL = "INSERT INTO T_Work(社員ID, 日付) " _
      & "SELECT 社員ID, Date() FROM T_社員"
     
  DoCmd.RunSQL strSQL
  Me.Requery
End Sub

Private Sub Form_Unload(Cancel As Integer)
Dim strSQL As String
  
  strSQL = "INSERT INTO T_日報情報(日付, 社員ID, 業務内容, 残業時間) " _
      & "SELECT 日付, 社員ID, 業務内容, 残業時間 FROM T_Work"
  
  DoCmd.RunSQL strSQL
  
  strSQL = "DELETE FROM T_Work"
  DoCmd.RunSQL strSQL
End Sub

何かしらのヒントになりましたら幸いです。

【7397】Re:日報の作成
お礼  青首  - 06/2/27(月) 19:45 -

引用なし
パスワード
   小僧さん、早速の回答ありがとうございます。
ちょっと自分のレベルでは理解するのに難しそうではありますが、
頑張って作ってみようと思います。

つまづきましたら、また書き込ませていただきますので、
お手が空いているようでしたら、またアドバイスをいただければ
と思います。

【7398】Re:日報の作成
質問  青首  - 06/2/27(月) 20:57 -

引用なし
パスワード
   早くも躓きましたので、質問させていただきます。

>まず、下記の様なテーブルを用意します。
>
>テーブル:T_Work
>
>  フィールド名 データ型
>  社員ID    数値型   (主キー)
>  日付     日付/時刻型
>  業務内容   テキスト型
>  残業時間   数値型

T_Workを作成して、社員IDに主キーを設定して保存しようとしたのですが、
「インデックスまたは主キーにはNUll値を使用できません。」

とエラーが出て保存できません。

 
>そしてフォームはこのテーブルを元にウィザードで作成します。
>社員名でなく、社員ID のテキストボックスができてしまうので、
>こちらを不可視にして、テキストボックスを追加します。

このフォームはT_Workがレコードソースですよね。

>あとは、こちらのフォームの「読み込み時」「読み込み解除時」に
>T_Work のデータを出し入れする様な処理を加えてあげます。
>

T_Workをレコードソースにしたフォームに教えていただいたコードを
書き込むという感じでよろしいでしょうか。

初心者なため、ほんと初歩的な質問かもしれませんが、
どうかよろしくお願いします。

【7401】Re:日報の作成
回答  小僧  - 06/2/28(火) 8:58 -

引用なし
パスワード
   ▼青首 さん:
おはようございます。

>とエラーが出て保存できません。

T_Work に何かデータが入っていませんでしょうか?
用意するのは空っぽのテーブルとなります。


>このフォームはT_Workがレコードソースですよね。

はい、その通りです。
ウィザードの「単票フォーム」でフォームを作成されて下さい。


>T_Workをレコードソースにしたフォームに教えていただいたコードを
>書き込むという感じでよろしいでしょうか。

はい。
フォーム の プロパティ の [イベント] タブに
「読み込み時」という項目があるかと思われます。

こちらを選択すると右側に表示される「...」をクリックし、[コードビルダ]を選択。

Private Sub Form_Load()

End Sub

という画面が出ると思いますので、そこに先ほどのコードを記述します。


「読み込み解除時」も同じ様にされてみて下さい。

【7416】Re:日報の作成
質問  青首  - 06/2/28(火) 22:08 -

引用なし
パスワード
   ▼小僧 さん:

ありがとうございます。うまくできました。

今後この日報のフォームにいくつか機能を追加させて
行きたいと思っております。

早速質問なのですが、現在は、一日のうちに何回でも
レコードの追加ができてしまうのですが、これを一日
一度だけに限定することはできますでしょうか。

2月28日に一度すべての社員のレコードを追加したら、
2月28日の分はもうレコードの追加ができないような形に
したいのですが。

【7417】Re:日報の作成
回答  小僧  - 06/3/1(水) 10:22 -

引用なし
パスワード
   ▼青首 さん:
こんにちは。

>2月28日に一度すべての社員のレコードを追加したら、
>2月28日の分はもうレコードの追加ができないような形に
>したいのですが。

2月28日に一度データを入れた後、もう一度フォームを開くと
前回のデータを修正するような形ではいかがでしょうか。

Private Sub Form_Load()
Dim strSQL As String
      
  strSQL = "INSERT INTO T_Work ( 社員ID, 業務内容, 残業時間, 日付 ) " _
      & "SELECT T_社員.社員ID, T_日報情報.業務内容, T_日報情報.残業時間, Date() " _
      & "FROM T_社員 LEFT JOIN T_日報情報 ON T_社員.社員ID = T_日報情報.社員ID " _
      & "WHERE (T_日報情報.日付=Date()) Or (T_日報情報.日付 Is Null);"

  DoCmd.RunSQL strSQL
  Me.Requery
End Sub

Private Sub Form_Unload(Cancel As Integer)
Dim strSQL As String
  
   strSQL = "INSERT INTO T_日報情報 ( 日付, 社員ID )" _
      & "SELECT 日付, 社員ID " _
      & "FROM T_Work;"

  DoCmd.SetWarnings False
    DoCmd.RunSQL strSQL
  DoCmd.SetWarnings True

  
  strSQL = "UPDATE T_日報情報 INNER JOIN T_Work " _
      & "ON (T_日報情報.社員ID = T_Work.社員ID) AND " _
      & "(T_日報情報.日付 = T_Work.日付) " _
      & "SET T_日報情報.業務内容 = T_Work.業務内容, " _
      & "T_日報情報.残業時間 = T_Work.残業時間;"
  DoCmd.RunSQL strSQL

  strSQL = "DELETE FROM T_Work"
  DoCmd.RunSQL strSQL
End Sub

前回と同じ様に、「読み込み時」「読みこみ解除時」に記述して下さい。

【7419】Re:日報の作成
お礼  青首  - 06/3/1(水) 21:06 -

引用なし
パスワード
   すごいです。今までぜんぜんできなかったことが、小僧さんの
言うようにやるとどんどんできるので感動しています。

>2月28日に一度データを入れた後、もう一度フォームを開くと
>前回のデータを修正するような形ではいかがでしょうか。

まさにこんな感じにしたかったのです。

本当にありがとうございます。

【7420】Re:日報の作成
質問  青首  - 06/3/1(水) 22:00 -

引用なし
パスワード
   またすみませんが、質問させていただきます。

テーブル:T_社員
テーブル:T_日報情報

の他に、
テーブル:T_残業区分
 フィールド  データ型
 残業区分ID  オートナンバー型
 残業区分   テキスト型

を作り、この情報もフォームに組み込みたいと考えております。

 残業区分は ・上司の指示
       ・仕事の遅れ
       ・改善
       ・その他
 の4つあり、オプショングループの中から選択するような
形にしたいのですが、またこれも自分にとっては難解で・・・。


よろしければ、またご指導いただければと思います。

【7431】Re:日報の作成
質問  青首  - 06/3/2(木) 22:27 -

引用なし
パスワード
   申し訳ありません。

F_日報情報についてさかのぼっての質問なのですが、

>2月28日に一度データを入れた後、もう一度フォームを開くと
>前回のデータを修正するような形ではいかがでしょうか。

ということでフォーム上では、修正できるような形になったのですが、
T_日報情報のデータを見てみるとF_日報情報を開いた分だけ
データが増えてしまいます。

たとえば、3月2日にF_日報情報を開いて20名いる社員の日報情報を入力して
フォームを閉じます。

そして3月2日のうちに、F_日報情報をもう一度開いて、情報を変更してフォーム
を閉じると、T_日報情報には40件分のデータが保存されています。

この状態を一日20件分(社員数分)のデータの保存だけにしたいのですが
可能でしょうか?

【7432】Re:日報の作成
発言  青首  - 06/3/2(木) 22:41 -

引用なし
パスワード
   >この状態を一日20件分(社員数分)のデータの保存だけにしたいのですが
>可能でしょうか?


すみません。

テーブルのインデックスの操作でこの件は解決できたみたいです。

お騒がせいたしました。

【7433】Re:日報の作成
発言  小僧  - 06/3/3(金) 11:35 -

引用なし
パスワード
   ▼青首 さん:
こんにちは。

>テーブルのインデックスの操作でこの件は解決できたみたいです。

>>  DoCmd.SetWarnings False
>>    DoCmd.RunSQL strSQL
>>  DoCmd.SetWarnings True

まずは自力で解決できました様で何よりです。

DoCmd 〜 の行を消すとインデックスが付いている為に重複エラーが発生し、
データの追加ができないような仕組みにしてあります。

エラーが出現しない様に DoCmd〜 の行で無視する様にしてあります。

【7434】Re:日報の作成
回答  小僧  - 06/3/3(金) 11:56 -

引用なし
パスワード
   ▼青首 さん:
こんにちは。

>オプショングループの中から選択するような
>形にしたいのですが、またこれも自分にとっては難解で・・・。

データベースを作成する際に、
後からテーブルの項目が増やすとテーブルだけでなく
フォームやモジュール等、色々な所に影響がでてきます。

できるだけ仕様をはっきり決めてから製作に取り掛かりましょう。
(当方も作っている内に段々とやりたい事が増えていく事が多いですけどね^^)


まずテーブルの変更です。
「T_日報情報」と「T_Work」に
数値型:残業区分ID フィールド を追加して下さい。


次にフォームですが、オプショングループの作成の仕方はご存知でしょうか。
もしお解りで無い様でしたら再度ご質問して下さい。

お解りでしたら、フレームのコントロールソースを「残業区分ID」に設定します。


そしてフォームモジュールの変更です。
前回のコードに一部不備がありましたので、訂正させて頂きます。

Private Sub Form_Load()
Dim strSQL As String
   
  strSQL = "INSERT INTO T_Work ( 社員ID, 日付 ) " _
      & "SELECT T_社員.社員ID, Date() AS 日付 " _
      & "FROM T_社員;"
  DoCmd.RunSQL strSQL
  
  strSQL = "UPDATE T_Work " _
      & "INNER JOIN T_日報情報 " _
      & "ON T_Work.社員ID = T_日報情報.社員ID " _
      & "SET T_Work.業務内容 = T_日報情報!業務内容, " _
      & "T_Work.残業時間 = T_日報情報!残業時間, " _
      & "T_Work.残業区分ID = T_日報情報!残業区分ID " _
      & "WHERE T_日報情報.日付=Date();"
  DoCmd.RunSQL strSQL
  
  Me.Requery
End Sub

Private Sub Form_Unload(Cancel As Integer)
Dim strSQL As String
  
   strSQL = "INSERT INTO T_日報情報 ( 日付, 社員ID )" _
      & "SELECT 日付, 社員ID " _
      & "FROM T_Work;"

  DoCmd.SetWarnings False
    DoCmd.RunSQL strSQL
  DoCmd.SetWarnings True

  
  strSQL = "UPDATE T_日報情報 INNER JOIN T_Work " _
      & "ON (T_日報情報.社員ID = T_Work.社員ID) AND " _
      & "(T_日報情報.日付 = T_Work.日付) " _
      & "SET T_日報情報.業務内容 = T_Work.業務内容, " _
      & "T_日報情報.残業時間 = T_Work.残業時間, " _
      & "T_日報情報.残業区分ID = T_Work.残業区分ID;"
  DoCmd.RunSQL strSQL

  strSQL = "DELETE FROM T_Work"
  DoCmd.RunSQL strSQL
End Sub

こんな感じでいかがでしょうか。

【7445】Re:日報の作成
質問  青首  - 06/3/5(日) 18:08 -

引用なし
パスワード
   小僧さんの言われるように、ちゃんとフォーム等の仕様を
きちんと決めてから作成するのがいいですね。

今まで小僧さんに教えていただいた方法で、自分なりに必要だと思われる
テキストボックス・コンボボックス・オプショングループを付け加えて
みました。

まあなんとか動いてくれているのですが、ちょっと心配…。

先日作成した残業区分のオプショングループの件で質問なのですが、

プロパティのタブ移動順で
テキストボックス:業務内容→残業時間→残業区分とエンターキーを
押すことによって移動していくのですが、


テキストボックス:残業時間からエンターを押して移動するとき
オプショングループ:残業区分
       ・上司の指示
       ・仕事の遅れ
       ・改善
       ・その他
の一番上、「・上司の指示」にカーソルは移動するのですが、
オプションボタンが選択されないのです。
(オプションボタンの中が白いまま)

「・上司の指示」にカーソルが移動した後、下キーを押してやると
「・仕事の遅れ」のオプションボタンは選択されます。
その後、上キーを押すと「・上司の指示」のオプションボタンは選択
されます。

これをテキストボックス:残業時間でエンターを押すと

、「・上司の指示」にカーソルが移動し、オプションボタンが
選択されるようにしたいのですが、どのようにすればよいでしょうか。

あともうひとつ質問がありまして、

フォームを開くときと閉じるときに

【開くとき】
○○件(社員数)のレコードが追加されます。
○○件(社員数)のレコードが更新されます。

【閉じるとき】
○○件(社員数)のレコードが更新されます。
○○件(社員数)のレコードが指定したレコードから削除されます。

というようなメッセージが表示されるのですが、このメッセージを
表示させないようにするにはどのようにしたら良いでしょうか。

申し訳ありませんが、ご指導お願いいたします。


  

【7447】Re:日報の作成
発言  小僧  - 06/3/6(月) 9:55 -

引用なし
パスワード
   ▼青首 さん:
おはようございます。

まず…掲示板の上にある、

>>本サイトの基本方針をまとめました。こちら をご一読ください。

をお読みください。

>>できるだけ1トピック1質問にしてください

とあります。

今回は当方が別スレッドを建てますので、
次回からはルールを守っていきましょう!

【7457】Re:日報の作成
お礼  青首  - 06/3/6(月) 22:28 -

引用なし
パスワード
   >>>できるだけ1トピック1質問にしてください


ルールも読まずに質問を立て続けにしてしまい、
申し訳ありませんでした(--;)。

これからは1トピック1質問で抑えたいと思います。

現在作成中のフォームもまだ完成までいけていないため、
またスレッドを建てて質問をしていきたいと思います。
その際はまたよろしくお願いいたします。

1376 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078229
(SS)C-BOARD v3.8 is Free