Probleme bei DLookup nach wechsel von Access Datenbank auf SQL (Abfrage ist zu Komplex 3360)

  • Access

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Mono.

    Probleme bei DLookup nach wechsel von Access Datenbank auf SQL (Abfrage ist zu Komplex 3360)

    Hallo Comm,

    Ich habe eine mir eine Kleine Datenbank in Access aufgebaut mit mehreren Tabellen. nachdem soweit alles wie gewollt funktioniert hat habe ich die Tabellen 1zu1 in SQL abgebildet.
    Jedoch bekomme ich nun bei einigen meiner abfragen leider den Fehler Abfrage ist zu Komplex 3360

    ein Beispiel welche abfrage nicht mehr seit der Umstellung auf SQL funktioniert:

    Quellcode

    1. DLookup("Count(Vorname)", "auswertung_mitarbeiter", "Typ = 'Soll' and ID in (select Mitarbeiter_ID from alle_abteilungsleiter_mitarbeiter where Abteilungsleiter = " & DLookup("ID", "main_mitarbeiter", "winid='" & fOSUserName & "'") & ")")


    nun habe ich im inet gefunden das man lieber keine DLookup Abfrage in der DLookup Abfrage bauen sollte da SQL damit Probleme haben kann wenn die benötigten Daten für eine Auswertung erst berechnet werden müssen. Aus diesem Grund habe ich meine Abfrage aufgelöst in:

    Quellcode

    1. DLookup("Count(Vorname)", "auswertung_mitarbeiter", "Typ = 'Soll' and ID in (select Mitarbeiter_ID from alle_abteilungsleiter_mitarbeiter where Abteilungsleiter = (select ID from main_mitarbeiter where winid='" & fOSUserName & "'))")


    Dies hat jedoch leider kein unterschied gemacht ._. mein letzter versuch war das ganze noch weiter runter zu Brechen und dabei kahm folgendes raus:

    Quellcode

    1. dim t1 as string
    2. dim t2 as string
    3. t1= DLookup("ID", "main_mitarbeiter", "winid='" & fOSUserName & "'")
    4. t2= DLookup("Mitarbeiter_ID", "alle_abteilungsleiter_mitarbeiter", "Abteilungsleiter='" & t1 & "'")
    5. Befehl25.Caption = DLookup("Count(Vorname)", "auswertung_mitarbeiter", "Typ = 'Soll' and ID in ("& t2 & ")")


    Jedoch blieb dies auch ohne Erfolg 8|
    Hat jemand eine Ahnung was ich falsch mache? Wie gesagt als alle Tabellen von Access selbst kahmen hat es funktioniert seitdem ich auf SQL verknüpfte verwende leider nicht mehr.

    fOSUserName

    Quellcode

    1. Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _
    2. "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
    3. Function fOSUserName() As String
    4. Dim lngLen As Long, lngX As Long
    5. Dim strUserName As String
    6. strUserName = String$(254, 0)
    7. lngLen = 255
    8. lngX = apiGetUserName(strUserName, lngLen)
    9. If lngX <> 0 Then
    10. fOSUserName = Left$(strUserName, lngLen - 1)
    11. Else
    12. fOSUserName = ""
    13. End If
    14. End Function


    auswertung_mitarbeiter
    Ich kann diese Ohne Probleme ausrführen auch unter SQL daran sollte es also eigentlich nicht ligen

    SQL-Abfrage

    1. SELECT main_mitarbeiter.ID, main_mitarbeiter.Vorname, main_mitarbeiter.Nachname, main_kompetenzen.Bezeichnung AS Kompetenz, main_sollstand.Bezeichnung AS Sollstand, "Ist" AS typ, main_überprüfung.Guligkeit, main_kompetenzen.Kategorie
    2. FROM ((main_überprüfung INNER JOIN main_sollstand ON main_überprüfung.Istzustand = main_sollstand.ID) INNER JOIN main_kompetenzen ON main_überprüfung.Kompetenz_ID = main_kompetenzen.ID) INNER JOIN main_mitarbeiter ON main_überprüfung.Mitarbeiter_ID = main_mitarbeiter.ID
    3. WHERE (((main_mitarbeiter.Aktiv)=True))
    4. GROUP BY main_mitarbeiter.ID, main_mitarbeiter.Vorname, main_mitarbeiter.Nachname, main_kompetenzen.Bezeichnung, main_sollstand.Bezeichnung, main_überprüfung.Guligkeit, main_kompetenzen.Kategorie, main_mitarbeiter.Aktiv UNION ALL SELECT main_mitarbeiter.ID, main_mitarbeiter.Vorname, main_mitarbeiter.Nachname, push_anforderungen.Kompetenz, push_anforderungen.Solstand AS Sollstand, "Soll" AS typ, push_anforderungen.Bis AS Datum, main_kompetenzen.Kategorie
    5. FROM (push_anforderungen INNER JOIN main_mitarbeiter ON push_anforderungen.ID = main_mitarbeiter.ID) INNER JOIN main_kompetenzen ON push_anforderungen.Kompetenz_ID = main_kompetenzen.ID
    6. WHERE (((main_mitarbeiter.Aktiv)=True));


    LG Ruerte
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Wieso nimmst nicht Dcount wenn du eh ein Count() hast?

    So würde ich es machen

    Visual Basic-Quellcode

    1. DCount("Vorname", "auswertung_mitarbeiter", "Typ = 'Soll' and ID in (select Mitarbeiter_ID from alle_abteilungsleiter_mitarbeiter where Abteilungsleiter = (Select TOP 1 ID FROM main_mitarbeiter Where winid='" & fOSUserName & "'))")
    Das ist meine Signatur und sie wird wunderbar sein!
    @Mono ich arbeite erst seit kurzem mit VBA und DCount war mir bis jetzt noch nicht bekannt (danke schonmal)
    Leider hat es immer noch das gleiche Problem zu folge Abfrage ist zu Komplex 3360

    (Und auch hier solange die Daten aus einer ACCES Tabelle kommen funktioniert die Abfrage wenn diese auf verknüpfte SQL Tabellen geht läuft es nicht O.o)


    LG Ruerte
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    auswertung_mitarbeiter ist eine View in Access auf als Verknüpfung zugefügte SQL Tabellen
    wenn ich die verknüpften Tabellen raus werfe und diese in Access nachmache funktioniert DCount und DLookup

    die View selber kann ich öffnen und gibt mir keine Fehler ._.

    LG Ruerte
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Verfachte die View auch auf den SQL Server. Wenn das Query auf LinkedTables ausgeführt wird, dann macht Access die Abfrage länger (er macht ein SQL Prepare Statement)
    Das ist meine Signatur und sie wird wunderbar sein!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mono“ ()

    Wenn du (richtigerweise) das Backend auf einen SQL Server verfrachtest rate ich dir, alle komplexeren Queries auch auf den SQL Server auszulagern und diese ganz normal als Linked Table (oder gar als SQL Pass-Through Query) in Access einzubinden. Erstens ist es performanter und zweitens rennts nicht in solche Probleme. Bei einfacheren Queries kannst Sie natürlich auch in Access belassen.

    LG
    Das ist meine Signatur und sie wird wunderbar sein!