2011-08-25 22 views
5

Uno de mis usuarios tiene una base de datos de Microsoft Access y en la tabla tiene un campo de archivo adjunto. En una de sus consultas, quiere devolver el número de archivos adjuntos que contiene el campo. Intenté hacer que esto funcionara en vano. Intenté crear un módulo de VBA y pasarle el campo, pero me da error. Intenté crear el parámetro como DAO.Recordset, DAO.Field, Attachment, etc.¿Cómo consultar el número de archivos adjuntos del campo Archivo adjunto en Microsoft Access?

También intenté consultar el campo de esta manera [MyField] .AttachmentCount.

+0

adjuntos como en objetos OLE? Si abre la tabla directamente, ¿qué ve en ese campo? Además, si entra en modo de diseño, ¿el tipo de campo es "Objeto OLE"? – transistor1

+0

El campo se muestra con un clip y un número que representa el número de archivos adjuntos en ese campo. No creo que esto se considere un objeto OLE, pero podría estar equivocado.Dicho esto, no puedo acceder al número que está al lado del clip a través de mi consulta, que es lo que necesito. –

Respuesta

8

Actualmente no tengo 2007 para probar esto, pero this article explica cómo acceder a los archivos adjuntos con LoadFromFile y SaveToFile.

Vea si puede acceder al conteo como tal (con DAO) ... obviamente use los nombres de su tabla.

' Instantiate the parent recordset. 
    Set rsEmployees = db.OpenRecordset("YourTableName") 

    ''' Code would go here to move to the desired record 

    ' Activate edit mode. 
    rsEmployees.Edit 

    ' Instantiate the child recordset. 
    Set rsPictures = rsEmployees.Fields("Pictures").Value 

    Debug.Print rsPictures.RecordCount'' <- SEE IF THIS GIVES YOU THE COUNT 

EDITAR: Lo siento por el retraso en esta; No he tenido la oportunidad de mirarlo.

Creo que esto debería ser una solución para usted. Lo probé en Access 2010 y funciona.

PARTE 1 - Crea una función genérica para obtener el recuento de archivos adjuntos para cualquier campo en cualquier tabla. Coloque este código dentro de un módulo.

Function AttachmentCount(TableName As String, Field As String, WhereClause As String) 
    Dim rsRecords As DAO.Recordset, rsAttach As DAO.Recordset 

    AttachmentCount = 0 

    Set rsRecords = CurrentDb.OpenRecordset("SELECT * FROM [" & TableName & "] WHERE " & WhereClause, dbOpenDynaset) 
    If rsRecords.EOF Then Exit Function 

    Set rsAttach = rsRecords.Fields(Field).Value 
    If rsAttach.EOF Then Exit Function 

    rsAttach.MoveLast 
    rsAttach.MoveFirst 

    AttachmentCount = rsAttach.RecordCount 
End Function 

PARTE 2 - Utilice la función personalizada en su consulta de Access.

SELECT Table1.ID, AttachmentCount("Table1","MyAttach","[ID]=" & [ID]) AS [Num Attach] 
FROM Table1; 

Parámetro 1 es la mesa donde los archivos adjuntos son, parámetro 2 es el campo de la tabla, donde los archivos adjuntos son, y el último parámetro es una cláusula WHERE para su tabla para seleccionar el registro correcto.

Espero que esto ayude!

ACTUALIZACIÓN

consulta SQL Esto también trabajó para mí:

SELECT t.ID, Count(t.MyAttach.FileName) AS [Num Attachments] 
FROM Table1 AS t 
GROUP BY t.ID; 
+0

Lo siento, intente ... 'rsPictures.RecordCount'; Creo que es un conjunto de registros incrustado en el campo. Si no, intente 'rsPictures.Count' – transistor1

+0

He leído ese mismo artículo. Mi problema no es escribir el código, mi problema es implementar este tipo de cosas en una consulta. Entonces, si he tomado el fragmento de código del que me estás hablando, en última instancia, debo llamarlo desde una consulta y pasarlo al campo. ¿Cómo se ve esa función? O bien, ¿hay alguna función que pueda invocar en mi consulta? Se vería así: Seleccione AttachCount ([MyAttachmentField]), otro campo de ..... –

+0

@Brian - editó el código anterior. ¡Espero que esto ayude! – transistor1

3

me encontré con la función anterior AttachmentCount fallado cuando el campo de archivo adjunto no contenía objetos/archivos adjuntos. Para hacer que un valor de retorno de 0 a cabo de la función en este caso he añadido tres líneas de código para dar el siguiente:

Function AttachmentCount(TableName As String, Field As String, WhereClause As String) 
    Dim rsRecords As DAO.Recordset, rsAttach As DAO.Recordset 

    On Error GoTo Handler 

    AttachmentCount = 0 

    Set rsRecords = CurrentDb.OpenRecordset("SELECT * FROM [" & TableName & "] WHERE " & WhereClause, dbOpenDynaset) 
    If rsRecords.EOF Then Exit Function 

    Set rsAttach = rsRecords.Fields(Field).Value 
    rsAttach.MoveLast 
    rsAttach.MoveFirst 

    If rsAttach.EOF Then Exit Function 

    AttachmentCount = rsAttach.RecordCount 

Handler: 
    Exit Function 

End Function 

Gracias tanto para la función original! Si no hubiera sido por ti, aún estaría rascándome la cabeza en cuanto a cómo obtener el conteo de apegos.

+0

Gracias! Actualizado el código para corregir ese error. – transistor1

0

añade todos los archivos adjuntos de campo seleccionado en un conjunto de datos, que le permite luego contar que

OleDbConnection connect = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source='db/Adb.accdb'"); //set up connection 
    //CL_ID is a fk so attachments can be linked to users 
    OleDbCommand sql = new OleDbCommand("SELECT at_ID, [at_Name].[FileData], [at_Name].[FileName], [at_Name].[FileType] FROM Attachments WHERE at_ID =1;", connect); 
    //adding sql to addapter to be ran 

    OleDbDataAdapter OleDA = new OleDbDataAdapter(sql); 
    //attempting to open connection 
    try { connect.Open(); } 
    catch (Exception err) { System.Console.WriteLine(err); } 

    DataSet Set1 = new DataSet(); 
    OleDA.Fill(Set1); //create and fill dataset 
    connect.Close(); 

    Set1.Tables[0].Rows.Count; 
Cuestiones relacionadas