16. maj 2009 - 11:59Der 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...
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)
Synes godt om
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!~)
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.
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.
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.
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.
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...
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?
"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
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?
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.
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
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
Synes godt om
Ny brugerNybegynder
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.