Skip to Content

Feltet "Monetary" i Odoo: Sådan Fungerer Det og Hvornår Du Bruger Det

En praktisk vejledning til korrekt håndtering af valuta i Odoos datamodel
6. marts 2026 af
Feltet "Monetary" i Odoo: Sådan Fungerer Det og Hvornår Du Bruger Det
Dasolo
| Ingen kommentarer endnu

Introduktion


Monetary-feltet i Odoo er et af de felttyper, man oftest ser — og samtidig en af dem, der misbruges mest. Det ligner et tal, det gemmes som en flydende værdi, men det opfører sig efter helt andre regler. Når du først forstår forskellen, vil du sjældent bruge et almindeligt Float til pengesummer igen.


Kigger du på en salgordres total, en fakturalinje eller en vares pris i Odoo, så er der stor sandsynlighed for, at du ser et Monetary-felt. De findes i næsten alle standardmoduler og tager sig af valutaopstilling, afrunding og præcision uden at brugeren skal gøre noget.

Denne guide er skrevet til udviklere, konsulenter og teknisk interesserede slutbrugere, som vil forstå hvad der egentlig foregår bag Monetary-feltet. Uanset om du følger en tutorial, laver et modul eller sporadisk undrer dig over uventet afrunding, får du her det praktiske overblik.

Hvad er et Monetary-felt i Odoo?


I Odoo er fields.Monetary en standard felttype, designet specifikt til værdier, der repræsenterer penge: priser, beløb, totalsummer, budgetter — kort sagt alle tal, der har en valuta knyttet til sig.


Det afgørende, der adskiller Monetary fra en simpel Float, er at det altid er koblet til en valuta. Feltet ved, hvilken valuta værdien er i, og bruger valutaens indstillinger til at styre antal decimaler og afrundingsregler.


Sådan vises det i brugerfladen

I Odoo’s grænseflade præsenteres et Monetary-felt formateret efter den tilknyttede valuta. Er det euro, ser brugeren noget i stil med “€ 1.234,50”; er det USD, vises “$ 1,234.50”. Antallet af decimaler og tegnsætningen følger valutaens opsætning.


Feltet er redigerbart i formularvisninger, præsenterer pænt i lister og fungerer i rapporter og pivottabeller uden ekstra arbejde fra brugeren — formatering håndteres automatisk af Odoo.


Den underliggende datamodel

I databasen gemmes Monetary-værdien som en double precision float i PostgreSQL. Selve valutaen gemmes ikke i samme kolonne; den peges på via en separat Many2one (typisk en currency_id) på samme model.


Denne adskillelse mellem tal og valuta er bevidst — den holder databasemodellen ren og gør det muligt at skifte valuta uden at blande selve talkolonnen sammen med valutaoplysningerne.


Hvordan feltet fungerer


At kende mekanikken bag Monetary-feltet hjælper dig til at bruge det korrekt og undgå de overraskende afrundings- og visningsproblemer, som ofte opstår i tilpassede Odoo-setup.


Parameteren currency_field

Hvert Monetary-felt skal parres med en Many2one, der peger på res.currency. Som standard leder Odoo efter et felt med navnet currency_id på samme model, men du kan angive et andet felt via currency_field-parameteren:


amount = fields.Monetary(string='Amount', currency_field='currency_id')

Hvis valuta-feltet mangler eller ikke er sat, falder Odoo tilbage til virksomhedens valuta. Det forhindrer typiske fejl, men i et multi-valuta setup giver det ofte forkert formatering. Angiv altid currency_field eksplicit.


Afrunding og præcision

En vigtig forskel mellem Monetary og Float er håndteringen af afrunding. Modellen res.currency indeholder både antal decimaler og afrundingsfaktor for hver valuta. Når Odoo læser eller viser et Monetary-felt, anvendes disse regler automatisk.

Det betyder f.eks. at en værdi gemt som 1.2349999 i et EUR-felt vil blive vist som 1,23. Det er afgørende for skat, fakturatotaler og afstemninger — bruger du almindelige Float-felter, ender du før eller senere med små afrundingsfejl, der er svære at debugge.


Integration med Odoo ORM

Når du læser et Monetary-felt via ORM’en, får du altid en Python float. Valutakonteksten hentes fra den tilknyttede currency-many2one på samme post. Ved beregninger bør du derfor bruge valutaens round()-metode for at bevare korrekt præcision:


rounded_value = self.currency_id.round(self.amount)

Det mindsker ophobning af flydende-komma-fejl, som nemt opstår i totalsummer eller ved gentagne beregninger.


Monetary i QWeb-rapporter

I QWeb-templates kan du bruge en særlig widget, så værdierne formateres korrekt i både PDF og web-udgaver af rapporter:


<span t-esc="record.amount"
      t-options='{"widget": "monetary", "display_currency": record.currency_id}'/>

Dermed får hvert dokument altid det rette valuta-symbol og decimalformat — uanset hvilken valuta der står på posten.

Forretningsscenarier


Hvor i Odoo møder du typisk Monetary-felter? Her er fem praktiske eksempler fra forretningsverdenen.


1) Salg: produktpriser og ordretotaler

På salgsordrer er prisfelter som price_unit, price_subtotal og amount_total Monetary-felter. De respekterer den valuta, kunden har valgt, hvilket kan være forskelligt fra virksomhedens egen valuta.


Når en sælger opretter en ordre i USD for en virksomhed, der opererer i EUR, sørger Monetary-felterne for korrekt visning, afrunding og kontekst — fordi de læser valutaen fra ordren, ikke fra systemet som helhed.


2) Regnskab: fakturabeløb og momslinjer

I regnskabsmodulet er alle beløbsfelter på en faktura Monetary: amount_untaxed, amount_tax, amount_total. Fakturavalutaen styrer afrundingen på disse felter.


Det er ikke en lille detalje. Forkert afrunding på momslinjer skaber ubalancer i konteringer, som er besværlige at rette. Monetary-feltet forhindrer disse problemer ved kilden.


3) CRM: forventet omsætning på muligheder

I CRM er expected_revenue et Monetary-felt. Salg kan indtaste pipelineværdier i kundens valuta, mens dashboards kan omregne til firmaets valuta for forecasting og rapportering.


Det fungerer stabilt, netop fordi Monetary-felter altid bærer valutaoplysninger med sig.


4) Indkøb: leverandørpriser og indkøbsordrer

Indkøbsordrer bruger Monetary-felter til enhedspriser og totalsummer, bundet til den valuta der er aftalt med leverandøren. En leverandørfaktura i japanske yen behandles på samme måde som en i euro — præcision og visning håndteres automatisk.


5) Tilpasninger: budget og målsporing

Når man tilføjer tilpassede felter som budget, mål eller loft for omkostninger, er Monetary typisk det rigtige valg. Feltet integrerer naturligt med firmaets valuta, vises korrekt i formularer og rapporter og opfører sig forudsigeligt i eksport/udtræk.

Teknisk set kan man bruge Float, men i praksis fører det til inkonsekvent formatering og afrundingsproblemer i multi-valuta scenarier.


Oprettelse eller tilpasning af feltet


Der er to almindelige måder at oprette et Monetary-felt på: via Odoo Studio uden kode eller via et Python-modul, når du vil have fuld kontrol.


Brug af Odoo Studio

I Studio kan du vælge Monetary-typen i feltoprettelsen. Studio tilføjer automatisk et currency_id-felt, hvis modellen ikke allerede har et — hvilket dækker mange simple behov uden kodning.


Vær opmærksom på at Studio-felter får x_-præfikset (fx x_studio_budget). Hvis modellen allerede har et currency_id, genbruger Studio det; ellers opretter Studio et nyt. Har du flere Monetary-felter, der burde kunne indeholde forskellige valutaer, bør du gennemgå de automatiske currency-felter inden go-live.


Til almindelige, ukomplicerede scenarier er Studio den hurtigste vej for forretningsbrugere uden udvikleradgang.


Teknisk tilgang: Python-felter

I et custom-modul definerer du både Monetary-feltet og den tilhørende currency Many2one. Det er standardmønstret i Odoo-udvikling:


from odoo import fields, models

class ProjectTask(models.Model):
    _inherit = 'project.task'

    x_budget = fields.Monetary(
        string='Budget',
        currency_field='x_budget_currency_id',
    )
    x_budget_currency_id = fields.Many2one(
        comodel_name='res.currency',
        string='Budget Currency',
        default=lambda self: self.env.company.currency_id,
    )

At sætte virksomhedens valuta som default er ofte den mest praktiske løsning for interne felter. Det forhindrer, at valutaen står tom, når en ny post åbnes, og sikrer dermed korrekt visning fra starten.


Beregnet Monetary-felt

Monetary-felter fungerer fint som beregnede felter. Skal du summere linjeværdier eller beregne et beløb ud fra en formel, er det standardmønsteret at bruge fields.Monetary med compute-metode:


x_total_budget = fields.Monetary(
    string='Total Budget',
    currency_field='currency_id',
    compute='_compute_total_budget',
    store=True,
)

@api.depends('x_line_ids.x_amount')
def _compute_total_budget(self):
    for record in self:
        record.x_total_budget = sum(record.x_line_ids.mapped('x_amount'))

Husk store=True hvis brugere eller rapporter skal kunne filtrere, sortere eller aggregere på feltet. Ikke-lagrede computed-felter kan ikke bruges i ORM-domæner eller SQL-baserede visninger.


Oprettelse af Monetary-felter via API

Skal du automatisk oprette felter fra et eksternt script via XML-RPC, kan du lave et ir.model.fields-opkald for at tilføje et Monetary-felt:


models.execute_kw(ODOO_DB, uid, ODOO_API_KEY,
    'ir.model.fields', 'create',
    [{
        'name': 'x_budget',
        'field_description': 'Budget',
        'model_id': model_id,
        'ttype': 'monetary',
        'currency_field': 'currency_id',
        'state': 'manual',
    }]
)

Det er en del af det større sæt af tilpasningsmuligheder via Odoo’s XML-RPC API, som også behandles i andre tekniske artikler.

Gode fremgangsmåder


Monetary-feltet er nemt at bruge, når man kender mønstrene. Følg disse praksisser for at holde dit setup robust og undgå problemer senere.


1) Brug aldrig Float til penge

Det vigtigste råd: repræsenter altid monetære værdier med fields.Monetary. Float mangler valuta-kontekst og håndterer ikke korrekt afrunding i multi-valuta miljøer. Monetary-feltet blev netop skabt for at undgå den slags fejl.


2) Angiv valuta-feltet eksplicit

Stol ikke på Odoo’s fallback med currency_id medmindre feltet faktisk findes. Sæt currency_field-parameteren eksplicit og definer den tilsvarende Many2one til res.currency — så undgår du skjulte fallback-situationer i multi-valuta scenarier.


3) Sæt en standardvaluta

For felter, der næsten altid bruger firmaets valuta, sæt default=lambda self: self.env.company.currency_id. Det sikrer, at feltet ikke står tomt på nye poster og bevarer valutaformatet i UI fra starten.


4) Brug store=True på beregnede felter, du vil søge på

Hvis en det beregnede Monetary-felt skal filtreres eller sorteres i lister/rapporter, skal du gemme det (store=True). Ikke-lagrede felter kan ikke anvendes i ORM-domæner, hvilket ofte skaber forvirring ved dashboardbygning.


5) Brug currency.round() i løbende beregninger

Når du laver flere regneoperationer med monetære værdier i Python, rund af med self.currency_id.round(value) løbende i stedet for kun til sidst. Flydende-komma-fejl ophober sig ved gentagne operationer, og tidlig afrunding minimerer uoverensstemmelser i totalsummer.


6) Vær eksplicit ved multi-valuta rapporter

Når du aggregerer beløb fra poster med forskellige valutaer, må du ikke blot lægge tallene sammen. Omregn dem til en fælles valuta først med res.currency.compute() eller lav rapporten valuta-specifik. At blande valutaer i en sum giver tal, der er korrekte teknisk set men meningsløse økonomisk.

Almindelige faldgruber


Selv rutinerede Odoo-udviklere løber ind i problemer med Monetary-felter. Her er de mest almindelige fejl og hvordan du undgår dem.


Fejl 1: Manglende valuta-felt

Den hyppigste fejl er at glemme at oprette den tilhørende currency Many2one. Uden et currency_id på modellen bruger Odoo nogle steder firmaets valuta automatisk og andre steder giver fejl. Opret altid valuta-feltet sammen med Monetary-feltet, også selv om du tror, det ikke skal ændres af brugeren.


Fejl 2: Flere Monetary-felter deler ét valuta-felt men skulle være i forskellige valutaer

Hvis to Monetary-felter på samme model reelt skal rumme beløb i forskellige valutaer (fx kundens pris i EUR og leverandørens omkostninger i USD), må de ikke dele samme currency_id. Hvert felt skal have sin egen valuta-reference, ellers overskrives indstillinger og data bliver forkerte og forvirrende i UI.


Fejl 3: Afrundingsforskelle ved opsummering på tværs af valutaer

At summere Monetary-værdier fra poster i forskellige valutaer giver ofte mærkelige totalsummer, fordi du i praksis lægger EUR og USD sammen. Normaliser altid til én valuta før aggregering for at undgå rapportfejl i multi-valuta virksomheder.


Fejl 4: Sammenligning af flydende tal i søgninger

At søge på et Monetary-felt med direkte lighed (fx amount = 10.0) kan savne poster på grund af hvordan flydende værdier gemmes. Brug >= og <= med en tolerance, eller rund af med valutaens round() før sammenligning i Python-logik.


Fejl 5: Ignorér ikke valuta-afrunding ved dataimport

Når du importerer beløb via CSV eller API, gemmes tallene som de er leveret — uden automatisk afrunding. Hvis dine kilder har flere decimaler end valutaen tillader, vil værdierne gemmes “rigtigt” men vises anderledes og kan skabe små afvigelser i totaler. Rund af i importskripterne inden du skriver til Odoo.


Afslutning


Monetary-feltet ser simpelt ud, men skjuler væsentlig funktionalitet: tæt kobling til valutaen sikrer korrekt afrunding, ensartet visning og valuta-bevidst håndtering i hele Odoo — både i brugerfladen og i rapporter.


Korrekt brug — altid sammen med et eksplicit valuta-felt og aldrig erstatte det med en Float — sparer dig for mange subtile fejl, som er dyre og tidskrævende at finde i produktion. Feltet er en grundpille i Odoo’s datamodel af en god grund.


Uanset om du følger en udviklerguide, tilpasser standardmoduler eller udvikler noget nyt, er valget og konfigurationen af Monetary-felter en af de fundamentale beslutninger, der bestemmer hvor robust dit Odoo-landskab håndterer økonomi.

Brug for hjælp til jeres Odoo-implementering?


Hos Dasolo hjælper vi virksomheder med at implementere, tilpasse og optimere Odoo — fra enkeltstående tilpasninger til komplette multi-selskabsopsætninger. Vi rådgiver om datamodel, valuta-strategi og bedste praksis, så jeres økonomidata bliver pålidelige.


Har I spørgsmål om Monetary-felter eller andre aspekter af jeres Odoo-opsætning, står vi klar til at hjælpe. Kontakt os og lad os tage en snak om jeres projekt.

Feltet "Monetary" i Odoo: Sådan Fungerer Det og Hvornår Du Bruger Det
Dasolo 6. marts 2026
Del dette indlæg
Log ind for at skrive en kommentar