2012-05-02 8 views
1

私はMS Access 2010にDBを持っています。私はDBの作成者ではなく、この質問をするには彼に連絡する方法がありません。それは多くのテーブルとレコードを持つ大きなデータベースであり、テーブルとカラムの名前は非常に説明的ではありません。基本的には、どのテーブル/列が特定のデータを格納しているかを調べようとしており、データの値を具体的に知っています。たとえば、データベースを使用するソフトウェアを使用して追加したため、「ABCDEF」という顧客がいます。さて、この顧客データをどのテーブルが保管しているのかを知る必要があります。テーブルや列を知らずにDB内のテキストを検索しますか?

これはまったく可能ですか?テーブルごとにテーブルを移動し、レコードごとに記録し、データベース全体のフィールドごとにフィールドを比較し、それを自分の文字列と比較する方法?

答えて

1

これは、フィールドの任意の部分に含まれる文字列を見つけ、この

Public Sub FindInAllTables(ByVal s As String) 
    Dim db As DAO.Database, rs As DAO.Recordset 
    Dim tdf As DAO.TableDef, fld As DAO.Field 
    Dim pattern As String 

    pattern = "*" & s & "*" 
    Set db = CurrentDb 
    For Each tdf In db.TableDefs 
     If (tdf.Attributes And dbSystemObject) = 0 Then 
      On Error Resume Next 
      Set rs = tdf.OpenRecordset(dbOpenSnapshot) 
      If err.Number = 0 Then 
       On Error GoTo 0 
       Debug.Print "Scanning [" & tdf.Name & "] "; 
       Do Until rs.EOF() 
        For Each fld In rs.Fields 
         If fld.Value Like pattern Then 
          Debug.Print 
          Debug.Print " Match in [" & tdf.Name & "].[" & _ 
           fld.Name & "] ===> """ & fld.Value & """"; 
          Exit Do 
         End If 
        Next fld 
        If rs.AbsolutePosition Mod 1000 = 999 Then 
         Debug.Print "."; 
        End If 
        rs.MoveNext 
       Loop 
       Debug.Print 
       rs.Close 
      Else 
       On Error GoTo 0 
       Debug.Print "Cannot open table [" & tdf.Name & "]" 
      End If 
     End If 
    Next tdf 
    db.Close 
End Sub 

を試してみてください。フィールド全体のみを検索する場合は、If fld.Value Like pattern ThenIf fld.Value = s Thenに置き換えてください。

+0

私は、直前のウィンドウでそれを実行しようとすると、 "実行時エラー '3167':レコードが削除されます。 – Antrim

+0

奇妙な。それは私のDBで発生しません。他の誰かが同じDBで同時に作業していますか?エラー処理を追加してみてください( 'On Error Resume Next'など)。 –

+0

私は2つの方法を試して、両方の "実行時エラー '3167'をスロー:レコードが削除されます。どのようなアイデアが間違っている? – Antrim

関連する問題