Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: gcniva am Dezember 31, 2012, 02:51:58

Titel: Public Function
Beitrag von: gcniva am Dezember 31, 2012, 02:51:58
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
Titel: Re: Public Function
Beitrag von: bahasu am Dezember 31, 2012, 07:19:50
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
Titel: Re: Public Function
Beitrag von: bahasu am Dezember 31, 2012, 08:02:27
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
Titel: Re: Public Function
Beitrag von: MzKlMu am Dezember 31, 2012, 09:44:59
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 ?
Titel: Re: Public Function
Beitrag von: Beaker s.a. am Dezember 31, 2012, 14:56:17
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
Titel: Re: Public Function
Beitrag von: MzKlMu am Dezember 31, 2012, 15:24:40
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.
Titel: Re: Public Function
Beitrag von: bahasu am Dezember 31, 2012, 15:25:55
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
Titel: Re: Public Function
Beitrag von: Beaker s.a. am Dezember 31, 2012, 16:02:10
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.
Titel: Re: Public Function
Beitrag von: DF6GL am Dezember 31, 2012, 17:15:58
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

Titel: Re: Public Function
Beitrag von: bahasu am Dezember 31, 2012, 17:21:34
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
Titel: Re: Public Function
Beitrag von: DF6GL am Dezember 31, 2012, 17:38:38
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
Titel: Re: Public Function
Beitrag von: MzKlMu am Dezember 31, 2012, 17:43:42
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.
Titel: Re: Public Function
Beitrag von: bahasu am Dezember 31, 2012, 17:55:51
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

Titel: Re: Public Function
Beitrag von: MzKlMu am Dezember 31, 2012, 18:02:06
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.
Titel: Re: Public Function
Beitrag von: DF6GL am Dezember 31, 2012, 18:10:18
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...
Titel: Re: Public Function
Beitrag von: bahasu am Dezember 31, 2012, 20:47:03
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
Titel: Re: Public Function
Beitrag von: gcniva am Januar 02, 2013, 15:22:09
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

Titel: Re: Public Function
Beitrag von: gcniva am Januar 02, 2013, 15:40:07
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
Titel: Re: Public Function
Beitrag von: gcniva am Januar 06, 2013, 16:02:55
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
Titel: Re: Public Function
Beitrag von: bahasu am Januar 06, 2013, 17:11:44
Hi,

schau Dir mal den replace-Befehl an. Der kann in einem String Zeichen austauschen.

Harald
Titel: Re: Public Function
Beitrag von: DF6GL am Januar 06, 2013, 18:05:10
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.



Titel: Re: Public Function
Beitrag von: gcniva am Januar 07, 2013, 20:35:49
Hi

@Franz

hab dir mal eine Tabelle angehängt...


@Harald

Werd ich mal anschauen obs mit dem geht...

Danke
Titel: Re: Public Function
Beitrag von: gcniva am Januar 07, 2013, 20:36:48
Huch

Tabelle vergessen  ::)

[Anhang gelöscht durch Administrator]