Avatar billede jmarques Nybegynder
16. marts 2011 - 01:15 Der er 23 kommentarer og
1 løsning

Automatisk genereret rapport nr.

Hej,

Jeg forsøger at lave et rapport nummer til min Access 2007 database. Der er en række krav som jeg ikke kan få til at virke.

Formatet skal se således ud:

GS000000-00

De 6 første ciffre skal være datoen.

Efter bindestregen skal de 2 sidste ciffre være et to ciffret fortløbene løbenummer.

Giver det mening??

Dvs.: det er kun løbenummeret der skal skifte (01, 02, 03 osv.) hver gang jeg starter på en ny rapport, sålænge vi har den samme dato. Skifter datoen starter løbenummeret forfra på nr. 01.

Dette har givet mig grå hår LÆNGE. Håber meget at nogen kan hjælpe.

Jeg er ikke så rutineret Access bruger endnu.

Mvh
Joachim
Avatar billede Slettet bruger
18. marts 2011 - 12:11 #1
Nummerering af poster sker som funktion af en sorteringorden - det kan ses ved at bladre gennem poster med navigationsknappen i en formular under forskellige sortering ordener.
Hvis, på nogen måde, de numre der ønskes vist i raporten, skal identificere den enkelte post - så skal nummeret komme fra datakildens tabelgrundlag. Med identificere, mener jeg, hvis nummeret skal anvendes til andet end kosmetik i den enkeltstående åbning/udskrift af raporten.
Hvis det bare er kosmetik, kan man anvende det samme nummer, som access forsyner os med i formulares navigationsknapper.

Givet:
    datakilde tabel:  CaseAbsPos
    tabelens nøgle: id

Function recAbsPos()
    With CurrentDb.OpenRecordset("select id from CaseAbsPos")
        .FindFirst "id=" & id
        recAbsPos = .AbsolutePosition: End With
End Function

(funktionen anbringes i raportens class modul - tryk, havende raporten åbnet i design visning , på den værktøjslinieknap hvis tiptekst er 'programkode') 

I en ubundet tekstboks i raporten skrives: =recAbsPos()
Avatar billede Slettet bruger
18. marts 2011 - 12:30 #2
Tilføjelse til #1 - følgende undgår åbning af recordset for hver post:

Public rs As DAO.Recordset

Function recAbsPos()
    If rs Is Nothing Then Set rs = CurrentDb.OpenRecordset("select id from Unit")
    With rs
        .FindFirst "id=" & id
        recAbsPos = .AbsolutePosition: End With
End Function
Avatar billede Slettet bruger
18. marts 2011 - 12:34 #3
rettelse til #2: Tabel hedder stadig 'CaseAbsPos' og ikke 'Unit' - sådan går det når man tester med andre navne!
Avatar billede jmarques Nybegynder
18. marts 2011 - 19:53 #4
Hej brugerekspert,

Tak for svaret. Det er ikke kun til kosmetik at man i rapport nummeret kan se hvilken dato den er fra. Det fremmer vores arbejdsgang meget.

Jeg er lidt usikker på:

datakilde tabel:  CaseAbsPos
tabelens nøgle: id

Skal alt dette kopieres med ind i det du kalder class modul? eller skal jeg finde tabelens nøgle id og skrive den der hvor der stå id?

Ja sorry men jeg skal nok have det bøjet i neon, for jeg er meget ny og har overtaget en gammel database med en masse vigtig information der helst ikke må gå tabt, hvis jeg dummer mig :-).

Beklager at være så besværlig.

Håber stadigvæk at du gider guide mig igennem.
Avatar billede Slettet bruger
18. marts 2011 - 20:53 #5
Vi starter jo alle et sted, så det er OK at stille elementære spørgsmål. Det eneste man er oppe mod, er at det kan være lidt svært at forstå hinanden i mangel af ord på ting og begreber.

En sikker strategi for ikke ødelægge noget, er at arbejde på en kopi - hvis noget går galt, så sletter man kopien og tager en ny kopi. Det er den *.mdb fil du måske har dobbeltklikket på i explore eller haft en genvej til eller åbnet vha. access.exe, jeg tænker på.
Når tilsidst man er helt sikker på det man laver, kan man ændre i originalen.

Kan du fortælle lidt mere om det databasen skal anvendes til - hvad er det for ting i den fysiske verden som har en dato og som skal administreres af databasen.
Avatar billede jmarques Nybegynder
18. marts 2011 - 21:13 #6
Du har ret jeg har lavet en kopi nu som jeg kan rode rundt i.

Formularen anvendes til at skrive rapporter i. Hver gang man starter en ny rapport (åbner en blank formular og udfylder/skriver i), skal denne rapport have et unikt rapport nummer.

Det nummer vil være en stor hjælp hvis det så ud på en bestemt måde (GSddmmåå-løbenr. = inputmaske der ser således ud GS______-__).

Når vi får opgaver, stilles de ofte således: Læs rapport nr. GS181109-17. Ved at nummeret ser således ud kan jeg med det samme se hvor gammel sagen er. Dermed ved jeg fra hvornår jeg skal søge rapporter fra andre afdelinger.

Håber det giver mening.
Avatar billede Slettet bruger
18. marts 2011 - 22:49 #7
Ja det giver fint mening. Hvad hedder tabelen formularen er baseret på og hvilke felter har denne tabel?
Avatar billede jmarques Nybegynder
18. marts 2011 - 22:58 #8
Tabellen hedder: GS-Rapport
Der er følgende felter:
ID
Dato og Tidspunkt
Reference nummer
Hrnr
Subjekt
Beskrivelse
Avatar billede Slettet bruger
19. marts 2011 - 11:35 #9
OK.
Er løbenummer=referencenummer ?

eller:

Eksisterer løbenummer kun som del af filnavn ?
Avatar billede jmarques Nybegynder
19. marts 2011 - 23:37 #10
Ja løbe nummeret er = referencenummeret men kun den sidste del af reference nummeret.

GS nummeret (GGddmmåå-00), bruger vi som sådan hele reference nummeret for den post eller den nye formular man står i og er ved at skrive sin rapport i.
Avatar billede jmarques Nybegynder
19. marts 2011 - 23:45 #11
Rettelse:

GS nummeret (GGddmmåå-00), bruger vi som sådan SOM hele reference nummeret for den post eller den nye formular man står i og er ved at skrive sin rapport i.
Avatar billede Slettet bruger
20. marts 2011 - 13:00 #12
Da feltet Hrnr er en funktion af dato og reference påhviler det formularens postinsættelses funktion at opretholde synkronitet mellem disse felter. Lad os lave simplest muligt database, der illustrerer det.

Tabel: Rap
dato, type 'dato og klokkeslet'
refNr, type 'heltal'
Mrnr, type 'tekst'

Der laves en autoformular (tabel markeret i database vindue->menulinie-indsæt autoformular)

Gemmes som 'Rap' - åbnes i designview - i egenskabsarket for Mrnr:

1. inputmaske: "GS"000000-00
2. i hændelsen efteropdatering klikkes der på de 3 små prikker ude til højre, kodegenerator og følgende indsætte i vba editoren:

Private Sub Mrnr_AfterUpdate()
    dato = DateSerial(Val(Mid(mrnr, 5, 2)), Val(Mid(3, 2)), Val(Left(mrnr, 2)))
    refNr = Right(mrnr, 2)
End Sub

I egenskabsarket for 'felterne' dato og refNr, kan de, i dette illustrative eksempel sættes til 'data->ikke aktiveret'

Måske kaster det lidt lys over det.
Avatar billede jmarques Nybegynder
21. marts 2011 - 23:44 #13
Ikke meget - beklager at din store indsats ikke lykkedes med mig.
Avatar billede jmarques Nybegynder
22. marts 2011 - 01:07 #14
I egenskabsark under fanebladet data i feltet standard værdi har jeg stående:

NewGDNumber("[Reference nummer]";"GS-Rapport")

Betyder det noget?
Avatar billede jmarques Nybegynder
22. marts 2011 - 02:14 #15
Tror måske at jeg har svaret forkert.

Det jeg forstår som løbenummer er de 2 sidste ciffre af referencenummeret som vi herinde i daglig tale kalder GS´nummeret. Beklager min begrebsforvirring. Løbenummeret er vel dermed kun er en del af et fil navn. Sådan at jeg kan se ud af GS nummeret at det er den 17 rapport skrevet på den d. 22/3-2011: GS220311-17.

Det du spørger om er muligvis det felt der i tabellen hedder "ID". Her gives der pr. autonummerering et individuelt fortløbende nummer til hver rapport vi skriver.

Glemte et par felter fra GS-Rapport tabellen:

ID (Autonummerering)
Dato og Tidspunkt (Dato og Klokkeslet)
Reference nummer (Tekst)
Tape (Tekst)
Security Officer (Tekst)
Hrnr (Tekst)
Surveillance Officer (Tekst)
Subjekt (Tekst)
Beskrivelse (Noter)
Er export lavet (Tekst)

(feltet med Hrnr, er det felt du hjælper mig med i den anden tråd om at åbne et specifikt word dokument fra en tekstboks).

Jeg beklager meget mine amatøragtige fejl. Jeg håber meget at du har mod på at hjælpe mig helt igennem !
Avatar billede jmarques Nybegynder
22. marts 2011 - 02:14 #16
Tror måske at jeg har svaret forkert.

Det jeg forstår som løbenummer er de 2 sidste ciffre af referencenummeret som vi herinde i daglig tale kalder GS´nummeret. Beklager min begrebsforvirring. Løbenummeret er vel dermed kun er en del af et fil navn. Sådan at jeg kan se ud af GS nummeret at det er den 17 rapport skrevet på den d. 22/3-2011: GS220311-17.

Det du spørger om er muligvis det felt der i tabellen hedder "ID". Her gives der pr. autonummerering et individuelt fortløbende nummer til hver rapport vi skriver.

Glemte et par felter fra GS-Rapport tabellen:

ID (Autonummerering)
Dato og Tidspunkt (Dato og Klokkeslet)
Reference nummer (Tekst)
Tape (Tekst)
Security Officer (Tekst)
Hrnr (Tekst)
Surveillance Officer (Tekst)
Subjekt (Tekst)
Beskrivelse (Noter)
Er export lavet (Tekst)

(feltet med Hrnr, er det felt du hjælper mig med i den anden tråd om at åbne et specifikt word dokument fra en tekstboks).

Jeg beklager meget mine amatøragtige fejl. Jeg håber meget at du har mod på at hjælpe mig helt igennem !
Avatar billede Slettet bruger
22. marts 2011 - 12:27 #17
Og Thor græmmede sig da han ikke kunne tømme drikkehornet:
http://da.wikipedia.org/wiki/Thor#Thor_hos_Udg.C3.A5rds-Loke
Jeg tror du klarer det meget godt - der findes dygtige access udviklere med år på bagen der nægter at kommme i nærheden af vba programmering.
Mine svar skal læses med et 'gran salt' - efterhånden som der kommer flere informationer viser det sig at de er ude af kontekst.

Standardværdien for Mrnr er en function, prøv at søge på NewGDNumber i vba editoren - vælg hele projektet. Når der oprettes en ny post indsættes standard vædier for de felter som har sådan en.

Hvordan ser vba koden for denne funktionen ud:
  NewGDNumber("[Reference nummer]";"GS-Rapport")
Avatar billede jmarques Nybegynder
22. marts 2011 - 20:33 #18
Når jeg søger på NewGDNumber i vba editoren finder jeg dett:

Function NewGDNumber(FieldName As String, TableName As String) As Variant
    'FieldName is the name of the number field in the table that we want the next number for.
    'TableName is the name of the table.

    Dim strGDBase As String
    Dim varMaxNum As Variant
    Dim intNewNum As Integer

    'Get the base of the number from the GamingDay function
  strGDBase = Format$(GamingDay(Now()), "ddmm")

    'Look up the biggest number on file for this base.
    varMaxNum = DMax(FieldName, TableName, FieldName & " Like """ & strGDBase & "*""")

    'If there's no number on file, return 00.
    If IsNull(varMaxNum) Then
        NewGDNumber = strGDBase & "01"
    Else
        intNewNum = CInt(Right$(varMaxNum, 2)) + 1
        If intNewNum > 99 Then
            '$$ What now, Michael?  You've used up all the numbers 00 - 99.
            '$$ Review the follwing logic and rewrite message in Danish.
            DoCmd.Beep
            MsgBox "Warning : The system can't automatically generate a number for " & _
                  FieldName & ", because no more numbers are available for this gaming day." & _
                  vbCr & vbCr & "You must enter your own number in " & FieldName & ".", _
                  vbExclamation
            NewGDNumber = Null
        Else
            NewGDNumber = strGDBase & Format$(intNewNum, "00")
        End If
    End If

End Function

Koden for NewGDNumber("[Reference nummer]";"GS-Rapport") kan jeg ikke lige finde. Når jeg klikker de 3... for enden af "standardværdi" feltet, kommer udtryksgeneratoren frem i stedet for. Det er her koden står ?
Avatar billede Slettet bruger
22. marts 2011 - 22:32 #19
Det er godt nok - vil lige påpege i forhold til tidligere indlæg:

Det er 'ddmmll' - dag,mpned,løbenummer der retuneres når ny post oprettes. Bindestreg før 2 sidste cifre og GS forrest er begge noget der alene befinder sig i inputmasken. Løbenummeret bliver tallet én større end antallet af poster for samme dag i GS-Rapport.

Den inputmaske, der vises i det oprindelige spørgsmål passer ikke med NewGDNumber(...)

Hvis du vil have år med skal "ddmm" rettes til "ddmmyy" og jeg vil tro din inputmaske skal være "GS"000000-00

Og, surprise - uden år "GS"0000-00

Det må aldrig rettes i feltet Mrnr - der kan søges og dobbelklikkes. Ny post oprettes med '*' i navigationsvælgeren (post bladre pilene nederst - hvis de er der ;)

Det er databasen der administrerer hvad der er af word dokumenter - og når der oprettes en ny post skal den tilsvarende word fil oprettes:

const path=" P:\.....",ext=".doc"
FileCopy path & "stddoc" & ext path & NewGDNumber & ext


Det viser sig nu at al det med kaste fokus til en anden knap er ligegyldigt. (tror jeg nok)
Avatar billede jmarques Nybegynder
22. marts 2011 - 22:54 #20
HHHHHHHHHHAAAAAAAAAAA jeg tror sgu at det virker!!!!

DU er GENIAL!!

Søgte efter NewGDNumber i editoren. Rettede til "ddmmyy" og fjernede focus knappen.

Kan jeg gøre feltet inaktivt så ingen kan komme til at taste i det men nummeret kan ses og det kører automatisk alligevel?
Avatar billede jmarques Nybegynder
22. marts 2011 - 22:59 #21
Har lavet en meget forsigtig test i den originale database og det virker sgu også her!!!!!!!!!
Avatar billede Slettet bruger
22. marts 2011 - 23:29 #22
Ja, det er en tilfredsstillelse når det virker.
Avatar billede jmarques Nybegynder
22. marts 2011 - 23:38 #23
Du har vist til fulde fortjent points´ene.

Jeg er lidt ny (surprise) her på sitet men jeg giver dig de point jeg har udlovet ikke sandt!

Det gør jeg ihvertfald dem har du mere end fortjent - TUSIND tak for hjælpen.
Avatar billede jmarques Nybegynder
22. marts 2011 - 23:39 #24
Værs´god.
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