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 ⏩

MzKlMu

Hallo,
ich versuche mal eine Regel zu definieren.

1.Spalte
Datum für jeden Mitarbeiter wiederholend. Beginnen am 1.1.

2.Spalte Mitarbeiter (als ID)

3.Spalte
Die X beginnend am 1.1. mit X1 dann X3 dann X2 immer 7 Tage dazwischen.

Fragen:
Sind das immer durchgängig 7 Tage  ?
Die Reihenfolge ist durchgängig immer X1 - X3 - X2 ?
Gruß Klaus

Xoar

7 Tage sind fix.
Reihenfolge ist bedingt fix.
Stell dir vor Du hast diese X1,2,3 die immer ein Mitarbeiter pro Tag nach unten wandern, irgendwann fällt ja das X unten raus und taucht oben wieder auf. 

Mann könnte sagen:

4. Wenn TagY Mitarbeiter20 (letzteID) X3 hat, muss TagY+1 wieder Mitarbeiter1 das X3 haben.

Für die X1 und X2 natürlich das gleiche Prinzip

MzKlMu

Hallo,
sorry, aber ich kapiere es einfach nicht. Für Dich mag das ja einfach sein, aber ich habe ja 0 Ahnung über Eure Abläufe. Und wenn man etwas automatisiert machen will braucht es ein klare und eindeutige Regel.

Es ist auch verwirrend, weil Du mal von X spricht und dann wieder von X1, X2, X3.
Zitatirgendwann fällt ja das X unten raus und taucht oben wieder auf
Welches (von den 3en) fällt dann raus und wie geht es dann oben weiter. Und was heist oben, wo oben, wieder beim 1.1.
Gruß Klaus

Xoar

Ok, ich danke dir für die Mühe, aber ich breche es hier ab. Scheint wohl für Außenstehende echt schwer zu verstehen sein.

Mein nächstes Problem, wird hoffentlich nicht so kompliziert. ;)

Meinetwegen kannst Du den Thread löschen.

Danke

crystal

Hallo,
nicht so schnell die Flinte ins Korn werfen.
Ich glaube, deine Frage verstanden zu haben und hatte schon begonnen, eine Lösung zu schreiben, als sich plötzlich mei Browser verabschiedet hat.

Ich schreib's jetzt neu und lade es dann hier hoch - bitte um etwas Geduld.

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


crystal

Hallo xoar,

hier nun meine Lösung.
Aber zunächst zu dem, was ich mir anhand deiner Beschreibungen vorstelle.
1. du hast eine Tabelle, in der für jeden MA ein Jahreskalender gespeichert ist.
2. gemäß deiner Darstellung in deiner ursprünglichen Frage willst du nun in der sich gedanklich ergebenden Matrix, beginnend am 1.Jan für Ma1 alle 8 Tage ein Kennzeichen speichern, das von x1 bis x3 läuft und dann wieder bei x1 beginnt.
3. für Ma2 beginnt der Zyklus einen Tag später, also am 2.Jan.
4. usw. bis Ma8. Hier fällt das x1 auf den 8.Jan. Das ist größer als das Intervall und deshalb muss hier für den 1.Jan. ein weiteres xn eingefügt werden. Um die Reihenfolge der xn's einzuhalten UND weil der 8.1. ein x1 bekommt, muss also am 1.1. ein x3 stehen.

Wenn das ganze ein 2-dimensionales Array in VBA wäre, könnte man mit For-Next-Loops die Matrix abarbeiten.

Das geht aber nicht in Access, weil deine Tabelle ja eigentlich so aussieht:
MA Tag  Wert
1  1.1. x1
1  2.1. -
1  3.1. -
...
1  7.1. -
1  8.1. x2
...
1  31.12. -
2  1.1. -
2  2.1. x1
...

Diese Tabelle kannst du natürlich nur sequenziell abarbeiten, also Zeile für Zeile.

Ich gehe jetzt vom einfachen Fall aus (das erste x1 in der gedachten Matrix fällt auf den 1.Jan. bei MA1). Die Lösung sieht dann grob so aus (für MA1):

<Hilfsvariable initialisieren:
intervall = 7
oldma = 1
weiter = true

<recordset öffnen (sortierung MA und Datum>
do while not rs.eof
   
   do while weiter
      for x = 37 to 39
         for i = 1 to intervall
            if i=1 then
               rs!wert = xwert
               rs.update
            endif
            rs.movenext
            if rs.ma <> rs.oldma then
               weiter = false
               goto loopexit
            endif
         next
      next
   loop
loop

loopexit:


Mir schwirrt etwas der Kopf, vielleicht kann das mal jemand prüfen...

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...

crystal

Noch einfacher:

icounter = 0
xwert=37
intervall =7
oldma =1
macount=0

do while not rs.eof
  if rs!ma <> oldma then
    macount = macount +1
    for i = 1 to macount
      rs.movenext
    next
    icounter =0
    exit loop
  endif
  icounter = icounter +1
  if icounter mod intervall = 0 then
    rs!wert = xwert
    rs.update
    xwert = xwert +1
    if xwert > 39 then xwert = 37
  endif
  rs.movenext
loop


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

Jap Du hast es erkannt.

Ich hab nur noch nicht erkannt, wo in der Schleife der Fall eintritt, dass er mit einem X3 beginnt.

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

Ok, soweit bin ich ja auch schon gekommen. Jetzt fängt das eigentliche Problem an... ich bin gespannt ;)

crystal

Hallo xoar,
Zwischenbericht:
Ich habe eine Tabelle "xtab" angelegt, die folgende Felder hat:
xid = autowert, Primärschlüssel
ma = zahl
dt = datum
xw = text

und mit 3 MAs und jeweils dem Datum 1.1. bis 31.12.2016 gefüllt.

Dazu noch eine Abfrage "xtaba", die einfach nur die Werte aus xtab holt und (zur Sicherheit) nach ma und dt sortiert.

Mit diesem Code

Private Sub Befehl0_Click()
Dim icounter As Integer
Dim xwert As Integer
Dim intervall As Integer
Dim oldma As Integer
Dim macount As Integer
Dim i As Integer

Dim rs As ADODB.Recordset
Dim sq As String
       
sq = "select * from xtaba"
Set rs = New ADODB.Recordset
rs.ActiveConnection = CurrentProject.Connection
rs.Open sq, , adOpenDynamic, adLockOptimistic

icounter = 0
xwert = 37
intervall = 8
oldma = 1
macount = 0

Do While Not rs.EOF
    If rs!ma <> oldma Then                  'MA wechselt, d.h. wir sind wieder beim 1.Januar
        oldma = rs!ma                       'neuen Ma merken
        macount = macount + 1               'MA-Zähler erhöhen und ...
        For i = 1 To macount                '... entspr. viele Tage überspringen
            rs.MoveNext
        Next
        xwert = 37
        icounter = 0                        'ab hier starten wir (fast) ...
    End If
    icounter = icounter + 1                 '... denn erst jetzt ist der Startzähler gesetzt
    If icounter Mod intervall = 0 Or _
        icounter = 1 Then                   'wenn das Intervall erreicht ist oder wir gerade gestartet haben ...
        rs!xw = xwert                       '... schreiben wir den xwert in die Tabelle und ...
        rs.Update
        xwert = xwert + 1                   '... erhöhen ihn ...
        If xwert > 39 Then xwert = 37       '... innerhalb der vorgegebenen Grenzen
    End If
    rs.MoveNext                             'weiter zum nächsten Record
Loop

rs.Close

End Sub


habe ich jetzt schon mal alle x-Werte richtig eingetragen.
An diesem Code muss jetzt weiter gebastelt werden - lass mir etwas Zeit.

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...

crystal

Lieber xoar,
hat etwas gedauert, aber ich habe eine Lösung gebaut und getestet, allerdings erstmal nur für 3 Mitarbeiter.

Zur Bedienung:
0. stelle im VBA-Fenster unter Extras einen Verweis auf Active-X-Dataobjects Vers.xx (letzte ist beste) her
1. öffne xtab. Du findest dort einen einzelnen x-wert (38), eingetragen am 27.12.2015 (ja 2015) für MA1.
2. öffne Formular1 und klicke auf "Befehl0".
3. wechsle zurück zu xtab und du siehst die Zahlen 38, 39, 37 usw. im Abstand von je 8 Tagen eingetragen. Wenn du runterscrollst, wird dir auffallen, dass für MA2 (MA3) und Dez. 2015 keine Werte eingetragen wurden.
4. zurück in Formular1 kannst du dann zum Testen alle x-Werte wieder löschen (Button reset). Dann musst du aber manuell einen neuen Wert in xtab eintragen (z.B. 37 am 26.12.2015) und kannst dann Befehl0 wieder anklicken.

Ich hoffe, diese erste Lösung entspricht deinen Vorstellungen und übersteht deine Tests. ;-)
Was jetzt noch zu tun ist, ist die spezielle Situation zu berücksichtigen, wenn man einen 8., 16. oder 24. MA bearbeitet...

Viel Erfolg beim Testen. Meine db ist unter acc2016 gebaut. Ich hoffe, das passt. Aber ich habe auch eine mdb eingepackt (acc2002 ff.).

Und sorry - ich habe kein Error-Handling eingebaut, musst du dann selber machen.

lg
crystal

PS: Erweiterungen mache ich dann in den folgenden Tagen...



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 cool danke.
Ich arbeite mit der 2010er. Kann sie selber erst am  Dienstag testen, da ich erst dann wieder auf der Arbeit bin.

Werd dir aufjedenfall eine Rückmeldung geben!

crystal

Hallo xoar,
so, es ist nun fertig. In der alten Version waren noch Fehler, bitte löschen.

Nicht vergessen: Verweis auf ADODB.

Ich hab die Tabelle auf 12 MA aufgepumpt und noch ein Formular2 gebastelt, zur Visualisierung des Ergebnisses (mit fest eingestelltem Jahr 2016, Rollbalken funktionieren nicht).
Zum Testen öffne Formular1, Formular2 und xtab. Wechsel dann zurück zu Formular1 und klick auf "x eintragen". Das Ergebnis siehst du dann "sofort" in xtab und Formular2.
Neuer Versuch? Einfach "reset" klicken, einen Startwert im Dez. 2015 eintragen und "x eintragen" klicken.

Viel Spaß beim Testen.

lg
crystal

PS: ich hab noch eine Excel-Tabelle zum Füllen von xtab beigefügt. Wenn du den Dez. 2015 rauslöschst und die MA-Spalte um je 12 erhöhst, hast du 12 weitere Test-MA für xtab (einfach importieren und an xtab anfügen).
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...