Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Kriterium aus einer anderen Tabelle holen

Begonnen von dolpho, Mai 07, 2024, 13:43:50

⏪ vorheriges - nächstes ⏩

dolpho

Hallo zusammen,
mal wieder sitze ich an einem Problem:
In mehrerern Abfragen benutze ich den gleichen Filter, der in sich recht komplex ist (ich füge ihn unten an)
Um bei einer Änderung des Filters, diesen in allen Abfragen gleich und richtig zu erneuern, würde ich ihn gern in der tblFlaschenfilter im Feld Filter "verwalten".
Leider ist es mir bisher nicht gelungen, diesen Wert abzurufen.
Der von Access erzeugte SQLCode lautet:

SELECT Right([Referenz],8) AS Lieferung, ([Menge in ErfassME]*-1) AS Menge, [2541].Bewegungsart
FROM 2541
WHERE ((([2541].Bewegungsart)="201" Or ([2541].Bewegungsart)="601" Or ([2541].Bewegungsart)="541" Or ([2541].Bewegungsart)="966") AND (([2541].Material) Like [tblFlaschenfilter]![Filter]));

leider bekomme ich kein Ergebnis, weil ich nicht weiß, wie ich den einzigen Wert in der tblFlaschenfilter abrufen soll.

Vielleicht findet sich ja diesmal jemand, der mir helfen kann  ;)

LG dolpho

Der Filter lautet, nur zum Verständnis:

Wie "-B102-" Oder Wie "-B105-" Oder Wie "-B108-" Oder Wie "-B110-" Oder Wie "-B120-" Oder Wie "-B130-" Oder Wie "-C1-" Oder Wie "-C10-" Oder Wie "-C20-" Oder Wie "-C140-" Oder Wie "-C187-" Oder Wie "-C209-" Oder Wie "-C271-" Oder Wie "-C272-" Oder Wie "-C3-C2" Oder Wie "-C4-" Oder Wie "-C5-" Oder Wie "-C620-" Oder Wie "-C640-" Oder Wie "-C643-" Oder Wie "-C646-" Oder Wie "-C649-" Oder Wie "-C660-" Oder Wie "-C680-" Oder Wie "-C683-" Oder Wie "-C686-" Oder Wie "-C689-" Oder Wie "-C690-" Oder Wie "-C7-" Oder Wie "-C8-" Oder Wie "-C9-" Oder "A5Q00028474" Oder "A5Q00033245"



MzKlMu

llo,
bei einem solchen Filter würde ich erhebliche Zweifel am Datenmodell anmelden.

Kannst Du mal ein Bild des Beziehungsfensters hier zeigen.
Gruß
Klaus

dolpho

Mein Problem ist, dass die Tabellen gar nicht in einer Beziehung stehen, ich aber nicht weiß, wie ich diese "Riesentextzeile" Von dem Ort, wo sie jetzt ist, in das Kriterium der Abfrage zu bekommen.
Gruß dolpho

MzKlMu

Hallo,
ich habe keine Ahnung über die Zusammenhänge.
Eine Datenbank ohne Beziehungen ist auch keine richtige Datenbank.
Ich glaube auch, die das Kriterium mit den vielen ODER ohnehin zu groß wird, es also gar nicht geht.

Wie sind denn die Tabelle(n) aufgebaut.
Gruß
Klaus

dolpho

Hallo Klaus,
da gebe ich dir recht. Der Ursprung ist gar keine Datenbank und es soll auch keine werden.
Das Ziel in diesem Fall ist, aus aus insgesamt vier Tabellen jeden Monat die Werte zu etxrahieren und die Daten weiter zu verwenden. Access ist mir da als glücklichste Lösung eingefallen.

Letztlich ist es eine Auswertung aus dem SAP, die verschiedene Warenbewegungen anhand der Bewegungsarten trennen kann und und verschiedenes Material filtern oder ausfiltern kann.

Der angegebe Filter steht derzeit als Kriterium in mehreren Abfragen und funktioniert tadellos.
Nur würde ich ihn lieber zentral verwalten, damit auch ein Lai später mal Änderungen vornehmen kann, ohne VBA oder SQL lernen zu müssen.

Gruß dolpho

PhilS

Zitat von: dolpho am Mai 07, 2024, 14:29:50Der angegebe Filter steht derzeit als Kriterium in mehreren Abfragen und funktioniert tadellos.

Nur würde ich ihn lieber zentral verwalten, damit auch ein Lai später mal Änderungen vornehmen kann, ohne VBA oder SQL lernen zu müssen.
Ich würde die ganzen Kriterien deines Filters als einzelne Werte in einer Tabellenspalte erfassen. Bei Bedarf noch eine weitere Spalte in der du speicherst ob das Kriterium mit LIKE oder Gleichheit geprüft werden soll. - Im Moment kannst du dir das sparen, weil ein LIKE (WIE) ohne irgendein Wildcard-Zeichen in dem Kriterium keinen Unterschied zu einer Prüfung auf Gleichheit macht.

Dann kannst du dein SQL schon fast so verwenden, wie du es hattest:


SELECT Right([Referenz],8) AS Lieferung, ([Menge in ErfassME]*-1) AS Menge, [2541].Bewegungsart
FROM 2541,  tblFlaschenfilter
WHERE ((([2541].Bewegungsart)="201" Or ([2541].Bewegungsart)="601" Or ([2541].Bewegungsart)="541" Or ([2541].Bewegungsart)="966") 
AND (([2541].Material) = [tblFlaschenfilter].[SpalteMitKriterien]));

Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Beaker s.a.

Hallo,

Wenn es eine Tabelle "Bewegungsarten" gibt, kann man die auch in einem Listfeld
(erweiterte Auswahl) darstellen. Da kann jeder Anwender einfach die benötigten
Arten auswählen. Aus dieser Auswahl lässt sich dann per VBA eine kommagetrennte
Liste zusammen stellen und in jeder Abfrage in eine IN-Klausel einfügen.

gruss ekkehard
--
Frauen aller Länder vereinigt euch! Wir brauchen eine Wiedergeburt des Matriarchats.
Und schickt den Papst in die Wüste! Da kann er 40 Tage auf God(o)t warten.

ebs17

#7
Wie "-B102-" Oder Wie "-B105-" Oder ...Das kann man vielleicht im Abfrageeditor eintippen, wird aber in einer Abfrage im WHERE-Teil so nie funktionieren.
Dort sieht ein übliches Krterium immer so aus:
Tabellenfeld Operator Vergleichswert OR/AND Tabellenfeld Operator Vergleichswert ...

In Deiner Gestaltung der Einbringung sieht es aber noch anders aus. Da steht dann ...
... AND [2541].Material = "langerlangerText"Solch ein Material wird es nicht geben. Durch die AND-Verknüpfung bekommt dann der Gesamtfilter kein True, Dein Ergebnis ist also leer.

ZitatFilter, der in sich recht komplex ist
Das ist der Umständlichkeit geschuldet.
Bei mir würde die Abfrage etwa so aussehen:
SELECT
   Right(T.Referenz, 8) AS Lieferung,
   T.[Menge in ErfassME] * -1 AS Menge,
   T.Bewegungsart
FROM
   2541 AS T
WHERE
   T.Bewegungsart IN ("201", "601", "541", "966")
      AND
   T.Material IN
      (
         SELECT
            SpalteX
         FROM
            tblFlaschenfilter
      )

Die Ausdrücke B102, B105, ... wären also Datensatz-Inhalte eines Feldes in der anderen Tabelle, die ggf. selber geeignet gefiltert wird.
Über die Rolle der Bindestriche habe ich keine Vorstellung, daher fanden sie bisher keine Berücksichtigung.

ekkehard wies freundlicherweise darauf hin, das man mit Tabellen die Filterung auf Bewegungsarten und Material gleichartig gestalten kann.
Mit freundlichem Glück Auf!

Eberhard

dolpho

Jetzt bin ich dank eurer Hilfe ein ganzes Stück weiter, aber noch nicht am Ziel.
Die Tabelle Flaschenfilter habe ich nun um die Spalten WA WE und Test erweitert und entsprechend den Code geändert.SELECT Right(T.Referenz,8) AS Lieferung, T.[Menge in ErfassME]*-1 AS Menge, T.Bewegungsart, T.Material
FROM 2541 AS T
WHERE (((T.Bewegungsart) In (SELECT WA FROM tblFlaschenfilter)) AND ((T.Material) In (SELECT Test FROM tblFlaschenfilter)));
Wenn ich als Filterkriterium in der Spalte Test den vollen Materialnamen stehen habe, bekomme ich ein Ergebnis. Gibt es nur einen Teil davon, bekomme ich kein Ergebnis.
Gibt es dafür eine Lösung?

Beispiel:
Filter S54475-B105-A1 bringt alle Zeilen mit S54475-B105-A1
und
Filter B105 sollte S54475-B105-A1, S54475-B105-A2 und S54475-B105-A5 anzeigen, bleibt aber leer.

ebs17

#9
Wenn man Datenbankregeln (Normalisierung) anwendet, hat man oft auch einen ganz praktischen Nutzen => es wird lösbar, es wird einfach, es wird schnell.
Wenn Du nach B105 statt nach S54475-B105-A1 suchst, liegen im zweiten Ausdruck offensichtlich mehrere atomare Informationen vor, die miteinander verkettet sind.
Die ultimative Lösung liegt also darin, diese Verkettung aufzulösen und den Ausdruck in (mindestens) 3 Felder zu zerlegen. Dann kannst Du obige Abfrage anwenden und müsstest nur den Feldnamen ändern.

Konsequent wäre, wenn diese Trennung in atomare Inhalte einmalig stattfindet und die Inhalte bereits in Tabellenfeldern liegen (und indiziert werden können).

Zusammensetzen von Inhalten ist viel einfacher als das Trennen in atomare Inhalte on the fly.
Daher sollte man sich regelmäßig für diesen zusätzlichen Normalisierungsschritt entscheiden.

Right(T.Referenz,8) weist auf ein gleiches Problem hin. Der Datenmodellierer war wohl nicht ganz bei der Sache.
Mit freundlichem Glück Auf!

Eberhard

dolpho

Hallo Eberhard,

das liegt sicher daran, dass zu viele Programmierer gemeinsam das SAP programmiert haben und dann kommen ständig verschiedene Werte heraus.
Einmal gibt SAP nur die 8 Stellen an, ein ander Mal (wie hier) stellt es dann zwei Nullen voran und wieder woanders heißt die Zahl dann SIH0000???????? oder SIH0000????001 und ich habe lediglich dort versucht, einen gemeinsamen Nenner zu finden.
Die von Dir vorgeschlagene Normalisierung in z.B. S54475-&B105&-A1 ist m.E. schwieriger, da die Zahlengruppen nicht gleich sind.
Es z.B. gibt sowohl S54475 als auch S54476
bei C640 gibt es A1,A2 und A3 und bei C680 nur A1   usw.
Wenn sich der Filter nicht so auflösen lässt, ist es sicher einfacher alle gesuchten Artikel
einzeln in die Tabelle aufzunehmen.
Das hatte ich auch schon mal so in die Abfrage eingelegt, mittlerweile sind das aber so viel Artikel geworden, dass die 144 Stellen nicht ausgereicht haben und deshalb versuchte ich, das sinnvoll einzukürzen.

Gruß dolpho

ebs17

#11
Zitatdas liegt sicher daran, dass zu viele Programmierer gemeinsam das SAP programmiert haben und dann kommen ständig verschiedene Werte heraus
Große Datenbanken und große Namen bedeuten nicht zwingend großartige (Anwendungs) Entwickler(leistungen). Wenn man selber seine Schlauheit zeigen will, sollte man anfangen zu ändern.

Die erste Frage ist jene: Erhält man die SAP-Tabelle als Export aus SAP oder Verknüpfung ins SAP?
Export/Import ist eine Schnittstelle, die immer auch die Chance auf eine totale Umstrukturierung nach eigenen Erfordernissen bietet. Ich vergleiche das gerne so: Ein Hühnerei wird mit Kalkschale ausgeliefert. Muss man jetzt die Kalkschale zwingend mitessen? Oder wird man frühest möglich die Kalkschale entfernen?

Bei einer Verknüpfung hat man meist nicht die Möglichkeit, Strukturen in  der Quellanwendung zu ändern. Dann müsste man solche benötigten Vorgänge live in seine Abfragen und Verarbeitungen einbauen, was aber im konkreten Fall durchaus auch schwierig bis unmöglich sein kann.. Da wäre bei mir der Schritt nicht weit, im Rahmen einer Gesamtabfrage die Ursprungstabelle in eine temporäre Tabelle zu normalisieren und dann die normalisierte Tabelle weiterzuverwenden. das um so nachdrücklicher, je intensiver eine Folgeverwendung dieser Tabelle erfolgt.

ZitatDie von Dir vorgeschlagene Normalisierung in z.B. S54475-&B105&-A1 ist m.E. schwieriger, da die Zahlengruppen nicht gleich sind.
Es z.B. gibt sowohl S54475 als auch S54476
bei C640 gibt es A1,A2 und A3 und bei C680 nur A1   usw.
Nun, der Umgang mit "Like '*irgendwas*'" oder Instr hat seine Grenzen. Resultierend musst Du sowieso trennen, unabhängig von einer richtigen oder temporären Normalisierung. Bei der richtigen Normalisierung hat man den Vorteil, dass man sich in diesem Arbeitsschritt nur auf diese Aufgabe konzentrieren und zusätzliche Methoden einbringen kann => RegEx.
Zu den genannten Schwierigkeiten: Wenn Du das im Kopf zusammenhalten bzw. trennen kannst, gibt es Regeln dafür, die man fixieren und in seiner Verarbeitung berücksichtigen kann.
Wenn Du wie hier ein Problem sauber formulieren kannst, stecken in dieser Formulierung bereits Schritte zur Lösung, die dann nur noch zu gehen sind.

Falls Du Deine Strukturen und Aufgaben etwas breiter ausrollen würdest, könnte man etwas konkretere Hinweise zu Einzelaufgaben beibringen.
Mit freundlichem Glück Auf!

Eberhard

Micharius

Hallo
Gerne erlaube ich mir einen Kommentar, auch wenn er von Access weg weist...

ZitatDas Ziel in diesem Fall ist, aus aus insgesamt vier Tabellen jeden Monat die Werte zu etxrahieren und die Daten weiter zu verwenden. Access ist mir da als glücklichste Lösung eingefallen.


Daten aus verschiedenen Quellen abfragen, gerade wenn du Ordner hast, wo jeden Monat eine neue Datei hinzukommt, klappt besser mit Excel PowerQuery. Ein extrem mächtiges Werkzeug und für mich die bessere Wahl wenn es darum geht, Daten zu aggregieren.

Lieber Gruss
Micharius

dolpho

#13
Zitat von: Micharius am Mai 27, 2024, 17:24:06Hallo
Gerne erlaube ich mir einen Kommentar, .....

Das schaue ich mir bei Gelegenheit mal an, müsste ich aber jetzt auch erst wieder erlernen.

dolpho

Einmal Danke an Alle, die mich unterstützt haben
und sorry, wenn es etwas gedauert hat.
Der Weg der Normalisierung war hier eine gute Wahl!
Dazu habe ich eine "Filtertabelle" gebaut und inzwischen hat sie sogar fünf Spalten und die SQL SELECT war dadurch fast ein Kinderspiel.
Zusätzlich hat das auch noch den Vorteil, dass meine Nachfolger einmal mit den entsprechenden Formularen diese Tabelle auch recht einfach bearbeiten können.