Avatar billede ugotabe_kidding Nybegynder
10. januar 2002 - 14:05 Der er 32 kommentarer og
1 løsning

Findes der ikke en smartere måde ?

Jeg sidder og skal registrere ændringer i en tabel (gamle værdier skal gemmes, hvis de overskrives med nogle nye). Jeg har en form med en masse felter med tal, og jeg har lavet en \"append-query\", hvor man, ved tryk på knappen \"gem ændringer\", kører query\'en og derved tilføjer de gamle data til en historisk tabel, når der er tastet noget nyt.. Problemet er, at hvis jeg trykker på \"gem ændringer\" f.eks. 5 gange i træk, oprettes der 5 ens poster i den historiske tabel.. Er det ikke:
1. Muligt kun at gemme, hvis det registreres at der er foretaget ændringer på en af værdierne i formen ?
2. Gemme automatisk, så jeg sparer den dumme knap i formen ?

Hvis det kun kan lade sig gøre med VB, vil jeg gerne have ret specifik hjælp, da jeg ikke er god til at finde ud af, hvor koden skal indsættes i modulet.
pft.
Avatar billede mugs Novice
10. januar 2002 - 14:17 #1
Ved at indsætte flg. VBA-kode kan du opdatere en tavel. I dette tilfælde hedder tabelen \"Tilbud\".

Linien:
.Fields![Kundenr] = Kundenr
Opdaterer feltet [Kundenr] i tabellen \"Tilbud\", og sætter den = feltet \"Kundenr\" i den åbne formular. Det samme med [CPU] = CPU   
Så¨er der spørgsmålet, hvor koden skal indsættes. Det må jeg lige arbejde lidt på.
Dim Rst As Recordset, Db As Database
Set Rst = DBEngine.Workspaces(0).Databases(0).OpenRecordset(\"Tilbud\")
    With Rst
    .AddNew
    .Fields![Kundenr] = Kundenr
    .Fields![CPU] = CPU
    End With
Avatar billede mugs Novice
10. januar 2002 - 14:18 #2
Prøv at indsætte i formularens EfterOpdatering.
Avatar billede terry Ekspert
10. januar 2002 - 14:37 #3
Well an idea was to de-activate (disable) the button UNTIL you got an after update event an dthen enablel it. then once saved disable again
Avatar billede terry Ekspert
10. januar 2002 - 14:47 #4
yu can also look at me.dirty which tells you if the current record has been modified since last changed.
If Me.Dirty Then
        Me!btnUndo.Enabled = True    \' Enable button.
    Else
        Me!btnUndo.Enabled = False    \' Disable button.
    End If
Avatar billede ugotabe_kidding Nybegynder
10. januar 2002 - 14:57 #5
>>mugs
Jeg har allerede følgende:
Private Sub Combo68_AfterUpdate()
    \' Find the record that matches the control.
    Dim rs As Object

    Set rs = Me.Recordset.Clone
    rs.FindFirst \"[CorpNo] = \" & Str(Me![Combo68])
    Me.Bookmark = rs.Bookmark
End Sub
--
Skal jeg indsætte din kode heri ? Hvor ?
Eller skal jeg lave en ny AfterUpdate() lige efter ?

Avatar billede terry Ekspert
10. januar 2002 - 15:04 #6
You need to place your code on the forms after update event NOT a controls, otherwise you will need it on all controls, or am I missing something here?
Avatar billede mugs Novice
10. januar 2002 - 15:07 #7
Både ja og nej. Hvis du indsætter koden her, vil den historiske tabel blive opdateret når Combo68 ændres. Hvis du ændrer andre felter bliver der ikke opdateret, med mindre du også indsætter koden i disse felter. På den måde opdateres tabellen hver gang et af formularens felter ændres. Hvis du således ændrer 5 felter i formularen, bliver der opdateret 5 gange - og det var vel ikke meningen.

Som jeg skrev kl a4:18: Indsæt koden i formularens EfterOpdatering. Klik på en område udenfor din formular og derefter på egenskabsarket. Så har du formularens egenskabsvindue.
Avatar billede ugotabe_kidding Nybegynder
10. januar 2002 - 15:07 #8
>>terry
Jeg forsøgte mig også med at hhv. vise/skjule min \"gemme\"-knap, men igen er jeg usikker på præcis hvor jeg skal sætte koden ind og desuden ved jeg ikke om \"Me!btnUndo.Enabled \" er det rigtige knap-navn ?
Jeg har følgende kode til knappen der kører min dårlige AppendQuery:
Private Sub Save_values_Click()
On Error GoTo Err_Save_values_Click

    Dim stDocName As String

    stDocName = \"Corp Query\"
    DoCmd.OpenQuery stDocName, acNormal, acEdit

Exit_Save_values_Click:
    Exit Sub

Err_Save_values_Click:
    MsgBox Err.Description
    Resume Exit_Save_values_Click
   
End Sub
Skal jeg indsætte vis/skjul funktionen heri ?

Jeg er totalt blank.. Håber at I kan hjælpe!
Avatar billede terry Ekspert
10. januar 2002 - 15:11 #9
You can set it in the FORMS after update event.

Me!btnUndo.Enabled

btnUndo is just an expample change this to the name of th ebutton on your form.
Avatar billede ugotabe_kidding Nybegynder
10. januar 2002 - 15:20 #10
>>mugs
Jeg forsøger at sætte din kode ind.. Er det korrekt at jeg skal ind i Expression Builder\"\'en og skrive det ? For jeg har tidligere åbnet Visual Basic Editoren og det er måske det der har forvirret mig ? I hvert fald får jeg da en slags svar fra DB\'en når jeg aktiverer knappen nu.. Det er godt nok en fejl, men den siger at
Access ikke kan finde makroen :\'Dim Rst As Recordset, DB As Database Set Rst = DBEngine\'
Hvad betyder det ?
Er det en fejl i koden eller er det igen mig der klokker i det ?
Avatar billede terry Ekspert
10. januar 2002 - 15:23 #11
I am VERY puzzled here! Your question was

Problemet er, at hvis jeg trykker på \"gem ændringer\" f.eks. 5 gange i træk, oprettes der 5 ens poster i den historiske tabel.. Er det ikke:

So the solution is to disable the posibility of pressing th ebutton 5 time, or again I ask, am I missing something?
Avatar billede ugotabe_kidding Nybegynder
10. januar 2002 - 15:32 #12
>>terry
Du har delvist ret.
Det vil være smart at skjule knappen, når der ikke er foretaget nogle ændringer, men nr. 1 vil være hvis systemet SELV gemmer ændringer, så brugeren ikke skal huske på at trykke på \"Gem ændringer\".

Min kommentar 15:07:19 indeholder min knap, der kører appendqueryen, altså den knap der skal skiftevis vises og skjules.. Men det er ikke DER din kode skal ind, vel ?
Avatar billede terry Ekspert
10. januar 2002 - 15:38 #13
OK Then You need to place thsi code in the on click event for the BUTTON

If Me.Dirty Then
... make your update
end if
       
Avatar billede ugotabe_kidding Nybegynder
10. januar 2002 - 15:44 #14
Og er \"...make your update\" så det som mugs skrev?
Fremgangsmåde:
Højreklik udenfor formen, vælg egenskaber/properties, vælg OnClickEvent(), vælg ExpressionBuilder? Macro Builder? Code Builder? Indsæt:
If Me.Dirty Then
Dim Rst As Recordset, Db As Database
Set Rst = DBEngine.Workspaces(0).Databases(0).OpenRecordset(\"Tilbud\")
    With Rst
    .AddNew
    .Fields![Kundenr] = Kundenr
    .Fields![CPU] = CPU
    End With
end if

Er DET korrekt????
Skal bare vide hvilken builder jeg skal bruge, samt om den indsatte kode er korrekt fra \"Dim Rst... til End With\"
Håber ikke at jeg er til alt for meget besvær...
Avatar billede terry Ekspert
10. januar 2002 - 16:00 #15
well this is where I am maybe getting puzzled but I thought that you already had a routine to make the update and wanted to make sure that a history record got made only once.
What you have to remember is that when you start editing a record the data in the field is the NEW data but you need to write OLD data to the history record or what?

In each field there is a property (OldValue) which contains the original value before changes were made, it i sTHIS value you should writ eto the history record.

Me.SomeField.OldValue

So in the BEFORE UPDATE for the form you would need to check If Me.Dirty then

(
Fields![Kundenr] = Me.Kunder.OldValue
   


Avatar billede mugs Novice
10. januar 2002 - 17:04 #16
For at være helt sikker på at min kode fungerer, har jeg lavet en lille testdatabase. Den fungerer perfekt på den måde, at når 1 eller flere af en formulars felter ændrer indhold, bliver posten automatisk smidt over i en anden tabel (historik), når den aktuelle post forlades enten ved at lukke formularen, eller ved at skifte til en anden post.

Hvis felterne ikke ændrer indhold sker der ikke noget.
Db er i Access97, hvis du lægger din email, kan jeg sende den til dig.
Avatar billede ugotabe_kidding Nybegynder
10. januar 2002 - 17:20 #17
>>mugs
Det ville være helt vildt hvis det fixer mit problem

ku@cool.dk - må du meget gerne sende den til.
(Kan du forresten svare på om man i Access kan slå den funktion fra, der gør at når man scroller med musens søgehjul, skifter man også record ??? Det har irriteret mig lidt, da nogle af mine forms er ret lange..
På forhånd tak
Avatar billede mugs Novice
10. januar 2002 - 17:44 #18
Ang. scrolling så aner jeg det simpelt hen ikke - men det kan vi da prøve at søge efter.
Testdb er sendt.
Avatar billede ugotabe_kidding Nybegynder
10. januar 2002 - 18:03 #19
Tusind tak for hjælpen...
Det er lige ved at virke... Skal man skrive \"Cancel as Integer\" ?
Den laver i hvert fald fejl når jeg eksekverer den, men jeg har altså også en række integerværdier jeg gerne vil opdatere...
Det her var helt sikkert pointene værd.. Tak for hjælpen..
Avatar billede mugs Novice
10. januar 2002 - 18:15 #20
Tak for point - rart du kunne bruge det.
Ja du er nødt til at benytte Cancel As Integer som en variabelerklæring.
Hvilken fejlmelding får du?
Avatar billede ugotabe_kidding Nybegynder
10. januar 2002 - 18:18 #21
\"Compile error:
User-defined type not defined.\"
Og så markerer den \", Db As Database\" i VB.
Jeg har nu lavet mine Long Integers om til byte, som du havde gjort, dog stadig uden held..
Men jeg kan mærke at jeg er tæt på nu ;o)
Skal det være \"byte\" ? Nogle af mine talværdier er ret store, så jeg ville gerne undgå det!
Avatar billede mugs Novice
10. januar 2002 - 18:22 #22
Det behøver ikke at være Byte - vælg den felttype der passer til dine data.

User-defined type not defined:
Det kan skyldes, at du mangler at markere en reference. Sørg for at du ikke har nogle fejlmeldinger. Derefter åbner du VBA-kodemodulet. Tryk på Funktioner > Referencer (Tools > References) og browser ned igennem vinduet og check om der står MANGLER ud for en reference. Hvis der gør det, skal den afkrydses.
Avatar billede mugs Novice
10. januar 2002 - 18:26 #23
Hjælper det ikke, så prøv helt at slette Db As Database.
Avatar billede ugotabe_kidding Nybegynder
10. januar 2002 - 18:39 #24
Så vidt jeg kan se, mangler der ingen referencer (der er en masse, der ikke er markerede, men der skal vel stå \"Missing\" eller noget i den stil ?)
Jeg har forsøgt at slette Db As Database \'Variabelerklæringer\' - men uden held..
Andre forslag ?
Avatar billede mugs Novice
10. januar 2002 - 18:56 #25
Der skal stå \"Missing\" eller \"Mangler\"
Umiddelbart har jeg ingen gode ideer.Du er velkommen til at sende db til:

mugs@get2net.dk

så vil jeg se på den, evt. kan du slette nogle poster.
Avatar billede ugotabe_kidding Nybegynder
10. januar 2002 - 18:56 #26
Jeg bliver desværre ved med at støde på den samme fejl, både med og uden Db As Database..
Har snart forsøgt en hel del ting..
Den ser sådan ud, ved ikke om du kan debugge den bedre end jeg kan:

Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim Rst As Recordset, Db As Database \'Variabelerklæringer\'
Set Rst = DBEngine.Workspaces(0).Databases(0).OpenRecordset(\"ShareHistoryTest\")
    With Rst
    .AddNew
    .Fields![Dato] = Now()
    .Fields![Currency] = CorpCurrency
    .Fields![CorpShareCapital] = CorpShareCapital
    .Fields![CorpShareSize] = CorpShareSize
    .Fields![CorpShareCapitalPaidUp] = CorpShareCapitalPaidUp
    .Fields![CorpShareAuthorizedCapital] = CorpShareAuthorizedCapital
    .Fields![CorpIssuedShares] = CorpIssuedShares
    .Update
End With
MsgBox \"Old values are stored under historical values\"


End Sub
Avatar billede ugotabe_kidding Nybegynder
10. januar 2002 - 19:10 #27
Jeg sender den lige til dig, og håber at du kan opklare det....
Avatar billede mugs Novice
10. januar 2002 - 19:26 #28
Når jeg indsætter din procedüre i min db, får jeg fejlen.

Egenskaben er brugt ugyldig.

Prøv at slette linien, hvor du opdaterer feltet Dato. Så fungerer det her.

Hvis det fungerer, så sæt standardværdien i Tabellen \"ShareHistoryTest\" til Now(). Det vil i den sidste ende give det samme resultat.
Avatar billede ugotabe_kidding Nybegynder
10. januar 2002 - 19:33 #29
Jeg får desværre stadig samme fejl.
Så stor forskel er da ikke på Access 97 og 2000, vel ?
Hvis jeg sletter
, Db As Database \'Variabelerklæringer\'
Så får jeg fejl nede i CorpShareAuthorizedCapital.
Min første indskydelse var at jeg havde stavet det forkert, men det ser da rigtigt nok ud. Jeg er ret blank nu! Især hvis det fungerer hos dig!?!
Avatar billede mugs Novice
10. januar 2002 - 19:50 #30
Jeg kender intet til 2000, men fra tidligere spørgsmål her på Eksperten, ved jeg at der kan være problemer med visse VBA-procedürer. Jeg vil prøve at søge efter et. 
Avatar billede ugotabe_kidding Nybegynder
10. januar 2002 - 22:21 #31
Hvis det er okay med dig, vil jeg gerne prøve at konvertere DBen til 97format og sende den til dig igen (i morgen, når jeg kommer på arbejde).
For jeg synes at det er ret mærkeligt at det driller sådan.
Avatar billede mugs Novice
10. januar 2002 - 23:15 #32
Send den bare. Alt har en naturlig forklaring, havde jeg fra startren vidst du arbejdede i 2000, havde jeg ikke involveret mig. Fejlen ligger ganske givet i forskelligheder fra 97 til 2000, og jeg er næsten sikker på, det er referencerne det er galt med. 
Avatar billede mugs Novice
10. januar 2002 - 23:34 #33
Se lige dette spørgsmål, især thomasjepsens sidste kommentar.

http://www.eksperten.dk/spm/153101
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