Avatar billede puppetmaster Nybegynder
26. april 2004 - 15:09 Der er 13 kommentarer og
1 løsning

Problem med "Metoden Update eller CancelUpdate"

Jeg får denne fejl i min kode:
"Metoden Update eller CancelUpdate er brugt uden AddNew eller Edit"
Når jeg kigger på koden, it kinda makes sense......men hvor skal jeg ændre?

Public Function OpretPalleNr(PalleTalPartiX As Long) As String
Dim PalleNrX As Variant
Dim PS As New ADODB.Recordset
Dim PalleTalTaellerX As Long
  PS.Open "PalleTal", CurrentProject.Connection, adOpenKeyset, adLockPessimistic, adCmdTable
  PS.Find ("palletalparti =" & PalleTalPartiX)
  If PS.EOF = True Then
    PS.AddNew
    PalleTalTaellerX = 1
    PS("PalleTalParti").Value = PalleTalPartiX
    PS("PalleTalParti").Value = PalleTalPartiX
    PS("PalleTalTaeller").Value = "000"
  End If
  PalleTalTaellerX = Val(PS("PalleTalTaeller"))
  PalleTalTaellerX = PalleTalTaellerX + 1
  PalleNrX = LTrim$(Str(PalleTalTaellerX))
  Select Case Len(PalleNrX)
    Case Is = 1
      PalleNrX = PalleTalPartiX & "00" & PalleNrX
    Case Is = 2
      PalleNrX = "0" & PalleNrX
  End Select
  PS("PalleTalTaeller").Value = PalleNrX
  PS.Update
  PS.Close
  Set PS = Nothing
  OpretPalleNr = PalleNrX
End Function

Hvis PS.EOF = False er det fordi partiet eksisterer og så skal der ikke oprettes et nyt parti, men så kommer jeg jo aldrig ind i If-løkken, hvilket vil sige, at PS.AddNew aldrig afvikles. Så står PS.Update jo alene, hvilket den ikke kan og derfor får jeg fejlen.
What to do?
26. april 2004 - 15:15 #1
Forstår jeg det rigtigt: Skal den sidste PS("PalleTalTæller").Value = PalleNrX skal angives uanset hvad?
26. april 2004 - 15:17 #2
Det giver i hvert fald ingen mening, at den angives 2 gange, hvis PS.EOF = True? Eller hvad?
Avatar billede puppetmaster Nybegynder
26. april 2004 - 15:49 #3
Nu er det jo godt nok ikke mig der har skrevet koden, men som jeg læser den, så søges der først efter om der eksisterer et parti (palletalparti), som har værdien PalleTalPartiX
Hvis det ikke eksisterer (If PS.EOF = True), skal der oprettes et nyt parti.
Et parti kan f.eks. være 4001 (første parti i år 2004) og pallerne som hører til partiet begynder fra 001 til 999.
Tilbage til koden:
Hvis vi kører videre med et partinummer på 4001, vil If-løkken resulterer i at PS("PalleTalParti") = 4001
og PS("PalleTalTaeller") = 000
Herefter lægger koden 1 til PalleTalTaellerX, som jo er værdien af PS("PalleTalTaeller").
Så checkes om størrelsen af palletallet er på 1 eller 2 karakterer (alt andet får bare lov til at "fortsætte")
Der bliver så smidt et 0 eller 2 0'er foran palletallet.
Tilsidst sætter vi værdien af palletallet til 1 (hvis vi fortsætter med tallene fra længere oppe)
PS("PalleTalTaeller").value = PalleNrX
Så opdateres PS til allersidst.
Tager jeg fejl i dette eller....?
Avatar billede puppetmaster Nybegynder
26. april 2004 - 15:50 #4
Der ER jo også en PS("PalleTalParti").Value = PalleTalPartiX for meget i If-løkken. Sorry.
26. april 2004 - 16:39 #5
Din forstelse af koden er vist god nok. Men det, som jeg ikke helt forstår, det er at uanet om PS.EOF=True eller ej, så vil posten bliv ændret, hvorved en PS.Update ikke burde fejle.

Har du prøvet at single-steppe dig gennem koden? Sæt et breakpoint i linien PS.Open "PalleTal... og tryk F8 for at hoppe én linie ad gangen.

Du kan evt prøve denne variation af koden:

Public Function OpretPalleNr(PalleTalPartiX As Long) As String
Dim PalleNrX As Variant
Dim PS As New ADODB.Recordset
Dim PalleTalTaellerX As Long
  PS.Open "Select * From PalleTal Where palletalparti =" & PalleTalPartiX, CurrentProject.Connection, adOpenKeyset, adLockPessimistic, adCmdtext
  If PS.EOF = True Then
    PS.AddNew
    PalleTalTaellerX = 1
    PS!PalleTalParti= PalleTalPartiX
    PS!PalleTalParti= PalleTalPartiX
    PS!PalleTalTaeller= "000"
    PS.Update
  else
    PalleTalTaellerX = Val(PS!PalleTalTaeller)
    PalleTalTaellerX = PalleTalTaellerX + 1
    PalleNrX = LTrim$(Str(PalleTalTaellerX))
    Select Case Len(PalleNrX)
      Case Is = 1
        PalleNrX = PalleTalPartiX & "00" & PalleNrX
      Case Is = 2
        PalleNrX = "0" & PalleNrX
    End Select
    PS!PalleTalTaeller= PalleNrX

  endif
  PS.Close
  Set PS = Nothing
  OpretPalleNr = PalleNrX
End Function
Avatar billede puppetmaster Nybegynder
27. april 2004 - 08:22 #6
Det prøver jeg da asap.
Avatar billede puppetmaster Nybegynder
27. april 2004 - 08:27 #7
Jeg har selvfølgelig sat kode ind i den funktion der kalder OpretPalleNr() og det giver følgende:
fejl i procedure 'opretpalle': Denne handling er ikke tilladt i denne sammenhæng.
(fra efter : og frem er der err-objektet)
Avatar billede puppetmaster Nybegynder
27. april 2004 - 08:29 #8
OpretPalle() kalder OpretPalleNr() for at få næste pallenummer i rækken...
Avatar billede puppetmaster Nybegynder
27. april 2004 - 08:34 #9
Hmmm....jeg har sat et breakpoint (ved End Function, just for kicks), og sat markøren i funktionskoden og trykket F8, men intet sker. Normalt bliver den første linie da highlightet i gul, ikke også?
Avatar billede puppetmaster Nybegynder
27. april 2004 - 08:46 #10
debuggeren virker fint i Word og Excel, men den kører sgu IKKE i Access! :(
27. april 2004 - 08:47 #11
jeg er ikke helt med på dine 4 sidste indlæg ;o)
Hvis du sætter breakpoint på End Function, så vil koden først stoppe når alt er overstået (hvorfor du ikke ser noget). Du skal istedet sætte breakpointet i starten (f.eks. første linie efter Dim'erne).

Når du singlestepper med F8 kan du holde musen over diverse udtryk og få værdien vist med gult. Komplicerede udtryk kan ikke vises, så da er du nødt til at markere hele udtrykket med musen og trykke Shift+F9
Avatar billede puppetmaster Nybegynder
27. april 2004 - 08:51 #12
Det er det jeg mener.
Jeg kan ikke steppe igennem! Det virker fint i Word og Excel, men ikke i Access.
Må vel forsøge at installere Access igen.
Avatar billede puppetmaster Nybegynder
27. april 2004 - 09:36 #13
Nå, nu virker det som det skal.
Klikkede lidt rundt i koden og blankede alle linier i underformularens Open hændelse og slog dem til 1 efter 1 og fandt synderen.
Takker for hjælpen alligevel, thomas.
27. april 2004 - 09:49 #14
Ja, debug'eren er ikke sådan at kimse af :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