Avatar billede erlandsen Seniormester
16. maj 2009 - 11:59 Der er 20 kommentarer og
1 løsning

Identificere hvem der har opdateret record samt hvornår

Jeg har en sagsstyrings database som betjenes af seks medarbejdere.

Jeg vil gerne kunne se, hvem der har lavet seneste opdatering i en record samt ikke mindst hvornår dette er gjort.

For at opdatere databasen har jeg lavet en formular. Formularens felter hentes fra en forespørgsel, hvor jeg har linket seks tabeller sammen.

Formularens hovedtabel er "Sager" og det er i denne tabel jeg gerne vil have, at der er et felt hvor der automatisk sættes et "dato/tidsstempel" når en eller flere af de seks formularers felter opdateres (kan dette lade sig gøre eller skal der være et felt i hver formular?)

Samtidig vil jeg gerne have at man kan se hvilken bruger der har lavet seneste ændring.

Jeg har endnu ikke oprettet brugertilladelser - da jeg ikke heller ikke har styr på dette...
Avatar billede mugs Novice
16. maj 2009 - 12:09 #1
Du har da travlt idag .o)

Du kan lave 2 felter i din tabel og træk dem ind i formularen:

Me!opdateret = Now 'datotid
Me!Opdateretaf = Environ("Username")'tekstfelt

Du skal nødvendigvis trække felterne ind i alle forespørgsler og formularen
Avatar billede mugs Novice
16. maj 2009 - 12:10 #2
Du kna forøvrigt se på makeiteasy.dk hvor der under downloads ligger et eksempel på "Gem historik på dine tabeller"
Avatar billede erlandsen Seniormester
16. maj 2009 - 13:51 #3
Tak for info om makeiteasy.dk og gem historik!

Der nævnes bl.a. at formularen skal være baseret på en tabel hvilket ikke er tilfældet hos os - da vi ønsker at det både er muligt at kalde en sagsrecord frem og samtidig se nogle af informationerne i de andre tabeller.

1) Hvis jeg laver de to felter Me!opdateret og Me!Opdateretaf - så går jeg ud fra at felterne kun opdateres når der opdateres i den tabel jeg laver dem i og ikke når der opdateres i et felt i en af de andre tabeller man også kan se i formularen?

2) Mht. Username - hvordan fungerer det? Skal man lave et eller andet så man logger sig på databasen med brugernavn - og hvordan gør man det? (hæves til 200 points)
Avatar billede Slettet bruger
17. maj 2009 - 23:50 #4
ang. dit sidste spm. så bruger man mugs' forslag med environ til at fange windows brugeren og det vil i de fleste tilfælde være fint. Det vil selvfølgelig ikke give nogen mening, hvis der er tale om en fællesbruger, men ellers...

ang. historikken, så vil ekstra felter i tabellen give den seneste ændring eller den første, alt efter hvordan man havde tænkt sig at bruge disse. Skal du bruge historik, så er du nød til at have en separat tabel. Det kan dog laves meget simpelt og så nemt udvides med alverdens oplysninger. Man kunne forestille sig, at man havde en historik tabel, som faktisk også kunne indeholde alle ændringer, som er gjort....

...jeg har lavet et simpelt eksempel, som lige så hurtigt begyndte at udvide sig til, at jeg kunne se historikken og så til at jeg skulle vide hvilke felter... og så stoppede jeg heldigvis!~)

Så her er den inden jeg går helt over gevind:

www.spgprogramming.com/access/historik.mdb

ps. husk at lave en løsning til hvis en post bliver slettet. I eksemplet skriver db'en at posten bliver slettet, men man er nød til at gå ned i tabellen for at finde posten.

God fornøjelse!~)
Avatar billede erlandsen Seniormester
19. maj 2009 - 23:46 #5
Me!opdateret og Me!Opdateretaf er det de feltnavne jeg skal bruge? Jeg får besked om at jeg ikke kan bruge ! i feltnavnet?
Avatar billede mugs Novice
20. maj 2009 - 09:00 #6
opdateret og opdateret er feltnavnene.

Ordet Me er reserveret og refererer til den altid aktive formular, d.v.s. at Me kun kan bruges i selve formularen.

Groft sagt: Når du bruger et feltnavn, kan du bruge det i formularen direkte, men du kan også understreger, at det drejer sig om denne formulars felt og benytte det "organisatoriske" hieraki:

[Forms]![Formularnavn]![Feltnavn]

Hvor du først definerer objektsamlingen [Forms], derefter objektet i samlingen [Formularnavn] og til sidst objektet i objektet [Feltnavn].
Så er det unæglelig lettere at skrive Me.

En anden forfel du opnår er, at når du efter ordet Me saætter en punktumnotation, vil du få en liste over alle Feltnavne i formularen, så du vælger på listen og ikke skriver. Det sikrer mod stavefejl. Hvis du samtidig har en navnekonvention, hvor alle feltnavne starter med FLDxxx, kan du altid indtaste FLD og få listen over alle objekter, der starter med FLD.
Avatar billede erlandsen Seniormester
20. maj 2009 - 19:51 #7
Jeg skal desværre have den skåret lidt mere ud i pap...

Jeg har oprettet de to felter i tabellen "Sager"
"Opdateret"
"OpdateretAf"

Nu skal jeg så automatisk have et tidsstempel og brugernavn når der er nogen der opdaterer formularen "sagsoprettelse"...

Er det i formularen "sagsoprettelse" jeg skal anføre:

Me!opdateret = Now 'datotid
Me!Opdateretaf = Environ("Username")'tekstfelt

-og hvor gør jeg dette?

Felterne i formularen "sagsoprettelse" hentes fra forespørgslen "sagsoprettelse" - så det skal måske stå i forespørgslen også?
Avatar billede erlandsen Seniormester
25. maj 2009 - 20:40 #8
håber at kunne få hjælp til at lave et felt der laver et tidsstempel og brugernavn når man opdaterer min formular...
Avatar billede mugs Novice
26. maj 2009 - 17:48 #9
Jamen du har jo selv askrevet løsningen:

Me!opdateret = Now 'datotid
Me!Opdateretaf = Environ("Username")'tekstfelt

Det er vel indlysende, at hvis disse felter (værdier) skal gemmes i tabellen, skal de oprettes her. Derefter ind i forespørgslen og formularen.

Hvornår felterne skal modtage værdierne bestemmer du jo selv. Hvis du nvil opdatere dem ved opdatering af en eksisterende post, skal koden lægges ind der.

Vedr. brugernavn er der vel altid et brugernavn på en maskine, og den person der er logget ind, vil blive afspejlet i username.
Avatar billede erlandsen Seniormester
26. maj 2009 - 22:30 #10
Du skriver at Me kun kan bruges i selve formularen - så hvad er det præcist der skal stå i feltet i tabellen?

Er det "Now()", "Now 'datotid" eller?
-og hvor skal det stå i feltegenskaberne i tabellen - er det i standardværdi?

Hvis Me skal bruges i formularen, er det som en hændelse, eller?

Samme sp. gælder for Me!Opdateretaf = Environ("Username")'tekstfelt
Avatar billede mugs Novice
26. maj 2009 - 22:50 #11
Du opretter et felt i tabellen der hedder opdateret. Felttypen skal være Dato / klokkeslet. Nu trækker de feltet ind i forespørgslen og derefter formularen.

Nu koder vi i formularen. Tag en kommandoknap fra værktøjslinien og sæt den i formularen. I formularens designvisning højreklikker du på knappen > Fanen Hændelser > Sæt markøren på linien Vedklik > Tryk på de 3 små ... i højre side og du kommer ind i VBA-editoren og markøren blinker mellem 2 linier. Øverst Private Sub... og nederst End Sub. Disse 2 linier kaldes procedurekroppen og AL kode skal skrives mellem disse 2 linier.

Du skriver nu:

Me!opdateret = Now

Skift til formularvisning og tryk på knappen. Hvad sker der så? Feltet opdateret viser den aktuelle tid hvor du trykkede på knappen. Luk nu formularen og gem ændringerne. Åbn din tabel og kontroller, at værdien er gemt der.

Samme procedure ved det andet felt opdateret af. Kopntroller igen, at den aktuelles brugers brugernavn er gemt i tabellen.
Avatar billede erlandsen Seniormester
27. maj 2009 - 00:21 #12
ok - tak for tålmodigheden...

Jeg havde dog håbet på at felterne "Opdateret" og "OpdateretAf" kunne opdateres automatisk når brugeren skrev i et af felterne - så brugeren ikke selv skal huske at trykke på en knap...
Avatar billede mugs Novice
27. maj 2009 - 08:44 #13
Tak for point.

Du bestemmer selv hvornår felternes skal opdateres. Eksemplet med knappen er kun ment som et eksempel.

Prøv at indsætte koden i et felts BeforeUpdate. Så vil de opdateres inden de nue værdier sendes til tabellen.

Prøv også at indsætte den i selve formularens OnClose. Der er så mange muligheder, at kun fantasien sætter grænser.
Avatar billede erlandsen Seniormester
27. maj 2009 - 23:10 #14
genialt!
umiddelbart tænker jeg at jeg vil indsætte de to koder

Me!opdateret = Now
Me!Opdateretaf = Environ("Username")

som hændelsen Efteropdatering på alle felterne i formularen og da du siger at jeg ikke kan indsætte koderne i tabellen - må jeg indsætte dem i forespørgslen - og så huske at anvende forespørgslen til at lægge data ind i stedet for tabellen.

To tillægsspørgsmål:
1) Hvad sker der hvis jeg i stedet sætter dem ind i formularens onclose - vil den så opdatere hver gang man lukker formularen - eller kun hvis man har opdateret noget?

2) Vi har defineret at brugernavn automatisk indsættes i feltet Opdateretaf. Vi har syv brugernavne som f.eks. kan være 124857.005. Hvad nu hvis jeg i stedet vil have det rigtige navn - kan jeg da lave en lille tabel hvor jeg oversætter 124857.005 til f.eks. "Johnny" - og/eller hvordan gøres dette?
Avatar billede mugs Novice
28. maj 2009 - 08:45 #15
"som hændelsen Efteropdatering på alle felterne i formularen og da du siger at jeg ikke kan indsætte koderne i tabellen - må jeg indsætte dem i forespørgslen - og så huske at anvende forespørgslen til at lægge data ind i stedet for tabellen."

Du kna ikke indsætte koderne i tabellen al den stund, at det ikke er muligt at programmere her. Du skal tænke lidt på, hvordan den enkelte objekters rolle er i en db. Tabellernes opgave er jo kun at gemme data, og du har kun meget begrænsede muligheder for at manipulere data.

Hvis du lægger koderne ind i en forespørgsel, skal du huske på, at syntaksen i en forespørgsel er forskellig fra VBA. En query programeres i SQL og en formular i VBA. Og mine eksempler i VBA, altså beregnet for en formular.

Ad 1.: Hvis du benytter formularens OnClose event, vil koden jo gennemløbes hver gang formularen lukkes og dermed opdatere felterne.

Ad 2.: Du kna godt lave en tabel, uden jeg har noget forslag til hvordan, men du kan også måle på Username med en Select Case struktur:


Select Case Environ("Username")
Case Is = "124857.005"
Me!Opdateretaf = "Johnny"
Case is = "124857.006"
Me!Opdasteretaf = "mugs"
Case is = "noget helt tredje"
Me!Opdateretaf = "en tredje bruger"
'o.s.v. - husk at slutte med end select.
end select
Avatar billede erlandsen Seniormester
28. maj 2009 - 10:29 #16
takker igen!

Efter at have lagt

Me!opdateret = Now
Me!Opdateretaf = Environ("Username")

som hændelsen "Efteropdatering" på alle felterne i formularen "sagsstyring" - får vi flg. fejlmeddelse:

"Der kan ikke gemmes designændringer eller til et nyt databaseobjekt i "sagsstyring", da en anden bruger har åbnet filen. Hvis du vil gemme dine designændringer eller gemme til et nyt object, skal du have udelt adgang til filen."

Kan det have noget med hinanden at gøre - altså, kan jeg nu kun have en bruger på ad gangen?
Avatar billede mugs Novice
28. maj 2009 - 11:02 #17
"Der kan ikke gemmes designændringer"

Hvis du prøver at gemme ændringer i designet / programmeringen SKAL db være åben kun for denne ene bruger.

Du åbner Access og i menuen Filer > Åbn vælger du hvilken fil. Når du har gjort det, så nede til høje i dialogboksen vælger du at åbne med udelt adgang.
Avatar billede mugs Novice
28. maj 2009 - 11:04 #18
Tak for point.
Avatar billede erlandsen Seniormester
28. maj 2009 - 12:14 #19
ok, tak!
Avatar billede erlandsen Seniormester
28. maj 2009 - 23:50 #20
Er det korrekt at skrive således - altså skal end su med til sidst eller skal det afsluttes med end select:

Private Sub Adresse_1_AfterUpdate()
Me!Opdateret = Now
Me!OpdateretAf = Environ("Username")
Select Case Environ("Username")
Case Is = "124857.001"
Me!OpdateretAf = "Bruger 1"
Case Is = "124857.002"
Me!Opdasteretaf = "Bruger 2"
Case Is = "124857.003"
Me!Opdasteretaf = "Bruger 3"
Case Is = "124857.004"
Me!Opdasteretaf = "Bruger 4"
Case Is = "124857.005"
Me!Opdasteretaf = "Johnny Erlandsen"
Case Is = "124857.006"
Me!Opdasteretaf = "Bruger 6"
End Select
End Sub
Avatar billede mugs Novice
29. maj 2009 - 08:41 #21
Det er korrekt som du skriver.

Når du skriver en programkode SKAL alle funktioner / kodelinier være mellem disse 2 linier. Det kaldes procedurekroppen:

Private Sub Adresse_1_AfterUpdate()
Her skrives alle kodelinier / funktioner
End sub
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