プロが教えるわが家の防犯対策術!

access2003で、シフト表を作成したいと考えております。カレンダーについて作成したことがなく、情報を絞り込めなかったためご質問させていただきます。以下がシフト表のイメージです。

  |        1月      |     2月
名前| 1日|2日|3日|4日|5日|・・・・|1日|2日
鈴木| 出|休 |休|出・・・・・・
山田| 休|出 |休|出・・・・・・

といった形のマトリクス型式にしたいと存じます。
月のテーブルで日付ごとにレコードを作製し、サブフォームで埋め込むといった方法も考えたのですが、長期的な運用を考えた際に、実用的でないと思ったためほかのアイデアをお伺いできればと思いました。

ご経験がある方、アイデアをお持ちの方がいらっしゃいましたらお伺いできればと存じます。よろしくお願いいたします

A 回答 (5件)

X CNNExecute "DELETE * FROM 出勤表 WHERE ID=1;"


O CNNExecute "DELETE * FROM 出勤表 WHERE ID=1 AND 日付=XXXXXXX;"

まあ、SQL文は例示ですので、少々のミスはと思いましたが一応訂正しておきます。
訂正のついでに CNNExecute関数を紹介しておきます。
一応、ADO関係の関数の基本形に忠実に作成したつもりです。

Public Sub ErrMessage(ByVal CnnErrors As ADODB.Error, ByVal strSQL As String)
   MsgBox "ADOエラーが発生しましたので処理をキャンセルします。" & Chr$(13) & Chr$(13) & _
      "・Err.Description=" & CnnErrors.Description & Chr$(13) & _
      "・Err.Number=" & CnnErrors.Number & Chr$(13) & _
      "・SQL State=" & CnnErrors.SQLState & Chr$(13) & _
      "・SQL Text=" & strSQL, _
      vbExclamation, " ADO関数エラーメッセージ"
End Sub

Public Function CnnExecute(ByVal strSQL As String) As Boolean
On Error GoTo Err_CnnExecute
   Dim isOK As Boolean
   Dim cnn As ADODB.Connection
  
   isOK = True
   Set cnn = CurrentProject.Connection
   With cnn
     .Errors.Clear
     .BeginTrans
     .Execute strSQL
     .CommitTrans
   End With
Exit_CnnExecute:
On Error Resume Next
   cnn.Close
   Set cnn = Nothing
   CnnExecute = isOK
   Exit Function
Err_CnnExecute:
   isOK = False
   If cnn.Errors.Count > 0 Then
     ErrMessage cnn.Errors(0), strSQL
     cnn.RollbackTrans
   Else
     MsgBox "プログラムエラーが発生しました。システム管理者に報告して下さい。(CnnExecute)", _
        vbExclamation, " 関数エラーメッセージ"
   End If
   Resume Exit_CnnExecute
End Function
    • good
    • 1

同様の勤務シフト の質問に 回答してます。



やって出来ないことは有りませんが相当に苦労しました。
ヒントも転がってると思いますので ご覧下さい。

工事の現場と派遣職人の予定を ガントチャートで 管理してます。

参考URL:http://oshiete1.goo.ne.jp/qa3707410.html
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
参考にさせていただきます。

お礼日時:2008/01/31 13:05

社員名__2008/01/01__2008/01/02__2008/01/03__2008/01/04__2008/01/05__2008/01/06


鈴木____________________0_________________0________________X________________0________________0_________________1
中村____________________X_________________0________________0________________X________________X_________________0

こういうデータ入力フォームを用意した場合、

O->Xへ
X->Oへ

で、テーブルの更新要領は違います。

前者は、DELETE文の発行、後者はINSERT文の発行。

CNNExecute "DELETE * FROM 出勤表 WHERE ID=1;"
CNNExecute "INSERT INTO 出勤表 SET (日付, 社員_ID) VALUES ('2008/01/01', 1);"

ところで、この場合、入力ではエクセル風のグリッドコントロールを利用することになろうかと思います。

確かに、現場からはかようなエクセルまがいの入力仕様を要求する向きがあります。

この場合、

[イミディエイト]
? DBSelect("SELECT 出勤表.日付, 出勤表.社員_ID, 社員.略称 FROM 社員 RIGHT JOIN 出勤表 ON 社員.ID = 出勤表.社員_ID ORDER BY 出勤表.日付, 社員.整列順位;")
2008/01/01;1;鈴木;
2008/01/02;1;鈴木;
2008/01/02;2;中村;

とデータを簡単に取得できることが課題になろうかと思います。
次に、

SetGridValue "XXX", 2, 2, "O"
SetGridValue "XXX", 2, 3, "X"

と、取得したデータに基づいて翻訳表示する関数もないと実にややこしいです。
こういう関数があれば、For ループで回すだけです。

これができりゃ、後は、CNNExecute関数の類を利用してグリッドデータの変更をテーブルに反映するだけです。

まあ、やって出来ないことじゃないでしょうが、所詮は、プログラマのマスターベーションじゃないですか?
No2さんの推奨されるやり方で事足りる訳ですから・・・。
    • good
    • 0
この回答へのお礼

No5のご回答含めありがとうございます。
ただ今開発環境がないため、後ほど試してみたいと存じます。

>所詮は、プログラマのマスターベーションじゃないですか?
おっしゃっていただいている事はご尤もです。現在すでにEXCELベースで複数の管理用ファイルが手元にあるのですが、作成者によって統一されていない、できない点が多々発生したため、一括管理を検討いたしました。私が担当するまで、会社の管理ファイルが統一されていなかったのが原因です。
そのため1つの機能として、今回のご質問をさせていただきました。

ソースもありがとうございました。大変助かります。
まずはお礼まで

お礼日時:2008/01/31 13:03

>といった形のマトリクス型式にしたいと存じます。


これが条件ならAccessをやめExcelでやりましょう

Accessでやる場合は日付は縦に展開し
インタフェースにはメイン・サブフォームを使います
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。EXCELで組むのもいいのですが、すべてVBAで組むのであれば、ACCESSの方がいいかと存知ます。

表面的に使用するだけであれば、社員データのテーブルと、カレンダーの様なテーブルを作成、2つを組み合わせたクエリを作成し、横型のカレンダーのような内容はすでに作成済みですが、

定期的にカレンダー作成の作業が必要になってしまうため、長期的に使用したいとも思いません。

DAOかADOで作成可能というお話を伺ったことがあったもので、ご質問いたしました。最初の質問文が言葉足らずで申し訳ございません。

お礼日時:2008/01/30 14:28

表の体裁(フォーマット)とテーブル設計は無関係かと思います。



稼動日程表:

日付:2008/01/29
曜日:1,2,3,4,5,6.7
稼動:Yes,No

社員:

ID_________:1
社員番号:101
整列順位:1
名前______:鈴木 一郎
略称______:鈴木

出勤表:

日付____:2008/01/29
社員_ID:1
出勤____:Yes, No <------ 不要!

こういうテーブル設計で事足りると思います。
この設計でエクセル風の入力と表示を実現するのはフォームとレポートの課題。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
仰っていただいた内容については存じ上げております。

フォームで、表示させたくご質問させていただきました。
以前DAOやADOを使用することで表示可能というお話をお伺いきましたもので、具体的にどうすればいいかがわからずご質問した次第です。

お礼日時:2008/01/30 14:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す