Avatar billede dane022 Seniormester
14. august 2007 - 12:31 Der er 22 kommentarer og
1 løsning

Dato gentagelse

Jeg har følgende kode i en formular. Den sørger for at kopiere antal forekomster med et bestemt interval i måneder.
Jeg kunne godt tænke mig at koden ikke opretter den første forekomst. Dvs. hvis første forekomst er 1/8-07 og intervallet er 1 måned, skal den første dato være 1/9-07.

Dim Dato As Date, I As Integer
Dato = Format(Me.Startdato, "dd-mm-yyyy", vbMonday, vbFirstFourDays)
Dato2 = Format(Me.Forfaldsdato, "dd-mm-yyyy", vbMonday, vbFirstFourDays)
For I = 1 To Val(Me.Forekomster)
DoCmd.RunSQL "INSERT INTO [Opgaver totalt] ( startdato, emne, initialer, forfaldsdato, gentagelse, forekomster, status, tekst )SELECT  '" & Format(Dato, "dd-mm-yyyy") & "', '" & Me.Emne & "', '" & Me.Initialer & "','" & Format(Dato2, "dd-mm-yyyy") & "', '" & Me.Gentagelse & "',  '" & Me.Forekomster & "',  '" & Me.Status & "',  '" & Me.Tekst & "' "
Dato = DateAdd("m", Val(Me.Hyppighed), Dato)
Dato2 = DateAdd("m", Val(Me.Hyppighed), Dato2)
Avatar billede thesurfer Nybegynder
14. august 2007 - 14:58 #1
Jeg ved ikke lige var Val(Me.Forekomster) indeholder, men ellers kunne du vel bare starte ved index 2:

For I = 2 To Val(Me.Forekomster)

Alternativt kan du lave en tæller, og kun gemme hvis tælleren er over 1:

dim c
c = 0

For I = 1 To Val(Me.Forekomster)

if c > 0 then

DoCmd.RunSQL "INSERT INTO [Opgaver totalt] ( startdato, emne, initialer, forfaldsdato, gentagelse, forekomster, status, tekst )SELECT  '" & Format(Dato, "dd-mm-yyyy") & "', '" & Me.Emne & "', '" & Me.Initialer & "','" & Format(Dato2, "dd-mm-yyyy") & "', '" & Me.Gentagelse & "',  '" & Me.Forekomster & "',  '" & Me.Status & "',  '" & Me.Tekst & "' "
Dato = DateAdd("m", Val(Me.Hyppighed), Dato)
Dato2 = DateAdd("m", Val(Me.Hyppighed), Dato2)

.... resten af din insæt-kode... og så:
c = c + 1
end if

Da c er 0 til at starte med, vil den første forekomst ikke blive gemt..
Avatar billede thesurfer Nybegynder
14. august 2007 - 15:00 #2
Rettelse til teksten:

Alternativt kan du lave en tæller, og kun gemme hvis tælleren er over "den første værdi":

I mit eksempel er den første værdi lig 0. Du kunne også starte ved 1, og bruge:

if c > 1

Helt op til dig..
Avatar billede dane022 Seniormester
14. august 2007 - 15:11 #3
Betyder det ikke at øverste sætning:
Dim Dato As Date, I As Integer
skal indeholde noget mere?
Avatar billede thesurfer Nybegynder
14. august 2007 - 15:46 #4
Nej, jeg har den jo lige her:

dim c
c = 0

Hvis du vil, kan du skrive:

dim c As Integer
c = 0
Avatar billede thesurfer Nybegynder
14. august 2007 - 15:47 #5
Du kan også bare samle alle definitionerne, hvis du vil:

Dim Dato As Date, I As Integer, c As Integer
Dato = Format(Me.Startdato, "dd-mm-yyyy", vbMonday, vbFirstFourDays)
Dato2 = Format(Me.Forfaldsdato, "dd-mm-yyyy", vbMonday, vbFirstFourDays)

For I = 1 To Val(Me.Forekomster)

if c > 0 then

DoCmd.RunSQL "INSERT INTO [Opgaver totalt] ( startdato, emne, initialer, forfaldsdato, gentagelse, forekomster, status, tekst )SELECT  '" & Format(Dato, "dd-mm-yyyy") & "', '" & Me.Emne & "', '" & Me.Initialer & "','" & Format(Dato2, "dd-mm-yyyy") & "', '" & Me.Gentagelse & "',  '" & Me.Forekomster & "',  '" & Me.Status & "',  '" & Me.Tekst & "' "
Dato = DateAdd("m", Val(Me.Hyppighed), Dato)
Dato2 = DateAdd("m", Val(Me.Hyppighed), Dato2)

.... resten af din insæt-kode... og så:
c = c + 1
end if

Det giver samme resultat.
Avatar billede thesurfer Nybegynder
14. august 2007 - 15:48 #6
Rettelse:

Dim Dato As Date, I As Integer, c As Integer
Dato = Format(Me.Startdato, "dd-mm-yyyy", vbMonday, vbFirstFourDays)
Dato2 = Format(Me.Forfaldsdato, "dd-mm-yyyy", vbMonday, vbFirstFourDays)

c = 0

For I = 1 To Val(Me.Forekomster)

if c > 0 then

DoCmd.RunSQL "INSERT INTO [Opgaver totalt] ( startdato, emne, initialer, forfaldsdato, gentagelse, forekomster, status, tekst )SELECT  '" & Format(Dato, "dd-mm-yyyy") & "', '" & Me.Emne & "', '" & Me.Initialer & "','" & Format(Dato2, "dd-mm-yyyy") & "', '" & Me.Gentagelse & "',  '" & Me.Forekomster & "',  '" & Me.Status & "',  '" & Me.Tekst & "' "
Dato = DateAdd("m", Val(Me.Hyppighed), Dato)
Dato2 = DateAdd("m", Val(Me.Hyppighed), Dato2)

.... resten af din insæt-kode... og så:
c = c + 1
end if

Jeg glemte linien "c = 0".

- Jeg regner med at det virker, hvilket det burde, og smider derfor et svar :-)
Avatar billede dane022 Seniormester
14. august 2007 - 21:15 #7
Tak for forslagene, jeg vil prøve det af imorgen på arbejdet
Avatar billede dane022 Seniormester
15. august 2007 - 07:43 #8
Hele koden ser nu sådan ud:
Dato = Format(Me.Startdato, "dd-mm-yyyy", vbMonday, vbFirstFourDays)
        Dato2 = Format(Me.Forfaldsdato, "dd-mm-yyyy", vbMonday, vbFirstFourDays)
        c = 0
        If c > 0 Then
        For I = 1 To Val(Me.Forekomster)
        DoCmd.RunSQL "INSERT INTO [adhoc opgaver totalt] ( startdato, emne, initialer, forfaldsdato, gentagelse, forekomster, status, tekst )SELECT  '" & Format(Dato, "dd-mm-yyyy") & "', '" & Me.Emne & "', '" & Me.Initialer & "','" & Format(Dato2, "dd-mm-yyyy") & "', '" & Me.Gentagelse & "',  '" & Me.Forekomster & "',  '" & Me.Status & "',  '" & Me.Tekst & "' "
        Dato = DateAdd("m", Val(Me.Hyppighed), Dato)
        Dato2 = DateAdd("m", Val(Me.Hyppighed), Dato2)
        c = c + 1
      Next
        MsgBox ("Opgaven er nu oprettet"), vbInformation, "Opgave oprettet"
        DoCmd.SetWarnings True
        End If

Jeg var nødt til at bytte om på 2 af dine linjer, da den ikke ville acceptere NEXT uden FOR. Men det virker stadig ikke, der bliver ikke lavet nogen dato gentagelser og jeg får ikke msgbox heller
Avatar billede thesurfer Nybegynder
15. august 2007 - 10:41 #9
Rettelse:

Dim Dato As Date, I As Integer, c As Integer
Dato = Format(Me.Startdato, "dd-mm-yyyy", vbMonday, vbFirstFourDays)
Dato2 = Format(Me.Forfaldsdato, "dd-mm-yyyy", vbMonday, vbFirstFourDays)

c = 0

For I = 1 To Val(Me.Forekomster)

if c > 0 then

DoCmd.RunSQL "INSERT INTO [Opgaver totalt] ( startdato, emne, initialer, forfaldsdato, gentagelse, forekomster, status, tekst )SELECT  '" & Format(Dato, "dd-mm-yyyy") & "', '" & Me.Emne & "', '" & Me.Initialer & "','" & Format(Dato2, "dd-mm-yyyy") & "', '" & Me.Gentagelse & "',  '" & Me.Forekomster & "',  '" & Me.Status & "',  '" & Me.Tekst & "' "
Dato = DateAdd("m", Val(Me.Hyppighed), Dato)
Dato2 = DateAdd("m", Val(Me.Hyppighed), Dato2)

.... resten af din insæt-kode... og så:
c = c + 1
end if
next

Jeg glemte linien "c = 0".

IF-sætning skal jo være inde i For-løkken.. ellers hjælper det jo ikke noget.. :-)
Avatar billede thesurfer Nybegynder
15. august 2007 - 10:43 #10
Hehe..

Linien "c = c + 1" skal jo ikke være inde i IF-sætningen, da den så aldrig vil kommer over 0.. :-)

Rettelse.. igen.. igen.. igen.. :-)

Rettelse:

Dim Dato As Date, I As Integer, c As Integer
Dato = Format(Me.Startdato, "dd-mm-yyyy", vbMonday, vbFirstFourDays)
Dato2 = Format(Me.Forfaldsdato, "dd-mm-yyyy", vbMonday, vbFirstFourDays)

c = 0

For I = 1 To Val(Me.Forekomster)

if c > 0 then

DoCmd.RunSQL "INSERT INTO [Opgaver totalt] ( startdato, emne, initialer, forfaldsdato, gentagelse, forekomster, status, tekst )SELECT  '" & Format(Dato, "dd-mm-yyyy") & "', '" & Me.Emne & "', '" & Me.Initialer & "','" & Format(Dato2, "dd-mm-yyyy") & "', '" & Me.Gentagelse & "',  '" & Me.Forekomster & "',  '" & Me.Status & "',  '" & Me.Tekst & "' "
Dato = DateAdd("m", Val(Me.Hyppighed), Dato)
Dato2 = DateAdd("m", Val(Me.Hyppighed), Dato2)

.... resten af din insæt-kode... og så:
end if
c = c + 1
next

Nu skulle det meget gerne virke.. :-)
Avatar billede dane022 Seniormester
15. august 2007 - 10:52 #11
Nu har jeg lavet en test, hvor der skulle være 3 forekomster der skulle gentages med ½ år mellemrum. Det blev således 1=1/8-07 2=1/8-07 3=1/2-08.

Det skulle have været 1/8-07, 1/2-08 og 1/8-08
Avatar billede thesurfer Nybegynder
15. august 2007 - 12:27 #12
Det er muligvis din SQL sætning, der er noget galt med..

Virker det fint hvis du ikke bruger IF-sætningen?

Skal der ikke være et ";" mellem ")" og "SELECT" her?: )SELECT
Avatar billede dane022 Seniormester
15. august 2007 - 13:03 #13
Uden if sætningen bliver der udarbejdet 4 poster, ligesom før med 1/8-07 i de 2 første og så derefter.

Jeg synes det virker som om at if sætningen fjerner den sidste post istedet for den første
Avatar billede thesurfer Nybegynder
15. august 2007 - 13:12 #14
Så skal du have en sortering på din SQL..

Normalt gør man sådan her:

select dato, felt2, andrefelter from tabelnavn order by FeltNavnDerSkalSorteresPå desc

Det vil så være oplagt, at sætte "FeltNavnDerSkalSorteresPå" til at være et dato-felt.

Med ordet "desc" vælger man at resultaterne skal vises faldende, så den starter med den nyeste, hvilket åbenbart ikke kommer med nu..

Så skal din For-løkke vist laves om til:

For I = 1 To Val(Me.Forekomster) - 1

Muligvis:

For I = 0 To Val(Me.Forekomster) - 1

Dvs, start ved 0 og kør til max minus 1..
Avatar billede dane022 Seniormester
15. august 2007 - 13:36 #15
Er det nemmere hvis jeg kan sende dig en kopi af databasen på mail?
Avatar billede thesurfer Nybegynder
15. august 2007 - 19:30 #16
VBA er bestemt ikke min stærke side, så jeg tror ikke at det ville blive nemmere..

Jeg forstår ikke helt din SQL sætning..

Hvis jeg ikke tager fejl, vil Format(Dato, "dd-mm-yyyy") returnerer en dato på det angivne format..

Så står der f.eks.: SELECT '01-08-2007'

Der burde vel have stået et navnet på et felt, f.eks. Dato..
Avatar billede dane022 Seniormester
16. august 2007 - 07:37 #17
Dato og dato2 repræsenterer de datoer der skal lægges i tabellen, dvs. for hver forekomst. Koden har egentlig fungeret godt nok, den er bare ikke sat op til at "springe" den første dato over og det ønsker jeg den skal gøre, fordi den post jeg opretter, vil netop indeholde den første dato
Avatar billede thesurfer Nybegynder
16. august 2007 - 11:12 #18
Normalt ville man f.eks. gøre sådan her:

SELECT * FROM TabellensNavn WHERE DatoFeltet BETWEEN 'FørsteDato' AND 'AndetDato'

Se f.eks.: http://www.w3schools.com/sql/sql_between.asp

Eksempel:

SELECT * FROM TabellensNavn WHERE DatoFeltet BETWEEN #" & Format(Dato, "dd-mm-yyyy") & "# AND #" & Format(Dato2, "dd-mm-yyyy") & "#"

Prøv lige det.. sig til hvis der er noget ved den SQL sætning du ikke helt forstår..


Ellers kan man f.eks. bruger noget i stil med:

SELECT * FROM TabellensNavn WHERE DatoFeltet > #" & Format(Dato, "dd-mm-yyyy") & "# AND <= #" & Format(Dato2, "dd-mm-yyyy") & "#"


PS: Det er ikke sikket at "#" skal med..
Avatar billede thesurfer Nybegynder
16. august 2007 - 11:46 #19
Den sidste skal muligvis være:

SELECT * FROM TabellensNavn WHERE DatoFeltet > #" & Format(Dato, "dd-mm-yyyy") & "# AND DatoFeltet <= #" & Format(Dato2, "dd-mm-yyyy") & "#"


Jeg glemte: AND DatoFeltet <=
Avatar billede dane022 Seniormester
16. august 2007 - 22:06 #20
Jeg ved ikke om du har ret, men mit mål er at kun at få en post pr. dato.

Hvad hvis man valgte en nemmere løsning, der gjorde at man i koden lagde en sletning af en af de poster der har samme dato. F.eks. hvis man slettede ud fra id.
Er du med på hvad jeg mener?
Avatar billede thesurfer Nybegynder
20. august 2007 - 22:02 #21
Jeg beklager at jeg først skriver nu.. Jeg "mistede" den seneste mail i dyngen af mails fra andre spørgsmål jeg deltager i..

Som jeg ser det, kan man gøre det på 2 måder:

1) Vía SQL
Her kan du begrænse hvad outputtet skal være, og du burde derfor kunne bruge noget i stil med SQL koden fra 16/08-2007 11:12:27 og 16/08-2007 11:46:22

2) Via kode
Efter at have fået outputtet fra SQL'en, kan du f.eks. smide posterne i en array, og hoppe over nogle af dem, via en tæller, som nævnt i resten af indlæggende..


Jeg har aldrig arbejdet med DoCmd.RunSQL, SQL kald direkte i Access, så jeg kan ikke sige dig, hvordan det vil fungerer..

Umiddelbart ser det ud til at fungere på normalvis.. hvilket så undrer mig, at du ikke får fejl, fordi du har en SELECT sætning lige efter en INSERT sætning, uden at putte ";" i mellem de to sætninger..
Det har jeg aldrig prøvet før..

Jeg ville helst have brugt SQL-begræsningen, f.eks. med BETWEEN eller "<= og >="..
Avatar billede thesurfer Nybegynder
20. august 2007 - 22:15 #22
Jeg har lavet en test i en Access database, med følgende data:

navn:        datotid:
ole        01-02-2003
hans        02-03-2004
henrik        03-04-2005
olga        04-05-2006

Via denne følgende sætning:

SELECT * FROM tabel1 WHERE datotid>#1/1/2003# And datotid<#1/1/2006#;

Får jeg dette resultat:

navn    datotid
ole    01-02-2003
hans    02-03-2004
henrik    03-04-2005
Avatar billede dane022 Seniormester
27. august 2007 - 10:12 #23
Jeg har først set dine svar nu. du skal ha tak for dine forsøg, jeg lukker nu spørgsmålet. Måske opretter jeg et nyt senere
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester