Viser opslag med etiketten nummerering. Vis alle opslag
Viser opslag med etiketten nummerering. Vis alle opslag

mandag den 18. november 2019

Tip: Automatisk nummerering af tabelrækker

Tabeller i tekstdokumenter har mange skjulte funktioner, og emnet har da også været behandlet før her i nyhedsbrevet. Du kan se tidligere artikler om tabeller her: https://libreofficedk.blogspot.com/search/label/tabel

Det er muligt at nummerere tabelrækker automattisk og generisk.

Først opretter du en tabel, hvor du efterlader en kolonne tom. I dette tilfælde er det første kolonne.
  1. Marker kolonnen, fx ved at holde musen hen over øverste celles øverste kant, indtil der markøren vises som en pil, og klik så.
  2. Når kolonnen er markeret, skal du klikke på ikonet ”Nummereret liste (F12)”.
Nu har du standard-nummerering i første kolonne.
Standard-nummereringen kan du ændre fra Typografier og formatering, Listetypografier.

Pointen med den automatisk nummerering er, at hvis du sletter en række eller hvis du indætter en ny række i tabellen, genberegnes nummereringen.

tirsdag den 8. november 2016

Fortløbende nummerering (fortsat...)


Jeg har tidligere skrevet om en løsning på fortløbende nummerering, f.eks. til fakturanumre eller lignende.

Det kan du læse om her: http://libreofficedk.blogspot.dk/2016/11/fortlbende-nummerering.html

Efterfølgende har jeg leget lidt med tanken om at gemme linjerne en for en og måske tilføje yderligere informationer. Så har vi faktisk en log.

Den største forskel fra den tidligere version, er at vi håndterer de indlæste data som et array.

Der er forklarende kommentarer i koden.

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


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

Text= ReadFile(FileName)
PreviousLine =  Text(0)                'Aflæser linje 0
Previous= Split(PreviousLine,";")(0)    'Aflæser venstre del af linje 0

CurrentLine = val(Previous) + 1 & ";" & CDate(Now) & ";" & GetUser    'Beregner den nye linje 0
Current = Split(CurrentLine,";")(0)    'Aflæser lige tallet fra ny linje 0

'Pakker mit array ud til tekst, retter teksten, og pakker teksten ind i et array igen
Text=Join(Text(),chr(13))   
Text = CurrentLine & Chr(13) & Text
Text()=Split(Text,Chr(13)

WriteFile(FileName, Text())    'Skriver det nye array til filen

MsgBox(Current)        'Viser resultatet
End sub



Function ReadFile(FileName)
Dim result As String    'Nulstiller tekstvariabel
n = FreeFile                  
Open FileName For Input As #n
Do While NOT EOF(n)           
    Input #n, s                 

'Hvis det er første linje
    If result="" then
        result = s
    Else
'Hvis det ikke er første linje   
        result = result + chr(13) + s
    end if
Loop

Text()= Split(result, chr(13))    'Lav til et array

Close #n
ReadFile = Text()
End Function


Sub WriteFile(FileName,Text())
n = FreeFile                   'Always find the next free file number
Open FileName For Output As #n  'Open the file for input
For i = 0 to UBound(Text())
    Write #n, Text(i)                 'Read some data!
Next i

Close #n

End Sub


Function GetUser
'Her henter jeg brugerens initialer (Funktioner - Indstillinger -...)

'Vi kan faktisk hente alle indstillingerne hvis vi kender adressen
  Dim aParams2(0) As new com.sun.star.beans.PropertyValue
  sProvider = "com.sun.star.configuration.ConfigurationProvider"
  sAccess   = "com.sun.star.configuration.ConfigurationAccess"
  aConfigProvider = createUnoService(sProvider)
  aParams2(0).Name = "nodepath"
  aParams2(0).Value = "/org.openoffice.UserProfile/Data"
  aSettings = aConfigProvider.createInstanceWithArguments(sAccess, aParams2())
  User= aSettings.getbyname("initials")
  GetUser = User
End Function





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