none
Ungültiges Argument für Funktion

    Frage

  • Guten Abend,

    ich stoße zur Zeit an ein Verständnisproblem mit im Titel genannter Meldung (Lt. Hilfe handelt es sich um Fehler 3072). Diese erscheint, wenn ich eine normale Anfrage zwischen Tabelle und einer anderen Abfrage erstelle. Folgende Abfrage funtkioniert ohne Probleme:

    SELECT * FROM tblA WHERE ID NOT IN (SELECT ID FROM qryB)
    

    Versuche ich dagegen:

    SELECT * FROM qryB WHERE ID NOT IN (SELECT ID FROM tblA)

    erscheint die im Titel erwähnte Meldung.

    tblA.ID hat den Typ Long Integer
    qryB.ID hat den 'Typ' CLng(Autoincrement)

    Wo liegt mein Denkfehler?

    [Access 2010; Format .accdb]

    Sonntag, 27. Februar 2011 18:18

Antworten

  • Guten Abend,

    obwohl es mir nicht gelungen ist die Ursache zu finden, habe ich letztlich eine Notlösung gefunden:

    SELECT qryB.*
    FROM qryMissingID LEFT JOIN qryB ON qryB.ID = qryMissingID.AvailableID;
    

    Die ganze ist für mich extrem mysteriös, denn tblA ist direkt durch ein

    SELECT * INTO tblA
    FROM qryB;
    

    entstanden. In qryB wurde die ID nur durch CLng(ID) in Long Integer umgewandelt, um eine Weitergabe des Typs Autoincrement zu verhindern. Im Übrigen, haben die zusätzlichen Umwandlungen mit CStr keine Auswirkung gehabt.

    [Edit]

    Ich habe es noch ein wenig umgestellt und

    SELECT * FROM (SELECT * FROM qryB) AS Tmp1
    WHERE Tmp1.ID NOT IN (SELECT ID FROM tblA);
    

    liefert die gewünschten Ergebnisse, wohingegen:

    SELECT * FROM qryB
    WHERE qryB.ID NOT IN (SELECT tblA.ID FROM tblA);

    wieder den gleichen Fehler ausgibt.

    [Edit]

    Schönen Abend noch.

    P.S.: Obwohl keine echte Lösung vorliegt, markiere ich mal meine Antwort als solche. Ich stelle hohe Ansprüche an die Office Produkte und diese werden in der eigentlich immer erfüllt - nur diesesmal leider nicht direkt :)

    • Als Antwort markiert RiverSpoon Sonntag, 27. Februar 2011 20:51
    Sonntag, 27. Februar 2011 20:51

Alle Antworten

  • hi,

    Zieh' das NOT vor:

    SELECT * FROM qryB WHERE NOT ID IN (SELECT ID FROM tblA)

    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Sonntag, 27. Februar 2011 18:35
    Moderator
  • Hallo,

    SELECT * FROM qryB WHERE NOT ID IN (SELECT ID FROM tblA);
    SELECT * FROM qryB WHERE NOT (ID IN (SELECT ID FROM tblA));
    

    haben beide die gleiche Auswirkung: Ungültiges Argument für Funktion.

    Ich habe zwischenzeitlich folgendes probiert:

    qryRegisteredID := SELECT CStr(tblA.ID) AS RegisteredID FROM tblA;
    qryAvailableID := SELECT CStr(qryB.ID) AS AvailableID
    FROM qryB;
    qryMissingID := SELECT AvailableID
    FROM qryAvailableID 
    WHERE NOT AvailableID IN (SELECT RegisteredID FROM qryRegisteredID);

    und siehe da, ich erhalte die gewünschte Schnittmenge. Versuche ich nun

    SELECT * FROM qryB WHERE qryB.ID IN (SELECT AvailableID FROM qryMissingID)

    Dann erhalte ich wieder die gleiche Meldung.

    Sonntag, 27. Februar 2011 19:37
  • Guten Abend,

    obwohl es mir nicht gelungen ist die Ursache zu finden, habe ich letztlich eine Notlösung gefunden:

    SELECT qryB.*
    FROM qryMissingID LEFT JOIN qryB ON qryB.ID = qryMissingID.AvailableID;
    

    Die ganze ist für mich extrem mysteriös, denn tblA ist direkt durch ein

    SELECT * INTO tblA
    FROM qryB;
    

    entstanden. In qryB wurde die ID nur durch CLng(ID) in Long Integer umgewandelt, um eine Weitergabe des Typs Autoincrement zu verhindern. Im Übrigen, haben die zusätzlichen Umwandlungen mit CStr keine Auswirkung gehabt.

    [Edit]

    Ich habe es noch ein wenig umgestellt und

    SELECT * FROM (SELECT * FROM qryB) AS Tmp1
    WHERE Tmp1.ID NOT IN (SELECT ID FROM tblA);
    

    liefert die gewünschten Ergebnisse, wohingegen:

    SELECT * FROM qryB
    WHERE qryB.ID NOT IN (SELECT tblA.ID FROM tblA);

    wieder den gleichen Fehler ausgibt.

    [Edit]

    Schönen Abend noch.

    P.S.: Obwohl keine echte Lösung vorliegt, markiere ich mal meine Antwort als solche. Ich stelle hohe Ansprüche an die Office Produkte und diese werden in der eigentlich immer erfüllt - nur diesesmal leider nicht direkt :)

    • Als Antwort markiert RiverSpoon Sonntag, 27. Februar 2011 20:51
    Sonntag, 27. Februar 2011 20:51
  • Hallo River
    Ein Join ist wohl einem Not In Konstrukt immer vorzuziehen.
    Wenn Du es sauber realisierst, dann sieht das so aus:
     
    SELECT qryB.*
      FROM qryB LEFT JOIN qryA ON qryB.ID = qryA.ID
     WHERE qryA.ID IS NULL
     
    Diese Abfrage erzeugt einen Join aller Datensätze von qryB und nur den Datensätzen von qryA die die gleiche ID haben, bei allen anderen Datensätze von qryB gibt es keinen Satz in qryA womit qryA.ID NULL ist. Das kannst Du dann in der WHERE Bedingung auswerten. Bezüglich Performance sollte das gemäss meiner Erfahrung 'eh die schnellste Lösung sein (hängt allerdings von den Tabellen ab, die dahinter verborgen sind)
     
    Der Grund, dass es nicht geht, könnte an einer impliziten Variablen Konversion liegen. Hast Du allenfalls NULL Werte in einzelnen Datensätzen drin? Falls ja, könnte das schief gehen.
     
    Gruss
    Henry

    Guten Abend,

    obwohl es mir nicht gelungen ist die Ursache zu finden, habe ich letztlich eine Notlösung gefunden:

    SELECT qryB.*
    FROM qryMissingID LEFT JOIN qryB ON qryB.ID = qryMissingID.AvailableID;
    

    Die ganze ist für mich extrem mysteriös, denn tblA ist direkt durch ein

    SELECT * INTO tblA
    FROM qryB;
    

    entstanden. In qryB wurde die ID nur durch CLng(ID) in Long Integer umgewandelt, um eine Weitergabe des Typs Autoincrement zu verhindern. Im �?brigen, haben die zusätzlichen Umwandlungen mit CStr keine Auswirkung gehabt.

    [Edit]

    Ich habe es noch ein wenig umgestellt und

    SELECT * FROM (SELECT * FROM qryB) AS Tmp1
    WHERE Tmp1.ID NOT IN (SELECT ID FROM tblA);
    

    liefert die gewünschten Ergebnisse, wohingegen:

    SELECT * FROM qryB
    WHERE qryB.ID NOT IN (SELECT tblA.ID FROM tblA);

    wieder den gleichen Fehler ausgibt.

    [Edit]

    Schönen Abend noch.

    P.S.: Obwohl keine echte Lösung vorliegt, markiere ich mal meine Antwort als solche. Ich stelle hohe Ansprüche an die Office Produkte und diese werden in der eigentlich immer erfüllt - nur diesesmal leider nicht direkt :)

    Dienstag, 1. März 2011 08:33