Bedingung bei Anfügeabfrage

Hallo,

ich habe eine DB bei der täglich Daten über eine Anfügeabfrage eingelesen werden. Da gelegentlich Daten doppelt eingelesen werden, soll das Datum des Einlesens in einer Tabelle nach dem Einlesen gespeichert werden. Das ist kein Problem.

Nun will ich vor dem Einlesen der neuen Daten, prüfen of das gespeicherte Datum kleiner ist als das Datum den neu einzulesende Datum. Nur dann soll die Abfrage ausgeführt werden.

In die Spalte ‚aktuell‘ für das Datum habe ich in der Zeile Kriterium folgenden Ausdruck eingegeben:
[tblImport]![aktuell] > [tblImportdatum]![aktuell]

Wenn ich die Abfrage starte, erhalte ich folgende Fehlermeldung:

Sie wollen eine Abfrage ausführen, die den angegebenen Ausdruck 'aktuell' nicht als Teil der Aggregatfunktion einschließt.

Leider komme ich hier überhaupt nicht weiter. Für jeden Tip oder auch eine Idee wie ich das sonst angehen kann, wäre ich euch sehr dankbar.

Gruß
Maria

Hallo Maria,

Nun will ich vor dem Einlesen der neuen Daten, prüfen of das
gespeicherte Datum

ähm welches Datum? Das Datum pro Datensatz, oder das Datum des Speicherns in der separaten Tabelle?

kleiner ist als das Datum den neu einzulesende Datum.

ähm welches Datum?

Nur dann soll die Abfrage ausgeführt werden.

könntest du das mal genauer beschreiben?

In die Spalte ‚aktuell‘ für das Datum habe ich in der Zeile
Kriterium folgenden Ausdruck eingegeben:
[tblImport]![aktuell] > [tblImportdatum]![aktuell]

du hast also eine Abfrage, in der du BEIDE Tabellen tblImport UND tblImportdatum hast?

Wenn ich die Abfrage starte, erhalte ich folgende
Fehlermeldung:

Sie wollen eine Abfrage ausführen, die den angegebenen
Ausdruck ‚aktuell‘ nicht als Teil der Aggregatfunktion
einschließt.

also ist das Feld aktuell NICHT vorhanden, oder DOPPELT vorhanden, oder wird nicht richtig ausgewertet.

Leider komme ich hier überhaupt nicht weiter. Für jeden Tip
oder auch eine Idee wie ich das sonst angehen kann, wäre ich
euch sehr dankbar.

du vergleichst eine Tabelle mit vielen Datumswerten mit einer Tabelle mit vielen Datumswerten.

das kann natürlich nicht funktionieren!

Erstelle eine neue Abfrage mit der Tabelle tblImport.
in dieser Abfrage gibst du für das Kriterium (Feld AKTUELL) folgendes ein:

> dmax(„aktuell“;„tblImportdatum“)
Damit bekommst du den maximalen Wert für „Aktuell“ aus der Tabelle tblImportdatum. Dieser Wert wird dann mit allen Datumswerten der tblImport verglichen.

Grüße aus Schwerin
Wolfgang
(Netwolf)

Hallo Wolfgang,

In die Spalte ‚aktuell‘ für das Datum habe ich in der Zeile
Kriterium folgenden Ausdruck eingegeben:
[tblImport]![aktuell] > [tblImportdatum]![aktuell]

du hast also eine Abfrage, in der du BEIDE Tabellen tblImport
UND tblImportdatum hast?

Wenn ich die Abfrage starte, erhalte ich folgende
Fehlermeldung:

Sie wollen eine Abfrage ausführen, die den angegebenen
Ausdruck ‚aktuell‘ nicht als Teil der Aggregatfunktion
einschließt.

also ist das Feld aktuell NICHT vorhanden, oder DOPPELT
vorhanden, oder wird nicht richtig ausgewertet.

ja, im Prinzip ist es doppelt vorhanden, in der Tabelle mit sämtlichen bisherigen Preisen und in der Tabelle, in der ich das Datum der letzten Datensätze speichere.

Leider komme ich hier überhaupt nicht weiter. Für jeden Tip
oder auch eine Idee wie ich das sonst angehen kann, wäre ich
euch sehr dankbar.

du vergleichst eine Tabelle mit vielen Datumswerten mit einer
Tabelle mit vielen Datumswerten.

das kann natürlich nicht funktionieren!

Erstelle eine neue Abfrage mit der Tabelle tblImport.
in dieser Abfrage gibst du für das Kriterium (Feld AKTUELL)
folgendes ein:

> dmax(„aktuell“;„tblImportdatum“)
Damit bekommst du den maximalen Wert für „Aktuell“ aus der
Tabelle tblImportdatum. Dieser Wert wird dann mit allen
Datumswerten der tblImport verglichen.

leider funktioniert das nicht

Vielleicht gehe ich auch falsch an die Problematik heran.
Ich habe EinkaufsPreise, die stark schwanken. Abhängig von der Veränderung sollen die artikel entweder stärker oder weniger in die Produktion einbezogen werden. Die Preise werden regelmäßig eingelesen. Da in nachfolgenden Statistiken immer auch die alten Preise in die Berechnungen einfließen, muß ich absichern, dass die Preise nicht mehrfach eingelesen werden, dass würde die Tends verfälschen.

Ich dachte mir das so:

Ich importiere die neuen Daten über eine Anfügeabfrage. Der Datensatz: Artikelnummer Preis Datum
Zieltabelle ist eine Tabelle mit den gleichen Feldern.

Das Datum aller Datensätze ist oft identisch mit dem Importdatum, auf jeden Fall haben alle importierten neuen Preise das gleiche Datum.

Ich möchte verhindern, dass Datensätze mehrfach eingelesen werden. Bisher schaue mir dazu die Zietabelle an und prüfe augenscheinlich, ob die neuen Daten schon vorhanden sind, dann führe ich die Anfügeabfrage aus. Trotzdem passiert es gelegentlich, dass Daten doppelt angefügt werden und in die nachfolgenden Berechnungen einfließen und Trends verfälschen.

Ich wollte dieses Datum in einer Tabelle speichern, die eigentlich nur dieses Datum beinhalten muss.
Beim nächsten Transport will ich prüfen, ob die neuen Daten das gleiche Datum haben oder nicht. Nur wenn es sich um ein späteres Datum handelt soll die Anfügeabfrage durchgeführt werden.

Eine andere Möglichkeit wäre, die identischen Datensätze zu löschen, aber auch hier weiß ich nicht so recht wie ich das machen soll.

Ja wie gesagt, vielleicht gehe ich auch falsch an die Thematik heran. Wahrscheinlich bin ich zur Zeit zu sehr auf diesen Weg fixiert und sehe dadurch keine andere Möglichkeit. Insofern hilft sicher jeder Vorschlag.

Kannst du mir helfen???

Gruß Maria

Hallo Maria,

Vielleicht gehe ich auch falsch an die Problematik heran.

ja, du benötigst eigentlich eine VBA Funktion, die den Vergleich vornimmt.

Kannst du VBA programmieren?

Grüße aus Schwerin
Wolfgang
(Netwolf)

ja, du benötigst eigentlich eine VBA Funktion, die den
Vergleich vornimmt.

Kannst du VBA programmieren?

ich probiere mich gerade darin, ich habe nicht wirklich Erfahrung auf dem Gebiet.

Vor allem würde ich nicht wissen, wo ich den code dann einbinde. Also ich weiß schon, dass ich im modul schreiben muss, aber wie bring ich das ganze dann in die Abfrage?

Und wie hole ich mir das Datum für den Vergleich?

Kannst du mir helfen?

Gruß Maria

ja, du benötigst eigentlich eine VBA Funktion, die den
Vergleich vornimmt.

Hallo Maria,

wenn ich das Problem richtig verstanden habe (ist nicht so leicht, wenn man die Datenbank nicht kennt), werden permanent Daten angefügt, dabei sollen schon vorhandene Einträge unverändert erhalten bleiben. Also der gleiche Datensatz soll nicht noch einmal angefügt werden.

In diesem Fall gibt es ne VBA-freie Lösung.

Wenn sich aus der Kombination mehrerer Datenfelder ein Unikat ergibt(Datum, Artikelnummer und Preis in Kombination eignen sich wunderbar), kannst du auf alle diese Tabellen-Felder gleichzeitig den Primärschlüssel setzen. Die Anfügeabfrage wird dann nur die Datensätze anfügen, die noch nicht vorhanden sind.

MfG
Stephan

Hallo Stephan,

wenn ich das Problem richtig verstanden habe (ist nicht so
leicht, wenn man die Datenbank nicht kennt), werden permanent
Daten angefügt, dabei sollen schon vorhandene Einträge
unverändert erhalten bleiben. Also der gleiche Datensatz soll
nicht noch einmal angefügt werden.

genau

In diesem Fall gibt es ne VBA-freie Lösung.

Wenn sich aus der Kombination mehrerer Datenfelder ein Unikat
ergibt(Datum, Artikelnummer und Preis in Kombination eignen
sich wunderbar), kannst du auf alle diese Tabellen-Felder
gleichzeitig den Primärschlüssel setzen. Die Anfügeabfrage
wird dann nur die Datensätze anfügen, die noch nicht vorhanden
sind.

Ich wußte nicht, dass das möglich ist. Es funktioniert tatsächlich und es ist genial. Danke für den Tip.

Allerdings erhalte ich jetzt die Fehlermeldung wegen Schlüsselverletzungen usw. Wenn ich trotzdem die Abfrage weiter ausführe, erhalte ich mein gewünschtes Ergebnis. Nun kann ich an meinem PC die Fehlermeldung ausschalten. Wie kann ich diese Meldung aber prinzipiell unterdrücken, z. B. für den Fall dass ein anderer User an einem anderen PC die Abfrage startet? Gibt es da auch eine Möglichkeit?

Gruß
Maria

Allerdings erhalte ich jetzt die Fehlermeldung wegen
Schlüsselverletzungen usw. Wenn ich trotzdem die Abfrage
weiter ausführe, erhalte ich mein gewünschtes Ergebnis. Nun
kann ich an meinem PC die Fehlermeldung ausschalten. Wie kann
ich diese Meldung aber prinzipiell unterdrücken, z. B. für den
Fall dass ein anderer User an einem anderen PC die Abfrage
startet? Gibt es da auch eine Möglichkeit?

Hallo Maria,

die Fehlermeldung kannst du vernachlässigen. Er meckert nur, weil er die Datensätze, die du ja nicht haben willst, nicht anfügen kann. Wahrscheinlich wird auch eine Tabelle (Importfehler oder sowas) erzeugen, wo er die nicht einfügbaren Datensätze ablegt.

Die Fehlermeldung lässt sich meines Wissens nach aber nur per Makro abschalten. Keine Sorge dafür brauchst du kein VBA. Einfach unter Makros ein neues erstellen. Er wird Dir dann sowas aufmachen was aussieht wie ne Tabelle. In der ersten Spalte der ersten Zeile schreibst du „Warnmeldungen“ (das Wort wird er schon automatisch ergänzen). Dann gehste in die Spalte daneben und schreibst das Wort „Nein“ (nur zu Dokumentationszwecken) hinein. Wenn du unten schaust, ist bei „Warnmeldugen an“ eh schon Nein voreingestellt.
In die nächste Zeile schreibst du bei Aktion „ÖffnenAbfrage“ (wird er ebenfalls automatisch ergänzen) hinein. Dann musst du unten bei den Aktionsargumenten nur noch bei Abfragename die gewünschte Abfrage auswählen. (Zu Dokumentationzwecken empfehle ich Dir als Kommentar bei ÖffnenAbfrage den Namen der Abfrage einzutragen.) Anschließend schreibst Du in die darauf folgende Zeile bei Aktion wieder Warnmeldungen und als Kommentar „Ja“. Danach unten bei den Aktionsargumenten „Warnmeldungen an“ auf Ja stellen.

Anschließend das Makro unter nem vernünftigen Namen abspeichern.

Führst Du das Makro anschließend aus, wird die von Dir gewählte Abfrage (ohne Warnmeldungen) ausgeführt.

Wie Du siehst ist die ganze Sache ganz einfach. Viel Spaß beim rumprobieren! Auf diese Art und Weise kannst du übrigens ganze Prozesse automatisieren ohne auch nur eine Zeile VBA zu programmieren. (ist übrigens schön, wenn man morgens zur Arbeit kommt und die fertigen Reports warten in Outlook nur noch darauf, dass ich sie versende *hehe*)

MfG
Stephan

1 Like

Hallo Stephan,

super, es funktioniert. prima Erklärung. Danke, du hast mir sehr geholfen.

Gruß und Stern
Maria