Hallo Leut
Habe da mal ein problem, haben folgenden code:
Public Function Schreiben(DatumVon As Date, DatumBis As Date)
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim AktuellesDatum As Date
Set db = CurrentDb
Set rst = db.OpenRecordset("tbl_Kalender", dbOpenDynaset)
For AktuellesDatum = DatumVon To DatumBis
rst.AddNew
rst!Datum = AktuellesDatum
rst!Kalendertag = Format(AktuellesDatum, "ddd")
rst!Jahr = Format(AktuellesDatum, "yyyy")
rst!Monat = Format(AktuellesDatum, "mmmm")
rst!KW = Format(AktuellesDatum, "ww")
rst!Schicht = ("T")
rst.Update
Next
End Function
Es geht auch alles nur hätte ich gerne das unter rst!Schicht im ersten datensatz "T" im zweiten "N" steht...
Geht das ???
Danke Gerd
Hi Gerd,
vielleciht hilft die folgende Ergänzung.
Public Function Schreiben(DatumVon As Date, DatumBis As Date)
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim AktuellesDatum As Date
Dim ErstesMal as boolean
ErstesMal = true
Set db = CurrentDb
Set rst = db.OpenRecordset("tbl_Kalender", dbOpenDynaset)
For AktuellesDatum = DatumVon To DatumBis
rst.AddNew
rst!Datum = AktuellesDatum
rst!Kalendertag = Format(AktuellesDatum, "ddd")
rst!Jahr = Format(AktuellesDatum, "yyyy")
rst!Monat = Format(AktuellesDatum, "mmmm")
rst!KW = Format(AktuellesDatum, "ww")
if ErstesMal then
rst!Schicht = ("T")
ErstesMal = false
else
rst!Schicht = ("N")
end if
rst.Update
Next
rst.close
set rst = nothing
End Function
Das BLAUE fehlt noch.
Harald
Hi,
im Nachtrag noch eine Frage:
Warum speicherst Du berechnete Daten wie Kalendertag, Monat, Jahr, Kalenderwoche in der Tabelle ab?
Es reicht doch, "AktuellesDatum" zu speichern und dann bei Bedarf in einer Abfrage die gewünschten Daten anzuzeigen.
Harald
Hallo,
es kann bei großen Kalendertabellen Sinn machen, diese Werte extra zu speichern.
Dann müsste man aber konsequent sein, die Werte nicht als Text zu speichern, sondern als Zahlenwert.
Und diese Felder in der Tabelle indizieren.
Weiterhin wäre noch anzumerken, dass die Funktion für die KW falsch ist. So wie das hier steht ergibt sich für den 31.12.2012 die KW 53, das ist aber bereits die KW1 2013. Das ollte also so geändert werden:
rst!Kalendertag = Weekday(AktuellesDatum, vbMonday) 'vbMonday = Monatg = 1
rst!Jahr = Year(AktuellesDatum)
rst!Monat = Month(AktuellesDatum)
rst!KW = DatePart("ww", AktuellesDatum, vbMonday, vbFirstFourDays)
Schicht habe ich jetzt mal unberücksichtig gelassen.
Wenn Performance keine Rolle spielt, genügt es nur das reine Datum in die Tabelle zu schreiben. Der Rest über eine Abfrage, auch die Schicht lässt sich über eine Abfrage ermitteln.
Wobei noch zu klären wäre, mit welcher Schicht begonnen wird, T oder N ?
Hallo Harald,
Warum nicht einfach
If AktuellesDatum = DatumVon Then
rst!Schicht = "T"
Else
rst!Schicht = "N"
End If
Frage:
Warum hast Du da geklammert?
gruss ekkehard
Hallo,
Zitatnur hätte ich gerne das unter rst!Schicht im ersten datensatz "T" im zweiten "N" steht...
Ich interpretiere das als alternierend.
Also so:
T
N
T
N
usw.
Hi Ekkehard,
du hast vollkommen recht.
Da hat der copy und paste Teufel zugeschlagen: Konkret ich hatte kritiklos die Vorgabe vom Diskussionsauslöser übernommen.
Habe mittlerweile auch meine Zweifel, ob das Ziel lautet: "im zweiten "N" steht..."
Könnte mir besser vorstellen, dass abwechselnd N und T verwendet werden (siehe Beitrag von Klaus).
Dafür wäre dann nur eine zusätzliche Zeile notwendig ...
Also mal abwarten, ob das Ziel noch genauer formuliert wird.
Bis dahin allen einen guten Rutsch und ein gutes Neues Jahr 2013.
Harald
Hallo,
Zitatdu hast vollkommen recht.
Leider nein :(
Habe ich mal wieder nicht genug nachgedacht; -
zwischen von und bis können ja mehrere Tage
liegen, und dann würde nur der erste Tag (von)
ein "T" und der letzte (bis) ein "N" bekommen
und die Tage dazwischen würden leer bleiben.
Da ist dann dein Ansatz wohl doch der bessere
um alternierend "T" und "N" zu erhalten.
gruss ekkehard
... und übrigens, nochwas:
Guten Rutsch und ein erfolgreiches 201.
Hallo,
wenn "alternierend":
Public Function Schreiben(DatumVon As Date, DatumBis As Date)
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim AktuellesDatum As Date
Dim i As Long
i = 0 '1, wenn mit "N" beginnend
Set db = CurrentDb
Set rst = db.OpenRecordset("tbl_Kalender", dbOpenDynaset)
For AktuellesDatum = DatumVon To DatumBis
rst.AddNew
rst!Datum = AktuellesDatum
rst!Kalendertag = Format(AktuellesDatum, "ddd")
rst!Jahr = Format(AktuellesDatum, "yyyy")
rst!Monat = Format(AktuellesDatum, "mmmm")
rst!KW = Format(AktuellesDatum, "ww")
If i Mod 2 Then
rst!Schicht = "N"
Else
rst!Schicht = "T"
End If
rst.Update
i = i + 1
Next
rst.close
set rst = nothing
End Function
Hi Franz,
oder:
Public Function Schreiben(DatumVon As Date, DatumBis As Date)
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim AktuellesDatum As Date
Dim ErstesMal as boolean
ErstesMal = true
Set db = CurrentDb
Set rst = db.OpenRecordset("tbl_Kalender", dbOpenDynaset)
For AktuellesDatum = DatumVon To DatumBis
rst.AddNew
rst!Datum = AktuellesDatum
rst!Kalendertag = Format(AktuellesDatum, "ddd")
rst!Jahr = Format(AktuellesDatum, "yyyy")
rst!Monat = Format(AktuellesDatum, "mmmm")
rst!KW = DatePart("ww", AktuellesDatum, vbMonday, vbFirstFourDays) ' korrigiert nach Hinweis von Klaus
if ErstesMal then
rst!Schicht = ("T")
ErstesMal = false
else
rst!Schicht = ("N")
ErstesMal=true
end if
rst.Update
Next
rst.close
set rst = nothing
End Function
... und dann könnte man auch ErstesMal umbenennen in Tagschicht
Harald
Hallo Harald,
ja, es gibt viele Wege nach Rom...
Noch "kürzer" und erweiterbar wäre es , auf die Buchstaben-Kennzeichnung für eine Schicht zu verzichten und anstelle eine Zahl zu benutzen:
Const AnzahlSchichten = 2 'Wert könnte auch aus einer Parametertabelle entnommen werden.
.
.
rst!KW = Format(AktuellesDatum, "ww")
rst!Schicht = i Mod AnzahlSchichten
rst.Update
i = i + 1
Next
Hallo,
dann würde ich es aber universeller machen. Das Datum ist ja eine Zahl und das Datum mit Mod 2 behandelt ergibt die Zahl 0 oder 1.
Man muss jetzt nur noch festlegen ob die 1 Tagschicht oder Nachtschicht ist.
Der Zähler i entfällt ersatzlos.
rst!Datum = AktuellesDatum
rst!Schicht = AktuellesDatum Mod 2
Das funktioniert immer richtig, ich muss nie überlegen mit was anzufangen ist, auch Jahresübergreifend wenn Jahre ergänzt werden.
Wenn man die Schicht wechsen will, zählt man zum Datum einfach 1 dazu:
rst!Schicht = (AktuellesDatum +1) Mod 2
Ergänzend: Da passt auch noch der Vorschlag von Franz dazu.
PS:
Die falsche Formel für die KW hat jeder einfach übernommen.
Hi Klaus,
Zitat von: MzKlMu am Dezember 31, 2012, 17:43:42
Die falsche Formel für die KW hat jeder einfach übernommen.
ja sorry. Habe jetzt #9 korrigiert.
Zum anderen:
mit mod ist das ok, wenn die Schicht nach 12:00 wechselt:
31.12.2012 12:00 liefert 0
31.12.2012 12:01 liefert 1
Guten Rutsch
Harald
Hallo,
von der Uhrzeit war ja noch gar nicht die Rede.
Anmerkung für den Threadersteller, damit das wegen der vielen Beiträge nicht untergeht: Bitte Hinweise in #3 beachten.
Und auch von mir an alle einen guten Rutsch.
Hallo,
sagte ja schon, : es gibt viele Wege nach Rom ;) ;)
Euch Allen auch einen gefahrlosen Rutsch ins Neue Jahr und möglichst wenig Laufzeitfehler in 2013...
Hi,
Zitat von: DF6GL am Dezember 31, 2012, 18:10:18
wenig Laufzeitfehler in 2013...
und besonders nicht den Fehler 2013 ;D : Datenträger ist beinahe voll {http://support.microsoft.com/kb/112509/de (http://support.microsoft.com/kb/112509/de)}
Harald
Hallo und vielen Dank erst mal...
Hab mal die #8 übernommen:
Public Function Schreiben(DatumVon As Date, DatumBis As Date)
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim i As Long
i = 0 '1, wenn mit "N" beginnend
Dim AktuellesDatum As Date
Set db = CurrentDb
Set rst = db.OpenRecordset("tbl_Kalender", dbOpenDynaset)
For AktuellesDatum = DatumVon To DatumBis
rst.AddNew
rst!Datum = AktuellesDatum
rst!Kalendertag = Format(AktuellesDatum, "ddd")
rst!Jahr = Format(AktuellesDatum, "yyyy")
rst!Monat = Format(AktuellesDatum, "mmmm")
rst!KW = DatePart("ww", AktuellesDatum, vbMonday, vbFirstFourDays)
If i Mod 2 Then
rst!Schicht = "T"
Else
rst!Schicht = "N"
Else
End If
rst.Update
i = i + 1
Next
rst.Close
Set rst = Nothing
End Function
Jetzt schreibt er aber 3 Jahre in die Tabelle?
Gruß Gerd
Hi ich noch mal
Ein bissel Erklärung zu dem ganzen.
Habe vor eine Schichtplanung zu erstellen.
Mit den Kalendermodulen geht das nicht so richtig...
Also eine bissel gesucht und bin bei der Tabellen version hängen geblieben.
Natürlich brauche ich nicht alles wie Kalenderwoche, schaut aber gut aus :-)
Schicht system ist 4x12 h , also 6:00 bis 18:00 und nächsten Tag von 18:00 bis 6:00 Uhr dann 48h frei...
Danke das mit der Kalenderwoche ist mir jetzt noch garnicht aufgefallen, jetzt geht es.
Werde Morgen mal spielen.
Gruß Gerd
Hi
Viel weiter bin ich noch nicht gekommen ::).
Wollte die Zahlen in Text umwandeln, hab dazu auch ein Modul doch irgend wie bekomme ich das nicht zum laufen..
könnt ihr mal drüber schauen, Danke.
Function ZahlInWort(lngZahl As Long) As String
On Error GoTo Fehler
Dim i As Single
Dim l As Single
Dim x As Variant
l = Len(CStr(lngZahl))
For i = 1 To l
Schicht = Mid(lngZahl, i, 1)
If Schicht = 0 Then Schicht = "T"
If Schicht = 1 Then Schicht = "N"
If Schicht = 2 Then Schicht = "-"
If Schicht = 3 Then Schicht = "-"
If Schicht = "" Then Schicht = "-"
ZahlInWort = ZahlInWort & "*" & x
Next i
ZahlInWort = ZahlInWort & "*"
Ende:
Exit Function
Fehler:
' MsgBox Err.Description
Resume Ende
End Function
Hi,
schau Dir mal den replace-Befehl an. Der kann in einem String Zeichen austauschen.
Harald
Hallo,
was hast Du nun mit diesem Code vor??
Wenn Du sowas:
ZitatSchicht system ist 4x12 h , also 6:00 bis 18:00 und nächsten Tag von 18:00 bis 6:00 Uhr dann 48h frei...
abbilden willst, dann zeig mal ein Beispiel mit ein paar Datensätzen, wie die Tabelle aussehen soll.
Hi
@Franz
hab dir mal eine Tabelle angehängt...
@Harald
Werd ich mal anschauen obs mit dem geht...
Danke
Huch
Tabelle vergessen ::)
[Anhang gelöscht durch Administrator]