Neuigkeiten:

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

Mobiles Hauptmenü

Formular mit zwei Abfragen schneller, als mit einer??

Begonnen von Xoar, Dezember 19, 2016, 13:39:17

⏪ vorheriges - nächstes ⏩

Xoar

Hallo,

folgende Ausgangssituation:
Ich habe zwei Abfragen, aus deren ich zwei Ufrm gemacht habe.
Binde ich beide in mein HF ein dauert der Aufbau, sowie DS-Wechsel ca. 1 Sek., also die Aktualisierung.

Jetzt wollte ich es eigentlich verbessern und habe beide Abfragen kombiniert, also ein berechnetes Feld aus Abfrage 1 mit in Abfrage2 eingebaut (im Abfrageneditor die Abfrage hinzugefügt und dann das berechnete Feld hinzugefügt) und das Ufrm1 dann aus dem HF gelöscht.

Das klappt auch, allerdings brauch der Aufbau und DS-Wechsel jetzt 2-3 Sek. länger um ausgeführt zu werden. Das ist Mist.
Berechnete Felder kann ich ja schlecht in der "Grundtabelle" indizieren, da sie ja dort nicht existieren.

Der ganze SQL Text ist arg lang, bei Bedarf poste ich ihn auch noch, falls das relevant wird.

Woran kann denn sowas liegen?

PS: Hat es was damit tu tun, dass ich mich in einer Abfrage auf ein berechnetes Feld einer anderen Abfrage beziehe?

Grüße



ebs17

ZitatDer ganze SQL Text ist arg lang, bei Bedarf poste ich ihn auch noch, falls das relevant wird.
Die SQL-Anweisung ist in jedem Fall relevant, weil sie ja die vollständige Abfragedefinition zeigt.

Sowie: Um das Gleiche zu erreichen, kann die Abfragedefinition durchaus recht unterschiedlich sein. Das Zusammenklopfen per Entwurfsansicht wäre ein möglicher Weg zu einer Abfrage, aber bei weitem nicht der beste.
Mit freundlichem Glück Auf!

Eberhard

Xoar

hi, also

das ist die Abfrage, wovon das berechnete Feld IstJahresStunden in die andere Abfrage mit einfließt.

SELECT Sum(Nz(IIf([bisZeit]<=[vonZeit],DateDiff("n",[vonZeit],DateAdd("n",1440,[bisZeit]))/60,DateDiff("n",[vonZeit],[bisZeit])/60),0)+Nz([Zusatzstunden],0)+IIf([bisZeitZweit]=[bisZeit],0,Nz(IIf([bisZeitZweit]<=[vonZeitZweit],DateDiff("n",[vonZeitZweit],DateAdd("n",1440,[bisZeitZweit]))/60,DateDiff("n",[vonZeitZweit],[bisZeitZweit])/60),0))) AS geleisteteStunden,
MitarbeiterID_F,
[geleisteteStunden]-([AnzahlTage]*6.8)+Nz([StundenVorjahr]) AS IstJahresStunden,
StundenVorjahr,
Count(Datumstag_F) AS AnzahlTage
FROM tblMitarbeiter
INNER JOIN tblZeiterfassung
ON MitarbeiterID = MitarbeiterID_F
GROUP BY MitarbeiterID_F, StundenVorjahr;


das rote Feld wird dann in folgende Abfrage mit aufgenommen:
SELECT Sortierung, MitarbeiterID, vonZeit, Nachname, Vorname, bisZeit, Position, Kommentar, Feiertagsstunden, Datumstag_F, Zusatzstunden,  Zweitposition, bisZeitZweit, vonZeitZweit, tblMitarbeiter.[48StdWoche], RB, IstJahresStunden
FROM tblMitarbeiter
INNER JOIN tblKalendertage
INNER JOIN qryBasisStundenberechnung
INNER JOIN tblZeiterfassung
ON qryBasisStundenberechnung.MitarbeiterID_F = MitarbeiterID_F
ON tblKalendertage.Datumstag = Datumstag_F
ON tblMitarbeiter.MitarbeiterID = MitarbeiterID_F
WHERE Datumstag_F=[Formulare]![frmDienstplan]![KombiDatumstag]
AND Wachabteilung=IIf([Formulare]![frmDienstplan]![HakenWa1],1,Null
OR Datumstag_F=[Formulare]![frmDienstplan]![KombiDatumstag]
AND Wachabteilung=IIf([Formulare]![frmDienstplan]![HakenWa2],2,Null
OR Datumstag_F=[Formulare]![frmDienstplan]![KombiDatumstag]
AND Wachabteilung=IIf([Formulare]![frmDienstplan]![HakenWa3],3,Null
OR Datumstag_F=[Formulare]![frmDienstplan]![KombiDatumstag]
AND Wachabteilung=[tblKalendertage]![Wachabteilung]
ORDER BY Wachabteilung, Sortierung, MitarbeiterID, vonZeit DESC;


diese ganzen Kriterien in der zweiten Abfrage stellen sich folgendermaßen dar.
Habe drei Checkboxen (WA1-3), diese kann ich im Formular anwählen, dadurch verändert sich die Anzahl der DS der Abfrage.
Falls ihr da ne bessere Idee habt, immer her damit.

Grüße

ebs17

Das berechnete Feld  wird in der zweiten Abfrage nur aufgeführt (Anzeige im SELECT-Teil). Das stellt kein Problem dar. Allerdings ist dessen Datenherkunft zusätzlich in den JOINs vertreten, und ein JOIN ist immer Aufwand.

Du darfst Dir aber gratulieren, dass die Abfrage überhaupt läuft. Bei mir würde Access wegen der fehlenden Klammern und der merkwürdigen Syntax im FROM-Teil schlicht streiken - wir reden doch von Jet-SQL?
Mit freundlichem Glück Auf!

Eberhard

Xoar

ja,

ich habe einiges aus aus dem Access Abfragen Generator erzeugtem SQL Code herausgelöscht, kann sein, dass dadurch die ein odere andere Klammer mit abhanden gekommen ist. Ja funktionieren tut das, könnte das auch in VBA auslagern, aber meine gelesen zu haben, dass Access das über Ausdrücke und SQL schneller kann.

Der Join entsteht wohl durch die Verknüpfung zweier Fenster, damit nur die passenden Daten aus der Berechnungsabfrage angezeigt werden (MitarbeiterID_F).

Dann lass ich es erstmal mit zwei Abfragen.