Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: Endling am Juni 25, 2018, 08:17:54

Titel: Bezug auf andere Zeile nehmen
Beitrag von: Endling am Juni 25, 2018, 08:17:54
Guten Morgen :D

ich habe folgende Problemstellung:

Ich habe in meiner Abfrage mehrere Einträge pro Teil, dabei hab ich jeweils unterschiedliche Orte und Werte zugeordnet.
Nun würde ich aber gerne eine weitere Spalte hinzufügen, die mehrere Werte miteinander verrechnet, aber:
Hierbei soll ein Spaltenwert IMMER aus der Zeile mit derselben Bauteilnummer aber einem bestimmten Ort stammen, siehe Beispiel.
Hierbei möchte ich dann immer den Zeilenwert aus Spalte "Nummer2" nehmen, der zum Ort "Berlin" passt.
Ist das a) überhaupt möglich, und falls ja
b) ohne SQL-Programmierung möglich?

Vielen Dank schonmal für Eure Hilfe,
lg
Sascha
Titel: Re: Bezug auf andere Zeile nehmen
Beitrag von: DF6GL am Juni 25, 2018, 08:29:42
Hallo,

entspr. dem Beispiel:

füge einfach in einer leeren Abfragespalte  hinzu:


Feld:        Ergebnis:  Nummer1*DomWert("Nummer2";"abf_DeineAbfrage";"Ort='Berlin'")



Das ist aber weder performant noch sinnvoll.  DomWert ist auch durch eine Unterabfrage realisierbar. Eine vernünftige Lösung ist aber wegen Unkenntnis der Hintergründe nicht zu geben.
Titel: Re: Bezug auf andere Zeile nehmen
Beitrag von: Endling am Juni 25, 2018, 10:05:12
Hallo DF6GL,
das könnte aber tatsächlich schon meine Lösung sein, werde ich direkt mal ausprobieren.
Vielen Dank!
Titel: Re: Bezug auf andere Zeile nehmen
Beitrag von: Endling am Juni 25, 2018, 10:19:52
Okay, ich glaube das ist doch nicht die Lösung. Die DomWert Funktion gibt mir für alle Zeilen dann aber denselben Wert aus, richtig? Nicht ganz das, was ich wollte.
Vllt wird es anhand des neuen Beispiels deutlicher.

Sprich ich habe für jedes Bauteil mind. 2 Orte. Der Bestand an beiden Orten ist unterschiedlich, ich hätte aber gerne eine Spalte, die mir immer den Bestand für einen speziellen Ort (hier Berlin), aber immer passend zur BauteilNr anzeigt, unabhängig vom Bestand des Bauteils am anderen Ort.
Titel: Re: Bezug auf andere Zeile nehmen
Beitrag von: Lachtaube am Juni 25, 2018, 11:37:57
Ich weiß nicht, ob ich Dich richtig verstehe. Gruppiere (dazu das Sigma oben im Band anklicken) in einer Abfrage über die Teilenummer und den Ort. Im Mengenfeld stellst Du dann die Funktion Summe ein.
Titel: Re: Bezug auf andere Zeile nehmen
Beitrag von: Endling am Juni 25, 2018, 12:14:07
Zitat von: Lachtaube am Juni 25, 2018, 11:37:57
Ich weiß nicht, ob ich Dich richtig verstehe. Gruppiere (dazu das Sigma oben im Band anklicken) in einer Abfrage über die Teilenummer und den Ort. Im Mengenfeld stellst Du dann die Funktion Summe ein.

Ich glaube, wir verstehen uns noch nicht richtig xD
Habe deine Anweisung trotzdem mal ausprobiert, er zeigt mir dann jedoch immernoch zwei unterschiedliche Werte je BauteilNr an. Ziel ist es, dass für jedes Bauteil, an beiden Orten der der Wert stehen soll, der eigentlich nur bei Berlin steht, (siehe Beispiel).
Titel: Re: Bezug auf andere Zeile nehmen
Beitrag von: Lachtaube am Juni 25, 2018, 12:26:05
Ich kann Deinen Ausführungen leider nicht folgen. Erstelle als Text eine kurze Ist-Situation und ebenso als Text eine darauf basierende Soll-Situation und stelle ggf. Rechenanweisungen zur Erläuterung bereit.
Titel: Re: Bezug auf andere Zeile nehmen
Beitrag von: Endling am Juni 25, 2018, 13:30:57
Hier nochmal in Excel dargestellt.
Einen richtigen IST-Zustand gibt es noch nicht, da ich halt überhaupt keine Ahnung habe, wie
ich in Access eine andere Zeile adressieren würde. Daher ja auch meine Frage, ob das überhaupt geht.

EDIT: Jetzt auch mit sichtbarer Spalten- und Zeilenbeschriftung <.<
Zudem meine ich im grünen Bereich den Bestandswert, nicht den Bedarfswert.
Titel: Re: Bezug auf andere Zeile nehmen
Beitrag von: DF6GL am Juni 25, 2018, 13:49:09
Hallo,


welche Bedeutung haben denn die Werte in Spalte I?
Warum wird Standort "A" so bevorzugt?

Soll sowas wie eine "Kanban"-Lösung realisiert werden?
Titel: Re: Bezug auf andere Zeile nehmen
Beitrag von: Endling am Juni 25, 2018, 13:58:18
Zitat von: DF6GL am Juni 25, 2018, 13:49:09
Hallo,


welche Bedeutung haben denn die Werte in Spalte I?
Warum wird Standort "A" so bevorzugt?

Soll sowas wie eine "Kanban"-Lösung realisiert werden?

Bei den Orten handelt es sich einmal um ein Zwischenziel und einmal um ein Endziel.
Die Berechnung in Spalte I ist hier nur beispielhaft, konkret soll ein anderer Wert errechnet werden. Für den ist jedoch erforderlich, den Bestandswert pro Bauteil zu vereinheitlichen, unabhängig von der Ortsangabe, bzw. fixiert auf das Endziel.
Titel: Re: Bezug auf andere Zeile nehmen
Beitrag von: DF6GL am Juni 25, 2018, 14:09:09
hallo,

sorry, aber das versteh ich nicht..

ZitatFür den ist jedoch erforderlich, den Bestandswert pro Bauteil zu vereinheitlichen, unabhängig von der Ortsangabe, bzw. fixiert auf das Endziel.


Einmal unabhängig, dann wieder fixiert auf...
Und was heißt "vereinheitlichen" ?


Vielleicht solltest Du die aktuelle Situation (gegebene Daten, Workflow)  nochmal überdenken und analysieren und dem gewünschten Ablauf anpassen.
Titel: Re: Bezug auf andere Zeile nehmen
Beitrag von: Endling am Juni 25, 2018, 14:25:34
Ich möchte wirklich nicht unhöflich oder undankbar sein, aber ich verstehe
das Problem beim Verständnis des Problems nicht xD
Ich muss mich wohl zu umständlich oder kompliziert ausdrücken.

Zitat
Vielleicht solltest Du die aktuelle Situation (gegebene Daten, Workflow)  nochmal überdenken und analysieren und dem gewünschten Ablauf anpassen.

Ich führe die Aufgabe im als Praktikant für meinen Vorgesetzten aus, der diese eine Spalte schlichtweg für sein Analysetool benötigt. Genauere Hintergründe zu diesem Wert, bzw. dem Sinn dieses Wertes kann ich nicht geben.

Unabhängig davon, ob die Ermittlung dieses Wertes sinnvoll erscheint oder nicht,
hier nochmal ein Versuch, zu erklären, was ich bräuchte:

Es gibt für jedes Bauteil zwei Zeilen, die sich im Standort, Bestand und Bedarf unterscheiden.
Nun soll beispielshalber der Bestand durch den Bedarf geteilt werden, und dabei soll immer der Bestandswert aus der Zeile von Standort "A" verwendet werden. Egal, ob bei dieser Zeile der Standort "A", "B", "C" oder "XYZ" steht.
Titel: Re: Bezug auf andere Zeile nehmen
Beitrag von: Endling am Juni 25, 2018, 14:28:42
Sowie es im Excel-Screenshot abgebildet ist, soll z.B.
im Feld H4 NICHT E4/F4 stehen, sondern E3/F4, da der Bedarfswert vom Standort "A" gewählt werden soll. Sprich ich bräuchte eine Abfrage, die prüft, ob der Standort = "A" ist, wenn ja, dann berechne Bestand/Bedarf, wenn nein, suche den Bestandswert zu diesem Bauteil zum Standort "A" und teile den Bedarf dadurch.
Titel: Re: Bezug auf andere Zeile nehmen
Beitrag von: DF6GL am Juni 25, 2018, 16:00:56
Hallo,

naja, die Sinnhaftigkeit zu hinterfragen ist nicht verkehrt und brächte Licht ins Dunkel.. Das darfst auch Du als Praktikant  ;-)

Zitatim Feld H4 NICHT E4/F4 stehen, sondern E3/F4, da der Bedarfswert vom Standort "A" gewählt werden soll.

Bedarfswert oder eher Bestand??




Wie auch immer, solche Konstruktion sollte das liefern was begehrt wird:

(Nimm immer den Bestandswert von Standort "A" und dividiere ihn durch den Bedarfswert des jeweiligen Standorts bezogen auf die jeweilige Bauteilnummer.)



In einer Abfragespalte:

Feld:      Ausgabe: Domwert("Bestand";"abf_DeineAbfrage";"Bauteilnummer= " & [Bauteilnummer] & " and Standort="A")  / Bedarf



In diesem Beispiel wird dividiert,  im ersten multipliziert. Da musst Du Dich jetzt auch entscheiden.


Und wie vorher gesagt: Domwert könnte durch eine Unterabfrage ersetzt werden. Du willst aber kein SQL (verwenden).
Titel: Re: Bezug auf andere Zeile nehmen
Beitrag von: Lachtaube am Juni 25, 2018, 17:27:10
Nun glaub' ich's verstanden zu haben. Schau Dir bitte diesen db<>fiddle (https://dbfiddle.uk/?rdbms=postgres_10&fiddle=851849f84906ad375bde47bc03ac278a) mit Anmerkungen an.
Titel: Re: Bezug auf andere Zeile nehmen
Beitrag von: Endling am Juni 26, 2018, 07:48:48
Vielen Dank für Eure Geduld mit mir, ich werde beide Ansätze direkt ausprobieren   ;D
Titel: Re: Bezug auf andere Zeile nehmen
Beitrag von: Endling am Juni 26, 2018, 13:46:56
Okay,
die Lösung von Franz funktioniert zwar effektiv, habe aber nun das Problem, dass die Abfrage unfassbar langsam/ruckelig wird, sobald ich in den Bereich mit der neuen Spalte komme.

Es sei dabei gesagt, dass ich bei meinem konkreten Fall 3 Bedingungen in den DomWert einbaue, und die Abfrage insgesamt 25.000 Einträge hat.

Kann es daran liegen, dass ein Fehler in dem Quellcode bei mir ist, obwohl er mir keine Fehlermeldung ausspuckt, ober liegt es an der DomWert-Funktion, die schlicht viel Rechenkapazität benötigt?
Titel: Re: Bezug auf andere Zeile nehmen
Beitrag von: DF6GL am Juni 26, 2018, 16:26:48
Hallo,

es liegt wie eingangs schon erwähnt, an der Performance der Dlookup()-Funktion und eine Unterabfrage sollte effektiver arbeiten. Die habe ich beispielhaft genannt, weil kein SQL gewünscht war.



Mit Unterabfrage sieht es so aus:


Ausgabe: (select Bestand from abf_DeineAbfrage as A where A.Bauteilnummer= " & [Bauteilnummer] & " and A.Standort="A")  / Bedarf


Es sollte etwas schneller sein.


Ein weitere Möglichkeit bestünde darin, die Abfrage (warum eigentlich Abfrage?.. Gibt es keine Tabelle, die diese Felder beinhaltet?) im Abfrageentwurf zweimal hinzuzufügen und über die Felder Bauteilnummer und Standort zu verknüpfen und bei der zweiten Abfrage auf Standort "A" zu beziehen.
Titel: Re: Bezug auf andere Zeile nehmen
Beitrag von: Lachtaube am Juni 26, 2018, 16:33:47
Mit Dom-Funktionen und Unterabfragen, die Skalare (Einzelwerte) ausgeben sollte man spärlich und bedacht umgehen. Auf jeden Fall sollten die Felder, die in Bedingungen vorkommen, einen Index aufweisen. Und ob man 25000 Datensätze auf einmal in der Ausgabe benötigt, sollte man sich auch gut überlegen.
Titel: Re: Bezug auf andere Zeile nehmen
Beitrag von: Endling am Juni 27, 2018, 08:43:15
Zitat von: DF6GL am Juni 26, 2018, 16:26:48
Mit Unterabfrage sieht es so aus:


Ausgabe: (select Bestand from abf_DeineAbfrage as A where A.Bauteilnummer= " & [Bauteilnummer] & " and A.Standort="A")  / Bedarf


Es sollte etwas schneller sein.

Das wollte ich jetzt mal ausprobieren, und mit dabei zum Testen lediglich den Bestand ausgeben lassen, ohne ihn weiter zu verrechnen. Dabei gibt er mir jetzt jedoch folgenden Fehler aus:
Datentypenkonflikt im Kriterienausdruck.

Hier mein konkreter Code:

TEST_MIN_BESTAND: (select MIN_BESTAND_AT from Miles_Tool as A where A.TFPLANID=" & [G21_Report.TFPLANID]&" and A.SENKE_ORTSNAME ="Eching")

Die TFPLANID ist dabei vom Typ "Allg. Zahl", SENKE_ORTSNAME vom Typ kurzer Text. Habs schon mit diverse hochgestellten Kommas an verschiedenen Stellen probiert, bekomme den Fehler aber nicht raus.
Titel: Re: Bezug auf andere Zeile nehmen
Beitrag von: DF6GL am Juni 27, 2018, 13:03:46
Hallo,


TEST_MIN_BESTAND: (select MIN_BESTAND_AT from Miles_Tool as A where A.TFPLANID=" & [G21_Report.TFPLANID] & " and A.SENKE_ORTSNAME ="Eching")


Was ist das denn?

Und wieso jetzt ganz andere Felder, bzw. Bedeutungen??   >:(