fredag den 4. november 2016

Fortløbende nummerering

Jeg er flere gange blevet spurgt om, hvordan man laver en fortløbende nummerering, f.eks. til fakturaer. LibreOffice har en intern nummerering, men kun inden for samme dokument. LibreOffice har ikke noget sted at gemme nummereringen fra gang til gang.

Vi må derfor selv opfinde et sted at "huske" hvor langt vi er kommet i rækken, hvilket godt kunne være i en database. Jeg synes dog det er lidt overkill og lidt for besværligt, for vores behov er i virkeligheden meget simpelt: Hvor langt er vi kommet i nummereringen? Læg en til og husk det til næste gang. Filen består af en enkelt linje: "1130;04-11-2016 12:40:09"

I dette eksempel gemmer jeg informationen i en fil, sammen med informationer om hvornår det seneste nummer i rækken er tildelt. Hvis flere forskellige personer skal anvende nummereringen, kan filen placeres på et fællesdrev.
Jeg har opbygget makroen med flere subrutiner og funktioner, som hver i sær udfører en bestemt handling. Makroen starter i subrutinen Main.

Resten er op til dig selv. Du skal indbygge makroen i dit dokument, og hvor jeg i subrutinen Main printer resultatet, skal du indsætte resultatet i din faktura (regneark eller tekstdokument).

God fornøjelse.


REM  *****  BASIC  *****

Sub Main
FileName =  "/home/leif/Skrivebord/Makro/nummer.csv"

Current = GetCurrent(GetPrevious(Filename))    'Her aflæser vi forrige nummer (GetPrevious) og lægger en til (GetCurrent)
SaveFile(FileName, Current)            'Her gemmer vi den nye række ned i filen
Print GetPrevious(Filename)            'Her printer vi resultatet (erstattes med indsæt i fakturaen)

End Sub


Function GetPrevious (FileName)
'Funktionen aflæser hvilket tal der står som første led i filen
n = FreeFile()                                      'Next free file number
Open FileName For Input As #n    'Open for read

   Seek(n, 1)  
   Line Input #n, t

   'Jeg skal lige af med gåseøjne
   t= left(t, len(t)-1)
   t= right(t, len(t)-1)

   'Jeg udleder tallet (ignorerer tidsstemplet)
   t= split(t,";")(0)

If t="" then
t=0
End if

GetPrevious=t

Close n
End function


Function GetCurrent(Previous)
'Her beregner jeg den nye række ud fra tallet (Prevous)
GetCurrent =  val(Previous) + 1 & ";" & CDate(Now)
End Function


Sub SaveFile(FileName, Current)
'Her gemmer jeg den nye tekststreng(Current)
n = FreeFile()                                     'Next free file number
Open FileName For Input Access Read Write As #n    'Open for read
Write #n,  Current                                 'Write some text  
Close n

End Sub