【保存版】2013年度発売全パチスロアプリ一覧(iPhone,iPad)

【Access】VBA(DAO)によるオートナンバー値の取得と初期化方法

Accessでちゃちゃっとツール的なものを作るとき、採番テーブルを準備せずにオートナンバー型を使ってAccess側で自動採番させることがあります。

で、このオートナンバー型の値ですが、データを挿入した際に自動採番された値を取得するのはどのようにすればよいのでしょうか?

新規登録画面で、登録されたデータの自動採番値を画面表示するといったケース等。

MySQL,SQLServer,etc...でもたまにこういう要件がありまして、いつもWEBで調べてます。(汗)
今回、Access+DAOでの実装方法をWEBで調べたところ、海外のあやしい翻訳サイトしかヒットしなかったので、実装方法を備忘として残しておこうと思います。

SELECT @@IDENTITY で取得可能


データ登録後、@@IDENTITYの値を取得します。@@IDENTITYに、登録時に取得されたオートナンバー値が格納されています。(SQLServerでの取得方法と似ていますね。)

以下、Access2003のスタンドアロン環境にて確認。(古いバージョンですみません。。。)

Dim db As DAO.Database

Set db = CurrentDb
db.Execute データ挿入SQLをここに記述(insert into ...)
db.OpenRecordset("SELECT @@IDENTITY")(0)

肝は、
db.OpenRecordset("SELECT @@IDENTITY")(0)
この戻り値を変数に格納しておけば、画面表示したり、別テーブルへ挿入したりといろいろ活用できます。

ついでに、オートナンバーの初期化について


これはよく質問サイトで見かけますが、Accessの場合、データを全削除後、最適化するとオートナンバーが初期化されるようです。

最適化を実行するということはアプリケーションを再起動する必要がありますが、これが都合が悪い場合もあります。

再起動しないでオートナンバーを初期化する方法として、DAOを使ったこんな方法(データ定義言語 (DDL) 使用)もあります。

Dim db As DAO.Database
Dim strSQL As String

Set db = CurrentDb
strSQL = strSQL & " ALTER TABLE テーブル名 ALTER COLUMN フィールド名 COUNTER (1,1)"
db.Execute strSQL

なお、Access、ADO、ODBC、MySQLでは以下のリンクが参考になります。
データの追加時に自動インクリメントの値を取得する方法(Access+MySQL)

以上、AccessのオートインクリメントまわりのちょっとしたTipsでした。


1ライセンスで2台までインストール可能。11196円。
>>Microsoft Office Access 2013 [オンラインコード] [ダウンロード][Windows版] (PC2台/1ライセンス)


Access初心者のやる気のある方向け。「売上管理」「営業日誌」「漢字クイズ」のサンプルを使って効率よく学ぶ。
>>Access マクロ & VBA 開発工房 2013/2010/2007/2003/2002/2000 対応


EXCEL連携ってよくありますよねー。
>>現場で役立つExcel & Accessデータ連携・活用ガイド 2013/2010/2007対応 (Small Business Support)

[Google PR]

Twitterはじめました。プラプラ | Twitter

【Access】Access2010でフォームのみ表示(制限ありの検証なしの暫定版)。

Accessのシステムってぱっと見た目でわかりますね。
何故なら、Access本体のメニューバーがあるから。

別にあってもいい(というか、あったほうが便利)と思うのですが、たまにVBチックにフォームのみを表示をしてほしい。という要望があります。

このフォームのみ表示ですが、従来のAccess2003では簡単に実現できました。
起動時にAccess本体を最小化するだけです。(ちなみにフォームはPOPUPに設定しておかないと、画面上に表示されません。あと、APIを使います。)

ただ、Access2010(+Windows7)だと簡単にはいきません。
タスクバーのアプリケーションアイコンをクリックすると、Accessの枠が復元されてしまいます。

下記、今回のケースと同等のお悩みかと思います。
Access2010でフォームのみを表示し、Access本体のウィンドウを表示しない方法はないでしょうか?

対応策の一例としては
Accessウィンドウを表示しない方法 Access2007以降版
Access本体をフォームと同サイズに調整し、その中でフォームを最大化して表示するという手法です。

なるほど、なるほど。ですが、他にも方法がないかなあ。
ということで、ちょっと考えてみました。

要は復元(最大化)されても、最小化すればいいんじゃないの


Access2010では、タスクバーのアプリケーションアイコンをクリックするとAccess本体が復元されてしまいます。で、あれば、復元されてもすぐに最小化すればいいんじゃないの?

と思ったのですが、Aceessには「アプリケーションが最大化された時」というイベントがありません。(アプリケーションを最大化するというコマンドならありますが。)
最大化を知るためには、Windowsのメッセージをフックする必要があるようです。

ならば、フォームをサブクラス化し、Windowsからの最大化命令(メッセージ)を監視し、最大化されれば、即最小化しちゃいましょう。(なんつー、大掛かりな。。。)

実装的には、起動時に最大化監視用のフォームを非可視でシステム終了まで起動しておきます。
<監視用のフォーム>
最大化監視(サブクラス化)

<フォームのイベント>

Private Sub Form_Open(Cancel As Integer)
'サブクラス化
OldWndProc = GetWindowLong(Application.hWndAccessApp, GWL_WNDPROC)
SetWindowLong Application.hWndAccessApp, GWL_WNDPROC, AddressOf WndProc
End Sub

Private Sub Form_Close()
'サブクラスを破棄する
SetWindowLong Application.hWndAccessApp, GWL_WNDPROC, OldWndProc
End Sub

<標準モジュール>
'*以下のソースは、
[VB6] ウィンドウプロシージャのサブクラス化サンプル v0.3
を参考にさせていただきました。

Option Compare Database
Option Explicit


'指定されたウィンドウプロシージャにメッセージ情報を渡す関数の宣言
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, _
ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

'指定されたウィンドウの属性を取得する関数の宣言
Public Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" _
(ByVal hWnd As Long, _
ByVal nIndex As Long) As Long

'指定されたウィンドウの属性を変更する関数の宣言
Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _
(ByVal hWnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long

' Access自身を最小化設定する為のAPI 宣言
Public Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, _
ByVal nCmdShow As Long) As Long

Public Const SW_SHOWMINIMIZED = 2

Private Const WM_SIZE = &H5
Private Const SIZE_MAXHIDE = 4
Private Const SIZE_MAXIMIZED = 2
Private Const SIZE_MAXSHOW = 3
Private Const SIZE_MINIMIZED = 1
Private Const SIZE_RESTORED = 0

Public OldWndProc As Long
Public Const GWL_WNDPROC = -4

Const WM_SYSCOMMAND As Integer = &H112
Const SC_CLOSE As Long = 61536

'アプリケーションの最大化を監視する
Public Function WndProc(ByVal hwindow As Long, ByVal message As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

'メッセージ処理
Select Case message

'サイズ変更イベント
Case WM_SIZE

Select Case wParam

'ウィンドウ最大化時
Case SIZE_MAXIMIZED

'Accessアプリケーションを最小化する
Call ShowWindow(Application.hWndAccessApp, SW_SHOWMINIMIZED)

End Select

'アプリケーション終了
Case WM_SYSCOMMAND
If wParam = SC_CLOSE Then
'終了ボタン以外からのアプリケーション終了は無効とする
MsgBox "システム終了ボタンからアプリケーションを終了してください。", 48, p_strAPPRICATION_TITLE
Exit Function
End If

End Select

'デフォルトメッセージ処理
WndProc = CallWindowProc(OldWndProc, hwindow, message, wParam, lParam)

End Function

<その他>
あと、システムの終了処理で、監視フォームを閉じることが必要です。


これで、それっぽく動くのですが、暫定版と名うったのは、エラー処理をしていないことはさることながら、ちょっとくせが強いためです。

サブクラス化の副作用として、サブクラス化を終了せずにアプリケーションを終了すると強制終了してしまいます。これはちょっと厳しい。とりあえずの対応策として、終了処理をキャンセルする処理も入れました。
あくまでも、システム内の終了処理ボタンで監視フォームを閉じてから、アプリケーションを終了させる必要があります。

あと、2画面を用いて、サブモニタに表示させることも難しいです。
フォームをサブモニタへ移動させても、再度開き直すとメインモニタに戻ってしまいます。(これは、Access2003の時も同じかもしれませんん。未確認)

等々ありますので、参考程度にどうぞ。

[Google PR]

Twitterはじめました。プラプラ | Twitter



[Google PR]


[最新エントリ 5]

>>トップページ
人気カテゴリ:AccessTips SQLServer CakePHP iPad
過去ログ(全記事一覧)

カテゴリー
プロフィール
お問い合わせ
Powered by NINJA TOOLS
links
recent comment
  • 【Access】vbaでhmacが正しく計算できた!!
    まさ (06/01)
  • 【Access】AccessReportMailメール送信時のポートを25から587へ
    わら (05/31)
  • 【SQLServer】超シンプル!再帰CTE(共通テーブル式)で連続データを作成する。
    sazi (09/08)
  • 【あまっちゃお】Amazon商品検索「あまっちゃお」プロジェクト始動。Ver00-06-00 β
    カメちゃん (07/31)
  • 【Access】あれ?DoCmd.RunCommand acCmdSaveRecordの内部仕様が変わった?
    花姉 (03/17)
  • 【Access】実行中のmdb(自分自身)をバックアップコピーする方法。
    亀 (02/06)
  • 【雑記】Amazonでの注文時、TMGさん発送にご注意を。納期を守れない可能性あり!
    管理人 (01/31)
  • 【雑記】Amazonでの注文時、TMGさん発送にご注意を。納期を守れない可能性あり!
    あ (01/31)
  • 【雑記】Amazonでの注文時、TMGさん発送にご注意を。納期を守れない可能性あり!
    K (11/13)
  • 【VAIOP】VaioXと両持ちできるものすっっごくマニアックなケース。当たり前ですが在庫限り。(笑)
    管理人 (08/04)
recent trackback
  • 【Access】2003安全でない式がブロックされていませんとセキュリティーレベル。
    awgs Foundry (10/29)
  • 【VAIOtypeP】液晶保護シートは、新車のカバーではない。レイアウト社液晶/天板保護フィルムセットRT-VP1FS1
    XMLがキライ。 (04/09)
  • Vistaから、LinkStation(NAS)にアクセスできません。
    そのほかいろいろ (09/06)