Office: (Office 2016) Schleifen in SQL?

Helfe beim Thema Schleifen in SQL? in Microsoft Access Hilfe um das Problem gemeinsam zu lösen; Hallo zusammen, ich benötige mal wieder eure Hilfe. Folgende Ausgangssituation: Tabelle 1 planungID planungvon planungbis Tabelle 2 mitID belegtvon... Dieses Thema im Forum "Microsoft Access Hilfe" wurde erstellt von christin84, 6. Juni 2020.

  1. Schleifen in SQL?


    Hallo zusammen,
    ich benötige mal wieder eure Hilfe. Folgende Ausgangssituation:

    Tabelle 1
    planungID
    planungvon
    planungbis

    Tabelle 2
    mitID
    belegtvon
    belegtbis

    Ich habe hier mal zwei sehr abgespeckte Versionen meiner Tabellen bzw. Abfragen aufgeführt um zu demonstrieren, worum es mir eigentlich geht. Tabelle 1 enthält eine Auflistung meiner geplanten Einsätze u.a. mit einer ID und einem Zeitraum (von/bis). In Tabelle 2 befindet sich eine Auflistung aller mir zur Verfügung stehenden Mitarbeiter mit ihren bereits belegten Zeiträumen (von/bis).

    Es sollen nun die belegten Zeiträume der Mitarbeiter aus Tabelle 2 mit den geplanten Zeiträumen überprüft werden. Welcher Mitarbeiter könnte für den geplanten Zeitraum aus Tabelle 1 zur Verfügung stehen.

    Klingt jetzt nicht so schwer, ich scheitere aber daran. In Tabelle 2 gibt es pro Mitarbeiter mehrere belegte Zeiträume. Nun muss also Datensatz für Datensatz geschaut werden, ob der Zeitraum beim Mitarbeiter frei oder belegt ist. Es sind vielleicht 4 Zeiträume frei, aber einer ist belegt. Dann darf der Mitarbeiter also insgesamt nicht mehr zur Verfügung stehen.

    Ich habe das recht simpel mit ner Gruppierung einer Abfrage der planungID und mitID versucht, aber es funktioniert nicht. Es wird mir dann 1 Zeitraum zurückgegeben - denn neben dem belegten Zeitraum (der nicht wiedergegeben wird) gibt es ja 4 Zeiträume die passen.

    Code:
    Wahrscheinlich brauche ich noch eine weitere Abfrage. Oder ich dachte an eine Schleife wie in VBA. Die pro planungID untersucht, bei welcher mitID der Zeitraum passt bzw. nicht. Die Schleife geht die Auflistung der belegten Zeiträume der Mitarbeiter durch und sobald ein Treffer gefunden wird, steht der Mitarbeiter für den geplanten Zeitraum nicht zur Verfügung.

    Ich hoffe, ihr habt eine Lösung für mich. Bei mir hapert es glaube ich schon an der Logik des Ganzen.

    Viele Grüße
    Christin

    :)
     
    christin84, 6. Juni 2020
    #1
  2. Code:
    Zum Thementitel: Schleifen widersprechen dem Grundansatz in SQL und werden daher in den meisten Fällen nur dritte Wahl sein. Jet-SQL als Dialekt, den Access verwendet, kennt solche prozeduralen Schritte gar nicht.
     
    ebs17, 8. Juni 2020
    #2
  3. Hallo Eberhard,
    vielen Dank für deinen Lösungsvorschlag. Leider funktioniert dieser nicht.

    Beispiel:
    Der Planungszeitraum ist vom 01.07-10.07. und der belegte Zeitraum vom 15.06.-25.06.

    Laut deines Befehls soll überprüft werden, ob belegtvon > planungbis ist. Also in dem Fall 15.06.>01.07. - ist somit falsch. Dazu soll geschaut werden, ob belegtbis < planungvon ist, also 25.06.
     
    christin84, 8. Juni 2020
    #3
  4. Schleifen in SQL?

    \@christin84, du musst statt "not Between" nur "Between" verwenden und dann mit or verknüpfen,
    dann siehst du wer nicht kann.
     
    markusxy, 8. Juni 2020
    #4
  5. \@markusxy
    Ich möchte aber nicht sehen, wer nicht kann, sondern wer zur Verfügung steht.

    Bei einer Auflistung aller Mitarbeiter, die nicht können, müsste ich eine weitere Abfrage laufen lassen, die dann aus meinem Mitarbeiterpool alle übrig gebliebenen Mitarbeiter herausfiltert. Den Weg bin ich auch schon gegangen. Ich suche erst die Mitarbeiter heraus, die nicht können, dann in einer weiteren Abfrage alle möglichen Mitarbeiter, um dann anschließend über eine Inkonsistenzsuche alle Mitarbeiter herauszufiltern, die letztendlich in Frage kommen. Die Performance leidet darunter aber sehr. Letztendlich landet das alles in einem DropDown-Feld, das mir dann die möglichen Mitarbeiter zur Auswahl anzeigen soll.

    Daher meine Frage, ob jemand eine schlanke Lösung hat. Ich verstehe auch nicht so recht, warum bei einer Gruppierung der mitID und planungID trotzdem der Datensatz, der korrekt ist angezeigt wird. Bei 5 Einsätzen einer mitID fällt nur ein Einsatz in den Planungszeitraum, also führt das Kriterium dazu, dass der Zeitraum nicht zur Verfügung steht. Also dürfte dieser Mitarbeiter nicht zur Auswahl stehen, auch wenn die anderen 4 Einsätze passen würde. Warum funktioniert das hier aber nicht?
     
    christin84, 8. Juni 2020
    #5
  6. \@Christin: verstehe ich es richtig, dass für jeden beiliebigen Planungszeitraum nur die Mitarbeiter angezeigt werden sollen, die in der fraglichen Planungs-Zeit keinlei Einsätze haben?
     
    hcscherzer, 8. Juni 2020
    #6
  7. Verstehe, die Performance ist das Problem.
    Warum sagst du das nicht gleich?

    Zeig einfach mal die Abfrage die funktioniert hat.
    Welche Felder sind wie indexiert?

    Das Beziehungsfenster der beteiligten Tabellen wäre eventuell hilfreich.

    Die Frage ob eine Planungsid über mehrere Zeiträume verfügt, ist für mich auch nicht sicher geklärt, ich gehe aber davon aus.
    Macht in der Abfrage aber einen großen Unterschied.
    Bei vielen Datensätzen ist das ein ganz schöner Aufwand, aber das sollte kein Problem sein. Mich verwundert aber deine Annahme, das deiner jetziger Weg performanter sein soll.
     
    Zuletzt von einem Moderator bearbeitet: 7. Januar 2021
    markusxy, 8. Juni 2020
    #7
  8. Schleifen in SQL?

    Oh jeh, das würde das ja noch komplizierter machen als es ohnehin schon ist.
    Und aus der Darstellung der Datenstruktur in #1 geht nun mal nicht hervor, dass Tabelle1 eine Detailtabelle ist.

    Nehmen wir das an und nehmen wir weiterhin an, dass es reicht, wenn ein vorhandener Einsatz eines Mitarbeiters innerhalb des Planungszeitraums auch nur einen einzigen Tag dieses Zeitraums betrifft, damit dieser Mitarbeiter nicht zur Verfügung steht, dann ergibt sich daraus:
    Er steht zur Verfügung, wenn sich alle seine aktuellen Belegungen
    a) vor Beginn beginnen und auch vor Beginn enden
    oder
    b) nach dem Ende des Planungszeitraums beginnen und enden

    Aus den Belegungstabellen der Mitarbeiter allein wird das nicht zu gewinnen sein.
    Deshalb muss zusätzlich auf die Tabelle der Mitarbeiter zugegriffen werden.

    Bin nicht sicher, ob das so geht, aber vielleicht ist es ein Denkanstoss:
    Code:
     
    hcscherzer, 8. Juni 2020
    #8
  9. Vielen Dank für eure Rückmeldungen.

    Kurz auf eure Fragen: Die Tabelle 1 Planung beinhaltet immer nur einen Zeitraum. Es ist eine Auflistung aller geplanten Korrektureinsätze unserer Klausuren. Beispiel: Klausur 123 soll in der Zeit korrigiert werden vom 01.07.-15.07.20. Für diesen Zeitraum benötige ich also Korrektoren (unsere Mitarbeiter). In einer weiteren Tabelle, die ich hier bisher noch nicht aufgeführt habe, wird dann die planungid mit der mitid verknüpft. Diese Tabelle beinhaltet dann die Korrektureinsätze mit den Korrektoren.

    Aus dieser Tabelle und der Urlaubstabelle ermittel ich dann per Abfrage eine Auflistung der belegten Zeiträume eines Mitarbeiters. Also die Tabelle 2 ist somit eigentlich eine Abfrage.

    @hcscherzer
    Du hast es korrekt zusammengefasst. Wenn man es so betrachtet wie du, dass alle seine aktuellen Belegungen nicht in den Planungszeitraum fallen dürfen, würde es ja funktionieren. Deine Abfrage funktioniert nur leider nicht. Du hast einmal mitid und dann mit_id. Hast du dich da vertan? Ich habe jetzt diesen Code hier:

    Code:
     
    christin84, 8. Juni 2020
    #9
  10. Ein Vorschlag, aufgrund der bisherigen Angaben.
    Ist aber weder geprüft, noch länger durchdacht. *wink.gif*
    Index: tbl_belegt Felder mitID, belegtvon, planungbis in einen eindeutigen Index.

    Code:
     
    markusxy, 8. Juni 2020
    #10
  11. Lieben Dank markusxy! In meiner abgespeckten Version funktioniert dein Code. Jetzt teste ich es noch in meiner großen. Das hat mich jetzt ein paar Tage gekostet und ich bin super glücklich, dass ihr eine Lösung gefunden habt. Vielen, vielen Dank!
     
    christin84, 8. Juni 2020
    #11
  12. Wenn es ein Performance Problem gibt, wie gesagt auf den erwähnten Index achten.

    Ist das Backend eigentlich auch Access?
    Wichtig wäre zu prüfen, ob ein Index wirkt und ob er dann auch überhaupt verwendet wird.
     
    markusxy, 8. Juni 2020
    #12
  13. Schleifen in SQL?

    Ja. Es war schon spät ... da hab ich nicht so genau auf die Namen geschaut.

    @markus: mit BETWEEN werden die Grenzen aber doch eingeschlossen.
    Und ausserdem steht da zweimal das Gleiche:
     
    hcscherzer, 8. Juni 2020
    #13
  14. Es sollte natürlich einmal belegtbis heißen. Habs korrigiert.

    Habs nur schnell zusammenkopiert.
    Between habe ich bewußt gewählt.
    Da müsste man aber inhaltlich bezüglich Überschneidungen genaueres wissen, was besser ist.

    Da mache ich mir aber keine Gedanken drüber.
     
    markusxy, 8. Juni 2020
    #14
  15. Hallo
    Was noch fehlt sind diejenigen Planungen, die größer als der Planungszeitraum sind.
    Um bei deinem Beispiel zu blieben:
    Beispiel:
    Der Planungszeitraum ist vom 01.07-10.07. und der belegte Zeitraum vom 15.06.-31.07.

    Diese müsstest du auch noch berücksichtigen.
    Gruß MDD
     
Thema:

Schleifen in SQL?

Die Seite wird geladen...
  1. Schleifen in SQL? - Similar Threads - Schleifen SQL

  2. Verkettung von Zellen - Schleife

    in Microsoft Excel Hilfe
    Verkettung von Zellen - Schleife: Hallo, folgendes Problem: Ich möchte in einer Tabelle die Texte in Spalte A mit den Texten in Spalte B verketten. Dazu benutze ich folgenden Code: Sub VerkettungAB() Range("E2").Value =...
  3. While-Schleife wird nicht beendet

    in Microsoft Access Hilfe
    While-Schleife wird nicht beendet: Hallo Forum Ein aus einem Unterformular soll in ein Feld im Hauptformular übernommen (fix abgespeichert) werden. Das Feld wurde nachträglich im Hauptformular (+ Tabelle) eingefügt. Nun habe ich...
  4. For Next Schleife

    in Microsoft Excel Hilfe
    For Next Schleife: Hallo zusammen, da bin ich wieder und wie kann es anders sein mit einem Problem. Ich habe eine Tabelle (im Anhang) dort soll die Werte in Zellen a/b/f kopiert werden und in die erste frei Zeile...
  5. VBA Schleife kopieren und einfügen von Spalten

    in Microsoft Excel Hilfe
    VBA Schleife kopieren und einfügen von Spalten: Hallo Zusammen, Ich habe auf einem Tabellenblatt eine variable Anzahl an Spalten mit Daten die auch eine variable Anzahl an Zeilen haben, auch mit Lücken in den Zeilen. Die Spalten mit den Infos...
  6. Eine Schleife mit zwei tebellen vba Access

    in Microsoft Access Hilfe
    Eine Schleife mit zwei tebellen vba Access: Hallo zusammen! Es gibt’s zwei Tabellen und ich wollte aus zweiter Tabelle die Daten nach einem Kriterium (FLTR=0) an erste Tabelle übertragen (kopieren). Geht aber nicht. Hier ist mein Kode,...
  7. Bestimmte Daten zwischen innerhalb eines Datumsbereichs einer Tabelle Anfügen

    in Microsoft Access Hilfe
    Bestimmte Daten zwischen innerhalb eines Datumsbereichs einer Tabelle Anfügen: Hallo, ich habe per Google und Foren SuFu leider nichts passendes finden können, wage aber zu bezweifeln, dass Access da an seine Grenzen kommt, da es eigentlich recht banal ist. Ich habe eine...
  8. VBA Loop : Werte suchen und löschen

    in Microsoft Excel Hilfe
    VBA Loop : Werte suchen und löschen: Hallo zusammen, ich habe folgende Ausgangslage: Im Tabellenblatt Auswahl sollen Artikel eingegeben werden und via Formel wird der zugehörige Lagerplatz ausgegeben (funktioniert soweit), sodass...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden