• ベストアンサー

MS-Accessでタイムテーブル(予定表)

実は似たような質問がすでにNo.1221079であったのですが、複数の施設の予約状況を人目で見てわかるような表を作りたいのです。縦軸に施設名、横軸に朝8時から夜8時までも時間軸をとって、予約済みの時間帯(枠)は色付けします。利用者名もその枠内に表示したいです。どうしたらいいでしょうか?自分で作成するのが難しい場合、OCXでそのような機能を提供するものがあったら教えてください。有料でもかまいません。

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

  • ベストアンサー
  • m0tt
  • ベストアンサー率55% (5/9)
回答No.3

そう難しくないと思うんですが、ただ面倒なだけで。 フォーム上で実現したいということですよね? 施設予約情報はテーブルに入っているのですよね? フォーム上で該当日付のレコード分のラベルを配置して時間分伸ばしたり縮めたりすればいいんでは?ラベルのプロパティのWidthを変更で。 ラベルの位置も移動できますし、Captionを変えれば利用者も表示できます。色も変えられます。 ただ、あまりラベルを多く増やすとかなり重たくなりますがね。 もしラベルをドラッグ&ドロップで移動したり伸びちぢみさせるならば面倒なのでやりたくないですが。でもそれをやるとテーブルとの連動も必要だからやらないか。

ninja_ex250
質問者

お礼

回答ありがとうございます。動的にラベルの大きさの変更が可能なんですね。ドラッグ&ドロップまでは考えていませんでしたが、動的にプロパティを変更できるならそれも可能ですね。ラベルの数は100枚程度になりそうなので、どのくらい重くなるか実験してみます。

その他の回答 (4)

  • m0tt
  • ベストアンサー率55% (5/9)
回答No.5

最近のパソコンならラベル100個程なら重くないかもしれませんね。 最小時間単位を1時間として1施設12枚(12時間分)のラベルだと9施設で108枚のラベルですかな。 簡単な方法で作成するとして、あらかじめこの108枚を1時間づつずらして配置し、[非表示]にしておきます。 10時から12時の予約なら10時のところのラベルの色とキャプションを変更して長さも12時まで(2倍)に変更し[表示]にます。11時のラベルはそのまま[非表示]で無視ということで。 これをデータ分実行します。 最小単位が30分なら単純にラベルは2倍になります。 ラベルの使いまわしでもいいですが制御が面倒になるので単位分作っちゃうのが楽。 アクセスはコントロール配列が使えないのでラベルのコントロール名を工夫して場所(座標)が判るような名前を付けたほうがいいですね。lblS1H08[施設1の8時]とか。

noname#182251
noname#182251
回答No.4

#3の「ラベル」というアイディアは面白いですね。試しにコードを書いてみました(ただしDelphi)。100件表示に120ミリ秒(環境:Pen4 1.5GH + 523KB RAM + Win2K )。充分実用になるでしょう。しかし面倒なのは#1で書いたように、ロックや重複チェックなんですよね。 以下はご参考までに procedure TForm1.FormCreate(Sender: TObject); var i:integer; begin for i := 0 to 100 do begin Labels[i]:=TLabel.Create(Self); with Labels[i] do begin Parent:=Form1; Color:=clAqua; AutoSize:=False; end; end; end; procedure TForm1.FormDestroy(Sender: TObject); var i:integer; begin for i := 0 to 100 do begin Labels[i].Free; end; end; procedure TForm1.LabelSet(LavelNo,R_No: integer; xName: String; s_time, e_time: TDateTime); var ss,ee:integer; begin ss:=Ceil(Frac(s_time)*24*60-300); ee:=Ceil(Frac(e_time)*24*60-300); with Labels[LavelNo] do begin Visible:=True; Left:=ss; Width:=ee-ss; Top:=200+R_No*20; Caption:=xName; end; end; procedure TForm1.Button1Click(Sender: TObject); var LavelNo,R_No: integer; xName: String; s_time, e_time: TDateTime; begin MyStopWatch1.Start; with ADOTable2 do begin First; LavelNo:=0; while not Eof do begin R_No:=FieldValues['roomno']; xName:=FieldValues['name']; s_time:=FieldValues['start_t']; e_time:=FieldValues['end_t']; LabelSet(LavelNo,R_No,xName,s_time,e_time); Inc(LavelNo); Next; end; end; ShowMessage(MyStopWatch1.MilTimeStr); end;

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.2

>予約済みの時間帯(枠)は色付けします。利用者名もその枠内に表示したいです 利用者名も枠内に表示するのは難しいですね。 そのような機能を提供してくれるものは申し訳ないですが知りません。 複数の施設の状況をフォームで表示するのは出来ますが。 複数の施設の一覧フォームで予約されてる時間を色分けして利用者は例えば施設名をクリックするとその施設の利用者名と時間が表示されるフォームを開くようにする方が楽にできると思います。

ninja_ex250
質問者

お礼

回答ありがとうございます。「ぱっとみて誰がどの施設を使っているかわかる」デザインを目指しているので、もう一つ別のフォームを開いて詳細を表示するというデザインとはちょっと目的が異なりそうです。今は時間帯の表示を目指していますが、日別、週別もいずれ必要になるのでそのときはもう一枚フォームを開くようなデザインにしようと思います。

noname#182251
noname#182251
回答No.1

MS-Accessをバックグラウンドに、Delphiでアプリケーションの使用状況をグラフ化したことがあります。縦軸にアプリケーション名、横軸に時刻で、MS-Accessの日付時刻型からデータを拾います。これは難しくないので、VBAでも簡単にできるでしょう。 しかし10年以上前ですが、DOS+C++で会議室予約ソフトを作ったときは、重複排除や、予約中のロック(予約するためのあれこれを書き込んで、登録しようとした寸前に、別の人に横取りされるのを防ぐ)辺りの実装が面倒でした。 で、MS-Accessにこだわらなければ、ベクターで「会議室予約」で検索すると、色々あがってきます。ひょっとすればバックグラウンドでMS-Accessを使用しているのもあるかもしれません。いかがでしょうか?

参考URL:
http://search.vector.co.jp/search?query=%89%EF%8Bc%8E%BA&path=%2Fwin%2F
ninja_ex250
質問者

お礼

回答ありがとうございます。MS-Accessの利用が諸般の理由で前提となってしまっているので、他のツールで作るのはちょっと無理な状況です。ベクターで真似をしたいと思えるAccessベースの予定表はいくつも見つかったのですが、残念ながらロックされていてデザインビューで見ることができないのでした。

関連するQ&A