2009-06-01 4 views
2

Lors de la liaison à une source de données externe via ODBC (en particulier un AS/400), je rencontre souvent des noms de champs cryptiques de l'autre côté, où aucun dictionnaire de données n'est disponible. Dans les rares cas où je pourrais obtenir les descriptions de champs de l'autre base de données, j'aimerais pouvoir les importer toutes en même temps, plutôt que de copier/coller chaque description dans le formulaire de conception de table, une à la fois.Comment renseigner les descriptions de champs dans MS Access

Je n'ai pas réussi à trouver cela dans les tables système, donc je ne sais pas où cette métadonnée est stockée. Des idées sur où il est, et si elle peut être mise à jour par lots?

Mise à jour: j'ai réussi à lire le schéma en utilisant la méthode OpenSchema (voir le code ci-dessous), mais cela retourne un ensemble de données en lecture seule, ce qui m'empêche de mettre à jour les descriptions.

Function UpdateFieldDescriptions() 
Dim cn As New ADODB.Connection 
Dim rs As ADODB.Recordset 
Dim rs2 As Recordset 
Dim strSQL As String 
Dim strDesc As String 

Set cn = CurrentProject.Connection 
Set rs = cn.OpenSchema(adSchemaColumns) 

While Not rs.EOF 
    If Left(rs!table_name, 4) <> "MSys" Then 
     Debug.Print rs!table_name, rs!column_name, rs!Description 
     strSQL = "SELECT Description " & _ 
      "FROM tblColumnDescriptions a " & _ 
      "WHERE a.Name = """ & rs!table_name & """ AND " & _ 
      "a.Column = """ & rs!column_name & """;" 
     Set rs2 = CurrentDb.OpenRecordset(strSQL) 
     While Not rs2.EOF 
      strDesc = rs2.Fields(0) 
      rs!Description = strDesc ' <---This generates an error 
     Wend 
    End If 
    rs.MoveNext 
Wend 

rs.Update 
rs.Close 
Set rs = Nothing 
Set rs2 = Nothing 
Set cn = Nothing 

End Function 

Répondre

1

Quelques notes pouvant aider. Ce qui suit montre les descriptions de champs d'adSchemaColumns.

Function ListFieldDescriptions() 
    ''List field descriptions 
    Dim cn As New ADODB.Connection, cn2 As New ADODB.Connection 
    Dim rs As ADODB.Recordset, rs2 As ADODB.Recordset 

     Set cn = CurrentProject.Connection 

     Set rs = cn.OpenSchema(adSchemaTables, _ 
      Array(Empty, Empty, Empty, "tablenamehere")) 

     While Not rs.EOF 
      Debug.Print rs!table_name; " desc= "; rs!Description 
      Set rs2 = cn.OpenSchema(adSchemaColumns, _ 
       Array(Empty, Empty, "" & rs!table_name & "")) 
      While Not rs2.EOF 
       Debug.Print "  " & rs2!Column_Name 
       Debug.Print "  " & rs2!Data_Type 
       Debug.Print "  " & rs2!Description 
       Debug.Print "  " & rs2!Is_Nullable 
       rs2.MoveNext 
      Wend 
     rs.MoveNext 
     Wend 
     rs.Close 
     Set cn = Nothing 

    End Function  

De: http://wiki.lessthandot.com/index.php/ADO_Schemas

+0

Ce ne fonctionne pas - l'appel OpenSchema retourne un jeu vide d'enregistrements. Je reçois rs.EOF immédiatement. Cela est peut-être dû au fait que ma table est liée à une source de données ODBC. Mais les propriétés de description de table et de champ sont toujours stockées localement dans Access db, donc elles doivent être quelque part ... –

+0

J'ai réussi à récupérer des données d'OpenSchema en laissant le champ de critère vide. Je peux lire les descriptions des colonnes maintenant. Toutefois, la méthode OpenSchema renvoie un jeu d'enregistrements statique en lecture seule, donc je ne peux pas mettre à jour la description. Des idées pour obtenir des mises à jour dans le schéma? –

1

Utiliser DAO au lieu d'ADO:

Sub SetFieldDesc(TblName As String, FldName As String, Description As String) 
Dim db As DAO.Database, td As DAO.TableDef, fld As DAO.Field 

    Set db = CurrentDb() 
    Set td = db.TableDefs(TblName) 
    Set fld = td.Fields(FldName) 

    On Error Resume Next 
    fld.Properties("Description") = Description 
    If Err.Number = 3270 Then 'Property not found.' 
     fld.Properties.Append fld.CreateProperty("Description", dbText, Description) 
    End If 
End Sub 
Questions connexes