Skip to Content

Det Monetære Felt I Odoo: Hvordan Det Fungerer Og Hvornår Man Skal Bruge Det

En praktisk guide til korrekt håndtering af valutaværdier i Odoo-datamodellen
6. marts 2026 af
Det Monetære Felt I Odoo: Hvordan Det Fungerer Og Hvornår Man Skal Bruge Det
Dasolo
| Ingen kommentarer endnu

Introduktion


Det monetære felt er en af de mest nyttige og mest fejlagtigt anvendte felttyper i Odoo. Det ser ud som et tal, gemmer sig som et float, men opfører sig som hverken. Når du først forstår, hvad der gør det forskelligt, vil du aldrig bruge et almindeligt Float til en finansiel værdi igen.


Hvis du nogensinde har kigget på et salgsordresum, et fakturabeløb eller en produktpris i Odoo, har du allerede brugt et monetært felt. De er overalt i Odoo-datamodellen, og de gør stille og roligt en stor del af det tunge arbejde omkring valutaformatering, afrunding og præcision.

Denne guide er til Odoo-udviklere, konsulenter og teknisk orienterede forretningsbrugere, der ønsker at forstå, hvordan det monetære felt faktisk fungerer. Uanset om du følger en Odoo-felt tutorial, bygger et tilpasset modul, eller bare prøver at forstå, hvorfor dine beløb afrundes anderledes end forventet, er dette den reference, du har brug for.

Hvad er det monetære felt i Odoo


Typen fields.Monetary er en af de centrale Odoo-felttyper i Odoo-rammen. Den er designet specifikt til at gemme valuta-baserede værdier: priser, beløb, totaler, budgetter eller ethvert tal, der repræsenterer penge.


Det, der adskiller den fra en almindelig Float, er det obligatoriske forhold til en valuta. Et Monetary-felt ved altid, hvilken valuta det arbejder med, og det bruger den valuta til at bestemme, hvor mange decimaler der skal vises, og hvordan gemte værdier skal afrundes.


Hvordan det vises i grænsefladen

I Odoo UI viser et Monetary-felt værdien formateret i henhold til den tilknyttede valuta. Hvis valutaen er Euro, ser du noget som € 1.234,50. Hvis det er den amerikanske dollar, ser du $ 1.234,50. Antallet af decimaler følger konfigurationen af valutaposten.


Feltet er fuldt redigerbart i formularvisninger, vises pænt i listevisninger og integreres naturligt i pivottabeller og finansielle rapporter. Slutbrugere behøver slet ikke at tænke på formatering. Odoo håndterer det gennemsigtigt.


Den underliggende datatype

På databaseniveau gemmes et Monetary-felt som en dobbelt præcisions float i PostgreSQL. Valutainformationen gemmes ikke i den samme kolonne. Den kommer fra en relateret res.currency-post, der er knyttet gennem et separat Many2one-felt på den samme model.


Denne adskillelse af værdi og valuta er intentionel. Den holder Odoo-databasefelterne rene og gør det muligt at ændre en post's valuta uafhængigt af dens gemte beløb.


Hvordan feltet fungerer


At forstå mekanikken bag Monetary-feltet vil hjælpe dig med at bruge det korrekt og undgå de slags afrundings- eller visningsproblemer, der er overraskende almindelige i tilpasset Odoo-udvikling.


Parameteren currency_field

Hvert Monetary-felt skal parres med et Many2one-felt, der peger på res.currency. Som standard leder Odoo efter et felt med navnet currency_id på den samme model. Du kan overskrive dette med parameteren currency_field:


amount = fields.Monetary(string='Beløb', currency_field='currency_id')

Hvis valuta-feltet mangler eller ikke er indstillet på en given post, falder Odoo tilbage til virksomhedens valuta. Dette forhindrer hårde fejl, men i et multi-valuta miljø vil det producere forkert formatering. Deklarer altid valuta-feltet eksplicit.


Afrunding og Præcision

En af de væsentlige forskelle mellem Monetær og Float er, hvordan afrunding fungerer. Modellen res.currency definerer antallet af decimaler og afrundingsfaktoren for hver valuta. Når Odoo læser eller viser en monetær værdi, anvender den automatisk disse regler.

Dette betyder, at en værdi, der er gemt som 1.2349999 for et EUR-felt, vil blive vist som 1.23, ikke 1.235 eller 1.23499. Dette er kritisk for skatteberegninger, faktura-totaler og enhver finansiel afstemningsproces. At bruge en almindelig Float i disse sammenhænge vil til sidst producere afrundingsforskelle, der er svære at spore.


Interaktion med Odoo ORM

I Odoo ORM returnerer læsning af et monetært felt altid en Python float. Valuta-konteksten kommer fra det parrede valuta-felt på den samme post. Når du udfører beregninger i Python, der involverer monetære felter, skal du bruge valutaens round() metode for at bevare præcision:


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

Dette undgår flydende punktakkumuleringsfejl, der kan optræde i multi-linje totaler eller iterative beregninger.


Monetære Felter i QWeb Rapporter

I QWeb rapportskabeloner integrerer monetære felter med en dedikeret widget, der formaterer værdien korrekt i PDF'er og web-rapporter:


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

Dette sikrer det korrekte valutasymbol og decimalformatering i hvert genereret dokument, uanset valutaen på posten.

Forretningsbrugssager


Monetære felter anvendes i hele standard Odoo-moduler. Her er fem konkrete eksempler, der illustrerer, hvor og hvorfor de er vigtige i virkelige forretningsarbejdsgange.


1. Salg: Produktpriser og ordrebeløb

Felter som price_unit, price_subtotal og amount_total på salgsordrer og ordrelinjer er alle monetære felter. De respekterer automatisk den valuta, der er valgt på kundens ordre, som kan være forskellig fra virksomhedens driftsvaluta.


Når en salgsrepræsentant opretter en ordre i USD for en virksomhed, der opererer i EUR, håndterer Odoo visning, afrunding og konvertering korrekt, fordi det monetære felt altid arbejder i konteksten af postens valuta, ikke systemvalutaen.


2. Regnskab: Fakturabeløb og skatteposter

I regnskabsmodulet er hver beløbs kolonne på en faktura et monetært felt: amount_untaxed, amount_tax, amount_total. Den valuta, der er angivet på fakturaen, styrer afrundingen af alle disse værdier.


Dette er ikke en detalje. Forkert afrunding på skatteposter skaber ubalancer i journalindgange, som er smertefulde at afstemme. Det monetære felts valuta-bevidste afrunding er det, der forhindrer disse problemer på dataniveau.


3. CRM: Forventet indtægt på muligheder

Feltet expected_revenue på en CRM-mulighed er et monetært felt. Salgsteams kan indfange pipeline-værdier i prospektets valuta, mens dashboards og rapporter konverterer alt til virksomhedens valuta til pipeline-analyse og prognoser.


Denne opsætning fungerer glat netop fordi monetære felter bærer valutaoplysninger sammen med deres numeriske værdi.


4. Indkøb: Leverandørpriser og indkøbsordrer

Indkøbsordrer bruger monetære felter til enhedspriser og totaler, knyttet til leverandørens aftalte valuta. En leverandørfaktura i japanske yen håndteres på samme måde som en i euro. Det monetære felt tager sig af præcision og visning uden nogen manuel håndtering fra indkøbsteamet.


5. Tilpassede felter: Budget- og målsporing

En meget almindelig tilpasningsanmodning er at tilføje et budgetbeløb, et indtægtsmål eller en omkostningsgrænse til et projekt, en afdeling eller en tilpasset model. I alle disse tilfælde er et Monetært felt det rigtige valg. Det integreres naturligt med virksomhedens valuta, vises korrekt i formularer og lister, og opfører sig forudsigeligt i rapporter og eksport.

At bruge et Float til denne type felt er teknisk muligt, men fører til formateringsinkonsistenser og afrundingsproblemer, så snart der opstår multi-valuta scenarier.


Oprettelse eller tilpasning af feltet


Der er to hovedmetoder til at tilføje et Monetært felt til en Odoo-model: gennem Odoo Studio for en no-code tilgang, eller gennem et tilpasset Python-modul for fuld kontrol.


Brug af Odoo Studio

Odoo Studio inkluderer en Monetær type i sin feltoprettelsespanel. Når du bruger Odoo Studio-felter til at tilføje et Monetært felt til en model, tilføjer Studio automatisk et currency_id felt, hvis der ikke allerede findes et på den model. Dette dækker de mest almindelige brugsscenarier uden at skrive nogen kode.


En ting at være opmærksom på: Studio-oprettede felter bruger x_ præfikset (for eksempel x_studio_budget). Hvis din model allerede har et currency_id felt, vil det nye Monetære felt bruge det. Hvis ikke, vil Studio oprette et nyt. Når du har flere Monetære felter på den samme model med potentielt forskellige valutaer, er det værd at gennemgå dette delte valuta felt omhyggeligt, før du går live.


For ligetil scenarier er Studio den hurtigste måde at oprette felter i Odoo og fungerer godt for forretningsbrugere, der ikke har udviklingstilgang.


Teknisk tilgang: Python-felter

I et tilpasset Odoo-modul kræver oprettelse af et Monetært felt to deklarationer: selve feltet og det tilknyttede valuta felt. Dette er den standardmønster i Odoo Python-feltsudvikling:


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='Budgetvaluta',
        default=lambda self: self.env.company.currency_id,
    )

At indstille virksomhedens valuta som standard er et praktisk valg for de fleste interne felter. Det forhindrer, at valuta feltet vises tomt, når en bruger først åbner en post, hvilket ville bryde formateringen af det Monetære felt.


Beregnede Monetære Felter

Monetære felter fungerer godt som odoo beregnede felter. Hvis du har brug for at totalisere linje beløb eller anvende en formel, der giver et monetært resultat, er dette den standardmønster:


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'))

Attributten store=True er vigtig, hvis du planlægger at filtrere, sortere eller aggregere på dette felt i listevisninger eller rapporter. Ikke-lagrede beregnede felter kan ikke bruges i ORM domænefiltre.


Tilføjelse af et Monetært Felt via API'en

Hvis du har brug for at oprette felter i Odoo programmatisk via XML-RPC (for eksempel som en del af et fjernkonfigurationsscript), kan du oprette det monetære felt gennem ir.model.fields:


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',
    }]
)

Dette er en del af det bredere odoo tilpasningsværktøj, der er tilgængeligt gennem XML-RPC API'en, som er dækket mere detaljeret i andre artikler i denne blogsamling.

Bedste praksis


Det monetære felt er ligetil at bruge, når du kender mønstrene. Her er de praksisser, der vil holde din implementering ren og forhindre problemer senere hen.


1. Brug aldrig Float til Finansielle Værdier

Dette er den vigtigste regel i odoo udvikling, når det kommer til penge. Hvis et felt repræsenterer en pris, et beløb, et total, et budget eller et hvilket som helst valuta-baseret nummer, skal du bruge fields.Monetary. Et Float-felt har ingen valuta-bevidsthed og vil ikke runde korrekt på tværs af forskellige valutaer. Det monetære felt eksisterer netop for at løse dette problem.


2. Deklarer altid valuta feltet eksplicit

Stol ikke på Odoos fallback til currency_id, medmindre dette felt faktisk findes i din model. Angiv eksplicit parameteren currency_field og deklarer altid den tilsvarende Many2one til res.currency. Dette gør forholdet klart og forhindrer stille fallback-adfærd i multi-valuta miljøer.


3. Indstil en standardvaluta

For interne felter, der næsten altid vil bruge virksomhedens valuta, skal du indstille en standard på valuta feltet: default=lambda self: self.env.company.currency_id. Dette forhindrer, at feltet vises som blankt på nye poster, hvilket ville fjerne valuta symbolet og formateringen i UI'en.


4. Brug store=True på beregnede monetære felter, du planlægger at søge i

Hvis du definerer et beregnet monetært felt og forventer, at brugere eller rapporter filtrerer eller sorterer efter det, skal du indstille store=True. Ikke-lagrede beregnede felter kan ikke vises i ORM-domæner eller SQL-baserede visninger. Dette er en almindelig kilde til forvirring, når man bygger brugerdefinerede dashboards i Odoo.


5. Brug Currency Round() til mellemliggende beregninger

Når du skriver Python-kode, der udfører flere aritmetiske trin på monetære værdier, skal du anvende self.currency_id.round(value) ved hvert meningsfuldt trin i stedet for kun i slutningen. Flydende punktfejl akkumuleres over flere operationer, og tidlig anvendelse af afrunding forhindrer uoverensstemmelser i totalerne.


6. Vær bevidst i multi-valuta rapporter

Når du aggregerer monetære værdier på tværs af poster med forskellige valutaer, skal du ikke blot summere de rå tal. Konverter alle værdier til en fælles valuta først ved hjælp af res.currency.compute(), eller gør rapporten valuta-specifik. At blande valutaer i en sum producerer tal, der teknisk set er korrekte på felt niveau, men økonomisk meningsløse.

Almindelige faldgruber


Selv erfarne Odoo-udviklere støder på problemer med monetære felter. Her er de mest almindelige fejl og hvordan man undgår dem.


Fælde 1: Manglende valuta felt

Det mest hyppige problem, når man tilføjer et monetært felt, er at glemme at oprette det tilknyttede valuta Many2one felt. Hvis currency_id ikke findes i modellen, vil Odoo stille falde tilbage til virksomhedens valuta i nogle sammenhænge og rejse en fejl i andre. Opret altid valuta feltet sammen med det monetære felt, selvom du aldrig forventer, at brugerne ændrer det.


Fælde 2: To Monetære Felter, der Deler Et Valuta Felt med Forskellige Tiltænkte Valutaer

Hvis du har to Monetære felter på den samme model, der er beregnet til at holde værdier i forskellige valutaer (for eksempel, en kundepris i EUR og en leverandørkostnad i USD), kan de ikke sikkert dele et enkelt currency_id felt. Hver skal have sin egen valutareference. Hvis dette ikke gøres, betyder det, at én valutaindstilling overskriver begge felter, hvilket vil producere forkerte data og forvirrende UI-adfærd.


Fælde 3: Afrundingsforskelle ved Aggregation på Tværs af Valutaer

Summen af Monetære feltværdier på tværs af poster med forskellige valutaer vil producere totaler, der ser forkerte ud, fordi du lægger EUR-beløb til USD-beløb, som om de var den samme enhed. Dette er en almindelig kilde til rapporteringsfejl i virksomheder, der opererer i flere valutaer. Normaliser altid til en enkelt valuta, før du aggregerer.


Fælde 4: Flydende Punkt Sammenligninger i ORM Søgninger

At søge i et Monetært felt med en præcis lighedskontrol (for eksempel, at lede efter poster hvor amount = 10.0) kan misse poster på grund af, hvordan floats gemmes i databasen. Brug >= og <= med en lille tolerance, eller anvend valutafradrag før du sammenligner værdier i Python-logik. Dette er et generelt odoo orm problem med float-baserede felter, ikke specifikt for Monetære, men det betyder mere, når penge er involveret.


Fælde 5: Ignorerer Valuta Afrunding Under Data Import

Når du importerer poster via CSV eller XML-RPC, der inkluderer Monetære feltværdier, gemmes de importerede tal som angivet uden automatisk afrunding. Hvis dine kilde data har flere decimaler, end den målvaluta tillader, vil den gemte værdi være teknisk korrekt, men vil blive vist anderledes end forventet, og kan forårsage små uoverensstemmelser i totaler. Anvend valutafradrag i dine import scripts eller databehandlingstrin, før du sender værdier til Odoo.


Konklusion


Det Monetære felt er en af de Odoo felttyper, der ser enkel ud på overfladen, men bærer en masse vigtig adfærd under overfladen. Dets tætte forhold til valutaposten er det, der gør det pålideligt for finansielle data: korrekt afrunding, konsekvent formatering og valuta-bevidst visning på tværs af hele Odoo-grænsefladen og rapportmotoren.


At bruge det korrekt, hvilket betyder altid at parre det med et eksplicit valuta felt og aldrig erstatte et Float for finansielle værdier, vil redde dig fra en hel kategori af subtile fejl, der er notorisk svære at spore i produktion. Odoo datamodellen er bygget omkring denne felttype af god grund.


Uanset om du følger en odoo udviklerguide, tilpasser et standardmodul eller bygger noget nyt fra bunden, er det at få dine Monetære felter rigtige en af de grundlæggende beslutninger, der former, hvor pålideligt din Odoo implementering håndterer penge.

Har du brug for hjælp med din Odoo-implementering?


Hos Dasolo hjælper vi virksomheder med at implementere, tilpasse og optimere Odoo på tværs af alle skalaer og konfigurationer. Uanset om du har brug for en ren datamodel, en tilpasset feltstrategi, multi-valuta support eller en fuld Odoo udrulning, har vores team den tekniske og funktionelle dybde til at få det rigtigt.


Hvis du har spørgsmål om monetære felter eller andre aspekter af din Odoo-implementering, er vi glade for at hjælpe. Kontakt os og lad os tale om, hvad du bygger.

Det Monetære Felt I Odoo: Hvordan Det Fungerer Og Hvornår Man Skal Bruge Det
Dasolo 6. marts 2026
Del dette indlæg
Log ind for at skrive en kommentar