Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Aktualisierungsabfrage mit JOIN

Begonnen von hajott, Dezember 23, 2025, 09:53:36

⏪ vorheriges - nächstes ⏩

hajott

Hallo Wissende,

ich würde eigentlich gern folgende Aktualisierungsabfrage per VBA ausführen:

UPDATE tbl1Basisdaten INNER JOIN qryBestandsdaten
ON tbl1Basisdaten.ISIN = qryBestandsdaten.ISIN
SET tbl1Basisdaten.tmpBestand = qryBestandsdaten.Bestand

Das klappt nicht und ich dachte zuerst, es liegt an mir. Habe aber im Internet gefunden, dass das schlicht mit Access nicht geht. Aber wie könnte ich es anders machen? Ich finde die Funktion DLookup, aber die ist wohl nur geeignet, wenn man einen Wert sucht. Ich möchte aber alle Datensätze in tbl1Basisdaten aktualisieren.

VIelen Dank im Voraus und frohes Fest

Hans-Jürgen

MzKlMu

Hallo,
ZitatHabe aber im Internet gefunden, dass das schlicht mit Access nicht geht.
Warum soll das nicht gehen ?
Und wo hast Du das im Internet gefunden ?
Bei solchen Aussagen bitte immer die Quelle mit angeben.

Hast Du die Abfrage mal über die Datenblattansicht probiert ?
Da müssen die zu aktulisierenden Datensätze angezeigt werden.

Anmerkung:
In der Regel ist die Speicherung eines Bestandes ein Strukturfehler der Datenbank.
Bestände werden normalerweise über Zugang (+) und Abgang (-) errechnet.
Oder willst Du einen Bestand nach Inventur 1x ig zum Jahresende speichern ?
Gruß Klaus

hajott

Hallo Klaus,

zunächst vielen Dank, dass Du dich um mein Problem kümmerst.

Zitat von: MzKlMu am Dezember 23, 2025, 11:22:36Warum soll das nicht gehen ?
Wenn ich die Aktualisierungsbfrage in der Access-Oberfläche so ausführe wie unten dargestellt, bekomme ich die Fehlermeldung "Operation muss eine aktualisierbare Abfrage verwenden". Vielleicht hätte ich noch sagen sollen, dass die qryBestandsdaten gruppierte Daten enthält, siehe unten. In einem Forum habe ich z.B. das dazu gefunden
https://www.office-hilfe.com/support/threads/operation-muss-eine-aktualisierbare-abfrage-verwenden.39950/
Übrigens: Wenn ich über die Access-Oberfläche aus der qryBestandsdaten eine Tabelle mache, klappts einwandfrei.

Zitat von: MzKlMu am Dezember 23, 2025, 11:22:36Hast Du die Abfrage mal über die Datenblattansicht probiert ?
Da müssen die zu aktulisierenden Datensätze angezeigt werden.
ja, werden sie.

Zitat von: MzKlMu am Dezember 23, 2025, 11:22:36In der Regel ist die Speicherung eines Bestandes ein Strukturfehler der Datenbank.
Bestände werden normalerweise über Zugang (+) und Abgang (-) errechnet.
Mir ist klar, dass das nicht ganz sauber ist. Ich schreibe nochmal 2 Sätze mehr, vielleicht liegt die Lösung ganz woanders:
- tbl1Basisdaten: Grundinformationen (von Wertpaieren)
- tbl2Umsätze: Hier wird jeder Kauf und Verkauf gespeichert (Käufe positiv, Verkäufe negativ)
- qryBestandsdaten: Gruppierung (Summe) der Umsatzdaten pro Wertpapier => der aktuelle Bestand

Ich habe ein Formular mit der Datensatzquelle "tbl1Basisdaten" in der Datenblattansicht. Beim Durchblättern (und Bearbeiten von UFOs) sollen erst die Einträge kommen, bei denen es einen Bestand gibt und anschließend alle ohne. Ich brauche also in der tbl1Basisdaten genau genommen nicht den Bestand, sondern nur den Flag "Bestand ja/nein"

Ich weiß, dass ich als Datensatzquelle auch eine Abfrage erstellen kann, die die gewünschte Reihenfolge enthält. Ich will im Formular aber auch die Möglichkeit haben, einen neuen Datensatz = Wertpapier in die Bestandstabelle hinzuzufügen. Und das geht nur, wenn die Datensatzquelle auch tbl1Basisdaten ist. Ich habe schon überlegt, als Standard-Datensatzquelle die Abfrage zu nehmen und nur für das Hinzufügen des Datensatzes per Makro die Datensatzquelle umzuschalten. Aber das halte ich für "noch unsauberer".

Danke für jede Hilfe.

Viele Grüße

Hans-Jürgen

Knobbi38

Hallo Hans-Jürgen,

ZitatIch will im Formular aber auch die Möglichkeit haben, einen neuen Datensatz = Wertpapier in die Bestandstabelle hinzuzufügen.
Warum verwendest du dafür nicht einfach ein Dialog-Formular?

Das Update in der gewünschten Form wirst du so nicht hinbekommen, da eine gruppierte Abfrage nicht aktualisierbar ist.
Eine Möglichkeit wäre eventuell für das Update tbl1Basisdaten den neuen Wert per DLookup aus der Query qryBestandsdaten abzufragen, so daß für das Update nur noch die Tabelle tbl1Basisdaten ohne Join genutzt wird.

Knobbi38
   

hajott

Vielen Dank an euch beide, ich muss morgen mal schauen, welche Kröte ich da schlucke ;-)

Normalo0815

Hallo hajott,

Zitat von: hajott am Dezember 23, 2025, 12:51:35Ich habe ein Formular mit der Datensatzquelle "tbl1Basisdaten" in der Datenblattansicht. Beim Durchblättern (und Bearbeiten von UFOs) sollen erst die Einträge kommen, bei denen es einen Bestand gibt und anschließend alle ohne.

Um Daten bearbeiten oder anfügen zu können gäbe es die Alternative mit DSUM (keine extra gruppierte Abfrage nötig).

Nachfolgend eine einfache Beispiel-Abfrage für das Formular als Datensatzherkunft (weitere Tabellenfelder ev. ergänzen):
SELECT
 ISIN,
 DSUM( "Bestand" , "tbl2Umsätze" , "ISIN = '" & ISIN & "'" ) AS BestandSumme
FROM
 tbl1Basisdaten
ORDER BY
 DSUM( "Bestand" , "tbl2Umsätze" , "ISIN = '" & ISIN & "'" ) = 0
 OR
 DSUM( "Bestand" , "tbl2Umsätze" , "ISIN = '" & ISIN & "'" ) Is Null DESC,
 ISIN

Das berechnete Feld mit der Bestandsumme dient nur zur Ansicht und kann auch herausgenommen werden falls die Performance darunter leidet. Ich bin mir nicht sicher, ob die dreimal gleichlautende DSUM-Funktion auch dreimal pro Datensatz ausgeführt wird oder ACE das auf einen Aufruf je Datensatz optimiert.

Bestand 0 (Bestandsumme mit Saldo 0) oder Null (keine Umsätze-Datensätze vorhanden) werden beim Sortieren gleich behandelt. Wenn das nicht sein soll, dann die entsprechende Zeile in ORDER BY entfernen.
Freundliche Grüße
Normalo0815   :)