Neuigkeiten:

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

Mobiles Hauptmenü

Automatisierte Werteeingabe alle X Tage

Begonnen von Xoar, November 19, 2016, 15:28:02

⏪ vorheriges - nächstes ⏩

Xoar

Hallo,

ich habe folgendes vor:
Zur besseren Vorstellung, stellt euch eine Liste vor, wo untereinander alle Mitarbeiter und nebeneinander alle Datumstage für ein Jahr stehen. Hier müssen in bestimmten Intervallen die Werte X1,X2,X3 eingetragen werden.
Es müssen alle 7 Tage(Invervalleingabe) ein X pro Mitarbeiter eingetragen werden, es fängt mit X1 an, das nächste (7 Tage später) X2, das dritte (7 Tage später) X3. Es kann aber auch vorkommen, dass das START X nicht 1, sondern, 2, oder 3 ist und dieses Problem bekomm ich noch nicht hin. Die Logik dahinter ist aber simpel. Wenn die X1 Treppe durchläuft, sieht man das ein Mitarbeiter 7 Schichten vor dem X1 wieder eine X eingetragen bekommen muss. Da es aber immer 1,2,3 durchlaufend eingetragen wird, muss dieser mit einem X2 starten.

Bsp:
M_ID Tag1  Tag2  Tag3  Tag4  Tag5  Tag6  Tag7  Tag8  Tag9  Tag10
1        x1                                                                x2
2                 x1                                                                  x2
3                           x1                                                                 x2
4                                   x1
5                                             x1
6                                                      x1
7                                                                x1
8         x3                                                             x1
9                 x3                                                              x1
10                      x3                                                                x1

Habe bis jetzt folgenden VBA Code geschrieben:
'////Hier wird eine Abfrage für jeden Mitarbeiter erstellt und dann alle 8(intervalleingabe) Schichten die passende X Schicht zugewiesen
Public Function XschichtenEintragen(StarttagWA As Date, XArt As Integer, intervall As Integer)
Dim qdf As QueryDef
Dim Starttag As Date
Dim rs As Recordset
Dim zaehler As Integer
Dim XSchichtArt As Integer
Dim Mitarbeiterschleife As Integer
Dim CounterDatum As Integer
On Error GoTo Fehlerbehandlung
CounterDatum = 1
Starttag = StarttagWA
For Mitarbeiterschleife = 1 To DMax("[Sortierung]", "tblMitarbeiter", "[Wachabteilung] = 1")
    Set qdf = CurrentDb.QueryDefs("qryXSchichtenVBA") 'Hier wird qdf eine Abfrage zugewiesen, der in VBA Parameter zugewieden werden können.
    qdf.Parameters("[WaEingabeX]") = 1
    qdf.Parameters("[MitarbeiterIDXTage]") = Mitarbeiterschleife 'hier wird die Abfrage auf den aktuellen Mitarbeiter der Schleife ausgeführt nach der Sortierreihenfolge
'Eine Abfrage enhält immer genau 1 Mitarbeiter und den Zeitraum 01.01. akt Jahr bis 31.12. akt. Jahr
   
   
    Set rs = qdf.OpenRecordset 'den Recordset auf die parameterisierte(gefilterte) Abfrage öffnen
        Do While Not rs.EOF
            If rs!Datumstag_F < Starttag Then
                rs.MoveNext
            Else
                For XSchichtArt = 37 To 39 'X 1 - 3
                   rs.Edit
                   rs!vonZeit = Null
                   rs!bisZeit = Null
                   rs!Position = XSchichtArt '37=X1, 38=X2, 39=X3
                   rs.Update
                       For zaehler = 1 To intervall
                           On Error Resume Next
                           If rs!Datumstag_F = Null Then GoTo Sprungmarke
                           If rs!Datumstag_F <= "31.12." & Year(Date) + 1 Then rs.MoveNext Else
                       Next
                Next
            End If
        Loop
Sprungmarke: If CounterDatum < intervall Then
    Starttag = DateAdd("d", 3, Starttag)
    CounterDatum = CounterDatum + 1
Else
    CounterDatum = 1
    Starttag = DateAdd("d", 3, StarttagWA)
End If
Next
MsgBox "fertig"
Exit Function
Fehlerbehandlung:

End Function


habt ihr eine Idee, wie ich dies realisieren kann, oder insg. anders machen sollte?

Jetzt fängt er halt immer mit X1 an.

crystal

Hallo xoar,

ZitatJetzt fängt er halt immer mit X1 an.

So ist es ja auch programmiert:
For XSchichtArt = 37 To 39 'X 1 - 3

Vielleicht müsstest du erst suchen, welche Schicht für den MA zuletzt definiert wurde.

Noch was:
Deine Codezeile

If rs!Datumstag_F <= "31.12." & Year(Date) + 1 Then rs.MoveNext Else

ist ja wohl fehlerhaft (else).


(Insgesamt: achte auf Ein- und Ausrückungen im Sourcecode, stelle Labels (sprungmarke) in einer Zeile allein usw., damit jeder If-Block oder Loop immer anhand der Einrückung identifiziert werden kann.)

Ansonsten würde ich das Intervall nach oben legen (also als erstes Statement beim Abarbeiten des Recordsets), etwa so:

icount =0
do while not rs.eof
  icount = icount +1
  if icount < intervall then
    goto MoveMyRS
  else
    icount=0
  endif
  (hier nun code für Intervall erreicht)
...
MoveMyRS:
  rs.movenext
loop

Zusammengefasst:
1. suche den letzten Tag (z.B. mit dlookup), an dem für den MA eine Schicht eingetragen wurde (kann allerdings auch im Vorjahr liegen, also suche z.B. vom 1.Dez.<Vorjahr> bis 31.Dez.<aktuelles Jahr>) und merke dir x1, x2 oder x3
2. da SQL kein STEP kennt (so wie in For i=1 to 100 step 10), selektiere nun die Datensätze von <letzter gefundener Eintrag> bis <31.12. aktuelles Jahr>
3. arbeite den RecordSet ab, überspringe dabei Records, die unterhalb des Intervalls liegen
4. wenn du einen Intervall-Tag gefunden hast, speicher den passenden X-Wert ab (in Abhängigkeit vom zuvor gefundenen X-Wert des letzten Tags)

Ich hoffe, diese Anregungen helfen dir weiter, wenn sie auch nicht "ausprogrammiert" sind.

lg
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

Xoar

ja danke, den Gedanken hatte ich auch schon in der Art, wusste nur noch nicht genau wie ich mir den Wert am besten hole.

Wenn ich den Wert dann gefunden habe, muss ich ihn ja als irgendwie einbinden.

Es gibt keine direkte Möglichkeit zu sagen, starte bei Wert 38 (x2) in der if Schleife, oder?
Ich muss dann wohl den Wert vor der Eintragung abfragen und mit if die Szenarien programmieren, wo der Start kein X1 ist.

sowas wie
if Abfragewert = 38 then
           rs.edit
           rs!Position = 39
           rs.update
           rs.movenext....
else if Abfragewert = 39 then
           ....
else
          ....
end if


crystal

Hallo xoar,

ZitatEs gibt keine direkte Möglichkeit zu sagen, starte bei Wert 38 (x2) in der if Schleife, oder?

Naja - du meinst ja For-Next-Schleife...
Prinzipiell kann du eine solche Schleife von einem "beliebigen" Punkt starten:
for i = <startpunkt> to <endpunkt> [step <stepsize>], also z.B.
for i = 120 to 140 step 4

Aber bei deiner Fragestellung würde ich den Vergleich mit "Intervall" vorziehen, da der Recordset ja schon sequenziell abgearbeitet wird.

Statt den Abfragewert mit if..elseif abzufragen könntest du auch

select case abfragewert
  case 38:
    ...
  case 39:
    ...
...
end select

schreiben.

Ganz verstanden habe ich nicht, wann aus x1 x2, aus x2 x3 und aus x3 wieder x1 wird (und was geschieht, wenn der MA Urlaub hat). Aber das kannst du ja programmieren, wenn du ertsmal die Intervall-Tage gefunden hast.

lg
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

MzKlMu

#4
Hallo,
Zitatwo untereinander alle Mitarbeiter und nebeneinander alle Datumstage für ein Jahr stehen.
prinzipiell ist eine solcher Matrixaufbau für eine Datenbank ungeeignet. Abgesehen davon, lässt sich ein Jahr mit allen Tagen nicht so darstellen, da eine Accesstabelle nur max. 255 Spalten haben kann.
Die Tabelle sollte nur 3 Spalten haben (MAID, Schichtart, Datum) und die Daten vertikal führen. Also für ein Mitarbeiter je Schichttag ein Datensatz, also nur ein Datum eintragen wenn er an diesem Tag auch Schicht hat.. Ob es sinnvoll ist diese Tabelle im voraus anzulegen weiß ich jetzt auch.
In Deinen Beispieldaten würde MA1 an Tag1 und Tag8 arbeiten und dazwischen ?
Warum glaubst Du die Tabelle im voraus füllen zu müssen ?
Kannst Du mal einfach die Schichtfolge beschreiben (ich verstehe das Beispiel nicht ganz), ohne jetzt mal eine Tabelle im Hinterkopf zu haben?
Um wie viele Mitarbeiter geht es denn da ?
Gruß Klaus

Xoar

#5
@crystal
Ich dachte Step ist dafür da, dass die Schleife z.B. 4 steps weiter geht. also 1 to 100 step 4 = 1,5,9,13....
Wann aus X1, X2, oder X3 hängt aus der Kombination zweier Sichtweisen ab.
a.
  1. Mitarbeiter Tag 1 = X1
                      Tag 2 = wert
                      Tag 3 = wert
                      Tag 4 = wert
                      Tag 5 = wert
                      Tag 6 = wert
                      Tag 7 = wert
                      Tag 8 = x2
                       ...
und einmal aus der Sichtweise des Tages
MitarbeiterID     Tag                          Tag
1                       01.01.2017     X1     02.01.2017
2                       01.01.2017              02.01.2017   x1
3                       01.01.2017              02.01.2017
4                       01.01.2017              02.01.2017
5                       01.01.2017              02.01.2017
6                       01.01.2017              02.01.2017
7                       01.01.2017              02.01.2017
8                       01.01.2017     X3     02.01.2017 -> 08.01.2017 X1
9                       01.01.2017              02.01.2017    x3 -> 09.01.2017 X1

Das hängt damit zusammen, dass der Mitarbeiter 8, sieben Tage nach dem 01.01.2017 sein X1 hat. Man geht die Treppe der X Tage einfach weiter, wie im Erstposting zu sehen ist.
PS: Da gabs noch ein Fehler die roten X2er, müssen natürlich X3er sein, weil danach ja X1 kommt.

Hoffe ist nun verständlich

@MzKIMu
soeine Matrix habe ich ja auch nicht, sie war nur zur Vorstellung gedacht.
Ich habe eine Tabelle wo alle Tage für jeden Mitarbeiter als DS untereinander stehen, also Anzahl_Jahrestage*AnzahlMitarbeiter an DS
Dazu dann ein Feld wo diese X1,2,3 rein müssen.

Die Vorausfüllung ist eine Arbeitserleichterung, da diese am Jahresanfang fest steht und somit nicht mehr eingetragen werden muss, sobald Tag X auftaucht steht bei Mitarbeiter Y schon der Wert drin.
Da diese Vorplanung einer Logik folgt, sollte das ja möglich sein.

Diese X1,2,3 bedeuten eigentlich "frei" mit Rangfolge (wegen Rufbereitschaft)

Die Arbeitsfolge ist eigentlich alle drei Tage, zum Verständnis habe ich es auf Tag auf Tag vereinfacht.

MzKlMu

Hallo,
also trotz mehrmaligen lesen habe ich das nicht verstanden. Oder ich stehe auf der Leitung, was ich ja nicht ausschließen will.

Was hat es mit diesen X auf sich ?
Was ist denn der Unterschied zwischen X1, X2 und X3 ?
Gruß Klaus

Xoar

X bedeutet erstmal frei. Jetzt können drei Leute an einem Tag frei haben. X1,2,3.
Wenn jetzt wer krank wird, wird erst X3 angerufen, bei zwei Kranken auch X2....

Diese Freitage sind alle 7 Tage vordefiniert. Damit die Priorität nicht immer gleich ist, wechselt diese immer.

MzKlMu

Hallo,
scheinbar bin ich wirklich etwas schwer von Begriff.
Kannst Du mal eine Exceltabelle hier hochladen, wie die fertige Accesstabelle aussehen soll ?
Mit so vielen Zeilen (Datensätzen) dass man die Regel erkennen kann.
Gruß Klaus

Xoar

#9
So habe sie als Xer.xls angehangen.

Wie gesagt da der erste Mitarbeiter mit X1 anfängt und die Treppe nach rechts unten weiter geht, muss irgendwann am ersten Tag ein Mitarbeiter mit X2 und einer mit X3 anfangen.

Hoffe ist ersichtlich.

PS: wie die Accesstabelle aussieht, kann ich garnicht abbilden, das wäre viel zu viele DS.
Jeder Tag ist ja 20x vorhanden (jeder Mitarbeiter 1x) und dann gehts los..

01.01 Mitarbeiter 1       X1
....
01.01 Mitarbeiter 8       X3
....
01.01 Mitarbeiter 15     X2
....
01.01 Mitarbeiter 20
02.01 Mitarbeiter 1
02.01 Mitarbeiter 2       x1
....
02.01 Mitarbeiter 9      x3
02.01 Mitarbeiter 16    x2
....


Grüße

MzKlMu

Hallo,
sorry, aber das wollte ich nicht. Ich wollte sehen, wie die Accesstabelle aussehen soll.
Zitat von: MzKlMuKannst Du mal eine Exceltabelle hier hochladen, wie die fertige Accesstabelle aussehen soll ?
Die Antwort auf eine frühere Frage steht auch noch aus.
Zitat von: MzKlMuUm wie viele Mitarbeiter geht es denn da ?
Gruß Klaus

Xoar

Insg. um ca. 70, aber diese sind geteilt in 3 Schichten., da ich mich ja immer auf eine Abfrage berufe sind es also ca. 24.

Hier ändert sich im Prinzip nur der erste Starttag und dann geht das gleiche Procedere los.

MzKlMu

Hallo,
und wo ist jetzt die andere Exceltabelle ?
Gruß Klaus

Xoar


Xoar

#14
SO....

jetzt wo ich mir das so in dieser Variante anschaue, sieht das eigentlich garnicht mehr so schwer aus, man muss nur immer bei jedem folgenden Datumstag MitarbeiterID +1  machen..... so spontan

Hier ist natürlich nun drauf zu achten, dass wenn die X1,2,3 soweit nach unten gewandert sind, diese wieder bei Mitarbeiter 1 anfangen.

heißt Mitarbeiter 20 hat nen X3 am 10.01. dann am 11.01 hat wieder Mitarbeiter 1 das X3.

(bei einer Annahme von genau 20 Mitarbeiter)