日付時刻型フィールドは、日付と時刻を一緒に格納できますが、日付のみを格納したり、時刻のみを格納する場合などもあります。
格納されている内容により、条件抽出が思ったようにできない場合がありますので、いろいろな場合の抽出パターンを例に示します。
このデータに対して、条件抽出を行います。
・日付と時刻が格納された項目の抽出
基本的なパターン。日付と時刻が格納されている項目を抽出する場合は、日付と日時の両方を指定します。
SQLのWHEREだと、
WHERE T日時.日付 = #2014/1/12 12:34:56#
となります。
日付時刻型の値を記述するときは、「#」でくくります。
文字列の場合の「"」(ダブルクォーテーション)のようなものです。
結果。
同じ日付時刻のレコードが抽出されました。
日付時刻が格納されている項目に対しては、日付と時刻が一致しないと抽出されません。
日付のみを指定した場合や、
WHERE T日時.日付 = #2014/1/12#
時刻のみを指定した場合は、
WHERE T日時.日付 = #12:34:56#
抽出されません。
・日付のみが格納された項目の抽出
日付のみの場合は、条件も日付のみを指定します。
SQLだと、
WHERE T日時.日付 = #2014/01/13#
と、なります。
結果。
日付に加えて、日時を付けてしまうと、
WHERE T日時.日付=#2014/01/13 12:00:00#
抽出されません。
ただし、日付のみが格納されている場合、内部的に時刻は「00:00:00」となっているので、
WHERE T日時.日付=#2014/01/13 00:00:00#
の場合は、抽出できます。
・時刻のみが格納された項目の抽出
時刻のみが格納されている場合は、条件も時刻のみを指定します。
SQLだと、
WHERE T日時.日付 = #15:12:45#
と、なります。
結果。
日付を付けてしまうと、
WHERE T日時.日付 = #2014/1/2 15:12:45#
抽出されなくなります。
時刻のみの場合も、日付部分は内部的に「1899/12/30」となっているので、
WHERE T日時.日付 = #1899/12/30 15:12:45#
の場合は、抽出されます。
・Betweenを使う場合
Betweenを使い、範囲で条件抽出を行う場合も、時刻が含まれているかどうかで、結果が変わってきます。
テストデータはこちら。
時刻がないパターンと、日付と時刻があるパターンです。
日付のみの「T日時A」テーブルに対して、条件
WHERE T日時A.日付 Between #2014/3/15# And #2014/3/17#
で、抽出を行うと、
2014/03/16から2014/03/17までのレコードが抽出されます。
これと同じ条件式を使って「T日時B」に対して抽出を行うと、
2014/03/17分のレコードが抽出できません。
Between #2014/3/15# And #2014/3/17#
と言う条件式の記述は、時刻部分が省略されていて、省略せずに記述すると、
Between #2014/3/15 0:0:0# And #2014/3/17 0:0:0#
と、なります。2014/03/17 0:0:1以降は、この条件の範囲外となり、抽出することができません。
データに時刻が含まれている場合は、
Between #2014/3/15 0:0:0# And #2014/3/17 23:59:59#
とする必要があります。
(「2014/3/15 0:0:0」は省略して、「2014/3/15」としてもかまいません)
以上のように、日付時刻型のフィールドがある場合は、時刻が含まれるかどうかで扱いが変わってきます。
グループで開発を行う場合は、仕様をしっかり把握しておく必要があります。
蛇足ですが、日付と時刻が格納されている項目を、「2014/3/15」で条件抽出する場合は、
WHERE T日時B.日付 Between #2014/3/15 0:0:0# And #2014/3/15 23:59:59#
と言う条件式になります。
たまにこれを、
WHERE Format(T日時B.日付,'yyyy/mm/dd') = '2014/03/15'
と言う条件式を書く人がいます。
上のBetweenより簡潔に書けるからだと思いますが、この条件式の場合、すべてのレコードに対して、Formatの処理が行われますので、Betweenよりパフォーマンスが悪いと言えます。
ただ、日付と時刻が格納されている項目で、時刻のみを範囲で抽出したい場合、例えば、日付にかかわらず、13:00から18:00まで(厳密には17:59:59まで)のレコードを抽出する場合は、
WHERE TimeValue(T日時B.日付) between #13:00:00# and #17:59:59#
と言うように、TimeValueで時刻のみを取り出してから、範囲抽出する必要があります。
パフォーマンスに問題が出る場合は、別に時刻のみを格納する項目を設けるなどした方が良いと思います。
・DoCmd.OpenQueryは、あらかじめ作成されたクエリを指定して実行します。
・DoCmd.RunSQLは、あらかじめ作成されたクエリを指定して実行することはできません。
・DoCmd.RunSQLは、パラメタに指定されたSQL文を実行します。
・DoCmd.OpenQueryは、SQL文を直接指定することはできません。実行するSQL文をクエリとして登録しておく必要があります。
・DoCmd.OpenQueryは、選択クエリ(SELECT)、アクションクエリ(UPDATEなど)を実行できます。
・DoCmd.RunSQLは、アクションクエリ(UPDATEなど)のみ実行できます。
・DoCmd.OpenQueryで選択クエリ(SELECT)を指定した場合、結果がデータシートで表示されます。
・DoCmd.RunSQLは、選択クエリ(SELECT)を実行できません。
上記のことから、DoCmd.RunSQLの使いどころは、VBAでアクションクエリのSQLを作成し、それを実行する場合になるかと思います。
・構文
DoCmd.RunSQL SQLStatement , UseTransaction
・引数
SQLStatement ・ SQL文を文字列で指定します。
実行可能なSQLは、INSERT INTO、DELETE、SELECT...INTO、UPDATE、CREATE TABLE、ALTER TABLE、DROP
TABLE、CREATE INDEX、DROP INDEXです。
UseTransaction ・ トランザクションに含める場合、Trueを指定します。デフォルトFalse
リファレンスにこう書いてあるので、トランザクション処理ができそうな感じがするのですが、DoCmdでトランザクション処理を行う方法はわかりません…。(できないっぽい)
・例
UPDATEのSQL文を実行する例です。
DoCmd.RunSQL "UPDATE TMCHIHO SET BIKO = 'TEST' "
パラメタにSQL文を指定して実行します。
このまま実行すると、
普通にクエリを実行したときと同様に、確認メッセージが表示されます。
「はい」をクリックすると、実行され、テーブルの内容が更新されます。
「いいえ」をクリックした場合、
エラーが表示され、実行が中断されますので、エラー処理を入れておく必要があります。
確認メッセージを表示させたくない場合は、事前に、
DoCmd.SetWarnings False
を実行しておくと、表示されなくなります。
元に戻すには、
DoCmd.SetWarnings True
です。
クエリを実行する方法として、DoCmd.RunSQLとDoCmd.OpenQueryを取り上げましたが、これらはあくまで簡易的な方法だと私は思っています。
処理として実装する場合は、ADOを使った方法をおすすめします。
ナビゲーションウィンドウ(2003以前はデータベースウィンドウ)から、クエリをダブルクリックしたときと同じ動作をさせる場合は、DoCmd.OpenQueryを使用します。
・構文
DoCmd.OpenQuery QueryName , View , DataMode
・引数
QueryName ・ 開く(実行する)クエリの名前を文字列で指定します。必須。
View ・ クエリをどのビューで開くか、下記のAcViewクラス定数で指定します。省略可。
名前 | 値 | 説明 |
---|---|---|
acViewDesign | 1 | デザイン ビュー |
acViewLayout | 6 | レイアウト ビュー |
acViewNormal | 0 | (既定値) 標準表示 |
acViewPivotChart | 4 | ピボットグラフ ビュー |
acViewPivotTable | 3 | ピボットテーブル ビュー |
acViewPreview | 2 | 印刷プレビュー |
acViewReport | 5 | レポート ビュー |
普通にクエリを開く場合は、acViewNormalです。
DataMode ・ クエリを開いて表示されたデータシートに対する入力モードを、下記のAcOpenDataModeクラス定数で指定します。省略可。
名前 | 値 | 説明 |
acAdd | 0 | 新規レコードの追加のみ。 データシートにクエリの結果が表示されず、新規追加の行のみ表示されます。 クエリの結果を参照したり、編集したりはできません。 |
acEdit | 1 | クエリの結果の参照、および編集(追加)ができます。(既定値) 普通にクエリを開いたときの状態です。 |
acReadOnly | 2 | クエリの結果の参照のみ可能です。 編集や追加はできません。 |
選択クエリ(SELECT)を開く場合は、
DoCmd.OpenQuery "クエリSELECT", acViewNormal, acEdit
と、記述します。「クエリSELECT」は、開くクエリの名前です。
実行すると、上図のように、クエリの結果がデータシートビューで表示されます。
更新クエリ(UPDATE)を開く場合ですが、
DoCmd.OpenQuery "クエリUPDATE", acViewNormal
と、記述して実行します。
アクションクエリをダブルクリックして実行した場合と同様に、
「更新クエリを実行すると、テーブルのデータが更新されます。」と言う確認メッセージが表示されます。
その後、さらに更新件数と、更新実行の確認メッセージが表示されます。
これを表示させたくない場合は、
DoCmd.SetWarnings False
を使用します。確認メッセージ無しで、最後まで実行されます。
更新クエリなどのアクションクエリの場合は、引数にどれを指定しても、データシートビューのウィンドウは表示されません。クエリが実行されるのみです。
DoCmd.OpenQuery利用する場合、あらかじめクエリを作成しておく必要があるので、VBAでSQLを組立てて実行する用途には向いていません。
また、アクションクエリを実行する場合は、トランザクション処理が行えません。
簡易的な方法として利用する場合は良いのですが、きちんとした更新処理を記述するのには向いていないと思います。
上記理由から、更新系の処理を行う場合は、他の方法をお勧めします。
選択クエリの内容を画面に表示させたい場合のみ、DoCmd.OpenQueryを利用するようにした方が良いと思います。
テーブル・クエリなどのウィンドウに切り替えたい場合は、DoCmd.SelectObjectを使用します。
・構文
DoCmd.SelectObject ObjectType , ObjectName , InNavigationPane
・引数
ObjectType … 必須。オブジェクトの種類を、AcObjectTypeクラスの定数で指定します。
名前 | 値 | 説明 |
acDatabaseProperties | 11 | Database プロパティ |
acDefault | -1 | |
acDiagram | 8 | データベースダイアグラム (Access プロジェクト ) |
acForm | 2 | フォーム |
acFunction | 10 | 関数 |
acMacro | 4 | マクロ |
acModule | 5 | モジュール |
acQuery | 1 | クエリ |
acReport | 3 | レポート |
acServerView | 7 | サーバー ビュー |
acStoredProcedure | 9 | ストアドプロシージャ (Access プロジェクト ) |
acTable | 0 | テーブル |
acTableDataMacro | 12 | データ マクロ |
ObjectName … 選択するオブジェクトの名前を文字列で指定します。
InNavigationPane … データベースウィンドウの項目を選択する場合はTrue、開いているウィンドウを選択する場合はFalse(既定値)を指定します。
例えば、テーブル「TMTDFK」を選択する場合は、
DoCmd.SelectObject acTable, "TMTDFK", False
と、します。
現在のウィンドウが最大化されていない状態で、最小化されているウィンドウを選択しても、ウィンドウは最小化されたままになります。
この場合は、選択後DoCmd.Restoreなどを行う必要があります。
・最大化
DoCmd.RunCommand acCmdAppMaximize
その他、ACCESSウィンドウ操作関連です。
・最小化
DoCmd.RunCommand acCmdAppMinimize
・元のサイズに戻す
DoCmd.RunCommand acCmdAppRestore
他に、ウィンドウサイズの変更、ウィンドウの移動を行う、
DoCmd.RunCommand acCmdAppMove
DoCmd.RunCommand acCmdAppSize
も、あるのですが、パラメタを指定して、目的の状態にするのではなく、その操作を行う状態にするだけで、移動やサイズ変更の操作が必要になります。
実質的に、これは使えないと思います。
あと、DoCmd.RunCommandは、ACCESSのバージョンが古いと、使えないかも。
確認は、2010で行っています。
設定できる内容は、以下の3つ。
設定値 | 内容 |
ダイナセット | 1 つのテーブルまたは一対一のリレーションシップが設定されたテーブルのフィールドに連結されているコントロールを編集できます。一対多のリレーションシップが設定されたテーブルのフィールドに連結されているコントロールの場合は、テーブル間で連鎖更新 (連鎖更新: テーブル間に参照整合性が設定されているリレーションシップにおいて、主テーブルでレコードを変更すると、関連テーブルのすべての関連レコードが更新されることです。)が有効に設定されていない限り、"一" 側の結合フィールドからデータを編集することはできません。(既定値) |
ダイナセット (矛盾を許す) | フィールドに連結されたすべてのテーブルとコントロールを編集できます。 |
スナップショット | フィールドに連結されたテーブルまたはコントロールは編集できません。 |
内容は、ヘルプから引用しました。
各設定値の内容を、順に説明します。
・ダイナセット
デフォルトはこの設定になっています。
データソースのクエリで、テーブルを連結している場合、1対1の場合は結合項目の値を直接変更することが可能です。
1対多の場合は、「1」側の結合項目の値を変更することはできません。
ただし、リレーションシップの設定で、連鎖更新の設定がされている場合は、変更可能です。
具体的には、以下の通り。
データは、都道府県テーブル(TMTDFK)と地方テーブル(TMCHIHO)。
都道府県テーブルには、地方コード(CHIHOCD)項目があり、都道府県がどの地方になるのかを示します。
地方テーブルは、地方コードと地方名の一覧です。
このテーブルをクエリで結合して利用します。
都道府県テーブルの地方コードで、地方テーブルを参照し、地方名をひっぱってきます。
この場合、地方テーブルが「1」、都道府県テーブルが「多」となる、1対多の結合です。
リレーションシップは設定していません。
このクエリを元に、フォームを作成します。
左側の3項目は、都道府県テーブルの項目です。
右側の2項目は、地方テーブルの項目です。
1対多の、「1」側の項目である、地方テーブルの地方コードを変更しようとします。
そうすると、下のステータスバーに、変更できない旨のメッセージが表示されます。
ダイナセットが指定されている場合は、このような制御がかかります。
ちなみに、「多」側である、都道府県テーブルの地方コードを変更しようとすると、
変更可能です。「2」「東北地方」を「3」に変更したので、「関東地方」の表示に変わりました。
ちなみに、地方マスタに存在しない地方コードに変更しようとすると、上図のエラーが表示され、変更できません。
・ダイナセット (矛盾を許す)
「矛盾を許す」とあるとおり、先程より緩くなっています。
上図の地方コードの値を「9」に変更しようとしています。
この変更を確定した直後、
地方テーブルの地方コード「2」で表示されていた項目が、すべて「9」に変更されました。
このデータのクエリは、「都道府県」テーブルの「地方コード」と、「地方」テーブルの「地方コード」で結合されているので、「都道府県」テーブルの「地方コード」が「2」で、「地方」テーブルの「地方コード」が「9」となっている上図の状態は、正しくリンクされた状態となっておらず、「矛盾」しています。
この状態で、リクエリを行うと、
先程の矛盾が起きていた結合のレコードが、表示されなくなりました。
INNER JOINなので、アンマッチの行は、表示されません。
地方テーブルの内容を確認すると、地方コードが「2」だった東北地方が、「9」に更新されています。
・スナップショット
スナップショットが設定された場合、データは変更できなくなります。
項目を変更しようとすると、ステータスバーに「このレコードセットは更新できません。」と表示されます。
データを更新させたくない場合に、この設定が利用できると思います。
フォームのプロパティに、「追加の許可」「削除の許可」「更新の許可」という項目があり、ここでも制御できますが、スナップショットにした場合、クエリ自体が読込のみで実行されると思われ、排他制御の対象外になり、内部的にいろいろ処理が省けて、処理がかるくなるのではと思います。(確証なし)
また、クエリのプロパティにも同様に「レコードセット」の項目があります。
クエリを更新不可にしたい場合には、スナップショットの設定が利用できます。
フォームのレコードセットが「ダイナセット」で、レコードソースに指定されているクエリのレコードセットが「スナップショット」だった場合、フォーム側の設定が優先されて、レコードは更新可能となるようです。
]]> ウィザードに出て来て欲しくなくなったら、下記の設定で、表示されなくできます。
フォームデザインの画面で、「フォームデザインツール」の「デザイン」タブに表示されているコントロール一覧の右端にある、下向きの矢印をクリックします。
「コントロールウィザードの使用」のアイコンが黄色で表示されている場合、コントロールを配置した際、ウィザードが表示されます。
「コントロールウィザードの使用」をクリックして、非選択状態にすることで、ウィザードが表示されなくなります。
本題の前に、確認事項です。
ACCESS2007以降、ACCESS内のウィンドウの表示のされ方の種類が1つ追加されました。
デフォルトでは、上図のように、タブでウィンドウを切り替えるようになっています。
この場合、1つのウィンドウがACCESSのウィンドウ内いっぱいに表示されるので、この記事の操作は適用されません。
この記事の内容は、従来の複数のウィンドウが重なって表示される場合の操作になります。
設定の変更方法は「複数ウィンドウの表示のされかた」を、参照してください。
ACCESSで作成したフォームを利用者に使用してもらう場合、ウィンドウの切り替えはプログラムで制御して、利用者が操作をするウィンドウは1つだけにしたほうが、操作がわかりやすく、プログラムも簡単になります。
その場合、操作対象のウィンドウのみを、ACCESSのウィンドウいっぱいに表示させて、他のウィンドウを見えなくします。
ウィンドウの最大化は、
DoCmd.Maximize
で、行います。
上図が通常のウィンドウ状態です。
DoCmd.Maximizeで、最大化すると、下図のようになります。
フォームがACCESSウィンドウいっぱいに広がります。
フォームウィンドウ右上にある最大化ボタンをクリックしたのと同じ動作です。
ウィンドウを開いたときに最大化させたい場合は、Openイベント(開く時)に記述すると良いと思います。
最小化は、
DoCmd.Minimize
で、行います。
最小化され、ウィンドウ下部に配置されます。
最小化を使う場面はあまりないかと思いますが。
ウィンドウを元のサイズに戻す場合は、
DoCmd.Restore
で、行います。
この状態に戻ります。
ウィンドウの操作関連で、ウィンドウの位置の移動と、サイズの変更の方法です。
これらは、
DoCmd.MoveSize
で、行います。
・構文
DoCmd.MoveSize Right, Down, Width, Height
・パラメタ
Right … ウィンドウの水平位置を、左端からの距離で指定します。
Down … ウィンドウの垂直位置を、上端からの距離で指定します。
Width … ウィンドウの幅を指定します。
Height … ウィンドウの高さを指定します。
指定の単位は、twipsです。
変更しない箇所は、省略可能です。
例
DoCmd.MoveSize Me.WindowLeft / 2, Me.WindowTop / 2, Me.WindowWidth * 1.2, Me.WindowHeight * 1.2
ウィンドウの位置は、現在の位置の半分の位置へ、ウィンドウの大きさは縦横1.2倍に変更します。
上図が実行前。
実行後。ちょっと左上に寄って、ちょっと大きくなっています。
ACCESS自体のウィンドウを最大化する方法は、こちら。
]]>フォーカスを移動させるには、通常のユーザの操作では、目的のコントロールをマウスでクリックする、タブキーを押下する、などがあります。
これをVBから行うには、SetFocusメソッドを使用します。
テキストボックスA(txtA)にフォーカスを移動する場合は、
Me.txtA.SetFocus
と、します。
コントロールのメソッドなので、対象となるコントロールにSetFocusメソッドがある場合のみ使用可能です。
入力系のコントロールであれば、テキストボックス(TextBox)、コンボボックス(ComboBox)、リストボックス(ListBox)、チェックボックス(CheckBox)などです。
フォーカスを移動させようとしているコントロールが、フォーカスを受け取れない状態の場合は、エラーになります。
Enabled(使用可能)プロパティがFalseの時などです。
複数のフォームを開いた状態で、目的のフォームに切り替える場合は、
Forms("FormA").SetFocus
と、します。
別のフォームのコントロールに対してSetFocusを行っても、フォームは切り替わりません。
例えば、
Forms("FormA").txtB.SetFocus
としても、フォームは現在のフォームのままになります。
この後、
Forms("FormA").SetFocus
とすると、
フォームAのtxtBにフォーカスがある状態で、フォームAに切り替わります。
同様に DoCmd.GoToControlでも、フォーカスを移動させることができます。
DoCmd.GoToControl "txtA"
と、することで、txtAにフォーカスが移動します。
SetFocusメソッド、DoCmdともに動作は同じですが、SetFocusメソッドが推奨です。
]]> 解説用のフォームです。
連結フォームを帳票フォームで作成し、データの一覧を表示させています。
フォームの上部分の「検索」テキストボックスに文字を入力し、「先頭から検索」ボタンをクリックすると、都道府県名にその文字を含むレコードに移動するようにします。
「先頭から検索」ボタン、「次を検索」ボタンのクリックイベントに、以下のコードを記述します。
Private Sub cmdFind_Click() '先頭から検索 Me.Recordset.FindFirst "TDFKMEI LIKE '*" & Me.txtFind & "*'" If Me.Recordset.NoMatch = True Then MsgBox "見つかりません。", vbExclamation End If End Sub Private Sub cmdNext_Click() '次を検索 Me.Recordset.FindNext "TDFKMEI LIKE '*" & Me.txtFind & "*'" If Me.Recordset.NoMatch = True Then MsgBox "見つかりません。", vbExclamation End If End Sub
検索を行っているのは、
Me.Recordset.FindFirst "TDFKMEI LIKE '*" & Me.txtFind & "*'"
の箇所になります。
Meは現在のフォームを指しています。
フォームのRecordsetのFindFirstメソッドを使用しています。
FindFirst構文は以下のようになります。
FindFirst Criteria
Criteriaには、Where句に記述する条件式を指定します。(Whereは不要です)
ANDやORなどを使って、複数の条件を記述することもできます。
FindFirstは、レコードの先頭から、条件に当てはまるレコードを探します。
見つからなかった場合、NoMatchプロパティがTrueになります。
これを利用して、見つからなかった場合にメッセージを出力しています。
検索テキストボックスに「山」を入力して、「先頭から検索」ボタンをクリックすると、
「山形県」のレコードにレコードセレクタが移動します。
(このフォームは、都道府県CD・都道府県名テキストボックスをEnabled=Falseにしているので、テキストボックスにフォーカスが移動しません。)
FindFirstは先頭から検索するので、何度「先頭から検索」ボタンをクリックしても、「山形県」になります。
山形県の次を検索するには、FindNextを使用します。
構文などはFindFirstと同じです。
FindNextは、現在のレコード位置の、次のレコードから検索を行います。
「山形県」で「次を検索」をクリックすると、「富山県」に移動します。
以降、「次を検索」をクリックする度に、「山梨県」「和歌山県」「岡山県」「山口県」と移動し、さらにクリックすると「見つかりません」のメッセージが表示されます。
Findは、検索開始位置と、検索方向別に、以下の4つのメソッドがあります。
FindFirst・先頭から、末尾に向かって検索
FindLast・末尾から、先頭に向かって検索
FindNext・現在の次のレコードから、末尾に向かって検索
FindPrevious・現在の前のレコードから、先頭に向かって検索
「単票フォーム」でも同じように、レコードを検索して、そのレコードへ移動することができます。
FindFirstを使う注意点として、Recordsetがダイナセットまたはスナップショットでなければなりません。
また、RecordsetにADOを利用している場合は、当然DAOであるFindFirstなどは使えません。
ユーザに提供する機能としては、これはあまり適していないように思います。
場合によるとは思いますが、検索して該当レコードに移動するよりも、条件に当てはまるレコードのみに絞り込んで表示する方が、使い勝手が良いと思います。
どちらかと言えば、レコード一覧などで、特定のレコードに移動したい場合に便利です。
純粋にDoCmd.FindRecordについて知りたい方、申し訳ありませんが、ここにご希望の内容はありません。ご了承下さい。
同じような検索であれば、DAOのFindFirstを使うのが良いかと思います。
・構文
DoCmd.FindRecord FindWhat , Match , MatchCase , Search , SearchAsFormatted
, OnlyCurrentField , FindFirst
・引数
FindWhat 必須
検索する数値・文字列を設定します。
Match
一致と判断する検索方法を、以下のacEntireクラスから指定します。
名前 | 値 | 説明 |
acAnywhere | 0 | FindWhatとフィールドの一部が一致した場合 |
acEntire | 1 | FindWhatとフィールド全体が一致した場合 |
acStart | 2 | FindWhatがフィールドの先頭から一部一致した場合 |
デフォルトはacEntireです。
MatchCase
大文字と小文字を区別するかどうかを指定します。
Trueなら区別します。デフォルトはFalse(区別しない)です。
Search
検索を行う方向を指定します。
以下のAcSearchDirectionクラスから指定します。
名前 | 値 | 説明 |
acDown | 1 | カレントレコードより下のすべてのレコードを検索します。 |
acSearchAll | 2 | すべてのレコードを検索します。 |
acUp | 3 | カレントレコードより上のすべてのレコードを検索します。 |
デフォルトはacSearchAllです。
SearchAsFormatted
書式化された形式で検索する場合にはTrue、データベースに保存されている形式で検索する場合はFalseを指定します。
デフォルトはFalseです。
OnlyCurrentField
検索対象となるフィールドを指定します。
以下のAcFindFieldクラスから指定します。
名前 | 値 | 説明 |
acAll | 0 | すべてのフィールドで検索します。 |
acCurrent | -1 | 現在のフィールドだけで検索します。 |
デフォルトはacCurrentです。
FindFirst
最初のレコードから検索を開始する場合は、Trueを指定します。
カレントレコードを次のレコードから検索を開始する場合は、Falseを指定します。
下記のような画面を作成しました。
「先頭から検索」コマンドボタンには、下記のコードを記述しました。
Private Sub cmdFind_Click() DoCmd.FindRecord Me.txtFind, acAnywhere, True, acDown, True, acAll, True End Sub
また、「次を検索」コマンドボタンには、下記のコードを記述しました。
Private Sub cmdNext_Click() DoCmd.FindNext End Sub
まず最初に、第5パラメタのSearchAsFormattedは、Falseを指定した場合、エラーになります。
どのような場合にFalseが指定できるのか分かりませんでした。仕方ないのでTrue固定です。
「検索」のテキストボックスに検索文字列を入力して、「先頭から検索」コマンドボタンをクリックすると、検索が行われるようにしたかったのですが、コマンドボタンをクリックすると、下図のようになります。
フォーカスが、「検索」テキストボックスに入力した「山」に移動しました。
ここでは、「山」を含む「山形県」に移動して欲しかったのですが、レコードではない非連結のテキストボックスをヒットさせてくれました。
仕方がないので、ひとまずテキストボックスへの入力は止めて、コードに直接書くことにしました。
Private Sub cmdFind_Click() DoCmd.FindRecord "山", acAnywhere, True, acDown, True, acAll, True End Sub
これで、「先頭から検索」をクリックすると、
「山形県」のフィールドにフォーカスが来ました。
とりあえず検索成功です。
その次に「次を検索」で、DoCmd.FindNextを試そうとしたのですが、クリックしても「山形県」からフォーカスが他へ移動しません。
そこで、第7パラメタをFalseにして、試してみました。
DoCmd.FindRecord "山", acAnywhere, True, acDown, True, acAll, False
結果、うまくいかなかったのですが、「山形県」のフォーカスが来た後、手動で次のレコードにフォーカスを移動してから、「次を検索」をクリックすると、次の「富山県」に移動しました。
うーん、思った動作と違います。
また、第6パラメタの検索対象となるフィールドの指定ですが、acCurrentを指定しても、変化がありませんでした。
DoCmd.FindRecord "山", acAnywhere, True, acDown, True, acCurrent, False
フォーカスを「都道府県CD」の列に移動してから、ボタンをクリックしても、都道府県名にフォーカスが移動します。
都道府県CDの列で、検索して欲しいのですが、期待通りの動作をしてくれません。
DoCmd.FindRecordは、ACCESSのUIにある検索機能を呼び出すものと思われます。
ですが、パラメタの指定を画面のように変更しても、同じような動作をしてくれません。
何か私の知らないコツがあるのかも知れませんが、VBAでプログラムを作るのならば、Recordset.FindNextなど代わりに使える物があるので、DoCmd.FindRecordについては、「使えない」という第一印象で放置しようと思います。
DoCmd.FindRecordを極めても、使う場面がないと思われます…。
最後に、この検証は、ACCESS2010で行いました。
]]>・構文
Application.Echo EchoOn, bstrStatusBarText
・EchoOn … 必須です。Trueなら描画ON、Falseなら描画OFFになります。
・bstrStatusBarText … ステータスバーテキストに表示する文字列を指定します。
以下に、例を示します。
Private Sub cmdEcho_Click() Application.Echo False, "処理中…" ' '…処理… ' Application.Echo True End Sub
フォームに配置したコマンドボタンで処理を起動すると想定して、その処理の前後で描画をOFF、ONしています。
第2パラメタのステータスバーテキストを指定すると、任意の文字列をACCESSの画面の下部分に表示させる事ができます。
描画OFFにした後、描画ONにしないと、VBAの処理が終わった後も画面が描画されないままになってしまいます。
ACCESSは操作を受け付ける状態になっているのですが、画面が更新されないので、実質操作不能な状態になってしまいます。
他のウィンドウが上に重なったりしても、ACCESSの描画が停止しているので、おかしな表示になったりします。
この場合、Alt+F11でVBA Editorを表示させ、イミディエイトウィンドウからApplication.Echo trueを実行することで、描画ONにすることが可能です。
プログラム中で描画OFFを使用する場合は、かならず最後にONに戻すようにして下さい。
エラー処理を行っている場合は、その辺も考慮が必要です。
私の場合、あまり描画OFFはしていません。
実際に処理を行ってみて、見苦しい場合はOFFにします。
OFFにしなければならないようなケースは、実際少ないのではと思います。
処理に時間がかかる場合は、ステータスバーテキストへのメッセージ表示を使用します。
プログレスバーのような、ビジュアル的な表示はできないのですが、「処理中…」や、「123件処理中…」などと表示しておくと、処理過程や、異常で停止していないか分かって便利です。
DoCmdにも、同じ機能の DoCmd.Echoメソッドがあります。まったく同じ機能です。
DoCmdは、たぶん内部でApplicationのメソッドを呼んでいるだけだと思うので、Applicationが推奨です。
具体的にどんなことなのかは、以下の通り。
フォームが閉じるときの処理を、キャンセルする例です。
画面にコマンドボタンを配置し、クリックイベントに以下のコードを記述します。
Private Sub cmdClose_Click() On Error Resume Next DoCmd.Close acForm, Me.Name On Error GoTo 0 End Sub
次に、フォームの「読み込み解除時」イベントに、以下のコードを記述します。
Private Sub Form_Unload(Cancel As Integer) If MsgBox("フォームを閉じますか?", vbYesNo) = vbNo Then Cancel = True Exit Sub End If End Sub
閉じるボタンをクリックすると、下図のメッセージボックスが表示されます。
「いいえ」をクリックすると、DoCmd.Closeでフォームを閉じる処理が実行されたのですが、Cancel = Trueが設定されたことにより、フォームを閉じる処理が取り消されます。
また、配置したコマンドボタンをクリックした時以外でも、Unloadイベントが発生した場合、このメッセージが表示されます。例えば、フォーム右上の「×」ボタンでフォームを閉じる時などです。
フォームが閉じられる際に起こる、「読み込み解除時」イベントで、イベントをキャンセルすることで、フォームが閉じられないようにすることができます。
これが、イベントのキャンセルです。
取り消し可能なイベントは、イベントプロシージャの引数に「Cancel As Integer」が記述されています。
ちなみに、DoCmd.Closeの前に、On Error Resume Nextを指定しているのは、イベントがキャンセルされた場合、DoCmd.Closeがエラーになってしまうからです。
エラー処理をしていないと、メッセージボックスの「いいえ」をクリックした後、
と言うエラーメッセージが表示され、止まってしまいます。
・DoCmd.CancelEventについて
DoCmd.CancelEventでも、同様にイベントのキャンセルが行えます。
上記の例を、DoCmd.CancelEventで記述すると、以下のようになります。
Private Sub Form_Unload(Cancel As Integer) If MsgBox("フォームを閉じますか?", vbYesNo) = vbNo Then DoCmd.CancelEvent Exit Sub End If End Sub
DoCmd.CancelEventはACCESSの仕組み、Cancel = TrueによるイベントのキャンセルはVBの仕組みです。
記述量はたいして差がありませんが、処理面では、DoCmdのメソッドを呼ぶより、Cancel = Trueを設定する方が、シンプルです。
イベントのキャンセルでは、Cancel = Trueを記述するのが一般的だと思います。
Application.CloseCurrentDatabaseメソッドで、現在のデータベースを閉じます。
データベースは閉じますが、ACCESSは終了しません。
例は以下の通り。
画面にボタンを作成し、クリック時イベントに以下のコードを記述します。
Private Sub cmdCloseDB_Click() Application.CloseCurrentDatabase End Sub
ボタンをクリックすると、データベースが閉じられ、ACCESSを起動した直後の、処理を選択する画面になります。
DoCmd.CloseDatabaseでも同様にデータベースを閉じることができますが、DoCmdオブジェクトは、内部で別の処理を呼び出していると思われるので、直接処理を実行すると思われるApplicationの方がお勧めです。
]]>・書式
DoCmd.Close ObjectType, ObjectName, Save
・引数
ObjectType
閉じるオブジェクトの種類を指定します。
以下のAcObjectTypeクラス定数から指定します。
名前 | 値 | 説明 |
---|---|---|
acDatabaseProperties | 11 | Databaseプロパティ |
acDefault | -1 | |
acDiagram | 8 | データベースダイアグラム(Accessプロジェクト) |
acForm | 2 | フォーム |
acFunction | 10 | 関数 |
acMacro | 4 | マクロ |
acModule | 5 | モジュール |
acQuery | 1 | クエリ |
acReport | 3 | レポート |
acServerView | 7 | サーバービュー |
acStoredProcedure | 9 | ストアドプロシージャ(Accessプロジェクト) |
acTable | 0 | テーブル |
acTableDataMacro | 12 | データマクロ |
よく使うのは、acForm、acReportくらいだと思います。
ObjectName
閉じるオブジェクトの名前を文字列で指定します。
フォームやレポートの名前です。
省略すると、現在アクティブなオブジェクトが閉じられます。
Save
変更を保存するかどうかを指定します。
以下のAcCloseSaveクラス定数から指定します。
名前 | 値 | 説明 |
---|---|---|
acSaveNo | 2 | 保存しない |
acSavePrompt | 0 | 確認を表示。 Visual Basic モジュールを閉じる場合は無視され、保存しない。 |
acSaveYes | 1 | 保存するされます。 |
まじめに指定するなら、acSaveNoが良いと思うのですが、制作中においては保存したい場合も多々あるので、acSavePromptが無難です。(私は省略しています。)
フォームを閉じる例。
フォーム上に適当にボタンを配置します。
ボタンのクリック時イベントにコードを記述します。
Private Sub cmdClose_Click() DoCmd.Close acForm, Me.Name End Sub
フォームにコードを記述しているので、第2パラメタに指定する閉じる対象の名前は、「Me.Name」にしています。
こうしておけば、他の名前のフォームで使用するときに修正が不要です。
DoCmd.Closeは、フォームなどを閉じるための物なので、ACCESSを終了させることはできません。
ACCESSを終了させるときは、Application.Quitを使用します。
・蛇足
VB6でフォームを閉じる場合は、Unloadを使いますが、この方法はACCESSでは使えないようで、エラーになります。
ACCESSではDoCmd.Closeが、正式なやり方のようです。
また、フォームを一時的に隠す場合も、Hideではなく、Me.Visible = Falseで行います。
]]> まず、DoCmdを使用する方法。
ApplyFilterと、SetFilterと言うメソッドがあります。
どちらを利用しても特に違いは無いようです。(どう違うのか調べたのですが、わかりませんでした。)
SetFilterは2010で追加されたメソッドなので、互換性を考えると、ApplyFilterが無難かもしれません。
構文・DoCmd.ApplyFilter FilterName , WhereCondition , ControlName
基本的には、第2パラメタのWhereConditionに条件式を指定すれば良いだけです。
メインフォーム上にサブフォームを配置していて、メインフォーム側に処理でサブフォームにフィルターを適用したい場合は、ControlNameにサブフォーム名を記述します。
下記のようなフォームで、例を示します。
都道府県名のレコードを一覧表示しているフォームです。
都道府県名の、最後が「府」のレコードを抽出するとします。
この場合は、下記のコードを記述します。
(例では、コマンドボタンのクリックイベントに記述しています。)
DoCmd.ApplyFilter , "TDFKMEI LIKE '*府' "
結果は以下の通り。
表示内容が、京都府と大阪府のみになり、フィルターが適用されている状態になりました。
フィルターを解除する場合は、
DoCmd.ShowAllRecords
です。
DoCmdよりも、もっと直接的にフィルターを行う方法として、フォームのプロパティにフィルター条件を設定する方法があります。
フォームのFilterプロパティに条件を設定し、FilterOnプロパティでフィルターのON・OFFを切り替えます。
先程のDoCmdと同様の処理を行う場合、下記のようになります。
Me.Filter = "TDFKMEI LIKE '*府' "
Me.FilterOn = True
フィルターを解除する場合は、
Me.FilterOn = False
です。
もしくは、
Me.Filter = ""
でも解除されます。この場合、Me.FilterOnは自動でFalseになります。
DoCmd.ApplyFilterも、Filterプロパティも、抽出条件には、WHERE句に記述する条件式を指定します。(WHERE自体は書かなくて良い)
最後に、もっと別の絞り込み方法を紹介します。
レコードソースに、抽出条件を記述したSQLをセットします。
DoCmd.ApplyFilterも、Filterプロパティも、レコードソースに指定されたテーブルやクエリの結果に対して、抽出処理を行っているように思われるので、元々のSQLに条件指定をする方が、処理的に有利な気がします。(余り根拠はありません…)
処理としては、VBAでSQLを組み立てて、それをフォームのレコードソースに設定します。
詳しくは、データ一覧フォーム その3 データ絞込あたりをご覧下さい。
私の独断と偏見で、 以下のように色分けしています。
ピンクは、使用頻度の高いメソッドです。
きいろは、いちおう知っておいた方が良いメソッドです。
グレーは、たぶん使わない、もしくは使わない方が良いメソッドです。
ブルーは、別の方法がオススメのメソッドです。
AddMenu | メニューバーの作成を行います。 リボンではありません。 |
ApplyFilter | 指定された条件でフィルター(絞り込み)を行います。 |
Beep | Beep(警告音)をならします。 VBのBeepステートメントと同じ。 |
BrowseTo | サブフォームのSourceObjectを切り替えます。 詳しくはまた調べます。 |
CancelEvent | 発生したイベントをキャンセルします。 |
ClearMacroError | MacroError オブジェクトに格納されているエラーについての情報を削除します。 |
Close | アクティブウィンドウ、又は指定したウィンドウを閉じます。 |
CloseDatabase | カレント データベースを閉じます。 ACCESSは終了しません。 |
CopyDatabaseFile | カレント プロジェクトに接続されたデータベースを SQL Server データベース ファイルにコピーしてエクスポートします。 ACCESSからmdfファイルを作成できます。 |
CopyObject | テーブル・フォーム・レポートなどのオブジェクトを複製します。 |
DeleteObject | テーブル・フォーム・レポートなどのオブジェクトを削除します。 |
DoMenuItem | メニューのコマンドを実行します。 DoMenuItemは、ACCESS97以降、RunCommandメソッドに置き換えられました。 |
Echo | 画面再描画のオン・オフ、ステータスバーの表示内容の設定を行います。 |
FindNext | FindRecordの後、続けて検索を行います。 |
FindRecord | 条件に一致するレコードを検索します。 |
GoToControl | 指定されたコントロールにフォーカスを移動します。 |
GoToPage | 指定したページの最初のコントロールにフォーカスを移動します。 FormのGoToPageと同じ。 |
GoToRecord | カレントレコードを指定先へ移動します。 |
Hourglass | マウスカーソルの形を、砂時計・通常に切り替えます。 |
LockNavigationPane | ナビゲーション ウィンドウに表示されているデータベースオブジェクトを削除できなくします。ACCESS2007以降。 |
Maximize | アクティブウィンドウを、最大化(ACCESSウィンドウと同じ大きさに)します。 |
Minimize | アクティブウィンドウを最小化します。 |
MoveSize | アクティブウィンドウを(ACCESSウィンドウ内で)移動・サイズ変更します。 |
NavigateTo | ナビゲーションウィンドウでのデータベースオブジェクトの表示を制御します。ACCESS2007以降。 |
OpenDataAccessPage | "OpenDataAccessPage/データアクセスページを開く" アクションを実行します。 (データアクセスページ・ACCESSで発行するWEBページ) |
OpenDiagram | "OpenDiagram/ダイアグラムを開く" アクションを実行します。 adpのみ。 |
OpenForm | 指定されたフォームを開きます。 |
OpenFunction | Microsoft SQL Server データベースのユーザー定義関数を開き、Accessで表示します。たぶんadp用。 |
OpenModule | 指定されたVBAモジュール・プロシジャをVBAEditorで開きます。 |
OpenQuery | 指定されたクエリを開きます。 アクションクエリの場合、クエリが実行されます。 |
OpenReport | 指定されたレポートを開きます。 |
OpenStoredProcedure | "OpenStoredProcedure/ストアドプロシージャを開く" アクションを実行します。たぶんadp用。 |
OpenTable | 指定されたテーブルを開きます。 |
OpenView | "OpenView/ビューを開く" アクションを実行します。 たぶんadp用。 |
OutputTo | 指定されたデータベースオブジェクトを、指定された形式で出力します。 |
PrintOut | 印刷を行います。 |
Quit | Accessを終了します。 Application.Quitが推奨。 |
RefreshRecord | レコードの変更内容を反映させます。 FormのRefreshと同じ。 ACCESS2010以降。 |
Rename | データベースオブジェクトの名前を変更します。 |
RepaintObject | 指定されたオブジェクトを再描画します。 FormのRepaintが推奨。 |
Requery | アクティブオブジェクト、またはアクティブオブジェクトの指定されたコントロールをRequeryします。 該当オブジェクトのRequeryメソッドが推奨。 |
Restore | 最大化・最小化したウィンドウを元のサイズに戻します。 |
RunCommand | 組み込みコマンド(メニューやツールバーのコマンド)を実行します。 AcCommandクラスの定数でコマンドを指定します。 |
RunDataMacro | 指定されたデータマクロを実行します。 ACCESS2010以降。 |
RunMacro | 指定されたマクロを実行します。 |
RunSavedImportExport | 保存済みのインポート仕様またはエクスポート仕様を実行します。 ACCESS2007以降。 |
RunSQL | パラメタに指定されたSQL文を実行します。 |
Save | 指定されたオブジェクトを保存します。 |
SearchForRecord | テーブル、クエリ、フォーム、またはレポート内で、レコード検索を行います。 |
SelectObject | 指定されたデータベースオブジェクトを選択します。 (テーブル、クエリ、フォームなど) |
SendObject | 指定したデータベースオブジェクトを添付したメールを送信します。 |
SetDisplayedCategories | ナビゲーションウィンドウのタイトルバーで、[カテゴリに移動]の下に表示される内容を指定します。 |
SetFilter | アクティブなデータシート、フォーム、レポート、またはテーブル内のレコードにフィルターを適用するには、SetFilter メソッドを使用します。 |
SetMenuItem | メニューバーの状態を制御します。 ACCESS97以前用。 |
SetOrderBy | データシート、フォーム、レポート、またはテーブルにソート順(並べ替え)を適用します。 |
SetParameter | BrowseTo、OpenForm、OpenQuery、OpenReportまたは RunDataMacroメソッドで使用されるパラメーターを作成します。 |
SetProperty | フォームやコントロールに対して、プロパティの設定を行います。 |
SetWarnings | ACCESSが表示する確認メッセージの表示を、オン・オフに設定します。 |
ShowAllRecords | 適用されているフィルターを解除します。 |
ShowToolbar | ツールバーの表示・非表示を制御します。 リボンではありません。 |
SingleStep | マクロの実行を一時中断して[マクロのシングル ステップ]ダイアログボックスを表示します。 |
TransferDatabase | インポート、エクスポート、リンクテーブルの作成を行います。 |
TransferSharePointList | Windows SharePoint Services 3.0 サイトのデータをインポート・リンクを行います。 [外部データ]タブの[インポート]で[SharePoint リスト]と同様です。 |
TransferSpreadsheet | ワークシート(Excel)に対して、インポート、エクスポート、リンクテーブルの作成を行います。 |
TransferSQLDatabase | 指定されたSQL Serverデータベース全体を別のSQL Serverデータベースに転送します。 たぶんadp用。 |
TransferText | テキスト形式(CSVなど)でインポート、エクスポート、リンクテーブルの作成を行います。 |
・設定手順
1.ACCESSのファイルを開きます。
既存、新規どちらでもかまいません。
ADOを使用するACCESSのファイルが開かれた状態にします。
2.VBA Editorを起動します。
「作成」タブにある、「マクロとコード」から、「Visual Basic」をクリックします。
VBA Editorが表示されます。
3.参照設定を行います。
メニューから、「ツール」-「参照設定」をクリックします。
「参照設定」ウィンドウが開きます。
「参照可能なライブラリファイル」の一覧から「Microsoft ActiveX Data Objects」を探して、チェックを付けます。
バージョン違いがたくさんありますが、自分のパソコンのみで使用するのであれば、最新の物で問題ありません。
別のパソコンにACCESSのファイルを持っていって、そこで動かす場合には、そのパソコンにもここで指定したバージョンのADOが存在していないと、エラーになります。
複数のパソコンで稼働させる予定がある場合は、どのバージョンなら大丈夫か確認しておく必要があります。
私は無難なところで、最新のちょっと前を選んでます…。
チェックを付けたら、「OK」ボタンをクリックして、参照設定画面を閉じます。
以上で設定は完了です。
記述方法は、結合したいSQLの間に、「UNION」を記述します。
SELECT * FROM Q明細 UNION ALL SELECT * FROM Q合計
上記の例は、2つのSELECTを結合していますが、もちろんそれ以上のSELECTを結合することもできます。
SELECT … UNION SELECT … UNION SELECT … UNION SELECT
と、言う具合に、間にUNIONを挟んで記述していきます。
・「UNION」と「UNION ALL」
UNIONは「ALL」を指定することができます。
「ALL」を指定しなかった場合、全体のレコードのうち、まったく内容が同じ(すべての項目の内容が一致している行)場合、1件にまとめられます。
「ALL」を指定した場合、上記のようなレコードがあっても、別々にレコードが表示されます。
場合によっては、「ALL」なしの動作が都合が良い場合もあるかと思いますが、UNIONした結果を合計集計する場合などは、結果が違ってきますので、「ALL」の指定が必要です。
後でバグを引き起こさないためにも、「ALL」は必ず書くようにすることをお勧めします。
他の人が修正する場合に、混乱を招かないように、重複行を省く目的で「ALL」が必要ない場合でも、「GROUP BY」で明確に行った方が良いと思います。
こういうデータで、
SELECT 商品名 FROM T売上A UNION SELECT 商品名 FROM T売上B
上記SQLを実行すると、
こういう結果になります。
両方のテーブルに存在していた「みかん」は、1件になっています。
SELECT 商品名 FROM T売上A UNION ALL SELECT 商品名 FROM T売上B
「ALL」を付けた場合は、
このように、それぞれのレコードが表示されます。
・項目の並べ方
すべてのSELECT文で、項目の数を一致させておく必要があります。
各SELECT文の項目数が一致していない場合、エラーになります。
また、各項目の属性(文字・数値)も、あわせておいた方が良いです。
属性は基本的に自動で変換されますが、予想外の結果にならないよう、注意が必要です。
結果に表示される項目名は、一番最初のSELECT文の項目名が採用され、2番目以降のSELECT文の項目名は使われません。
逆に言えば、項目名は各SELECT文で一致している必要はありません。
・ORDER BY(並べ替え)の指定
ORDER BY句は、一番最後のSELECT文にのみ指定可能です。
ただし、記述する項目名は、一番最初のSELECT文の項目名です。
SELECT 商品名1,金額1 FROM T売上1 UNION ALL SELECT 商品名2,金額2 FROM T売上2 ORDER BY 商品名1
このようになります。
]]> ACCESSのクエリでUNION句を利用する場合、いつものクエリデザインの画面ではできません。
SQL編集画面にして、直接SQLを記述する必要があります。
いきなりSQLばりばりの例ではわかりにくいと思いますので、クエリデザインを中心に使う場合の手順から説明したいと思います。
サンプルデータは下図のとおり。
商品名と金額の項目があるテーブルです。
これの合計集計を行うクエリを作成し、UNIONで明細と合計行を一度に表示します。
最初に、明細行のクエリを作成します。
上図のように集計クエリを作成します。
「T売上」テーブルをクエリデザインに追加します。
一番左の列のフィールドに、「順番:1」と入力します。
これは、合計の行を必ず一番最後に持ってくるためのものです。
そして、「商品名」「金額」項目を下のグリッドに表示させます。
このクエリを「Q明細」と言う名前で保存します。
次に、合計集計を行うクエリを作成します。
上図のように集計クエリを作成します。
「T売上」テーブルをクエリデザインに追加して、「金額」項目を下のグリッドに表示させます。
「集計Σ」アイコンをクリックして、集計クエリにします。
金額項目の集計は、「合計」を指定します。
金額項目の左列に、「順番:2」「商品名:"合計"」の列を作成します。
このクエリを「Q合計」と言う名前で保存します。
実行すると、合計の1レコードが返されます。
次に、UNIONクエリを作成します。
新規のクエリを開き、最初に表示される「テーブルの表示」ウィンドウを閉じます。
左上の「SQL表示」アイコンをクリックします。
画面がSQL入力画面に切り替わります。
上図のように、下記のSQLを入力します
SELECT * FROM Q明細 UNION ALL SELECT * FROM Q合計
「UNION ALL」と記述することに、気をつけてください。
入力後、「Q明細合計」と言う名前で保存します。
最後に、先程作成したQ明細合計を元にしたクエリを作成します。
新規クエリを開き、「テーブルの表示」から「クエリ」タブをクリックし、「Q明細合計」を選択し、「追加」ボタンをクリックします。
下のウィンドウに「Q明細合計」が表示されたら、「テーブルの表示」ウィンドウを閉じます。
「順番」「商品名」「金額」項目を下のグリッドに配置します。
「順番」列の「並べ替え」を、「昇順」に設定し、「表示」のチェックボックスを「OFF」にします。
これでできあがり。
実行結果。
明細の後に、合計が連結された状態で、結果が表示されます。
Q明細、Q合計の各クエリで設定した「順番」項目は、必ず合計行を一番最後に来るように、並べ替えを設定するために作成しました。
ここまでの方法は、UNIONのクエリ以外、極力直接SQL書かずに済む手順を説明しました。
その為、複数のクエリを作成してします。
SQLで作成する場合、全部を1つのクエリで作成することもできます。
SELECT 商品名 , 金額 FROM ( SELECT 1 AS 順番 ,商品名, 金額 FROM T売上 UNION ALL SELECT 2 AS 順番 , "合計" AS 商品名, SUM(T売上.金額) AS 金額 FROM T売上 ) ORDER BY 順番
クエリの本数が増えると管理が煩雑になりがちですので、SQLに慣れてきたら、簡単な物はSQLで作成しても良いと思います。
]]>