1

Microsoft Access と ODBC を介して読み取り専用アクセスで接続できるかなり大きな Oracle データベースがあります。私たちは、舞台裏の構造と一致しないフロントエンド システムを使用しており、Microsoft Access を介してシステムにクエリを実行する必要があることがよくあります。問題は、構造に関するドキュメントが提供されておらず、構造に細心の注意を払う必要があることです。必要なフィールドを検索するのは非常に時間がかかります。

私たちのフロント エンドでは、照会したい値を表示できます。キー フィールドはわかっていますが、既知の値を含むフィールドを見つける必要があります。

フィールド「A」の値がわかっているレコードがあり、フィールド「X」の値がある場合、フィールド「X」を照会することはできますか?

フロントエンドショー

Student ID: 12345678
Payments: 23456

バックエンド

TechID: 12345678
???: 23456

「???」をクエリできますか

4

2 に答える 2

2

これを行うには、テーブルのコレクションを反復処理し、テーブルごとにフィールドのコレクションを反復処理します。

Open Database
Get all Tables
For Each Table
   Get all Fields
   For Each Field
       If Field type is text ... and
       If Field size is not TOO Long ...
           Search for string
           If found, write to a results bucket
   Next
Next

テーブルをカタログ化するためのコードの例を次に示します (ソースはこちら) 。

Public Function GenerateDataDictionary(aDataDictionaryTable As String)
'***       Usage: GenerateDataDictionary("MyDataDictionaryTable")
'*** Extracts the information about the tables for the data dictionary 
'*** and inserts it to a table named aDataDictionaryTable

    Dim tdf As TableDef, fldCur As Field, colTdf As TableDefs
    Dim rstDatadict As Recordset
    Dim i As Integer, j As Integer, k As Integer
    Set rstDatadict = CurrentDb.OpenRecordset(aDataDictionaryTable)
    Set colTdf = CurrentDb.TableDefs

    'Go through the database and get a tablename   
    For Each tdf In CurrentDb.TableDefs
    'Do what you want with the table names here.
    rstDatadict.AddNew
    rstDatadict.Update   
rstDatadict.AddNew
    rstDatadict![Table] = tdf.NAME
    rstDatadict![Field] = "----------------------------"
    rstDatadict![Display] = "----------------------------"
    rstDatadict![Type] = ""
    rstDatadict.Update
    rstDatadict.AddNew
    rstDatadict![Table] = "Table Description:"
    For j = 0 To tdf.Properties.Count - 1
          If tdf.Properties(j).NAME = "Description" Then
              rstDatadict![Field] = tdf.Properties(j).Value
          End If
    Next j

    rstDatadict.Update 
    rstDatadict.AddNew
    rstDatadict.Update

For i = 0 To tdf.Fields.Count - 1
          Set fldCur = tdf.Fields(i)          
          rstDatadict.AddNew
          rstDatadict![Table] = tdf.NAME
          rstDatadict![Field] = fldCur.NAME
          rstDatadict![Size] = fldCur.Size

          Select Case fldCur.Type
            Case 1
              FieldDataType = "Yes/No"
            Case 4
              FieldDataType = "Number"
            Case 8
              FieldDataType = "Date"
            Case 10
              FieldDataType = "String"
            Case 11
              FieldDataType = "OLE Object"
            Case 12
              FieldDataType = "Memo"
            Case Else    ' Other values.
              FieldDataType = fldCur.Type
          End Select

          rstDatadict![Type] = FieldDataType                                
                For j = 0 To tdf.Fields(i).Properties.Count - 1
                    If fldCur.Properties(j).NAME = "Description" Then
                        rstDatadict![DESCRIPTION] = fldCur.Properties(j).Value
                    End If

                    If fldCur.Properties(j).NAME = "Caption" Then
                        rstDatadict![Display] = fldCur.Properties(j).Value
                    End If

                    If fldCur.Properties(j).NAME = "Rowsource" Then
                        rstDatadict![LookupSQL] = fldCur.Properties(j).Value
                    End If
                Next j

            rstDatadict.Update

    Next i
    Debug.Print "  " & tdf.NAME
    Next tdf

End Function

テーブル名のテーブルに結合するフィールド名のテーブルを作成することにより、Access で調査結果をカタログ化できます。次に、検索は生のコレクションではなくカタログに基づいています。

この方法で、MAS 90 (JobOps アドインを使用) のスキーマをリバース エンジニアリングしました。マップはありませんが、あなたが提案した方法で正確に使用した読み取り専用の ODBC 接続がありました。購買担当の会計士が独自の製品番号を教えてくれ、この包括的なエンジンでそれを実行しました。時間の経過とともに、18,000 のフィールドからなる 700 のテーブルを 20 のテーブルと数百のフィールドに絞り込むことに成功しました。これにより、データをエクスポートできました。

于 2012-08-07T18:39:54.207 に答える
1

あなたの質問への答えは簡単です。いいえ、それはできません。

私が考えることができる2つの解決策があります。1つ目は、すべての値を手動で連結してから、値を含む行を探すことです。これは不完全ですが、機能する可能性があります。

select *
from (select t.*, ('|'""col1||'|'||col2+'|' . . .||'|') as allcols
      from t
     ) t
where instr('|23456|', allcols) > 0

これにより、列にその値を持つ行が検索されます。おそらくあなたが望むものに十分近いでしょう。

2つ目は、UNPIVOTを使用して基本的に同じことを行うことです。

少し時間をかけてフィールド間のマッピングを見つけてから、アプリケーションに表示されるフィールド名を持つビューをOracleで作成することを強くお勧めします。これにより、中期的には多くの労力を節約できるようです。

于 2012-08-07T18:20:57.857 に答える