Neuigkeiten:

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

Mobiles Hauptmenü

Abfrage - Anzahl Std an welchem Tag.

Begonnen von Xoar, Oktober 08, 2016, 11:22:10

⏪ vorheriges - nächstes ⏩

Xoar

Hallo,

ich bin ja gerade dabei mir eine Dienstplandatenbank zu erstellen, wo ich jetzt an einem Punkt angekommen bin, wo ich SQL Profis brauche ;)

Ich muss folgendes umsetzten:
Ein Mitarbeiter geht am
07.10.2016  von 15:00 - 22:00 arbeiten
08.10.2016  von 08:00 - 19:00 arbeiten
09.10.2016  von 07:30 - 07:30 (Folgetag) arbeiten <- dieser spezielle Fall hat nur ein Startdatum. Die Stunden habe ich über StundenDienst: Wenn([bisZeit]<=[vonZeit];DatDiff("n";[vonZeit];DatAdd("n";1440;[bisZeit]))/60;DatDiff("n";[vonZeit];[bisZeit])/60) errechnet

Jetzt müsste ich wissen, wieviel Stunden der Mitarbeiter am
Montag - Freitag in der Zeit von 20:00 - 06:00
Samstag in der Zeit von 13:00 - 20:00
Sonntag in der Zeit von 07:30 - 07:30
gearbeitet hat. Für jedes Datum einzelnd, Monatsweise

Beispiel            Mo-Fr(20-24)      Sa(13-20)         So(07:30-07:30)           
07.10.2016             2       
08.10.2016                                     6
09.10.2016                                                                    24


So in der Art.

Folgende Felder stehen mir zur Verfügung
Startdatum  Mitarbeiter         hh:mm  hh:mm  Ausdruck siehe oben
DatumID_F,  MitarbeiterID_F,  vonZeit, bisZeit, Stunden(errechnetesStundenFeld])
  zahl                  zahl                Datum   Datum   

tblKalendertage
DatumID (autoid)
TDatum  (Datum/Uhrzeit)
WT         (zahl) 1-7 für den einzelnen Wochentag 1 = Montag

Ich muss ehrlich sagen, dass ich noch überhaupt keine Ahnung habe wie ich da starten soll :(

[edit]
Mein Anfang, so errechne ich mir schonmal die Differenz von der Startzeit, allerdings kann ich die Endzeit nicht kappen, sprich ich habe zuviele Stunden.
DuzStunden: Wenn([bisZeit]<=[vonZeit];DatDiff("n";"20:00";DatAdd("n";1440;[bisZeit]))/60;DatDiff("n";"20:00";[bisZeit])/60)

ist das mit sql umsetzbar, oder muss ich zu ner komplizierten VBA-Schleife greifen?
[/edit]

Xoar

ok, ist auch viel aufeinmal....

Das Problem wo ich gerade hänge, ich versuche es hinzubekommen, dass ich eine Stundenberechnung von einem fest definierten Tageszeitraum zu bekommen.

Datum            WT       von       bis
07.01.2017     7          07:30    18:00

kann man mit einer Abfrage die Stunden berechnen, die innerhalb des Zeitfensters von 13:00 - 20:00 liegt?
Hab da nichts zu gefunden,

SELECT tblKalendertage.TDatum, tblMitarbeiter.Nachname, tblKalendertage.WT, IIf([bisZeit]<=[vonZeit],DateDiff("n","13:00",DateAdd("n",1440,[bisZeit]))/60,DateDiff("n","13:00",[bisZeit])/60) AS DuzStunden
FROM tblMitarbeiter INNER JOIN (tblKalendertage INNER JOIN (tblDienstposten INNER JOIN tblDienstplan ON tblDienstposten.DienstpostenID = tblDienstplan.DienstpostenID_F) ON tblKalendertage.DatumID = tblDienstplan.DatumID_F) ON tblMitarbeiter.MitarbeiterID = tblDienstplan.MitarbeiterID_F
WHERE (((tblKalendertage.WT)=6)
);

soweit bin ich bis jetzt. Aber da hab ich ja nur den Startbereich....

Lachtaube

Am besten bestehen Arbeitsanfang und Arbeitsende aus einem kompletten Zeitpunkt (Datum plus Uhrzeit). Dann entfällt schon einmal der Sonderfall und bei Arbeiten über Mitternacht gibt es auch keine Rechenschwierigkeiten.

Der Rest ist eigentlich einfach. Liegt der Beobachtungsstart zwischen Arbeitsbeginn und Arbeitsende, nimm den späteren Wert aus Beoabachtungsstart und Arbeitsbeginn als Untergrenze und verwende den kleineren Wert aus Arbeitsende und Beobachtungsende als Obergrenze für Deine Differenzbildung.
Grüße von der (⌒▽⌒)

Xoar

Morgen.

Oh man klar, so simpel.
Da hab ich aber sowas von nen Brett vor dem Kopf gehabt.

Ich danke dir :)

Xoar

Moin,

stehe schon wieder vor dem nächsten Problem  ::)

Ich habe jetzt eine Kreuztabellenabfrage wo mir die Daten, wie im Bild unten gezeigt, ausgegeben wird.
Gibt es eine Möglichkeit, eine gewisse Anzahl der Spaltenüberschriften zu gruppieren? 1-5 sollen zusammen angezeigt werden und anders benannt (Mo-Fr), 6 (Sa), 7 (So) sollen einzelnd stehen.

Falls das nicht möglich ist, geht das in einem Bericht, oder muss ich das nach Excel exportieren?

Grüße 

MaggieMay

Hi,

in einem Bericht wäre das kein Problem, da kannst du ja die Spalten Mo-Fr in einer aufsummieren.

Natürlich kannst du die Daten auch in einer Abfrage so aufbereiten, dass das gewünschte Ergebnis erzielt wird. Dazu solltest du aber erstmal den SQL-Code zeigen, damit man dir einen konkreten Vorschlag machen kann.
Freundliche Grüße
MaggieMay

Xoar

Ah ok, danke
dann teste ich das mal, weißt Du wo ich ein Beispiel für sowas finde?
Hab von Berichten leider so fast keine Ahnung.

MaggieMay

Du könntest dir einen Bericht auf Basis der Kreuztabellenabfrage generieren lassen und diesen dann abändern.
Freundliche Grüße
MaggieMay

Xoar

#8
jo so hab ich es gemacht, mein einziges Problem ist, dass ich keine bedingte Spaltensumme bilden kann.
Ich habe ja die Felder  1,2,3,4,5,6,7  jetzt möchte ich ja gerne die Felder 1-5 summieren, aber das klappt nicht.
Habe einiges versucht.
Hab ein Textfeld erzeugt mit folgendem Inhalt
=Summe(1:5) ala Excel, geht aber nicht
=summe([1];[2]....) geht auch nicht
=summe([1]:[5]) geht auch nicht
=[1]+[2]... geht auch nicht.

AHHH -.-

[edit]
bei
=Summe(Nz([1])+Nz([2]))
rechnet er mir 23 aus, für alle Zeilen, warum auch immer......
siehe Bild 2
[/edit]

MaggieMay

Du musst die Felder einfach nur addieren, ohne Einsatz der Summenfunktion.

PS:
Zitat=[1]+[2]... geht auch nicht.
Wieso nicht?
Auch hier wäre wohl die NZ-Funktion sinnvoll.
Freundliche Grüße
MaggieMay

Xoar

ja was soll ich sagen, an nz() lags....

Danke  ;D

Xoar

so langsam fang ich an zu verzweifeln....
Ich habe mir jetzt über viel Zeit eine Kreuztabelle zusammen gebastelt, wo ich aus drei Einzel-Abfragen, mit UNION eine Gesamtabfrage baue, die die Grundlage für die Kreuztabelle ist.

Kreuztabelle:
TRANSFORM Sum(qryDuzZusammen.DuzMoFr) AS SummevonDuzMoFr
SELECT qryDuzZusammen.TDatum, qryDuzZusammen.Nachname
FROM qryDuzZusammen
WHERE (((qryDuzZusammen.Nachname)="Nachname1"))
GROUP BY qryDuzZusammen.TDatum, qryDuzZusammen.Nachname
PIVOT qryDuzZusammen.WT;


Unionabfrage: nur um sie mal zu zeigen...
SELECT tblKalendertage.TDatum, tblKalendertage.WT, tblMitarbeiter.Vorname, tblMitarbeiter.Nachname, DateDiff("n",IIf([vonZeit]<=TimeValue("20:00:00"),TimeValue("20:00:00"),[vonZeit]),DateAdd("n",1440,IIf([bisZeit]<=TimeValue("06:00:00"),[bisZeit],TimeValue("06:00:00"))))/60 AS DuzMoFr
FROM tblMitarbeiter INNER JOIN (tblKalendertage INNER JOIN (tblDienstposten INNER JOIN tblDienstplan ON tblDienstposten.DienstpostenID = tblDienstplan.DienstpostenID_F) ON tblKalendertage.DatumID = tblDienstplan.DatumID_F) ON tblMitarbeiter.MitarbeiterID = tblDienstplan.MitarbeiterID_F
WHERE (((tblKalendertage.WT) Between 1 And 5) AND ((tblDienstposten.SichtbarImDienstplan)=1))
union
SELECT tblKalendertage.TDatum, tblKalendertage.WT, tblMitarbeiter.Vorname, tblMitarbeiter.Nachname, DateDiff("n",IIf([vonZeit]<=TimeValue("13:00:00"),TimeValue("13:00:00"),[vonZeit]),IIf([bisZeit] Between TimeValue("20:00:00") And TimeValue("13:00:00"),[bisZeit],TimeValue("20:00:00")))/60 AS DuzSa
FROM tblMitarbeiter INNER JOIN (tblKalendertage INNER JOIN (tblDienstposten INNER JOIN tblDienstplan ON tblDienstposten.DienstpostenID = tblDienstplan.DienstpostenID_F) ON tblKalendertage.DatumID = tblDienstplan.DatumID_F) ON tblMitarbeiter.MitarbeiterID = tblDienstplan.MitarbeiterID_F
WHERE (((tblKalendertage.WT)=6) AND ((tblDienstposten.SichtbarImDienstplan)=1))
UNION SELECT tblKalendertage.TDatum, tblKalendertage.WT, tblMitarbeiter.Vorname, tblMitarbeiter.Nachname, IIf([bisZeit]<=[vonZeit],DateDiff("n","07:30",DateAdd("n",1440,[bisZeit]))/60,DateDiff("n","07:30",[bisZeit])/60) AS DuzSo
FROM tblMitarbeiter INNER JOIN (tblKalendertage INNER JOIN (tblDienstposten INNER JOIN tblDienstplan ON tblDienstposten.DienstpostenID = tblDienstplan.DienstpostenID_F) ON tblKalendertage.DatumID = tblDienstplan.DatumID_F) ON tblMitarbeiter.MitarbeiterID = tblDienstplan.MitarbeiterID_F
WHERE (((tblKalendertage.WT)=7) AND ((tblDienstposten.SichtbarImDienstplan)=1));


das funktioniert auch alles super, so wie es soll ohne Probleme ABER ich habe genau bei einer Abfrage ein Problem
Samstags nämlich.

Wenn man Samstags Dienst hat, bekommt man auch Stunden in den Spalten Mo-Fr, sowie Sonntag gutgeschrieben, aber in den Spalten kann ich ja nichts schreiben. Ist das überhaupt möglich, oder muss ich die Daten mit mehreren AddAbfragen, oder VBA in eine Tabelle schreiben, und diese dann abfragen?

Bsp. damit ich wisst was ich meine:

Samstag 08.10.2016  24Std Dienst bekommt dann folgende Stunden
Mo-Fr     Sa         So    (könnte man auch einfach DuzForm1, DuzForm2 und DuzForm3 nennen, die Tage verwirren etwas)
4            7,5        7

in meiner obigen Abfrage bekomme ich ja nur
Sa (DuzForm2)
7,5

weil er ja nur an diesem Tag Dienst macht. Das ist echt tricky umzusetzen.

MaggieMay

Hallo,
ZitatWenn man Samstags Dienst hat, bekommt man auch Stunden in den Spalten Mo-Fr, sowie Sonntag gutgeschrieben, aber in den Spalten kann ich ja nichts schreiben.
Sorry, aber ich verstehe das nicht. Wieso wird für die Arbeit am Samstag auch an anderen Tagen etwas gutgeschrieben?
Was ist anders am Samstag als an anderen Wochentagen?

Und wo um Himmels Willen gibt es einen 24h-Dienst?!  ???
Freundliche Grüße
MaggieMay

Xoar

Ich sag ja die Bezeichnungen sind einfach im aktuellen System doof.

Wer Sa arbeitet bekommt wie oben beschrieben Stunden in DuzForm 1,2 und 3. Die blöderweise MoFr, Sa, So heißen.

Den 24h Dienst gibt es bei ner Feuerwehr :)

Also wer Sa arbeitet bekommt im den drei DuzFormen Stunden (unterschiedliche finanzielle Zulage) und diese drei Formen haben halt Zeiträume die auch vom Wochentag abhängen.

Ich glaub das ist echt so kompliziert, dass ich das in eine Tabelle schreiben muss.

Ich weiß auch nicht wie ich das genauer beschreiben soll.


MaggieMay

Hi,

du kannst ja nur das zeigen, was in der Tabelle gespeichert ist, also solltest du das bei der Eingabe der Samstags-Arbeitszeit berücksichtigen, und nicht erst bei der Ausgabe der Zeiten.
Freundliche Grüße
MaggieMay