Avatar billede dsjk Novice
26. oktober 2004 - 09:09 Der er 24 kommentarer og
1 løsning

samme kode til 53 felter - kan det laves smart?

Hej

Jeg har denne kode som skal køres når jeg sætter hak i en afkrydsningsbox:

Private Sub uge8_AfterUpdate()
  Dim sqlstr As String
  Dim iBladid As Integer
  Dim iAar As Integer
  iBladid = Me.bladid
  If (Me.aar <> "") Then
    iAar = Me.aar
    If (Me.ugeX = -1) Then
        sqlstr = "INSERT INTO omdeling (bladid, uge, aar) VALUES ('" & iBladid & "', 'X', '" & iAar & "')"
        MsgBox sqlstr
        DoCmd.RunSQL sqlstr
    End If
    If (Me.ugeX = 0) Then
        sqlstr = "DELETE FROM omdeling WHERE bladid = '" & iBladid & "' AND uge='X' AND Aar='" & iAar & "'"
        MsgBox sqlstr
        DoCmd.RunSQL sqlstr
    End If
  Else
    MsgBox "Husk at vælge år", vbInformation
    Me.ugeX = 0
  End If
End Sub

Jeg har 53 afkrydsningsboxe som skal have samme kode. Det eneste der er forskelligt er me.ugeX som skal være fra me.uge1 til me.uge53 og i de 2 sqlstr skal uge X være fra uge 1 til 53.

Kan det laves på en smartere måde, end at kopiere det ud til alle 53 afkrydsningsboxe?

/dsjk
Avatar billede jensen363 Forsker
26. oktober 2004 - 09:11 #1
Opret koden som Public Sub i et modul, og kald modulkoden derfra
Avatar billede dsjk Novice
26. oktober 2004 - 09:13 #2
kan du uddybe det lidt mere, har ikke lavet en public sub før. :)

/dsjk
26. oktober 2004 - 09:14 #3
Lidt mere detaljeret....

Lav en function på formularen således:

Private Sub OpdaterUge(Uge as Control)
  Dim sqlstr As String
  Dim iBladid As Integer
  Dim iAar As Integer
  iBladid = Me.bladid
  If (Me!aar <> "") Then
    iAar = Me!aar
    If (Me(Uge) = -1) Then
        sqlstr = "INSERT INTO omdeling (bladid, uge, aar) VALUES ('" & iBladid & "', 'X', '" & iAar & "')"
        MsgBox sqlstr
        DoCmd.RunSQL sqlstr
    End If
    If (Me(Uge) = 0) Then
        sqlstr = "DELETE FROM omdeling WHERE bladid = '" & iBladid & "' AND uge='X' AND Aar='" & iAar & "'"
        MsgBox sqlstr
        DoCmd.RunSQL sqlstr
    End If
  Else
    MsgBox "Husk at vælge år", vbInformation
    Me(Uge) = 0
  End If
End Sub


På hver Uge-tekstboks lægger du denne linie direkte på EfterOpdatering-egenskaben i egenskabsarket:

=OpdaterUge(Form!UgeX)

UgeX skal så ændres for hver af de 53 felter
Avatar billede jensen363 Forsker
26. oktober 2004 - 09:16 #4
Opret den samme kode som et modul startende med :

Public Sub BeregnNoget()
xxxx
xxxx
End Sub

Afkrydsningsfeltet skal så undeholde :

Private Sub uge8_AfterUpdate()
  BeregnNoget
End Sub
26. oktober 2004 - 09:48 #5
ah....jeg misforstod vist det med de 53 uger ;o)

Hvis 'X' skal repræsentere ugenr, skal koden måske se således ud:

Private Sub OpdaterUge(Ugenr as Byte)
  Dim sqlstr As String
  Dim iBladid As Integer
  Dim iAar As Integer
  iBladid = Me!bladid
  If (Me!aar <> "") Then
    iAar = Me!aar
    If (Me("Uge" & ugenr) = -1) Then
        sqlstr = "INSERT INTO omdeling (bladid, uge, aar) VALUES ('" & iBladid & "', '" & Ugenr & "', '" & iAar & "')"
        MsgBox sqlstr
        DoCmd.RunSQL sqlstr
    End If
    If (Me("Uge" & ugenr) = 0) Then
        sqlstr = "DELETE FROM omdeling WHERE bladid = '" & iBladid & "' AND uge='" & ugenr & "' AND Aar='" & iAar & "'"
        MsgBox sqlstr
        DoCmd.RunSQL sqlstr
    End If
  Else
    MsgBox "Husk at vælge år", vbInformation
    Me(Me("Uge" & ugenr) = 0
  End If
End Sub
Avatar billede dsjk Novice
26. oktober 2004 - 10:04 #6
thomasjepsen> jeg har gemt koden på formularen, og sat =OpdaterUge1(Form!uge20) ind under EfterOpdatering men jeg får fejlen: Udtrykket Efteropdatering, du iindtastede som indstilling af hændelsesegenskaben, gav en fejl: Det indtastede udtryk indeholder et funktionsnavn, som Microsoft Access ikke kan finde.

/dsjk
26. oktober 2004 - 10:06 #7
ah, sorry...jeg tror, at du er nødt til at gøre funktionen Public. Så den skal altså starte således:

Public Sub OpdaterUge(Ugenr as Byte)
  Dim sqlstr As String
...
...
Avatar billede dsjk Novice
26. oktober 2004 - 10:11 #8
ok, nu kommer fejlen ikke, men den kører heller ikke koden :(
26. oktober 2004 - 10:17 #9
man kan ikke få det hele ;o)

Hmm, det lyder mærkeligt, at den slet ikke køre koden!!
Prøv at sætte et breakpoint i linien, som starter med If (Me!aar <> "") then
(Du indsætter breakpoint ved at stille markøren et sted på linien og trykke F9)

Herefter kører du formularen og opdaterer et felt og ser om Accss hopper over i VB-editoren på den valgte linie.
Hvis den gør det, kan du singlesteppe med F8 og se hvordan den reagere.

Ved at holde musen over variable m.m., kan du få vist indholdet.



Er Uge egentlig tekst eller tal i tabellen Omdeling?

Jeg kan se, at du havde angivet den som tekst i dine SQL strenge, men burde det ikke være tal?
Avatar billede dsjk Novice
26. oktober 2004 - 10:20 #10
Uge er sat som tekst, men tror jeg ændre den til tal, så jeg kan sortere korrekt efter den.

Prøver lige den med breakpoint.
Avatar billede dsjk Novice
26. oktober 2004 - 10:28 #11
Det er =OpdaterUge(Form!Uge20) den er gal med, her bliver værdien -1 eller 0

Så den skal hedde =OpdaterUge("20")
Eneste problem er så at den ny kører koden 2 gange :)
26. oktober 2004 - 10:32 #12
nå ja, jeg lavede jo parameteren om - beklager, at jeg glemte at nævne det :o(

Men hvorfor kører den koden 2 gange???
26. oktober 2004 - 10:32 #13
Har du kald til funktionen på både før- og efter-opdatering?
Avatar billede dsjk Novice
26. oktober 2004 - 10:35 #14
nej kun i efteropdatering
26. oktober 2004 - 10:44 #15
kommer den til dit breakpoint 2 gange?

Hvis du trykker F5 i stedet for F8 fortsætter koden til den er færdig.
Avatar billede dsjk Novice
26. oktober 2004 - 10:47 #16
ja, det gør den
26. oktober 2004 - 10:53 #17
Så MÅ den kaldes flere steder fra.

Hvad med nogle af de andre ændelser: vedindgang, vedudgang, vedændring. Hvad med på form-niveau: form_afterupdate m.m.?
Avatar billede dsjk Novice
26. oktober 2004 - 11:02 #18
har kigget alle igennem men den bliver ikke kaldt andre steder.
26. oktober 2004 - 11:05 #19
mystisk!!

Prøv at oprette en ny tekstboks og læg sammen egenskab på efteropdater og se om det samme sker.
Avatar billede dsjk Novice
26. oktober 2004 - 11:09 #20
der kommer den også 2 gange :(
26. oktober 2004 - 11:14 #21
hmmm...har du mulighed for at sende db'en til mig?

Du finder min email ved at klikke på mit navn hr til venstre.
Avatar billede dsjk Novice
26. oktober 2004 - 11:19 #22
Den er sendt.
26. oktober 2004 - 11:34 #23
Hmm, det er godt nok lidt mystisk! Men fejlen var, at din "funktion" ikke var en funktion, men i stedet en procedure. Igen min fejl - jeg omtalte den hele tiden som en funktion, men glemte bare at skrive det i koden :o(

Således virker den:

Public Function OpdaterUge(Ugenr As Byte)
  Dim sqlstr As String
  If (Me!aar <> "") Then
    If (Me("Uge" & Ugenr) = -1) Then
        sqlstr = "INSERT INTO omdeling (bladid, uge, aar) VALUES ('" & Me!bladid & "', " & Ugenr & ", '" & Me!aar & "')"
        MsgBox sqlstr
        DoCmd.SetWarnings False
        DoCmd.RunSQL sqlstr
        DoCmd.SetWarnings True
    End If
    If (Me("Uge" & Ugenr) = 0) Then
        sqlstr = "DELETE FROM omdeling WHERE bladid = '" & Me!bladid & "' AND uge=" & Ugenr & " AND Aar='" & Me!aar & "'"
        MsgBox sqlstr
        DoCmd.SetWarnings False
        DoCmd.RunSQL sqlstr
        DoCmd.SetWarnings True
    End If
  Else
    MsgBox "Husk at vælge år", vbInformation

    Me("Uge" & Ugenr) = 0
  End If
End Function


Bemærk jeg har slået advarsler fra inden hver SQL-kørsel. Det kan du selv fjerne hvis du gerne vil have advarslerne.
Avatar billede dsjk Novice
26. oktober 2004 - 11:44 #24
SUPER, skulle alligevel have fjernet warnings.
26. oktober 2004 - 11:47 #25
tak for point :o)
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