2011-08-25 12 views
5

Jeden z moich użytkowników ma bazę danych Microsoft Access, a w tabeli ma pole załącznika. W jednym z jego zapytań, on chce zwrócić liczbę załączników, które zawiera pole. Próbowałem zrobić to bezskutecznie. Próbowałem już stworzyć moduł VBA i przekazać go polu, ale to na mnie błąd. Próbowałem już utworzyć parametr jako DAO.Recordset, DAO.Field, Attachment, itp.Jak wykonać kwerendę dotyczącą liczby załączników z pola Załącznik w programie Microsoft Access?

Próbowałem również zapytać o to pole [MyField] .AttachmentCount.

+0

Osprzęt jak w obiektach OLE? Jeśli otworzysz tabelę bezpośrednio, co widzisz w tym polu? Ponadto, jeśli przejdziesz do trybu projektowania jest typ pola "OLE Object"? – transistor1

+0

Pole wyświetla się za pomocą spinacza do papieru i liczby określającej liczbę załączników w tym polu. Nie wierzę, że byłby to obiekt OLE, ale mógłbym się mylić.Powiedział, że nie mogę uzyskać dostępu do numeru, który jest obok spinacza do papieru za pośrednictwem mojego zapytania, co jest tym, czego potrzebuję. –

Odpowiedz

8

Nie mam 2007 roku, aby przetestować ten program, ale this article wyjaśnia, jak uzyskać dostęp do załączników za pomocą LoadFromFile i SaveToFile.

Sprawdź, czy możesz uzyskać dostęp do licznika w ten sposób (z DAO) ... oczywiście używaj nazw swoich tabel.

' 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 

EDIT: Przepraszam za opóźnienie w tej sprawie; Nie miałem okazji na to spojrzeć.

Myślę, że to powinno być rozwiązanie dla Ciebie. Przetestowałem go w Access 2010 i działa.

CZĘŚĆ 1 - Utwórz ogólną funkcję, aby uzyskać liczbę załączników dla dowolnego pola w dowolnej tabeli. Umieść ten kod w module.

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 

CZĘŚĆ 2 - Użyj funkcji niestandardowej w zapytaniu Access.

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

Parametr 1 jest tabela gdzie załączniki są, parametr 2 jest pole w tabeli, gdzie są załączniki, a ostatni parametr jest WHERE na stole, aby wybrać odpowiedni zapis.

Mam nadzieję, że to pomoże!

UPDATE

zapytań SQL ten pracował również dla mnie:

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

Niestety próbuję ... 'rsPictures.RecordCount'; Myślę, że to zestaw rekordów osadzony w tej dziedzinie. Jeśli nie, spróbuj 'rsPictures.Count' – transistor1

+0

Czytałem ten sam artykuł. Mój problem polega na tym, że nie piszę kodu, moim problemem jest implementacja tego typu rzeczy w zapytaniu. Tak więc, jeśli wziąłem fragment kodu, o którym mówisz, ostatecznie, muszę zadzwonić do niego z zapytania i przekazać w polu. Jak wygląda ta funkcja? Czy istnieje już funkcja, którą mogę wywołać w moim zapytaniu? Wyglądałoby to tak: Wybierz AttachCount ([MyAttachmentField]), inne pole z ..... –

+0

@Brian - edytuj powyższy kod. Mam nadzieję że to pomoże! – transistor1

3

Znalazłem funkcję AttachmentCount powyżej zawiodły, gdy pole załącznik zawierał żadnych obiektów/załączniki. Aby faktycznie uzyskać wartości zwracanej 0 z funkcji w tym przypadku ja plus trzy linie kodu dać poniżej:

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 

Dziękuję bardzo za pierwotnej funkcji! Gdyby nie on, wciąż drapałbym się po głowie, aby uzyskać liczbę załączników.

+0

Dzięki! Zaktualizowano kod, aby naprawić ten błąd. – transistor1

0

dodaje wszystkie załączniki z wybranego pola w zestawie danych, który pozwala następnie policzyć go

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; 
Powiązane problemy