2009年3月31日火曜日

Access でデータベースを分割する

1. データベースの分割

Access では、入力フォームとテーブルを、別々のデータベースに分割することができる。

Microsoft Access – Wikipedia によると、

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

自動的に分割する

データベースの分割を行うには、メニューより

  • ツール > データベース ユーティリティ > データベース分割ツール

これにより、データを含むバックエンドのデータベースを自動で作成してくれる。

 

手動で分割

これに対して、

には、手作業でデータベースを分割する方法が説明されている。

簡単に方法をまとめると、

  1. 分割前のデータベースから、テーブルだけを別のデータベースにインポートする。(バックエンド)
  2. 分割前のデータベースから、フォームとクエリを別のデータベースにインポートする。(フロントエンド)
  3. リンクテーブルの機能により、フロントエンドから、バックエンドのデータベースにあるテーブルを指定する。

3399710217_747a9bbee1

データベースを分割するメリットは、次のように述べられている。

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

(Access 2002 または Access 2003 で Microsoft Access データベースを手作業で分割する方法 より)

 

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

バックエンドデータベースに一度リンクした後、フォームを別のデータベースに接続したい場合は、メニューより

  • ツール > データベース ユーティリティ > リンク テーブルマネージャ

において、「リンク先を更新するためのプロンプトを毎回表示する」にチェックを入れ、更新が必要なリンクを選択して 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 が重くなってきたので新しくプロファイルを作成

1. Firefox の動作が重い

Firefox が最近すごく重い。 (+_+) アドオンを入れてないときはサクサクと動いていた。色々と軽くする方法を試してみたけれど、今一効果がなかった。

新しくプロファイルを作成するのが良い。しかし、各アドオンを設定しなおすことを想像すると、二の足を踏む。

 

2. 新しいプロファイルの Firefox は軽い

思い切って、新しくプロファイルを作成した。新たにプロファイを作り直した Firefox の動作は軽い。^^  これまでと同じアドオンをインストールし直しても、動作が軽い。

プロファイルを作りなおして正解だった。プロファイルの新規作成がモッサリフォックスには一番効く。

 

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

プロファイルを新しくしたので、面倒がらずに全てのアドオンをインストールし、各設定を行なった後に、FEBEを使いバックアップした。

Foxmarks Bookmark Synchronizer を使っている場合、プロファイルをまるごとバックアップすると、まずいかも。

090328-004

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

これで、新しくプロファイルを作成する必要に迫られたとき、楽ができる。

 

関連記事

2009年3月24日火曜日

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

1. VBA で関数の動作を調べたい

試したい関数があるとき、

  1. フォームでコマンドボタン作り
  2. 関数をボタンを押したのイベントに記述し、
  3. MsgBox で出力する

という方法は手間がかかる。

 

2. イミディエイトウィンドウを使う

データベースウィンドウで右クリック > 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 でルックアップの設定 - テーブル定義とフォームにおけるコンボボックスにおいて

1. テーブル定義とリレーションシップの設定

「人」と「性別」テーブルがある。

「人」テーブルの「性別id」が、「性別」テーブルの「id」を参照する。

090322-003

「性別」テーブルの内容は、以下の通り。

090322-002

id はシステムが自動的に割り当てる数値。CD は性別コード。 id は不変とし、性別コードはユーザが変更可能な値とする。

ルックアップを利用しないで、「人」テーブルにデータを入力する場合、「人」テーブルの「性別id」に、「性別」テーブルの「id」に存在する値を、直接入力しなければならない。

090322-004

 

2. テーブルにおけるルックアップの設定

ルックアップの機能を利用しないと、性別を入力しにくい。

「人」テーブルにおいて、「性別id」フィールドの「ルックアップ」を設定する。

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

よく忘れるのは「連結列」の意味。本来、RDB の列に順序はない。

090322-006-2

ルックアップの設定をした場合、「性別コード」を入力するとき、「性別の名称」を確認しながら入力できる。ただし、「人」テーブルのデータを一覧するとき、性別id には性別コードではなくて id が表示されるのでわかりずらい。

そこで、「列幅」の先頭を 0 cm に設定し、全体の「リスト幅」を 4 cm に変更する。

090322-008-2

これにより id が表示されなくなり、性別コードが先頭に見える。テーブルの内容を一覧したとき、性別コードで表示されるため、データの内容を把握しやすい。

 

3. クエリをルックアップ

上記の例では、ルックアップする先が「テーブル」だった。(「値集合タイプ」がテーブル)。

ルックアップ先は、「連結列」、つまり順序で指定している。このため、ルックアップ先のテーブルの列の順序を変更すると、影響を与える。

そのため、「性別」に対するクエリ (q_性別) を作成しておき、「値集合タイプ」でクエリを参照する方が良い。

090322-011

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

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

090322-012

これにより、元のテーブルを変更しても、ルックアップの設定に影響が及ばなくなる。

 

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

追記 (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日金曜日

コンボボックス、セレクトボックスのメニューを開くためのショートカットキー

1. コンボックスを開くためのショートカットキー

Access でテーブルを定義するとき、データ型はコンボボックスで選択する。

一々マウス使い、メニューから選択するのは面倒。

090320-001

「はじめて作るAccessアプリケーション」(p57) によると、

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

(太字は引用者による)

 

2. ブラウザのセレクトボックスを開くためのショートカットキー

セレクトボックスを表示するために、

にあるサンプルを用いた。

Firefox
Firefox では、
  • Alt + ↓
  • F4

でセレクトボックスが開いた。Access のコンボボックスのショートカットキーと同じ。

 

Google Chrome
Google Chrome では、
  • Alt + ↓

F4 を押しても反応なし。カーソルキーで、セレクトボックスのメニューのフォーカスを切り替えることはできる。

 

Opera
Opera では
  • Alt + ↓

F4 は、別の操作のショートカットキーが割り当てられている。

 

Internet Explorer

IE は、Opera と同様
  • Alt + ↓

 

Alt + ↓  のショートカットキーはどのブラウザでも使える

比較してみると、 Alt + ↓ が多くのアプリで使えるようなので、こちらで手を馴染ませておこうか。

しかし、Firefox は、F4 でセレクトボックスを開くことができるのは楽。

 

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

「リストから一つを選択する」

UI の名称は、「コンボボックス」や「セレクトボックス」と呼ばれる。

どちらが一般的な名称なのだろう?

VB では「コンボボックス」と呼ばれ、HTML のフォームだと「セレクトボックス」言う。

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

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

コンボボックス - Wikipedia

ドロップダウンリストまたはリストボックスを1行のテキストボックスと組み合わせたもので、ユーザーは値を直接入力することもできるし、既存のオプションから選択することもできる。グラフィカルなウェブブラウザのアドレス入力バーは、一般にコンボボックスになっている。

ユーザが入力できるリストがコンボボックス。

List box - Wikipedia

A list box is a GUI widget that allows the user to select one or more items from a list contained within a static, multiple line text box.  …

  • Drop down list - Like a list box, but not permanently expanded to show the elements of the list.
  • Combo box - Like a drop down list, but users also can make entries not on the list.

また 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