Neuigkeiten:

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

Mobiles Hauptmenü

Für jeden Tag eines Zeitraums per Anfügeabfrage einen Datensatz erzeugen

Begonnen von Samurai2_de, April 21, 2016, 00:06:42

⏪ vorheriges - nächstes ⏩

Samurai2_de

Hallo ihr Wissenden!

Nach einiger Access-Abstinenz habe ich in den letzten Tagen an einer meiner Datenbanken weitergearbeitet und bin hier auf zwei (hoffentlich) kleine Probleme gestoßen, bei dem ich um Hilfe bitte:

1. Meine Datenbank hat unter anderem die Tabellen "tbl_zeitraum" und "tbl_tage". In dem zur tbl_zeitraum gehörenden Formular kann in zwei Felder der Beginn und das Ende eines Zeitraums festgelegt werden. Wird nun der Datensatz in der tbl_zeitraum gespeichert soll automatisch eine Anfügeabfrage ausgelöst werden, die für jeden Kalendertag des definierten Zeitraums einen Datensatz in der tbl_tage mit dem jeweiligen Datum erzeugt.

Beispiel: Beginndatum im Formular: 25.04.2016, Enddatum im Formular: 30.04.2016
Wenn nun der Datensatz gespeichert wird, wird in der tbl_zeitraum das Beginn- und Enddatum des Zeitraums gespeichert, zugleich soll in der tbl_tage nun jeweils ein Datensatz erzeugt werden für den 25.04., 26.04., 27.04., 28.04., 29.04. und 30.04.2016

Hat jemand einen Tipp für mich, wie ich die Anfügeabfrage in SQL schreiben muss, damit dass funktioniert?

2. Im Grunde genommen eine Erweiterung des oben beschriebenen Problems: es sollen in der Tabelle tbl_tage keine doppelten Einträge vorhanden sein, es darf also nicht jedes Mal ein Datensatz erzeugt werden, wenn über das Formular ein Zeitraum in tbl_zeitraum gespeichert wird. Andersherum müssen aber Datensätze aus tbl_tage gelöscht werden, wenn ein bereits vorhandener Zeitraum gekürzt wird.

Beispiel: Es bleibt der Beginndatum 25.04.2016 und das Enddatum 30.04.2016 im Formular eingestellt, der Benutzer klickt jedoch noch einmal auf speichern. Nun sollen keine neuen Datensätze in tbl_tage erzeugt werden, da es schon für jeden Tag einen Datensatz gibt. Andersherum: der Benutzer verkürzt den Zeitraum durch setzen des Enddatums auf den 29.04.2016. Nun müsste der Datensatz für den 30.04. in tbl_tage gelöscht werden...

Es würde mich wirklich freuen, wenn hierzu jemand eine Idee hat, wie das zu realisieren ist. Bislang sieht mein SQL-Code für die Anfügeabfrage so aus:
INSERT INTO tbl_tage (Datum)
SELECT tbl_zeitraum.beginn
FROM tbl_zeitraum

Ich vermute, dass hier noch eine WHERE-Anweisung fehlt, habe jedoch keine Idee, wie diese aussehen muss...

Für eure Hilfe wäre ich wie immer sehr dankbar!

Gruß aus der Nacht

Samurai2_de
"Vegetarier" ist das indianische Wort für "zu doof zum jagen"!

Ein Tag ohne Lachen ist ein verschenkter Tag!

Samurai2_de

Mist, gerade gesehen, dass ich im falschen Unterforum gepostet habe.

Bitte an die Mods: Thema bitte nach "Tabelle/Abfrage" verschieben.
Danke und Sorry!

Gruß

Samurai2_de
"Vegetarier" ist das indianische Wort für "zu doof zum jagen"!

Ein Tag ohne Lachen ist ein verschenkter Tag!

MaggieMay

Hallo,

nein, mit einer "Where-Klausel" ist es nicht getan.
Was du gebrauchen könntest wäre evtl. eine Datumstabelle, die für jeden Tag einen Eintrag (=Datensatz) enthält.

Warum aber sollten dort nicht benötigte Datumsangaben gelöscht werden?
Von dieser Idee wirst du dich wohl verabschieden müssen.

Erkläre doch bitte auch den Hintergrund.
Was ist das eigentliche Ziel?
Was hat dich zu diesem Lösungsansatz gebracht?


Freundliche Grüße
MaggieMay

Samurai2_de

Okay, hier eine kleine (*hust*) Erklärung zum Ganzen:

Am zukünftigen Einsatzort der Datenbank gibt es mehrere Abteilungen. Einmal pro Jahr / Halbjahr / Quartal wird ein Zeitraum definiert, in dem jede Person in einer Abteilung die ANZAHL der von ihm / ihr geleisteten Arbeitsvorgänge aufschreiben soll. Beispiel: Abteilung "Lohnbuchhaltung", Arbeitsfall "Lohnabrechnungen schreiben", Mitarbeiter "Meyer", Datum "25.04.2016", Zeit "08:00 - 10:00 Uhr", Anzahl "15".
Am Ende des Zeitraums sollen die von allen Mitarbeitern gesammelten Zahlen mittels eines Reports als Ergebnis für die Abteilung zur Verfügung stehen. Beispiel: Abteilung "Lohnbuchhaltung", Arbeitsfall "Lohnabrechnungen schreiben", Datum "25.04.2016", Zeit "08:00 - 10:00 Uhr", Anzahl insgesamt "47".
Ich habe bereits Tabellen für die Abteilungen, das Personal (inklusive der Zuordnung des Personals zu den Abteilungen) und die Arbeitsfälle eingerichtet. Außerdem habe ich dem "Hauptmenü" der Datenbank in Login-in-Formular mit Passwortabfrage vorgeschaltet, mittels der sich die Mitarbeiter in die Datenbank einloggen können.
Jetzt folgt die Tabelle und das zugehörige Formular, mit dem die Zählzeiträume festgelegt werden können. Hier gibt es u.a. die Felder mit dem Beginn und dem Ende des Zeitraums.

Nachdem dies alles eingerichtet ist, soll für jeden Mitarbeiter ein Formular zur Verfügung stehen, in dem die für ihn relevanten Arbeitsfälle angezeigt werden (zum Beispiel soll die Lohnbuchhaltung nicht die Zählfälle der Fertigung sehen und umgekehrt). Außerdem soll in diesem Formular der Beschäftigte seine Zahlen buchen können, aber nicht die Ergebnisse der anderen aus der Abteilung sehen können. Also sieht Meyer auch nur, was Meyer an dem Tag gemacht hat, aber nicht was Schulz am gleichen Tag gemacht hat, auch wenn Schulz in der gleichen Abteilung ist wie Meyer.
Auf dem Formular möchte ich über ein Drop-Down-Feld die Auswahl des Tages, für den die Eintragungen gemacht werden sollen, ermöglichen. Daher mein Ansatz mit der Einrichtung der Hilfstabelle, aus der das Drop-Down-Feld mit dem anwählbaren Datum gefüttert wird.

Teil 1 meiner Frage habe ich mir mittlerweile übrigens schon zusammengestückelt. Mein Code für den "Zeitraum speichern"-Button im Formular lautet jetzt wie folgt:
Private Sub Zeitraum_speichern_Click()
Dim Tag As Date
Dim Tag2 As Date
Tag = Me!Ende
Tag2 = Me!Beginn
Dim db As DAO.database
   DoCmd.SetWarnings False
   Set db = CurrentDb
   DoCmd.RunCommand acCmdSaveRecord
   DoCmd.RunSQL ("INSERT INTO tbl_tage ([Datum]) SELECT [Beginn] FROM [tbl_zeitraum] WHERE [Beginn] = forms.frm_zeitraum.Beginn")
   Do Until Tag = Tag 2
      Tag2 = Tag 2 + 1
      DoCmd.RunSQL ("INSERT INTO tbl_tage ([Datum]) VALUES ('" & Tag2 & "')")
      Loop
End Sub

(Ich hoffe mal, ich habe den Code richtig abgeschrieben, ich arbeite hier zur Zeit mit zwei unterschiedlichen Rechnern und der Rechner zum Schreiben der Datenbank ist nicht mit dem Internet verbunden)

Damit fügt der Druck auf den "Zeitraum speichern"-Button in die Tabelle "tbl_tage" das Anfangs- und Enddatum des Zählzeitraums plus alle dazwischenliegenden Tage ein.

Das mit dem kürzen des Zeitraums macht mir nur noch Kopfschmerzen. Vielleicht muss ich hier einen Trick anwenden und festlegen, dass ein einmal angelegter Zeitraum nicht mehr verändert werden darf sondern nur noch komplett gelöscht und danach neu angelegt werden muss. Dann müsste ich doch nur eine Löschanweisung für die Tage des ausgewählten Zeitraums an die tbl_tage weitergeben, oder?

Vielen Dank schon einmal, dass ihr euch so rasch mit meinem Anliegen beschäftigt habt, ich bastele dann mal weiter...

Gruß aus der Nacht

Samurai2_de
"Vegetarier" ist das indianische Wort für "zu doof zum jagen"!

Ein Tag ohne Lachen ist ein verschenkter Tag!

DF6GL

Hallo,

ich sehe noch nicht die Notwendigkeit dieser Tage-Generierung....(Die erzeugt möglicherweise ungültige DS  z. B. Feiertage, Brückentage, Urlaubstage etc.)


Wenn der MA die Daten eingibt, kann er auch noch das zugehörige Datum in den DS eintragen, evtl. auch vorgegeben (akt. Datum) oder durch Auswahl mit dem Date-Picker/Kombifeld.

Die Vorgabe des Zeitraums wird in einer Tabelle erfasst. Beim Eingeben der einzelnen Arbeitsvorgänge wird lediglich geprüft, ob das akt.  Datum innerhalb des vorgegebenen Bereiches liegt (oder entspr. einem Betriebskalender, siehe weiter unten)


Wenn sich der Vorgabe-Zeitraum ändern sollte, dann können im Fall der Kürzung leicht die herausfallenden Tage mit einer Lösch-Abfrage entfernt werden.


Nichtsdestotrotz  sollte über eine Kalendertabelle ("Betriebskalender") nachgedacht werden, um damit (mindestens) Plausibilität-Prüfungen zu ermöglichen.

siehe:
http://www.ms-office-forum.net/forum/showthread.php?t=298670
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Samurai2_de

Zitat von: DF6GL am April 21, 2016, 08:30:25
Hallo,

ich sehe noch nicht die Notwendigkeit dieser Tage-Generierung....(Die erzeugt möglicherweise ungültige DS  z. B. Feiertage, Brückentage, Urlaubstage etc.)
Dieses Problem ist grundsätzlich nicht gegeben, da am zukünftigen Einsatzort der Datenbank 24/7 gearbeitet wird und tatsächlich auch jeder Mitarbeiter mal in den "Genuss" kommen kann, am Wochenende oder an Feiertage usw. arbeiten zu "dürfen". Daher wollte ich eigentlich tatsächlich stumpf jeden Tag des Zählzeitraums als möglichen anwählbaren Tag vorgeben.

Zitat
Wenn der MA die Daten eingibt, kann er auch noch das zugehörige Datum in den DS eintragen, evtl. auch vorgegeben (akt. Datum) oder durch Auswahl mit dem Date-Picker/Kombifeld.
Genau dies wollte ich vermeiden, denn wenn das Datum "händisch" eingetragen werden muss, öffne ich eine weitere Fehlerquelle. Sicher gibt auch die Auswahl des Datums anhand eines Drop-Downs die Möglichkeit zur Fehleingabe, jedoch wird so im schlimmsten Fall auf einen falschen Tag im Zeitraum gebucht und nicht womöglich ein Tag gebucht, der komplett außerhalb des Zeitraums liegt. Immer vom DAU ausgehen...  ;)

Zitat
Die Vorgabe des Zeitraums wird in einer Tabelle erfasst. Beim Eingeben der einzelnen Arbeitsvorgänge wird lediglich geprüft, ob das akt.  Datum innerhalb des vorgegebenen Bereiches liegt (oder entspr. einem Betriebskalender, siehe weiter unten)


Wenn sich der Vorgabe-Zeitraum ändern sollte, dann können im Fall der Kürzung leicht die herausfallenden Tage mit einer Lösch-Abfrage entfernt werden.
Ist dieser Vorschlag nicht ähnlich meiner Idee, die möglichen Zähltage per Drop-Down auszuwählen? Wenn ich dich recht verstanden habe, möchtest du, dass bei Eingabe des Datums überprüft wird, ob das Datum in der Tabelle, in der die Tage des Zählzeitraums erfasst werden, vorhanden ist. Ich möchte diese Prüfung auslassen, indem ich nur Tage auswählbar vorgebe, die in der Tabelle der Tage des Zählzeitraums vorhanden sind.
Wenn ich dich richtig verstanden habe, liegen hier nun zwei Lösungsansätze vor, die zum gleichen Ergebnis führen sollten...?

Zitat
Nichtsdestotrotz  sollte über eine Kalendertabelle ("Betriebskalender") nachgedacht werden, um damit (mindestens) Plausibilität-Prüfungen zu ermöglichen.

siehe:
http://www.ms-office-forum.net/forum/showthread.php?t=298670
Mache ich auf jeden Fall und sehe mir die Datei in dem Thread, den du verlinkt hast, gerne mal an.
Vielen Dank für den Tipp!

Gruß

Samurai2_de
"Vegetarier" ist das indianische Wort für "zu doof zum jagen"!

Ein Tag ohne Lachen ist ein verschenkter Tag!

DF6GL

Hallo,

ich bin nur gegen die Generierung von Tages-Einträgen in einer Tabelle...  In jedem Fall besser ist die (durchgehende) Kalendertabelle. Diese wird einmalig erstellt und überdeckt mehrere zukünftige Jahre.   Damit ist auch die Eingrenzung der Kombifeld-Auswahl ohne großen Aufwand über eine Abfrage möglich.


Ob nun manuelle Datumseingabe oder Auswahl eines Datums in einer Datumstabelle,  hier ist immer die Disziplin des "DAU" erforderlich.

ZitatIch möchte diese Prüfung auslassen,

Das ist nicht zu empfehlen...  Möglicherweise kann die Auswahl aus dem vorbestimmten Bereich übergangen werden.

Es gibt immer mehrere Lösungswege (Konzepte) ,  die Frage stellt sich nur nach Effizienz und Aufwand.

Ich denke, eine (durchgehende) Kalendertabelle ist hier am Besten geeignet.

Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access