Ich habe folgendes Problem mit Abfragen:(siehe Anlage Test.accdb)
1) es gibt eine Tabelle tblInventur und eine Tabelle tblArtikel.
In der tblArtikel sind alle Artikel gespeichert. In der tblInventur alle Inventurwerte der letzten Jahre.
Nun möchte ich für die Eingabe der laufenden Inventur die Mengen des Vorjahres anzeigen. Dazu habe ich zwei Abfragen qryInventurlfd und qryInventurVJ erstellt. In der qryInventureingabe sollen die Inventurwerte des laufenden Jahres erfasst werden (selbstverständlich dann über das entsprechende Formular). Sobald ich aber die Menge des Vorjahres über die qryInventurVJ anzeigen möchte, kann ich im laufenden Jahr keine Menge mehr eingeben. Mir ist nicht klar warum.
2) Das gleiche Problem habe ich wenn ich in der Abfrage qryOffene Auftraege den Ort in die Abfrage aufnehme, kann ich ebenfalls keine Änderungen mehr machen.
Alle bisherigen Vorschläge haben leider keine Lösung gebracht. (siehe Abfrage über mehrere Tabellen).
Vielleicht hat jemand eine Idee welchen Denkfehler ich bei diesen Abfragen habe, bevor ich wieder die ganze Tabellenstruktur neu aufbauen muss.
Günther
Zitat von: gsaccess am März 26, 2024, 12:17:34Alle bisherigen Vorschläge haben leider keine Lösung gebracht. (siehe Abfrage über mehrere Tabellen).
Vielleicht hat jemand eine Idee welchen Denkfehler ich bei diesen Abfragen habe, bevor ich wieder die ganze Tabellenstruktur neu aufbauen muss.
Auf den ersten Blick scheint es dasselbe Problem zu sein, dass du auch bei dem Thread
Abfrage über mehrere Tabellen (https://www.access-o-mania.de/forum/index.php?topic=27066) hattest.
Du baust dir Tabellen und/oder Abfrage, die keine eindeutigen Datensätze liefern.
Für Access ist es notwendig, dass es
technisch ausgeschlossen ist, dass es mehrdeutige Datensätze gibt. Dagegen verstößt du nicht nur auf der theoretischen, technischen Basis, sondern auch effektiv mit den eingegebenen Daten (Artikel 77 ist mehrfach in deiner Abfrage
qryInventurVJ vorhanden).
Du musst sicherstellen, dass jeder Artikel in einer Inventur nur einmalig erfasst
werden kann. Dafür eignet sich z.B. ein eindeutiger, zusammengesetzter Index auf
ArtikelnummerID_F und
Inventurdatum in der Tabelle
tblInventur.
Danke für die schnelle Antwort.
Der doppelte Datensatz Artikel 77 ist nur durch die händische Nachbearbeitung in der TestDB entstanden.
In der Echtdb kann es jeden Artikel mit jedem Datum nur 1x geben. Die Artikelnummern werden über eine Anfügeabfrage in der tblInventur angelegt und können daher jedes Jahr nur einmal vorkommen. Nach der Inventureingabe werden die Artikel ohne Wert in der tblInventur gelöscht.
Ich habe nun in der tblInventur einen eindeutigen Schlüssel aus ArtikelnummerID_F und Inventurdatum eingebaut.
Dies ändert aber nichts daran, dass die Menge nicht eingegeben werden kann.
Was ist mit
ZitatFür Access ist es notwendig, dass es technisch ausgeschlossen ist, dass es mehrdeutige Datensätze gibt
noch gemeint.
Aus meiner Sicht gibt es in der Inventur durch den zusammengesetzten Schlüssel keine doppelten Datensätze mehr. Trotzdem kann nicht angefügt werden.
Wo habe ich hier noch einen Denkfehler?
Günther
Wenn ich recht verstanden habe ist dein erster Schritt alle Artikel
an die Inventurtabelle anzuhängen, mit ID und Inventurdatum. Dabei
kann es m.E. eigentlich zu keinen Problemen kommen, da nur aus einer
Tabelle Daten an eine zweite angehängt werden.
Das Zählfeld ist dann leer und du kannst die Zählungen da eintragen, -
was willst du also noch (mal) anfügen?
Was meinst du mit "Menge des Vorjahres"? Den letzten Inventurbestand?
Der ist doch völlig uninteressant! Um Schwund (oder Differenzen allgem.)
zu erkennen brauchst du doch den Soll-Bestand am Stichtag. Und der ergibt
sich aus der Addition der Lagerbewegungen.
Du schreibst also eine Abfrage auf diese Tabelle, die die Bewegungen
summiert, gruppiert nach ArtikelID. Diese dann mit der aktuellen Inventur
über die ArtikelID gejoint, siehst du im Form den akt. Soll-Bestand und
das Feld für den (gezählten) Ist-Bestand. Und der ist da dann auch zu
erfassen. Daraus lässt sich dann auch autom. die Differenz ermitteln und
im Lager buchen. Da musst du dann einen DS anfügen.
Zitat von: gsaccess am März 26, 2024, 15:48:16Aus meiner Sicht gibt es in der Inventur durch den zusammengesetzten Schlüssel keine doppelten Datensätze mehr. Trotzdem kann nicht angefügt werden.
Den zusammengesetzt Schlüssel finde ich in deiner DB nicht.
Allerdings ist auch mit dem Schlüssel das Bearbeiten nicht möglich und mir ist leider auch nicht klar warum.
Es geht, wenn du in den Abfrageeigenschaften den RecordsetType auf "Dynaset (Inconsistent Updates)" stellst. - Vorausgesetzt der o.g. Schlüssel ist vorhanden, sehe ich da kein ernsthaftes Risiko.
ZitatVielleicht hat jemand eine Idee welchen Denkfehler ich bei diesen Abfragen habe
Bei einer Abfrage über mehrere Tabellen entsteht keine "Exceltabelle", wo man alles beliebig ändern kann wie man denkt. Durch JOINs entstehen Vervielfältigungen und umgedreht dann Zuordnungsprobleme, wenn man schreiben will. OUTER JOINs wirken verschärfend, in Kette um so mehr.
Meine Maxime ist, zum Ändern immer genau EINE Tabelle für sich darstellen zu lassen, dann klappt das mit dem Ändern 100-prozentig unter der Voraussetzung, das keine Verletzungen der RI erzeugt werden.
Dealing with Non-Updateable Microsoft Access Queries and the Use of Temporary Tables (https://www.fmsinc.com/microsoftaccess/query/non-updateable/index.html)
Mögliche Entschärfung:
Die Anbindung der Vorjahresmenge statt per Abfrage mit einem DLookup. Das wird entspannter von Jet behandelt. Dazu ein DISTINCTROW, das greift auf alle Felder der verwendeten Tabellen und damit auf vorhandene Schlüssel zu.
SELECT DISTINCTROW
A.ArtikelnummerID,
A.ArtikelgruppeID_F,
A.Artikelbezeichnung,
A.Dimension,
LFD.Menge AS MengeLFD,
LFD.Einzelpreis,
Dlookup("Menge", "tblInVentur", "Inventurdatum = #12/31/2022# AND ArtikelnummerID_F = " & A.ArtikelnummerID) AS MengeVJ
FROM
tblArtikel AS A
LEFT JOIN qryInventurLfd AS LFD
ON A.ArtikelnummerID = LFD.ArtikelnummerID_F
Vielen Dank für eure Rückmeldungen.
ZitatWas meinst du mit "Menge des Vorjahres"? Den letzten Inventurbestand?
Der ist doch völlig uninteressant! Um Schwund (oder Differenzen allgem.)
Der Anwender möchte immer den Vorjahreswert bei der Eingabe der neuen Inventur sehen. Ansonsten ist mir deine Argumentation klar.
ZitatEs geht, wenn du in den Abfrageeigenschaften den RecordsetType auf "Dynaset (Inconsistent Updates)" stellst.
Mit dieser Umstellung funktioniert die Abfrage auch die Abfrage von (Abfrage über mehrere Tabellen) mit Ort und Straße funktioniert. Mir war diese Möglichkeit bisher nicht bekannt. Nach Durchsicht einiger Erklärungen im WEB sollte es im konkreten Fall keine Probleme geben.
ZitatMeine Maxime ist, zum Ändern immer genau EINE Tabelle für sich darstellen zu lassen, dann klappt das mit dem Ändern 100-prozentig unter der Voraussetzung, das keine Verletzungen der RI erzeugt werden.
Dieser Ansatz gefällt mir sehr gut.
Vielen Dank für den Code. Ich werde diesen in meiner DB einbauen.
Nochmals vielen Dank an alle!!
Günther
Noch eine Frage an Eberhard:
Wie kann man den Code (wie in deinem Beispiel) so schön strukturiert beibehalten.
Sobald ich einmal in die Entwurfsansicht gehe schaut der SQLCode dann so aus
SELECT DISTINCTROW LFD.InventurID, A.ArtikelnummerID, A.ArtikelgruppeID_F, A.Artikelbezeichnung, A.Dimension, LFD.Menge AS MengeLFD, LFD.Einzelpreis, DLookUp("Menge","tblInVentur","Inventurdatum = #12/31/2022# AND ArtikelnummerID_F = " & A.ArtikelnummerID) AS MengeVJ
FROM tblArtikel AS A LEFT JOIN qryInventurLfd AS LFD ON A.ArtikelnummerID = LFD.ArtikelnummerID_F;
Also nicht mehr so schön strukturiert.
Günther
Das ist leider so, die SQL-Ansicht behält die Formatierung beim
Speichern nicht bei.
Ich verwende einen eigenen Formatierer als Add-In:
Info - QueryHelper - Formatierung und Editierung von SQL-Anweisungen (https://www.ms-office-forum.net/forum/showthread.php?t=371406)
Vielen Dank für das tolle Tool. Damit kann man ja richtig gut und übersichtlich arbeiten. Großes Lob!!
Günther