Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Public Function

Begonnen von gcniva, Dezember 31, 2012, 02:51:58

⏪ vorheriges - nächstes ⏩

gcniva

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
Arbeite mit Access 2010

bahasu

#1
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
Servus

bahasu

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
Servus

MzKlMu

#3
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 ?
Gruß Klaus

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MzKlMu

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.
Gruß Klaus

bahasu

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
Servus

Beaker s.a.

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.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

DF6GL

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


bahasu

#9
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
Servus

DF6GL

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

MzKlMu

#11
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.
Gruß Klaus

bahasu

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

Servus

MzKlMu

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.
Gruß Klaus

DF6GL

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