2009年3月31日火曜日

Access データベースの分割

Microsoft Access – Wikipedia の「開発」によると、

1つの設計技術はAccessのアプリケーションをデータとプログラムに分割することである。1つのデータベースはテーブルとリレーションシップのみを含むべきであり、一方他のデータベースはすべてのプログラム、フォーム、レポート、及びクエリを含み、最初のデータベースのテーブルにリンクする。

メニューより「ツール > データベース ユーティリティ > データベース分割ツール」を使うと、バックエンドデータベースを自動で作成してくれる。

これに対して、「Access 2002 または Access 2003 で Microsoft Access データベースを手作業で分割する方法」には手作業でする方法が詳細に記されている。これを簡単にまとめておくと、

090331-008

 

分割するメリットとして次のように述べられていた。

データベースを分割する最も一般的な理由は、ネットワーク上で複数のユーザーがデータベースを共有していることです。ネットワーク共有に単純にデータベースを保存している場合は、ユーザーがフォーム、クエリ、マクロ、モジュール、またはレポートを開くと、これらのオブジェクトがネットワークを経由して、データベースを使用する各ユーザーに送信されます。データベースを分割すると、各ユーザーに、フォーム、クエリ、マクロ、モジュール、およびレポートの自分用のコピーを与えられます。このため、ネットワークを経由して送信する必要があるデータは、テーブルのデータのみとなります。

(同上より)

 

リンクしたテーブルの更新

バックエンドデータベースに一度リンクした後、同フォームを別のデータベースに接続したい場合は、メニューより「ツール > データベース ユーティリティ > リンク テーブルマネージャ」において、「リンク先を更新するためのプロンプトを毎回表示する」にチェックを入れ、更新が必要なリンクを選択して OK ボタンを押す。

090331-009

Access でコンボボックスの「リスト外入力時」のメッセージを変更

テーブルの構造とルックアップの設定

「人」テーブルと「都道府県」テーブルがあるとする。

「人」テーブルは「都道府県」を参照。 id は主キーで、CD は候補キー。 id はシステムがタプルを一意に識別するためのもので、CD も一意に識別することができるが人間の都合で変更の可能性がある。

090331-003

 

「都道府県」を参照しているフィールドは、「ルックアップ」で「コンボボックス」が表示されるようにする。

090331-004

 

クエリからフォームを作成

上記のテーブルから下記のクエリを作成。

090331-005

 

これを元にフォームを作る。

このとき、フォームにおける「都道府県」の入力は CD (コード) でしようと考えていたので、「あれ? id を入力しなくていけないかな?どうしよう… (@_@;) 」と思ったけれど、上記の通り「人」テーブルの「都道府県id」フィールドには「ルックアップ」が設定されているので、id の入力をあたかも CD を入力してるかのようにフォームのコンボボックスで入力できる。

 

リスト外入力時のイベント

さて、ここで「都道府県」テーブルにない CD を入力しようとすると、

指定した項目はリストにありません。

とメッセージが表示される。

090331-007

 

このメッセージではユーザにとってわかりにくいので変更したい。

コンボボックスのプロパティより「イベント > リスト外入力時」の VBA を記述する。

Private Sub 都道府県id_NotInList(NewData As String, Response As Integer)
    Response = acDataErrContinue
    MsgBox "存在しない都道府県コードです"
End Sub

引数 Response の設定で先ほどのメッセージを抑制して、新たにメッセージを表示する。

 

参考

2009年3月28日土曜日

Firefox が重くなってきたので新しくプロファイルを作成

Firefox が最近すごく重い。 (+_+) アドオンを入れてないときはサクサクと動いていたのになぁ~と思いつつ、色々と軽くする方法を試してみたけれど今一。諦めて新しくプロファイルを作成しようかと思ったけれど、その後の設定のことを考えると二の足を踏む。しかし、試行錯誤している内に新たにインストールしたアドオンがいけなかったのか、Firefox の UI がおかしくなってしまった。アドオンの一覧を開こうとしてもウィンドウが全く表示されない。 (@_@;) まぁ~仕方ない、これが年貢の納めどきと思い、新しくプロファイルを作成した。それにしても、今まで使っていたアドオンをインストールして設定をしなくてはならないと思うとげんなり。

 

新しいプロファイルの Firefox

しかし、さすがに新たに再生した Firefox 。^^ 同じアドオンを入れても結構サクサク動く。あ~、やっぱ作りなおして正解だった。何だかんだ言ってプロファイルの新規作成がモッサリフォックスには一番効くなぁ~。

 

調子のいい状態をバックアップ

せっかく新しくしたので、ここで面倒がらずに全てのアドオンをインストールし、各設定を行なった後にバックアップ。以前のようにプロファイルをまるごとバックアップ

または、「アドオンと設定」だけをバックアップ。こちらの方がシンプルかな? Foxmarks Bookmark Synchronizer を使っているので、プロファイルをまるごとだとまずいかも。

090328-004

 

ついでにStylish の設定ファイルも、Wired-Marker の設定ファイルと同じように Dropbox に移動した。

これで次回は楽ができそうだ。 ^^

2009年3月24日火曜日

Access の VBA で関数をちょっと試すには

VBA において試したい関数があるとき、フォームでコマンドボタン作って MsgBox で出力させるのもの面倒なので…

 

データベースウィンドウで右クリック > Visual Basic Editor を選択。

090324-007

 

表示 > イミディエイトウィンドゥ」 を選択しておく。

標準モジュール」の中でプロシージャを作成し、F5 で実行。F8 でデバッグ。

090324-005

 

関数の場合は「表示 > ローカルウィンドウ」 を表示しておく。

2009年3月22日日曜日

Access のコンボボックスにおける Value と Text プロパティの違い

以下のように、前回と同じテーブルを使う。

090322-003

 

「人」テーブルの「性別id」は、前回最後に作ったクエリを元にルックアップの設定をしてある。

データの値だけちょっと変えておく。性別コードを二桁にした。

090322-001

 

ここで例えば、「人」テーブルを元に以下のようなコンボボックスを含むフォームを作成したとする。コンボボックスのコントロールソースは「性別id」。

090322-002

 

繰り返すが「性別id」は、クエリを元にルックアップの設定がしてある。

test ボタンを押すと VB のイミディエイトウィンドウにコンボボックスの値が出力されるようにした。コードは次の通り。

Private Sub btnTest_Click()
    ' Value プロパティ
    Debug.Print "性別id.Value: " & 性別id.Value
    
    ' Text プロパティ
    性別id.SetFocus
    Debug.Print "性別id.Text: " & 性別id.Text
End Sub

結果、次のような出力が得られた。

性別id.Value: 4
性別id.Text: 09

Text プロパティを取得する前にフォーカスを与えているのは、

コントロールの Text プロパティを取得または設定するには、コントロールにフォーカスを与えておく必要があります。フォーカスを与えないと、エラーが発生します。

(ヘルプの「Text プロパティ」より)

上記の結果を見ると、Text プロパティはコンボボックスに表示された値そのものを取得している。それに対して、Value プロパティは「データ > コントロールソース」である「性別id」の値が表示された。このような違いが生じたのは、コンボボックスの「データ > 集合ソース」にルックアップの設定で使っているクエリが設定されているためということか。

Access で テーブル定義・フォームのコンボボックス におけるルックアップの設定

リレーションシップの設定

「人」と「性別」テーブルがあり、「人」テーブルの「性別id」が「性別」テーブルの「id」を参照しているとする。

090322-003

 

「性別」テーブルの内容は以下の通り。 id はシステムが自動的に割り当てる数値で、CD は性別コードのこと。 id は不変だけれど、性別コードはユーザが変更可能な値とする。

090322-002

 

ルックアップを利用せずにテーブルに値を入力しようとする場合、「人」テーブルの「性別id」は「性別」テーブルの「id」の値を直接入力しなければならない。

090322-004

 

テーブルをルックアップ

上記のままだと性別を入力しにくいので、「ルックアップ」の機能を利用する。

以下、「人」テーブルの「性別id」フィールドの「ルックアップ」の設定。

  1. 「表示コントロール」を「コンボボックス」に変更。
  2. 「値集合ソース」をリレーションを設定した「性別」テーブルに。
  3. 「連結列」を 1 に。「性別」テーブルの id が 1 列目に存在するため。
  4. 「列数」を 3 に。これが「人」テーブルにおいて「性別id」を入力するときのコンボボックスの列数に対応。
  5. 「列幅」は、上記「列数」で表示した各々の列を表示するときの長さのこと。
  6. 「リスト幅」は、上記「列幅」の合計。

ここでよく忘れるのは「連結列」の設定。はじめて Access を使ったときわかりにくかった。列の順序で指定するというのも違和感を感じる。 (@_@;) 列の名称で設定する方法ってあるのかな?

090322-006-2

上記の状態だとテーブルにデータ入力するとき、「性別コード」「性別の名称」を見ながら入力できる。しかし、テーブルでデータを一覧するとき、性別id には性別コードではなくて id が表示されるのでちょっと見にくい。

 

そこで「列幅」の先頭を 0 cm に設定し、それに伴ない全体の「リスト幅」も 4 cm 変更してやる。

090322-008-2

これにより id が隱れ、性別コードが先頭に見えるようになる。加えて、テーブルの内容を一覧したとき、性別コードで表示されるので id よりは内容を理解しやすい。

 

クエリをルックアップ

上記ではルックアップする元がテーブルだった。(「値集合タイプ」がテーブル)。しかし、これだとルックアップ先を「連結列」、つまり順序で指定しているので、後にテーブルを変更したときに影響を与えてしまう可能性がある。

そのため、例えば以下のような「性別」に対するクエリ (q_性別) を作成しておき、「値集合タイプ」にこのクエリを参照させておく方がいいかな。

090322-011

 

「性別id」のルックアップの設定は、

  1. 「値集合ソース」をテーブルからクエリに変更
  2. 「連結列」を 3 に。 (クエリにおいて、id を 3 列目にしたため。)
  3. 「列幅」を 1cm, 3cm に変更。(3 列目の id の設定は不要。)

090322-012

これで元のテーブルを変更しても、クエリを変更していなければルックアップの設定に影響が及ばない。

 

フォームのコンボボックスにおけるルックアップの設定

追記 (2010.1.16) : フォームのコンボボックスにおけるルックアップの設定もテーブルのときと同様に考えればよい。

まずは、コンボボックスにしたいコントロールを「右クリック > コントロールの種類の変更 > コンボボックス」 を選択。

 

ルックアップするソースの設定
  1. コントロールの「プロパティ > データ」で 値集合タイプを「テーブル/クエリ
  2. 値集合ソースでルックアップしたいテーブルまたはクエリを選択。
  3. ルックアップしたいテーブルまたはクエリの主キーが 1 行目に設定されている場合、連結列を `1’ とする。

img01-16-2010[2].png

 

コンボボックスの表示の設定

表示されるコンボボックスの列を以下のようにしたいとする。

ID, CD, 名称

ただし、主キーである ID はユーザに見えないようにしたい。

先ほどのコンボボックスのプロパティにおいて書式タブを選択。

  1. 列数を 3
  2. 列幅で 3 列それぞれの長さを設定。ただし、1 列名の ID が表示されないように 0 とする。ここでは一々単位である cm を入力する必要はない。
  3. リスト幅は上記で設定した値の合計。

img01-16-2010[1].png

 

参考

 

関連記事

2009年3月21日土曜日

テプラの代わりにマスキングテープ

どこで読んだか忘れたけれど、「整理するときにテプラを使って綺麗にラベリングしておくのがいい」という内容の記事があった。確かに手書きだと字の汚なさ故に整理されていないという印象を与える。また、加えて手書きの字が読みにくいために、文字を認識するのに時間がわずかばかり余計にかかる。その点印刷された字は見やすくて読みやすい。

普段からよくメモ書きをする。書いたメモを内容ごとにクリアフォルダに入れて整理しているが、このラベル貼りにテプラを利用することにした。(cf. 本棚の整頓)

 

テプラでラベンリング

テプラを使うと流石に綺麗に整頓できた気になる。後で探すときもなぜか気分がいい。 ^^; 調子に乗って家の中にある棚の引き出しにもラベル貼り。家の中が整頓された気になる。手書きのときとは随分雰囲気が違う気が。

しかし、試用のテープが終わり、替えを購入しようと思ったら結構テープの値段が高いことに気がついた。これでは気軽に使えない。 (@_@;) クリアフォルダは 100 枚単位で購入しているので、これ全てにテプラで貼っていたらすぐにテープがなくなってしまう。

 

 

マスキングテープでラベリング

そこで代替として、消耗の激しいクリアホルダーに関してはマスキングテープを利用することにした。当初マスキングテープでは擦れたときにはがれてしまうかと思ったけれど全然はがれない。耐久性は十分だということがわかった。カラフルなので用途に合わせて選べるところもいい。 ^^

内容がコピーされない PDF ファイルを作成 (2)

内容がコピーされない PDF ファイルを作成する」の続き。

PrimoPDF と並んで定番の クセロPDF2 を使って PDF ファイルを作成していたときのこと。作成している途中でエラーが表示され、その後何をしても PDF を作成することができなくなった。エラーが表示されるけれどその意味が調べてもわからず。 (+_+) そこで別の PDF を作成するアプリを探すことに。

【レビュー】仮想プリンタとしてPDFファイルを作成 - オープンソースソフト「PDFCreator」 (1) に、おもしろそうな機能を持ったアプリが紹介されていた。

PDFファイルのほかにも、「JPEG」や「PNG」などの画像ファイルとして文書を変換できることが特徴的

オープンソースであることもよさげ。試しにこれを使ってみよう。やることは前回と同じように内容がコピーされないな PDF ファイルを作成すること。

 

インストール

PDFCreatorダウンロード から PDFCreator_XXXXX.setup.exe をダウンロードしてインストール。

 

方法

印刷をする操作において、プリンタのプリンタ名を PDFCreator に変更する。

090321-019

 

表示されたダイアログにおいて、Options ボタンを押す。

090321-021

 

Formats > Security において、以下をチェックして Save 。

  • Use Security
  • High
  • Password required to change permissions and passwords
  • Copy text and images
  • Modify the document
  • Modify comments

090305-002

 

パスワードを設定。

090305-003

 

印刷できなかった理由

後でわかったのだけれど、クセロPDF2 でエラーが表示された後に PDF を作成できなくなった理由は、エラーになったものがプリンタのスプールに溜っていたからだった。 (+_+) エラーになっていたものをキャンセルしたら、また PDF を作成できるようになった。

2009年3月20日金曜日

コンボボックス、セレクトボックスのキーボードショートカット

Access のコンボックス

090320-001久しぶりに Access を触ったら、コンボボックスのキーボードショートカットを忘れてしまった。 (+_+) テーブルの定義において、一々マウス使ってコンボボックスの内容を選択するのは面倒なので、昔読んだ本を読み返し。

コンボボックスからの選択操作にマウスと Alt + ↓ または F4 キーしか使えないならば、…

(はじめて作るAccessアプリケーション, p57 より、太字は引用者による)

 

ブラウザのセレクトボックス

Firefox

ブラウザのセレクトボックスでも同じショートカットが使えるのだろうかと思い、Firefox で試してみる。HTMLタグ/フォームタグ/セレクトボックスを作る - TAG index Webサイト にあるサンプルを使ったら、Access と同様に Alt + ↓ または F4 でセレクトボックスが開いた。

 

Chrome

Chrome では Alt + ↓ または F4 を押しても何の反応もなし。カーソルで内容を切り替えることはできる。ショートカットキーが違うのかな?

 

Opera

Opera では Alt + ↓ が使えた。F4 は別の操作のショートカットキーが割り当てられている。

 

Internet Explorer

Opera と同様 Alt + ↓ が使えた。

 

こうやって見ると Alt + ↓ が多くのアプリで使えそうなので、こちらで手を馴染ませておこうかなぁ。

 

コンボボックスとセレクトボックスの違い

こういう「リストから一つを選択する」ものに対する呼び方って、「コンボボックス」とか「セレクトボックス」て言うけれど、どちらが一般的なのだろうか? VB とか使っていると「コンボボックス」で、HTML のフォームだと「セレクトボックス」と言っているような気がするのだけれど。

Gallery lumber-mill - コンボボックス?セレクトボックス? によると、

コンボボックスは(ユーザの自由な入力を受け付ける点で)機能が大きく異なるため、混同しないようにすべきでしょう。

あ~、言われてみればそうだ。(@_@;)

 

また UltraExplorer が起動しなくなった

Gavotte Ramdisk をいじっていたら、急にブルースクリーンになり再起動。 (+_+) その後、UltraExplore が起動しなくなった。立ち上げようとすると、

an error occurred in the application

とダイアログが表示される。

以前にも UltraExplore が起動しなくなったことがある。そのときは、Google デスクトップのインデックスを作成しなおした後に直ったので、Google デスクトップが犯人かと思っていた。しかし、今回は Google デスクトップを終了してもダメ。

 

設定ファイルを手動で削除

コントロールパネルの「プログラムの追加と削除」から UltraExplorer をアンインストールした後、再度インストールしてもダメ。あ~、困ったなぁと思い、インストール先のフォルダを見てみたら、なぜか UltraExplorer の本体は消えていたけれど設定ファイルが残っていた。

念のためフォルダの中身を手動で全て削除し、再インストールしたら今度は起動することができた。 ^^ どうやらブルースクリーンになったときに、設定ファイルが壊れてしまったために起動できなくなっていたようだ。 (@_@;)

2009年3月19日木曜日

メモリを増設して、RAM ディスクを活用

PC にメモリを 2G 積んでいる。(cf. はじめての自作 PC の組立て) しかし、Firefox のアドオンを結構入れているので長時間使っているとこれでは厳しい。タスクマネージャを見ると Firefox だけで 300 ~ 600 M くらい消費しているのがわかる。(@_@;) 他にもたくさんアプリを起動しているので、反応が鈍くてイライラすることが多い。「じゃあ、Firefox アドオンを減らせよ」ということになるけれど、どれも捨て難し。 (+_+) 結局メモリを増設することにした。

 

認識される限界

調べてみると、32bit の OS では、いくらたくさんのメモリを搭載しても使えるのは 3G ちょっとのようだ。

32bit版のWindowsでは、それがXPであれVistaであれ、搭載できるメモリーは理論上4GBとなる。これは2の32乗が4ギガになるためで、絶対的な限界である。

(Vue Tips / Stardust Crossing より)

しかし、以前に余ったメモリを RAM ディスクとして活用できるという記事を読んだことがったを思い出し (cf. Gavotte Ramdisk インストール 設定方法 使い方 - GeekなNooblog) 、この際 2G を 2枚購入することにした。

今使っているのが 2G なので合わせて 6G の予定。問題は CPU クーラーが大きいため、今使っているメモリを活用できるかということだった。

 

4 枚挿せず

早速購入してメモリを取り付けてみたら、やはり CPU クーラー (ANDY SAMURAI MASTER SCASM-1000。マザーボードは GIGABYTE GA-MA78GM-S2H Rev.1.0) が巨大でメモリを 4 枚挿すことができなかった。 (+_+) 一度外せばはめることができそうにも見えたけれど、ちょっと面倒なのでやめた。 ^^;

DSC02237

 

タスクマネージャを見ると、3 G ちょっと認識されているのが確認できた。

090317-002

 

RAM ディスクの設定

次に余ったメモリを活用できるように設定。RAM ディスクに Firefox のキャッシュを置くことにした。上記のブログで紹介されていた Gavotte Ramdisk を使う。

まずは、Gavotte Ramdisk まとめWIKI – トップページ よりアプリをダウンロード。設定は、RAMディスク導入ガイド - @IT の説明に従った。

インストールの際にまず行うのは、パッケージに含まれているram4g.regというファイルを実行して、レジストリをシステムに登録する

後は、ramdisk.exe を起動して、Install Ramdisk を実行。

追記 (2010.1.11) : Vista の場合は、管理者として実行する必要がある。 (via VistaでGavotte Ramdiskを使う - ¥(エン)ジニア)

090317-003

 

その後、画面左側の OK ボタンが有効になるのでクリック。Disk Size は変更しなくても使えるだけ自動的に設定してくれるようだ。

090317-004

 

マイコンピュータを見ると、RamDisk-PAE(R:) が 1.74GB 領域を確保してくれたのがわかる。

090317-005

ただし、再起動した後、同様の操作をしたときはなぜか表示通り 16M が確保されただけだった。

 

Firefox の設定

先ほど作成した RAM ディスクの R:\TEMP をキャッシュディクレトリにすることに。

FireFoxのキャッシュディレクトリ変更 [Symplus Wiki] を参考にして、about:config でbrowser.cache.disk.parent_directory を新規作成し R:\TEMP を値として設定。

ん~、しかしこの設定はあまり効果を感じないなぁ。。。(@_@;)

 

トラブル

追記 (2010.3.29) : Vista で Disk Size を 3G にして再起動したら、PC が起動しなくなった。 (+_+) セーフモードで立ち上げ、Gavotte Ramdisk を実行し、Remove Ramdisk をして再起動したら元に戻った。

ところで、最近 Vista を起動し続けていると反応が極端に鈍くなる。 Gavotte Ramdisk を使わなくなっってから、そういう症状が表われていない。これが原因だったのかな?

2009年3月15日日曜日

Windows のパーティションのサイズを変更

Windows を再インストールし、ドライブレターがおかしくなってから随分経った。

当初、システムを入れていたドライブを小さ目のサイズにしていたが、インストールするアプリが増えるにつれて徐々に窮屈になってきた。ドライブをフォーマットしたとき、サイズを大きく設定しておくべきだったと今更ながら後悔。 (+_+)

フォーマットをしなくても、パーティションのサイズを変更できるソフトがあると聞いたことがある。面倒だったのでそのまま放置していた。しかし、「そろそろ限界だな」と思っていた矢先、

にアプリが紹介されていたので、これを機に試してみることに。

 

ダウンロードとインストール

EASEUS Partition Master Home Edition

より、Home Edition をダウンロードしてインストール。

 

パーティションサイズの変更

現状は D ドライブが 50G、C ドライブが 250G 割り当てられている。(上述の通り、ドライブレターが通常とは逆になっている。)

C ドライブ(容量が余っている方のドライブ)を選択して、ResizeMove ボタンをクリック。

090315-001

ドライブの容量を示すバーが表示されるので、左端をつかんで適当なサイズに設定。

090315-002

これにより D と C ドライブの間にスペースができた。

090315-003

次に D ドライブの設定。容量を示すバーの右端をつかんで目一杯広げる。

090315-004

下図のように設定されたので、後は Apply ボタンをクリック。再起動が促され、結構長い時間をかけて実際にドライブの容量を変更してくれた。

090315-006