collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 28
  • Punkt Versteckte: 0
  • Punkt Mitglieder: 0

Es sind keine Mitglieder online.

* Forenstatistik

  • stats Mitglieder insgesamt: 13811
  • stats Beiträge insgesamt: 64313
  • stats Themen insgesamt: 8696
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 16
  • stats Am meisten online: 415

Autor Thema: Abfragekriterium zu komplex ????  (Gelesen 5602 mal)

Offline 69bruno

  • Heimwerker
  • Access-Profi
  • **
  • Beiträge: 262
Abfragekriterium zu komplex ????
« am: Oktober 11, 2012, 12:06:42 »
 >:(
Ich stehe irgendwie neben mir......

Ich habe eine Abfrage, die den Datenbestand auf eine Gruppe Personen beschränkt, die mehr als 30 Tage Bereitschaft hatten.

Wenn ich diese Gruppe mit einer zweiten Abfrage auf die Personen beschränken möchte, die als Laufbahn "h.D." als Feldwert  in der Laufbahn haben, kommt eine Meldung, das Abfragekriterium wäre zu komplex.

Bei allen anderen Laufbahnen funktioniert das.
Ich habe schon alle anderen Laufbahnen gelöscht und arbeite nur mit den Problemfällen weiter.

Gebe ich an, er soll alle Personen zeigen, die "h.D" (ohne den zweiten Punkt) in der Laufbahn haben, bringt er mir logischerweise eine leeres Ergebnis.
Was ist an der Zeichenkombination "h.D." denn so schwierig ???

Hat einer eine Idee ???
If Brain <= requestoutofPost then
  PostonForum "Ich verstehe Dein Problem nicht....."
Else
  PostonForum "Denk erst mal über die Normalisierung nach......"
End If
 

Offline DF6GL

  • Global Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 23147
Re: Abfragekriterium zu komplex ????
« Antwort #1 am: Oktober 11, 2012, 12:25:59 »
Hallo,


zeige mal die SQL-Strings der Abfragen.... (Copy&Paste aus der Abfrageentwurf/SQL-Ansicht)

Offline 69bruno

  • Heimwerker
  • Access-Profi
  • **
  • Beiträge: 262
Re: Abfragekriterium zu komplex ????
« Antwort #2 am: Oktober 11, 2012, 12:58:16 »
Hier die Ausgangsabfrage:

SELECT Bedienstete.PersonenID, Bedienstete.Geschlecht, Bedienstete.Beamter, Bedienstete.Laufbahn, IIf([Arbeitstage]<>0,[Arbeitstage],AnzWerktagesoll([Montag_1],[Montag_2],[Dienstag_1],[Dienstag_2],[Mittwoch_1],[Mittwoch_2],[Donnerstag_1],[Donnerstag_2],[Freitag_1],[Freitag_2],[Bereit_ab],Berichte!Bereitschaft!bis,5,False,False,False,True,True,True,True,True,False,False,False)) AS Arbeitstage_berechnet, Arbeitstage.Montag_1, Arbeitstage.Dienstag_1, Arbeitstage.Mittwoch_1, Arbeitstage.Donnerstag_1, Arbeitstage.Freitag_1, Arbeitstage.Montag_2, Arbeitstage.Dienstag_2, Arbeitstage.Mittwoch_2, Arbeitstage.Donnerstag_2, Arbeitstage.Freitag_2
FROM Bedienstete INNER JOIN (Arbeitstage INNER JOIN Bereitschaften ON Arbeitstage.ArbeitstageID = Bereitschaften.ArbeitstageID) ON Bedienstete.PersonenID = Arbeitstage.PersonenID
WHERE (((Bereitschaften.Bereit_ab)>=[Berichte]![Bereitschaft]![Vom] And (Bereitschaften.Bereit_ab)<=[Berichte]![Bereitschaften]![bis]))
GROUP BY Bedienstete.PersonenID, Bedienstete.Geschlecht, Bedienstete.Beamter, Bedienstete.Laufbahn, IIf([Arbeitstage]<>0,[Arbeitstage],AnzWerktagesoll([Montag_1],[Montag_2],[Dienstag_1],[Dienstag_2],[Mittwoch_1],[Mittwoch_2],[Donnerstag_1],[Donnerstag_2],[Freitag_1],[Freitag_2],[Bereit_ab],Berichte!Bereitschaften!bis,5,False,False,False,True,True,True,True,True,False,False,False)), Arbeitstage.Montag_1, Arbeitstage.Dienstag_1, Arbeitstage.Mittwoch_1, Arbeitstage.Donnerstag_1, Arbeitstage.Freitag_1, Arbeitstage.Montag_2, Arbeitstage.Dienstag_2, Arbeitstage.Mittwoch_2, Arbeitstage.Donnerstag_2, Arbeitstage.Freitag_2
HAVING (((IIf([Arbeitstage]<>0,[Arbeitstage],AnzWerktagesoll([Montag_1],[Montag_2],[Dienstag_1],[Dienstag_2],[Mittwoch_1],[Mittwoch_2],[Donnerstag_1],[Donnerstag_2],[Freitag_1],[Freitag_2],[Bereit_ab],[Berichte]![Bereitschaft]![bis],5,False,False,False,True,True,True,True,True,False,False,False)))>30));

Und hier die aufgesetzte Abfrage:

SELECT Anz_Pers_31_Tage_ber.PersonenID, Anz_Pers_31_Tage_ber.Beamter, Anz_Pers_31_Tage_ber.Laufbahn, Anz_Pers_31_Tage_ber.Geschlecht
FROM Anz_Pers_31_Tage_ber
GROUP BY Anz_Pers_31_Tage_ber.PersonenID, Anz_Pers_31_Tage_ber.Beamter, Anz_Pers_31_Tage_ber.Laufbahn, Anz_Pers_31_Tage_ber.Geschlecht
HAVING (((Anz_Pers_31_Tage_ber.Laufbahn) Like "h.D."));
If Brain <= requestoutofPost then
  PostonForum "Ich verstehe Dein Problem nicht....."
Else
  PostonForum "Denk erst mal über die Normalisierung nach......"
End If
 

Offline DF6GL

  • Global Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 23147
Re: Abfragekriterium zu komplex ????
« Antwort #3 am: Oktober 11, 2012, 13:15:44 »
Hallo,


heiße Kiste....


Welchen Datentyp hat "Bedienstete.Laufbahn" ?

Neben dem schwer zu ertragenden Aufbau der ersten Abfrage (wenn sie denn für sich funktioniert , ist es ja gut.. ) wäre es eh besser, in der Having-Condition der zweiten Abfrage auf Like zu verzichten und "=" zu benutzen:

HAVING (((Anz_Pers_31_Tage_ber.Laufbahn) "h.D."));

Offline 69bruno

  • Heimwerker
  • Access-Profi
  • **
  • Beiträge: 262
Re: Abfragekriterium zu komplex ????
« Antwort #4 am: Oktober 11, 2012, 13:29:51 »
Stimmt, das Ding wuchert unglaublich........

Das mit dem = hatte ich zwar nicht in SQL verwendet, aber im Abfragegenerator habe ich schon beide Varianten verwendet. Habe auch schon die Punkte entfernt, was aber aufgrund der Deklaration als Textfeld kein Problem hätte darstellen sollen. Und ohne Punkte lief es auch nicht.
Interessant ist, ich habe im Bericht die Daten per Domänenaggregatfunktion ermittelt und die läuft auch auf Fehler.......(Nur bei der Kombination "h.D." )

Ich sehe mich, das ganze Abfragemodell neu zu gestalten, durch das arbeiten mit Access und Eure Hilfe habe ich da schon zu komplizierte Methoden entdeckt.......

Ich werde das like durch = in SQL austauschen und gleich berichten.......
If Brain <= requestoutofPost then
  PostonForum "Ich verstehe Dein Problem nicht....."
Else
  PostonForum "Denk erst mal über die Normalisierung nach......"
End If
 

Offline DF6GL

  • Global Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 23147
Re: Abfragekriterium zu komplex ????
« Antwort #5 am: Oktober 11, 2012, 13:34:13 »
Hallo,

mich verwundert auch, dass in der ersten Abfrage ein Verweis auf ein Berichts(!)-Textfeld als Kriterium steht... Was soll das bedeuten?

Und WO wird diese Abfrage verwendet?

Offline 69bruno

  • Heimwerker
  • Access-Profi
  • **
  • Beiträge: 262
Re: Abfragekriterium zu komplex ????
« Antwort #6 am: Oktober 11, 2012, 13:45:32 »
Der Verweis auf das Berichtstextfeld liegt darin begründet, dass ich die Werte an und für sich mit der Domänenaggregatfunktion ermittle.
Es werden Berichtsoptionen abgefragt, wer der Berichterstatter ist, von welchem Datum an der Bericht generiert wird und bis zu welchem Datum der Bericht generiert wird. Die Werte werden an den Bericht übergeben und eben in diese Textfelder geschrieben. Danach verwende ich die Werte dann für die Funktionen.

Das funktioniert bei ....moment, ich zähle...... 165 Aggregatfunktionen einwandfrei..... und einige davon sind noch um einiges komplexer als die Abfrage der Laufbahn....... ich werte auch Altersgruppen aus, da ist der SQL-String auf einem 19 Zöller nicht mehr zu lesen, deswegen habe ich hier auch zwei nebeneinander.......

Ist vielleicht nicht die schönste lösung, hatte ich aber wegen des Erfolges bei den o.g. Funktionen nicht weiter in Frage gestellt.......
........
Das = bringt keine Wirkung.........  :-[

Frei nach Bundeswehrmanier werde ich wohl erst mal eine Nacht drüber schlafen und Access morgen wieder bedienen. Ich befürchte temporäre Betriebsblindheit....
If Brain <= requestoutofPost then
  PostonForum "Ich verstehe Dein Problem nicht....."
Else
  PostonForum "Denk erst mal über die Normalisierung nach......"
End If
 

Offline DF6GL

  • Global Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 23147
Re: Abfragekriterium zu komplex ????
« Antwort #7 am: Oktober 11, 2012, 13:55:15 »
Hallo,

Du benutzt also diese Abfrage  in einer Domänenfunktion im selben Bericht mit einem Abfragekriterium als Verweis auf ein Textfeld im selbigen Bericht ?
Und das 165 mal?  Zumal sowohl in der Select-Liste als auch im Group by -Teil eine IIF() -Konstruktion und eine Funktion verwendet werden..


Ich denke mal, da wäre es angebracht, sich über den Tabellenaufbau (nochmal)  Gedanken zu machen


Erstaunlich, dass sowas überhaupt (bislang) funktioniert.  Eigentlich sollte eine Berichtsabfrage so einfach wie möglich gehalten werden (Nur Tabellen-Verknüpfungen und "statische" Kriterien, ohne Sortierungen und Gruppierungen). Besondere Berechnungen , besonders in Abhängigkeit vom aktuellen Datensatz und Sortierung/Gruppierung werden im Bericht selber veranstaltet (aber nicht mit 165 Dom-Funktionen )  ;-)  



"Komplex" kann auch darauf hindeuten, dass insgesamt der Abfrage-SQL-String zu viele Zeichen aufweist..., vermutlich weiß aber Access nicht, was es eigentlich machen soll..




Offline 69bruno

  • Heimwerker
  • Access-Profi
  • **
  • Beiträge: 262
Re: Abfragekriterium zu komplex ????
« Antwort #8 am: Oktober 11, 2012, 14:10:31 »
 ;D
Rein amerikanische Herangehensweise........schnelle Maschine, viel Speicher, 2 Monitore......

Was kostet die Welt......

Und dann merkt man, dass es so gar nicht geht.......

 :o

Ich gebe Dir vollkommen recht, ich muss glaube ich viel früher mit meinen Änderungen ansetzten.........

Die ersten 2-3 Tausend Datensätze lang hat es gewirkt...... und jetzt vermute ich eine nicht bedachte Kombination von Eingabenotwendigkeiten, die mir Löcher reisst.......
If Brain <= requestoutofPost then
  PostonForum "Ich verstehe Dein Problem nicht....."
Else
  PostonForum "Denk erst mal über die Normalisierung nach......"
End If
 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 836
Re: Abfragekriterium zu komplex ????
« Antwort #9 am: Oktober 11, 2012, 14:22:09 »
Zitat
165 Aggregatfunktionen ... und einige davon sind noch um einiges komplexer als die Abfrage der Laufbahn
Eine Domänenaggregatfunktion ermittelt genau einen Wert und ist daher bestenfalls für einen Einzelnutzung vorgesehen. Und eine Domänenaggregatfunktion arbeitet in der Regel uneffektiv (was bei einer Einzelabfrage nicht auffällt), da jedesmal ein Tabellenzugriff erfolgt und eine schlechte  Indexnutzung vorliegt.

Effektiver wäre es, aus 165 Einzelabfragen + X eine Abfrage zu erstellen.

MfGA
ebs
Mit freundlichem Glück Auf!

Eberhard
 

Offline 69bruno

  • Heimwerker
  • Access-Profi
  • **
  • Beiträge: 262
Re: Abfragekriterium zu komplex ????
« Antwort #10 am: Oktober 11, 2012, 14:35:16 »
Genau das war eben mein Gedanke,

ich berechne mir alle Werte in Einzelabfragen und übernehme sie dann in den Bericht.......
Aber es ist ja nicht so, dass die Funktionen auf Tabellen aufsetzen, die holen sich die Daten ja schon von Zwischenabfragen......

Der gerade umgekippte Ansatz war aber, nicht ganz soviele Zwischenabfragen verwalten zu müssen, sondern in einem Bericht ggfls. verschiedene Aggregatfunktionen anpassen zu müssen......

Wenn Der Bericht sich verändert.....er ist nämlich nicht von mir gesteuert, muss ich derzeit nur in das jeweilige Berichtsfeld und die Kriterien ändern. Künftig muss ich mir die zum Feld gehörende Abfrage(-n) suchen und diese anpassen......
« Letzte Änderung: Oktober 11, 2012, 14:49:42 von 69bruno »
If Brain <= requestoutofPost then
  PostonForum "Ich verstehe Dein Problem nicht....."
Else
  PostonForum "Denk erst mal über die Normalisierung nach......"
End If
 

Offline 69bruno

  • Heimwerker
  • Access-Profi
  • **
  • Beiträge: 262
Re: Abfragekriterium zu komplex ????
« Antwort #11 am: Oktober 11, 2012, 14:45:59 »
Vielleicht sollte ich zu meiner Entlastung noch erwähnen, dass der Bericht 1 mal im Jahr gezogen wird, da durfte er ruhig 2 Minuten Zeit haben, um sich zu berechnen.......

Bei einer häufigeren Berichtserstellung hätte mich die Performance durchaus mehr interessiert....
If Brain <= requestoutofPost then
  PostonForum "Ich verstehe Dein Problem nicht....."
Else
  PostonForum "Denk erst mal über die Normalisierung nach......"
End If
 

Offline 69bruno

  • Heimwerker
  • Access-Profi
  • **
  • Beiträge: 262
Re: Abfragekriterium zu komplex ????
« Antwort #12 am: Oktober 16, 2012, 12:07:40 »
 ???

Mannomannomann.

Jetzt versuche ich, die Sollarbeitstage zu berechnen. Es gibt 4 Abfragen, die verschieden Konstellationen berechnen.
1. Wenn jemand z.B nur 4 Arbeitstage die Woche hatte, im Zeitraum vor dem Berichtszeitraum, bis inmitten des Berichtszeitraumes, werden hier die Sollarbeitstage von Beginn des Berichtszeitraumes, bis Ende des damaligen Arbeitszeitmodells berechnet.
2. Wenn jemand von vor dem Berichtszeitraum bis nach Berichtszeitraum ein Arbeitszeitmodell hatte, wird mir berechnet, wieviel Arbeitstage er im Berichtszeitraum hatte.
3. Wenn jemand von inmitten des Berichtszeitraumes bis über das Ende des Berichtszeitraumes hinaus ein  besonderes Arbeitszeitmodell hatte, werden mir die Sollarbeitstage von Beginn des Arbeitszeitmodells bis Ende Berichtszeitraum berechnet.
4. wenn jemand von inmitten des Berichtszeitraumes bis inmitten des Berichtszeitraumes ein besonderes Arbeitszeitmodell hatte, werden mir dafür die Sollarbeitstage berechnet.

Eine fünfte Abfrage soll das alles addieren und mir die gesamten Sollarbeitstage aller Personen anzeigen.
An und für sich alles klar.

ABER
es gibt eine Variante, die bei keinem zutrifft. also bleibt das Feld in der Abfrage leer. Wie sage ich ihm jetzt, dass er das leere Ergebnis durch eine Null ersetzen soll ? Denn die Addition funktioniert nicht, wenn ein Feld leer ist.
das hier klappt nicht:(Ist zusätzlich noch nach Geschlecht gruppiert)

SELECT NZ(Sum(AnzWerktagesoll([Montag_1],[Montag_2],[Dienstag_1],[Dienstag_2],[Mittwoch_1],[Mittwoch_2],[Donnerstag_1],[Donnerstag_2],[Freitag_1],[Freitag_2],[ATvon],[ATbis],5,False,False,False,True,True,True,True,True,False,False,False)),Int(0)) AS Soll2, Bedienstete.Geschlecht
FROM Bedienstete INNER JOIN Arbeitstage ON Bedienstete.PersonenID = Arbeitstage.PersonenID
WHERE (((Arbeitstage.ATvon)>=[Formulare]![Berichtsoptionen]![Vom]) AND ((Arbeitstage.ATbis)<=[Formulare]![Berichtsoptionen]![bis]))
GROUP BY Bedienstete.Geschlecht;
If Brain <= requestoutofPost then
  PostonForum "Ich verstehe Dein Problem nicht....."
Else
  PostonForum "Denk erst mal über die Normalisierung nach......"
End If
 

Offline DF6GL

  • Global Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 23147
Re: Abfragekriterium zu komplex ????
« Antwort #13 am: Oktober 16, 2012, 13:27:48 »
Hallo,

offensichtlich musst Du leere Felder schon bei der Berechnung in der Funktion "AnzWerktagesoll"  berücksichtigen.

Offline 69bruno

  • Heimwerker
  • Access-Profi
  • **
  • Beiträge: 262
Re: Abfragekriterium zu komplex ????
« Antwort #14 am: Oktober 16, 2012, 13:33:43 »
 ;D
Oder ich addiere in der 5. Abfrage so:

Ausdr1: NZ([Soll1];Int(0)) + NZ([Soll2];Int(0)) .......

Hat lange gedauert, ist aber doch noch aufgefallen......

Mann, wird man blind.......
If Brain <= requestoutofPost then
  PostonForum "Ich verstehe Dein Problem nicht....."
Else
  PostonForum "Denk erst mal über die Normalisierung nach......"
End If