Innledning
Desimalfeltet (Float) er standardvalget i Odoo når du jobber med tall som krever desimaler. Alt fra enhetspris og produktvekt til rabattprosent, avgiftssatser og konverteringsfaktorer i stykk-lister lagres som desimaler i datamodellen.
Ved første øyekast virker det som et enkelt tallfelt, men det skjuler viktige detaljer: hvordan nøyaktighet styres, hvordan verdier avrundes og hva som skjer i rapporter og aggregater. For noen typer data finnes det derfor bedre feltvalg enn ren Float.
Denne guiden forklarer hva et desimalfelt lagrer, hvordan det oppfører seg i Odoo-rammeverket, hvordan du kan opprette eller tilpasse det via Studio eller kode, og konkrete eksempler fra salg, lager og regnskap.
Hva er en desimalfelt (Float) i Odoo
I Odoo sin ORM representerer et desimalfelt et tall med flytende desimaler. I PostgreSQL blir dette lagret som en double precision-kolonne, som gir opptil rundt 15 signifikante sifre — mer enn nok for de fleste forretningsformål.
For brukeren vises feltet som et numerisk input i skjemaer. Antall viste desimaler styres av digits-innstillingen du angir. I listevisninger vises tallene med samme presisjon og høyrejusteres. I pivotrapporter og grafer deltar desimalfelt i summering, gjennomsnitt eller maksimumsberegninger.
Slik kan feltet se ut i en Python-modelldefinisjon:
from odoo import fields, models
class SaleOrderLine(models.Model):
_inherit = 'sale.order.line'
custom_margin = fields.Float(
string='Custom Margin',
digits=(5, 2),
default=0.0,
)
Parameteren digits er en tuple: første tall er totalt signifikante sifre, andre er antall desimaler. Altså tillater (5, 2) opptil fem signifikante sifre hvor to er etter desimaltegnet.
Du kan alternativt referere til en navngitt presisjonsgruppe i stedet for å hardkode sifrene:
price_premium = fields.Float(
string='Price Premium',
digits='Product Price',
)
Odoo har ferdigdefinerte presisjonsgrupper som administreres under Teknisk > Database-struktur > Desimalpresisjon. Vanlige grupper er Produktpris, Enhetsmål, Rabatt og Vekt. Å bruke slike grupper gjør det mulig å justere presisjon via grensesnittet uten å endre kode.
I Odoo Studio heter feltet «Desimalt tall» (Decimal Number). Felt opprettet i Studio bruker som regel standardpresisjon med mindre du spesifiserer noe annet i feltets egenskaper, noe som gjør det enkelt for sluttbrukere å utvide skjema uten utviklerhjelp.
Slik fungerer feltet
Når du definerer et desimalfelt i Odoo-modellen, opprettes databasekolonnen automatisk ved installasjon eller oppgradering av modulen. Du trenger normalt ikke å skrive SQL eller migrasjonsskript for dette.
Digits-innstillingen påvirker både visning og lagring: Odoo runder verdien ved lagring etter den definerte presisjonen. Hvis du setter digits=(6, 2) og en bruker skriver 3.14159, blir verdien avrundet og lagret som 3.14 — dette skjer i ORM-laget, ikke bare i UI.
Viktige feltattributter
Under finner du de viktigste egenskapene du kan sette på et desimalfelt i Odoo:
- digits: En tuple som (6, 2) eller navnet på en presisjonsgruppe. Styrer både visnings- og lagringspresisjon.
- required: Gjør feltet obligatorisk. Merk at 0.0 regnes som en gyldig verdi, så obligatorisk-krav kan oppfylles selv om brukeren ikke har oppgitt noe annet enn null.
- default: Standardverdi ved opprettelse av ny post. Å angi default=0.0 sikrer at feltet har et tall og ikke False/null.
- compute: Kobler feltet til en Python-metode som beregner verdien dynamisk — nyttig for marginberegninger eller konverteringsresultater.
- store: Når compute brukes, lagrer dette den beregnede verdien i databasen slik at den kan søkes, filtreres og grupperes.
- group_operator: Bestemmer hvordan feltet aggregeres i pivot- og grafvisninger — vanlige valg er 'sum', 'avg', 'min' eller 'max'. Default for Float er ofte 'sum'.
- copy: Styrer om verdien kopieres ved duplikering av en post. Standard er True.
Slik vises feltet i grensesnittet
I skjemaer rendres desimalfelt som numeriske input hvor lokaliserte desimaltegn respekteres. I lister blir tallene vanligvis høyrejustert. I søk kan du bruke numeriske sammenligningsoperatorer for å filtrere på feltet.
Du kan legge på widgets for å endre visningen. Et vanlig eksempel er percentage-widgeten som ganger lagret verdi med 100 og viser et prosenttegn — praktisk når feltene lagrer verdier i intervallet 0–1.
Interaksjon med Odoo ORM
Når du leser et desimalfelt får du en Python-float, eller False hvis feltet ikke er satt og ingen default finnes. Ved skriving aksepteres heltall, float eller False. ORM runder verdien i henhold til digits-innstillingen ved lagring.
Et viktig utviklertips: sammenlign aldri floats med == i Python. Flyttallsaritmetikk kan gjøre at tilsynelatende like verdier ikke er identiske. Bruk odoolib-funksjonene float_compare og float_is_zero fra odoo.tools.float_utils som tar hensyn til definert presisjon.
Når bedrifter bruker desimalfeltet
Praktiske bruksområder i ulike moduler
Salg: rabattprosent på ordrelinjer
Rabattfeltet på salgslinjer er et desimalfelt. En rabatt på 15 % lagres typisk som 15.0 og påvirker prisberegningen videre til tilbud og faktura. Korrekt håndtering av rabatter er viktig både for kundeinformasjon og for lønnsomhetsanalyser.
Lager: produktvekt og volum
Produkter har eget vekt- og volumfelt som desimaler — eksempelvis 2.5 kg eller 0.003 m3. Slike verdier må kunne ha desimalpresisjon for å gi riktige fraktkostnader og korrekte svar fra logistikkintegrasjoner.
Regnskap: avgiftssatser
Mva- og skattesatser lagres som desimaler, f.eks. 21.0 for 21 % eller 5.5 for reduserte satser. Regnskapet leser disse tallene for å beregne avgiftsbeløp på alle fakturaer, så små avrundingsforskjeller kan akkumuleres og gi avvik i rapportene.
Produksjon: stykklistens mengder
I produksjon brukes desimalfelt for komponentmengder — for eksempel 0.75 liter eller 2.5 kg. Desimaler gjør det mulig å angi nøyaktige resepter; heltallsfelt ville tvunget uønsket avrunding og skapt produksjonsfeil over tid.
Innkjøp: prisfaktorer og leverandørmarginer
Prisregler og påslagsfaktorer lagres ofte som desimaler, for eksempel 1.25 for 25 % påslag eller 0.85 for 15 % rabatt. Disse tallene inngår i automatiske prisberegninger på bestillinger og bidrar til konsistente innkjøpspriser.
Slik oppretter eller tilpasser du et desimalfelt
Tre måter å legge til et desimalfelt på
Avhengig av teknisk nivå og driftsrutiner finnes tre vanlige tilnærminger.
Bruke Odoo Studio (ingen koding)
- Odoo Studio er lavkodeverktøyet i systemet. For å legge til et desimalfelt uten kode:
- Åpne Odoo Studio fra hovedmenyen.
- Gå til skjemaet hvor feltet skal ligge.
- Dra inn feltet «Desimalt tall» fra feltvelgeren til skjemaet.
- Sett etikett, standardverdi og antall desimalplasser i egenskapspanelet.
Lagre og lukk Studio.
Felt laget i Studio får vanligvis prefikset x_studio_ og legges automatisk til i skjemaet. Dette er den enkleste metoden for brukere som vil skreddersy skjema uten utviklerstøtte.
Bruke Python i en modul (for utviklere)
For utviklere defineres felt i Python når du bygger moduler — anbefalt for endringer som skal versjonsstyres og deployeres:
Etter at feltet er lagt til i modellen, må du inkludere det i views XML slik at det vises i grensesnittet. Odoo oppretter databasekolonnen ved installasjon eller oppgradering av modulen. Dette er standard arbeidsflyt for seriøs Odoo-utvikling.
Bruke XML-RPC API
For automatisert konfigurasjon eller eksterne skript kan du opprette felt via XML-RPC:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_custom_coefficient',
'field_description': 'Custom Coefficient',
'model_id': model_id,
'ttype': 'float',
'state': 'manual',
}]
)
Ved bruk av API oppretter du som regel felt med state: 'manual' for å markere at feltet er opprettet utenfor en modul. Desimalpresisjon for slike felt styres via Desimalpresisjon-innstillingene i det tekniske menyområdet.
Gode arbeidsmetoder
Anbefaling 1: Bruk navngitte presisjonsgrupper
I stedet for å hardkode digits=(6,2), bruk en presisjonsgruppe som 'Product Price' eller 'Product Unit of Measure'. Dette gjør det enklere å justere presisjon sentralt og sikrer konsistens med Odoos innebygde felt.
Anbefaling 2: Bruk Monetary for beløp
Viktigst av alt: for valuta-beløp bør du bruke Monetary-feltet, ikke Float. Monetary kobles mot valutafeltet på samme modell, håndterer avrunding i henhold til valutaens regler og fungerer riktig i multivalutaoppsett. Float på fakturabeløp eller salgspris fører ofte til avrundingsproblemer og feil i flervaluta-rapportering.
Anbefaling 3: Sett alltid standardverdi
Angi default=0.0 for tallfelt som skal starte på null. Uten default returnerer feltet False når det er ufylt, noe som kan gi uventede feil i beregnede felt eller Python-metoder som forutsetter numeriske innganger.
Anbefaling 4: Tenk på group_operator for rapporter
Hvis feltet skal summeres i rapporter, angi group_operator='sum'. For rater og prosenter kan 'avg' være mer passende. Riktig valg sikrer korrekte aggregater i pivot-tabeller og grafer.
Anbefaling 5: Dokumenter prosentkonvensjoner
Vær eksplisitt om hvorvidt et prosentfelt bruker 0–100 (f.eks. 15.0) eller 0–1 (f.eks. 0.15). Å blande disse konvensjonene i samme datamodell fører lett til skjulte feil i kalkulasjoner.
Vanlige feilgrep
Når Float ikke er passende for pengebeløp
Float-felt bærer ikke valutasammenheng. Et tall som 1500 kan være kroner, euro eller dollar — det vet ikke feltet selv. I multivalutaoppsett gir dette feil i finansielle sammendrag; bruk Monetary for alle pengesummer.
Feil: ikke sette digits-parameteren
Uten eksplisitt digits bruker Odoo som regel to desimaler som standard. Det fungerer for prisfelt, men ikke for felttyper som krever høyere presisjon som valutakurser eller enhetskonverteringsfaktorer. Runder du en konverteringsfaktor til 2 desimaler, får du systematiske feil i alle transaksjoner.
Feil: sammenligne floats med == i Python
På grunn av flyttallsrepresentasjon kan uttrykk som 0.1 + 0.2 == 0.3 gi False. Bruk float_compare(value1, value2, precision_digits=2) og float_is_zero(value, precision_digits=2) fra odoo.tools.float_utils for sikre sammenligninger i utviklingsarbeid.
Feil: bruke Float når Integer er riktig
Hvis et felt kun skal inneholde hele tall (antall kolli, sekvensnummer osv.), bruk Integer. Float-felt her kan forvirre og tillate desimaler som ikke gir forretningsmessig mening.
Feil: ikke håndtere False i compute-metoder
Et desimalfelt uten default gir False når det ikke er satt. Sørg for å sjekke for False i beregningsmetoder eller sett default=0.0 for å unngå TypeError i produksjonssituasjoner.
Oppsummering
Oppsummering om viktigheten av desimalfeltet
Desimalfeltet er et grunnleggende byggestein i Odoo for priser, mengder, satser og målinger. Når det konfigureres med riktig presisjon og standarder, fungerer det stabilt og forutsigbart.
Hovedregelen er å bruke navngitte presisjonsgrupper for standardfelter, Monetary for valuta, alltid angi default og dokumentere prosentbruk. Disse vanene fanger de vanligste datakvalitetsproblemene før de vokser til produksjonsfeil.
Trenger du hjelp med Odoo? Hos Dasolo bistår vi bedrifter med å implementere, tilpasse og optimalisere Odoo i alle avdelinger. Enten det gjelder datamodellering, skreddersydde felter eller full modulutvikling, kan vi bidra. Ta kontakt med oss, så tar vi en prat om ditt Odoo-prosjekt.