2010年06月10日

クエリでの書き込みを禁止するには

Access中級講座で頂いたご質問

Accessではデータはテーブルに保存されますが、このテーブルのデータは、クエリやフォームからでも修正することができます。

システム管理者が作成したAccessのシステムを、Accessの操作に慣れていないユーザーに配布する場合には、誤ってクエリからデータが修正されないように、クエリでの編集を禁止したいケースもあります。

この場合は例えばクエリのプロパティを利用する方法があります。

(手順)〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
1)クエリをデザインビューで開きます。

2)[表示]メニューから[プロパティ]を選択し、プロパティの画面を表示します。

ヒント:プロパティが 「クエリのプロパティ」ではなく「フィールドのプロパティ」になっている場合は、フィールドリストやデザイングリッド以外の部分をクリックすると「クエリのプロパティ」が表示されます。

3)プロパティから「レコードセット」を「スナップショット」に変更します。

ヒント:初期設定ではダイナセットが表示されています。ダイナセットを利用すると、一部の場合を除いてデータの編集が可能ですが、スナップショットはデータの修正ができなくなります。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

設定ができたらクエリを実行して結果を確認します。
レコードを追加するための「*」マークの行が表示されず、データの修正もできなくなります。

AccessはExcelに比べて、体系的な習得には手間がかかる一方、
ちょっとしたデータ編集ならば、Excelと似た操作で出来てしまう
手軽さもあります。

そのため「レコードの保存がどのタイミングで確定するか」を調べないままで修正作業を行ってしまうケースも多いようです。

Excelでは、シート内のデータを変更しても、ブック(ファイル)を保存せずに閉じれば、修正内容は破棄されますが、
Accessでは通常、1レコードずつデータが保存されていきますので、ここがExcelとは大きく異なります。

Accessのデータを、操作に慣れない担当者に配布する場合には、その「データが保存されるタイミング」について、説明した上で配布した方が安全なデータの活用が出来ると思います。

posted by Three bit com at 18:00| Access(アクセス)

2010年05月19日

SQLのWHERE句

つい先日SQLについて書いたところ、早速セミナーでもSQLの基本に関するご質問を頂きました。

Accessを学習し始めて最初に覚えておいた方がよいSQLというとWHERE句ではないでしょうか。
クエリのデザインビューで言うと「抽出条件」の欄に入力した部分が、SQL文のWHERE句(WHEREで始まる部分)に変換されます。

ごく簡単な例を書いてみます。

(抽出条件1)
 数値型の「顧客ID」フィールドの値が 100 と等しいデータ
(WHERE句の例1)
 WHERE 顧客ID = 100

(抽出条件2)
 テキスト型の「顧客名」フィールドの値が文字列 花子 と等しいデータ
(WHERE句の例2)
 WHERE 顧客名 = "花子"

SQL文の中で文字列データは半角の " " で囲みます。
VBAのプログラムの中で " " を使って囲む場合は " " を ' ' に修正します。

(VBAで利用する場合の例)
 "WHERE 顧客名 = '花子'"

クエリのデザインビューで抽出条件を入力し、SQLビューで確認すると、WHEREに続けてどのような記載になるかを確認することができます。
SQLビューでは以下のように ( ) や テーブル名も追加されます。

(AccessのSQLビューの例)
 WHERE (((顧客マスター.顧客名)="花子"));
(意味)
 「顧客マスター」テーブルの中にある「顧客名」フィールドの値が、文字列 花子 と等しいデータ

意外に多いミスは半角と全角の入力ミスです。
「WHERE」や文字と文字の間に入る空白などは半角になります。
WHEREを小文字の where と書いても動きますが、
全角で WHERE と書くと動きません。

Accessの表示が初期設定で「MS Pゴシック」になっているので、全角と半角の違いが画面上で見分けにくく、スペースキーで半角に変換して入力していると、ついつい間違えてしまうことが多いようです。

「どう見ても合っていると思うのになぜかエラーになってしまう」
というような場合は、もう一度入力し直してみてください。

Accessを使っていると、グループ集計、クロス集計、マクロなどで「WHERE条件」という言い方で抽出条件を指定させる機能があります。
SQL文のWHERE句について理解しておくと、AccessのWHERE条件も入力がしやすくなることと思います。




posted by Three bit com at 10:00| Access(アクセス)

2010年05月12日

SQLの勉強

ブログのシステムが整わず、記事投稿を長らくお休みしていましたが、ようやく準備が整いましたので再開することになりました。
セミナーで頂いたご質問の紹介や、開発、IT関連ほか、色々書いていきたいと思っています。
どうぞよろしくお願いいたします。

大分前のセミナーになりますが、AccessのSQLの学習方法についてご質問を頂いたことがあります。
ブログでもSQLについて紹介していきたいとお約束していましたし、つい先日のセミナーでも類似のご質問を頂きました。
記事投稿の再開にあたりSQLの習得に関連することに少し触れてみたいと思います。

Accessはクエリの「SQLビュー」を使えば簡単にSQL文を調べることができますので、SQLの勉強はとかく後回しにされることが多いように思います。
私自身のことを振り返ってSQLを勉強しておいて分かりやすかったことと言えば、例えばSum関数などの利用方法です。

Excelを使う時のような感覚でレコードのフィールドの一つにCount関数やSum関数の結果を表示して演算に使用したくなる場合があります。
Sum関数だけを使って合計だけを求めるのであれば、例えば以下のようなSQL文で結果が求められます。

(例)
SELECT Sum([金額]) AS 売上 FROM T_受注;
(意味)
「T_受注」テーブルから、[金額]フィールドの合計を求め、「売上」というフィールド名で表示する。

ところが、この「SELECT」の後ろに他のフィールドを追加したとします。

(間違った例)
SELECT 受注ID, 金額, [金額]/Sum([金額]) AS シェア FROM T_受注;

気持ちとしてはExcel風に
「受注IDごとに、その売上金額のシェアを求めるつもり」
なのですが、このクエリ(SQL)を実行しようとすると次のようなエラーが返ってきます。

「集計関数の一部として指定された式'受注ID'を含んでいないクエリを実行しようとしました。」

ヘルプを見ると

「指定した式を集計関数やグループ化の一部として指定せずにクエリを実行しようとしました。」というエラー解説が出てきます。

集計関数とはSumやCountのような集計を行う関数のことです。

「集計関数の一部」として利用する方法とは、
以下の[数量]や[定価]のようにSum関数の引数としてフィールド名を指定することが出来る
という意味になります。

(例)
SELECT Sum([数量]*[定価]) AS 売上 FROM T_受注;

もう一つの「グループ化の一部」として利用する場合は、
グループ化のSQL文「GROUP BY」 に続けてそのフィールド名が指定されているならば「SELECT」の後に続けて記載が可能
というものです。

(例)
SELECT 受注ID, Sum(金額) AS 売上 FROM T_受注 GROUP BY 受注ID;
(ポイント)
SELECTとGROUP BYの両方の後ろに「受注ID」が記載されています。)

Accessには、Excelと似た使い方が出来るところが沢山あり、比較対照しながら覚えると早くマスター出来ます。
この知識は業務処理を行う際に、ExcelとAccessのどちらを使った方がよいかの判断に繋がり役立ちます。

ですがクエリの難易度が上がってきた場合には、SQLの知識もあると、ExcelとSQLの違いの切り分けが出来るようになり、SQLのルールに照らして
「これは出来る」
「これは出来ない」
などの判断が素早くできるようになり、作成効率が上がってくると思います。

SQLの学習には一般にOracleの資格が利用されることが多いと思います。
エンジニアを目指される場合にはお勧めですが、Accessの作業を効率化したいだけでしたら、時間がある時にクエリのSQLビューを少しずつ見ておき、ある程度頭に入ってきたら参考書などで体系的に学習するのもよいと思います。

posted by Three bit com at 10:00| Access(アクセス)

2009年02月27日

パラメータクエリ

Accessのパラメータクエリを実行する際に、パラメータ入力のダイアログボックスで何も条件を入力しないでOKボタンを押すと、レコードは何も表示されません。

ユーザーの気持ちとしては「無条件」なので「全データが表示される」ことを期待すると思いますが、パラメータクエリでは条件は基本的には指定しなければ正しく実行されません。 

パラメータクエリで条件入力をしなかった場合に、全データが表示されるようにする方法があります。

例えば、「商品」フィールドの抽出条件欄に以下のようなパラメータを入力したとします。

 [商品名を入力してください。]

「商品」フィールドの抽出条件2行目にあたる「または」に以下のように入力します。

 [商品名を入力してください。] Is Null

Is Null は小文字で入力しても認識されますが、]の右側に来るスペースと、IsとNullの間のスペースは半角で入力する必要があります。
また、Is の入力は省略をすることができませんので注意が必要です。

作成時にパラメータクエリを作成すると本番運用前の動作確認時にもいちいち条件を入力しなければならず面倒だと感じることがあります。
そんな場合にも知っておくと便利ですね。
posted by Three bit com at 10:00| Access(アクセス)

2009年02月20日

主キーと複合キー

Accessテーブルのデザインビューで主キーを設定する場合、ツールバーから主キーボタンを押して設定を行います。

主キーは2つのフィールドに対しても設定することができます。
1つのフィールドだけではレコードを一意に特定することが出来ない場合に、複合キーとして2つ以上のフィールドをペアで主キーにします。

作業手順は、デザインビューで複合キーにしたいフィールドをCtrlキーを押しながら全て選択します。
Ctrlキーを押すと離れたところにあるフィールドを選択することができます。

複数のフィールドを選択後にツールバーから主キーを選択すると、複合キーとして設定することができます。

注意事項としては複合キーを設定すると、データ量が多くなってくるとパフォーマンスが落ちる場合があります。そのテーブルを使った将来的な利用状況なども想定して複合キーを設定するか、あるいは別途主キーとなるフィールドを作成するか検討することをお薦めします。
posted by Three bit com at 10:00| Access(アクセス)

2009年02月04日

ExcelからAccessへのインポートエラー

Excel(エクセル)のデータをAccess(アクセス)に移行する際に、Accessの「インポート」コマンドを使用することができます。
その際に一部のデータがAccessのテーブルにインポートできないことがあります。

この作業で躓いてしまい、仕事持込セミナーやAccess関連の講習会にご参加頂くケースもあります。
色々な原因が考えられますが、例えばExcelで行内改行(Alt+Enterキー)をしているデータがエラーになってしまう場合があります。

特に行の高さを狭めていると目で見ても分からないため、データ件数が多い場合には困ります。
対応策として例えばCLEAN関数を使うと便利です。

A1に行内改行が挿入されている場合、B1に次の式を入力します。
=CLEAN(A1)

Alt+Enterで入力した改行をこれだけで取り除くことができますので、インポート時にエラーが出るようであれば、可能性のありそうなフィールド・レコード全てに同様の処理を行ってからAccessでインポートをしてみてください。

Accessのシステム完成後にデータの移行がうまく行かず、システム運用開始に時間がかかるケースを非常に多く拝見します。

初めてシステムを作成する場合には、ついつい後回しになりがちなデータのクリーニング作業ですが、システムを作成しながら、平行して早い段階でデータのチェックもしておきたいですね。
posted by Three bit com at 10:00| Access(アクセス)

2009年01月17日

未定の関数エラー

Access(アクセス)のヘルプにも出ている関数を使っているし、他の人のPCではちゃんと動くのに、自分のPCではなぜか動かない、というご質問をAccess関連のセミナーで伺うことがあります。

拝見してみると、
Access(アクセス)のクエリを開こうとすると
「式に未定義関数 '○○○' があります」
というエラーが表示されて実行できないケースです。

この場合、まず確認して頂きたいのが「参照設定」です。
Alt+F11を押して、VBEを起動して、[ツール]メニューから[参照設定]を確認してください。

[参照設定] ダイアログボックスに
[参照不可:○○○・・・] という項目にチェック ボックスがオンになっている参照があるようでしたら、その参照へのチェックボックスをオフにするとエラーが出なくなります。
posted by Three bit com at 10:00| Access(アクセス)

2009年01月09日

レポートの背景色

Accessのセミナーで、レポートに罫線を効率的に作成する方法をご質問頂くことが少なくありません。

Access以外の例えばVB、VB.NET、PHPなどを使ってWindowsフォームやWebアプリを作成する場合を考えると、それでもAccessのレポートはずっと簡単なのですが、Excel(エクセル)の簡便さに比べると、やはり手間がかかるという印象は強いように思います。

罫線を作成する代わりに、VBAを使って背景色を1行おきに変更して対処している例をよく拝見します。

考え方のポイントで基本となるのは
レポート「詳細」セクションの「フォーマット時」イベント
だと思います。

レコードを1行ずつ読み取るごとに「フォーマット時」というイベントが発生しますので、フォーマット時イベントに、
例えば、奇数行ならば、詳細セクションの背景色をグレーにし、それ以外なら(偶数行なら)、詳細セクションの背景色を白くする、という考え方になります。

色々な書き方がありますが、例えば簡単な例を1つ書いてみると以下のようになります。

Dim i As Long  'この行は宣言セクションに記載します。

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
  i = i + 1
  If i Mod 2 = 1 Then '2で割った余りを求め、それが1と等しいかどうか判断しています。
    詳細.BackColor = 16777215  '白
  Else '条件に該当しない2で割った余りが 0となる場合です。偶数行が該当します。
    詳細.BackColor = 12632256 'グレー
  End If
End Sub

1レコードずつ読み取られてる度にフォーマット(Format)イベントが発生することを理解しておくと、他にも活用範囲が広がりますので、レポートの大事なイベントの一つだろうと思います。

posted by Three bit com at 10:00| Access(アクセス)

2008年11月12日

テーブル名、フィールド名

Access(アクセス)のテーブル名、フィールド名、あるいはクエリ・フォーム・レポート・テキストボックスを初めとする各種コントロールの名前にスペースやハイフン(-)が入っているケースをよく拝見します。
例えば、受注テーブルに 顧客コード と 取引先コード を含める目的で

顧客 コード と 取引先 コード
あるいは
顧客-コード と 取引先-コード

といった定義をしている場合などがありますが、
空白は2つが別のフィールドであるように見えます。
ハイフンは演算子の一つ、マイナスと同じになります。

そのため上記のように定義してしまうと、これらのフィールドを使ってクエリの演算フィールドを定義したり、 フォームの演算コントロールを作成したり、あるいはマクロやVBAの中でこれらのフィールドをそのまま記載してしまうとトラブルが起きるか、あるいは作成に一手間増えてしまうことがあります。

フィールド名の途中で空白を空けたほうが見やすい場合は、空白の代わりに半角のアンダースコア( _ Shift+ひらがなの「ろ」のキー)を使うことをお薦めしています。

上記の例では 顧客_コード と 取引先_コード のように命名することになります。

英語名を使う場合には、区切りとなる文字に大文字を使用している例をよく拝見します。
アンダースコアの方が見やすければアンダースコアに変えてもよいと思います。

社内あるいは同一部署内では、こうした命名ルールは決めておいた方が、後任に引き継ぐときや、同じシステムに複数の担当者が関わるときにも都合がよいと思います。
posted by Three bit com at 10:00| Access(アクセス)