2009-06-04 7 views
4

バックエンドにMicrosoft Accessデータベースを使用するプログラムがあります。特定のテーブル/フィールドがプログラムによって更新されるたびに、(Webサービスを呼び出す)いくつかのVBAコードを実行する必要があります。私はこれがSQL Serverのトリガーのように動作することを確認します。Microsoft Accessデータベースの特定のテーブルとフィールドが更新されたときにVBAコードを実行する方法はありますか?

Accessでこのような変更を監視し、対応することは可能ですか?問題のプログラムがアクセス(すなわちないVBAアプリ)の内部で実行されません

更新 、それは単純にそのバックエンドストレージとしてMDBファイルを使用しています。残念ながら、閉鎖されたサードパーティのアプリケーションであるため、プログラムのコードにアクセスすることはできません。

+0

あなたは、データのアクセス方法が使用されて知っていますか? ODBCの場合は、ODBCのロギングから何かを学ぶことができます。 –

+0

受け入れられた回答は、現在のバージョンのアクセスでは正しくありません。下にスクロールすると、Access 2010で利用できるデータマクロイベントの一覧が表示されます。 – manotheshark

答えて

1

GUI環境とJetのデータベース形式には別々のものがあります。

Accessデータベースをバックエンドとして使用している場合、これは操作できるJET機能です。 GUI(VBAを含む)へのアクセスはクライアントマシン上で実行され、自動トリガー機能はありません。

1

プログラムがAccessファイルを使用する唯一のプログラムである場合は、テーブルが更新されるタイミングを知り、トリガーの代わりにいくつかのコードを実行する必要があります。

それ以外の場合は、アクセスファイルテーブルの更新をチェックしている別のアプリケーション/サービスが必要です(おそらく、テーブルにupdate_dateタイプのフィールドがありますか?)。

+0

+1 "あなたは別のアプリケーション/サービスの実行が必要です" – onedaywhen

+0

あなたが何をしていても。これらの変更が行われている間は、常に実行する必要があります。現在のアプリケーションに追加できますか? – JeffO

0

Jetを使用している場合(つまり、データがMDBファイルのバックエンドに格納されている場合)、コードを実行できる場所はフォームの更新後イベントになります。もちろん、ここでの問題は、フォームを使用せずにデータが変更され、イベントが発生しない場合です。

あなたは、あなたがAccessデータベースファイルに書き込まれますMicrosoft Office 2003 Webサービス・ツールキットClick Here to download

1

をダウンロードすることができ、Webサービスを実行するためのMS Access 2003を使用している場合は、それは、日付/タイムスタンプの変更をです。 file monitorを使用してファイルの変更を検出し、ファイルを調べて変更内容を確認することができます。

Accessデータベースに、テーブルの[LastModified]の日付/時刻列がある場合に役立ちます。

0

あなたがVBAで立ち往生している場合、少し荒いです。 1つの方法は、タイマーを使ってフォームを作成することです(目に見えないように開くことができます)。タイマーは、レコード数の変更に対して1分に1回(または任意の間隔が適切と思われます) (下のコード)

これは個人的に私がお勧めするものではありません。アクセスは腐敗のために有名です。単純なバックエンドとして使用する場合は、ほとんどの時間は安全ですが、それはあなたのデータベースでロシアのルーレットをプレイしています。少なくとも私は別のアクセスファイルからあなたのデータベースにリンクし、リンクされたテーブルを監視します。あなたのモニターがクラッシュした場合、最後に、あなたがウェブサイトのタイムアウトの唯一の原因であることを嫌っているので、あまり頻繁に問い合わせをしないようにしてください:)

Option Explicit 

Private m_lngLstRcrdCnt_c As Long 

Private Sub Form_Open(Cancel As Integer) 
    Const lngOneMinute_c As Long = 60000 
    Me.TimerInterval = lngOneMinute_c 

End Sub 

Private Sub Form_Timer() 
    Const strTblName_c As String = "Foo" 
    Const strKey_c As String = "MyField1" 
    Dim rs As DAO.Recordset 
    Dim lngRcrdCnt As Long 
    If TableExists(strTblName_c) Then 
     Set rs = CurrentDb.OpenRecordset("SELECT Count(" & strKey_c & ") FROM " & strTblName_c & ";", dbOpenSnapshot) 
     If Not rs.EOF Then lngRcrdCnt = Nz(rs.Fields(0&).Value, 0&) 
     rs.Close 
     If lngRcrdCnt <> m_lngLstRcrdCnt_c Then 
      m_lngLstRcrdCnt_c = lngRcrdCnt 
      'Number of records changed, do something. 
     End If 
    Else 
     'Table is deleted, do something. 
     m_lngLstRcrdCnt_c = -1 
    End If 
End Sub 

Private Function TableExists(ByVal name As String) As Boolean 
    Dim tdf As DAO.TableDef 
    On Error Resume Next 
    Set tdf = CurrentDb.TableDefs(name) 
    If LenB(tdf.name) Then 'Cheap way to catch broken links. 
     Set SafeGetTable = tdf 
    End If 
End Function 
3

この質問は古いですが、回答は正しくありません。 Access 2010は、データが挿入、更新、または削除されたときに実行できるデータマクロイベントを追加しました。テーブルのデータシートビューまたはテーブルのデザインビューのいずれかを使用しながら、次のイベントが(イベントはなく、フォーム、マクロボタンを介してテーブルに直接結合している)が利用可能である:

  • 削除マクロイベント後
  • 挿入マクロイベント
  • 後 削除マクロイベント変更前マクロイベント
  • BEFORE UPDATEマクロイベント

詳細については、次の場所にあります。

関連する問題