26. oktober 2004 - 09:09Der 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?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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:
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
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.
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?
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.
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.