Introduksjon
Hvis du har brukt tid på å jobbe med Odoo, har du sannsynligvis støtt på felt som automatisk beregner verdien sin. Et lagret beregnet felt tar dette et skritt videre: det beregner verdien og lagrer den direkte i databasen.
Denne distinksjonen betyr mer enn det kan virke som ved første øyekast. Et felt som bare beregner på farten kan ikke søkes, filtreres, grupperes eller eksporteres effektivt. Et lagret beregnet felt kan. Det oppfører seg som en vanlig databasokolonne, samtidig som det fortsatt drives av logikken du definerer.
Denne guiden dekker alt du trenger å vite om lagrede beregnede felt i Odoo: hvordan de fungerer inne i Odoo datamodellen, hvordan du oppretter dem ved hjelp av Odoo Studio eller Python, virkelige forretningsbrukstilfeller, og de vanligste feilene å unngå.
Hva er et lagret beregnet felt i Odoo
I Odoo ORM holder hvert felt på en modell en del av dataene. De fleste felt lagrer det brukeren skriver inn manuelt. Et beregnet felt er annerledes: verdien genereres av en Python-funksjon i stedet for å bli skrevet inn av en bruker.
Et lagret beregnet felt er rett og slett et beregnet felt med store=True. Når avhengighetene endres, kjører Odoo beregningsfunksjonen og skriver resultatet inn i databasekolonnen. Verdien er deretter tilgjengelig akkurat som ethvert annet felt.
I Python ser det grunnleggende mønsteret slik ut:
total_amount = fields.Float(
string='Total Amount',
compute='_compute_total_amount',
store=True,
)
@api.depends('quantity', 'unit_price')
def _compute_total_amount(self):
for record in self:
record.total_amount = record.quantity * record.unit_price
Parameteret store=True er det som skiller et lagret beregnet felt fra et vanlig beregnet felt. Uten det blir verdien beregnet på nytt hver gang feltet leses, men aldri lagret i databasen.
I Odoo-grensesnittet ser et lagret beregnet felt nøyaktig ut som ethvert annet felt. Brukere ser det på skjemaer, listevisninger og rapporter. De kan filtrere etter det, gruppere poster ved hjelp av det, og inkludere det i eksport. Det er ingen visuell indikator på at verdien er beregnet i stedet for inntastet.
Lagret vs Ikke-lagret Beregnet Felt
Å forstå denne forskjellen er essensielt for ethvert Odoo utviklings arbeid:
- Ikke-lagret beregnet felt: Beregnet på farten når det leses. Kan ikke brukes i filtre, søk eller gruppering. Letter på lagringen, men ikke tilgjengelig for databaseforespørsel.
- Lagret beregnet felt: Beregnet når avhengighetene endres og lagret i databasen. Søkbar, filtrerbar, eksportbar. Tar opp plass i databasen som enhver vanlig kolonne.
Valget mellom de to handler ikke om hvilken som er bedre generelt. Det avhenger av hva du trenger feltet til. Hvis du bare viser det på et enkelt skjema, er ikke-lagret greit. Hvis du trenger å filtrere, sortere eller aggregere etter det, bruk lagret.
Hvordan feltet fungerer
Når du definerer et lagret beregnet felt i Odoo, setter ORM opp automatiske rekalkulasjonstriggere basert på feltene som er oppført i @api.depends() dekoratoren.
Når noen av disse avhengige feltene endres på en post, merker Odoo den posten som trenger rekalkulering. Beregningsmetoden kjøres, og resultatet skrives tilbake til databasekolonnen for det feltet.
Rekomputasjonslivssyklusen
Her er hva som skjer trinn for trinn:
- En bruker eller en automatisert prosess endrer et felt som er oppført i
@api.depends(). - Odoo oppdager endringen og identifiserer alle poster som avhenger av dette feltet.
- Compute-metoden kalles for disse postene.
- Den beregnede verdien skrives til databasekolonnen.
- Feltet er nå tilgjengelig for søk, filtrering og eksport med den oppdaterte verdien.
I de fleste tilfeller skjer denne rekomputasjonen umiddelbart innenfor den samme transaksjonen. For store batchoperasjoner kan Odoo utsette noen rekomputasjoner og behandle dem i bakgrunnen.
Avhengigheter på tvers av relaterte modeller
Dekoratøren @api.depends() støtter prikkede stier for å få tilgang til felt på relaterte modeller. For eksempel:
@api.depends('partner_id.country_id.name')
def _compute_country_name(self):
for record in self:
record.country_name = record.partner_id.country_id.name or ''
I dette tilfellet sporer Odoo endringer på partner_id, country_id og name på tvers av modeller. Hvis landnavnet endres på en partner, blir alle relaterte poster automatisk rekomputert. Dette er en av de mest kraftfulle aspektene ved Odoo-rammeverket.
Database Impact
Fordi feltet er lagret, oppretter Odoo en ekte kolonne i PostgreSQL-databasen. Dette betyr at feltet deltar i SQL-spørringer direkte. Søk og filtre på lagrede beregnede felt er raske og effektive, akkurat som søk på vanlige felt.
Forretningsbrukstilfeller
Lagrede beregnede felt vises i alle områder av Odoo. Her er fem praktiske eksempler fra virkelige forretningsarbeidsflyter.
1. Salg: Marginprosent på Ordrelinjer
Et salgsteam ønsker å se marginprosenten på hver salgsordrelinje uten å åpne en kalkulator. Et lagret beregnet felt tar enhetsprisen og kostnadsprisen, beregner marginen og lagrer den på linjen. Salgslederen kan deretter filtrere ordre etter marginprosent, finne ulønnsomme linjer umiddelbart, og gruppere etter marginbånd i pivotvisninger.
2. CRM: Dager Uten Aktivitet på en Lead
Et lagret beregnet felt på CRM-leadmodellen kan spore hvor mange dager som har gått siden den siste planlagte aktiviteten. Kombiner dette med en planlagt handling som utløser rekalkulering hver morgen, og salgsteamet ditt kan filtrere leads etter inaktivitetsterskel. Ingen manuell oppfølging nødvendig.
3. Lager: Netto Tilgjengelig Mengde
For produkter med komplekse lagerregler kan et lagret beregnet felt holde en forhåndsberegnet verdi som tilgjengelig mengde minus reservert mengde. Fordi verdien er lagret, kan produktledere sortere og filtrere produktlisten etter tilgjengelighet uten at Odoo kjører komplekse lagerberegninger live for hver rad på skjermen.
4. Regnskap: Antall Forfalte Fakturaer per Kunde
På kundemodellen kan et lagret beregnet felt telle hvor mange fakturaer som for tiden er forfalt. Når regnskapsteamet åpner kontaktlisten, kan de sortere kunder etter antall forfalte fakturaer med ett klikk. Dette er kun mulig fordi tellingen er lagret i databasen i stedet for å bli beregnet på farten for hver rad.
5. Produksjon: Total Estimert Arbeidstid
I en materialliste kan et lagret beregnet felt summere den estimerte varigheten på tvers av alle arbeidsstedsoperasjoner knyttet til BOM. Produksjonsplanleggere kan deretter filtrere og sortere BOM-er etter total arbeidstid, noe som er nyttig for kapasitetsplanlegging og tidsplanlegging. Hver gang en operasjon legges til eller endres, oppdateres totalen automatisk.
Opprette eller tilpasse feltet
Det er to hovedmåter å opprette lagrede beregnede felt i Odoo: ved å bruke Odoo Studio for enkle tilfeller, eller ved å skrive Python-kode i en tilpasset modul for full kontroll.
Bruke Odoo Studio
Odoo Studio lar deg legge til beregnede felt uten å skrive noe kode. Når du oppretter et nytt felt av typen Integer, Float eller Monetary i Studio, kan du aktivere et formelalternativ som aksepterer et Python-lignende uttrykk. Studio håndterer avhengighetssporing i bakgrunnen.
Studio-beregnete felt passer godt når logikken er et enkelt aritmetisk uttrykk mellom felt på samme post. De er enkle å sette opp og krever ikke noe utviklingsmiljø. Imidlertid har de reelle begrensninger. Hvis logikken din involverer relaterte modellfelt, betingede grener eller aggregering på tvers av barneposter, vil Studio ikke være tilstrekkelig. Du vil trenge en tilpasset modul.
Dette er en viktig distinksjon når du planlegger din Odoo-tilpasning: Studio er raskt for enkle tilfeller, men Python gir deg full fleksibilitet når logikken blir kompleks.
Bruke en tilpasset Python-modul
For noe utover grunnleggende formler definerer du feltet i Python inne i en tilpasset Odoo-modul. Her er et konkret eksempel som legger til et marginprosentfelt til salgsordrelinjer:
from odoo import models, fields, api
class SaleOrderLine(models.Model):
_inherit = 'sale.order.line'
x_margin_pct = fields.Float(
string='Margin %',
compute='_compute_margin_pct',
store=True,
digits=(5, 2),
)
@api.depends('price_unit', 'purchase_price')
def _compute_margin_pct(self):
for line in self:
if line.price_unit:
line.x_margin_pct = (
(line.price_unit - line.purchase_price) / line.price_unit
) * 100
else:
line.x_margin_pct = 0.0
Når denne modulen er installert, oppretter Odoo x_margin_pct-kolonnen i databasen, kjører beregningsmetoden for alle eksisterende poster, og begynner å spore endringer i price_unit og purchase_price fra det punktet.
Feltprefikset x_ er konvensjonen for tilpassede felt i Odoo for å unngå konflikter med kjernefelt. Dette er standard praksis i Odoo-utvikling.
Gjør et lagret beregnet felt redigerbart
Som standard er beregnede felt skrivebeskyttede. Hvis du vil at brukerne skal kunne overstyre den beregnede verdien manuelt, kan du definere en inverse-metode sammen med beregningsmetoden din. Inversmetoden kjøres når en bruker skriver direkte til feltet og kan oppdatere kildefeltene deretter. Dette mønsteret er nyttig for felt der den beregnede verdien er et godt standardvalg, men som noen ganger trenger en manuell overstyring.
Odoo Studio-felt og XML-RPC API
For team som administrerer Odoo-databasefelt gjennom XML-RPC API, kan du opprette standardfelt via ir.model.fields-modellen. Men for lagrede beregnede felt med tilpasset Python-logikk, må beregningsmetoden selv være i serverkode. API-tilnærmingen fungerer godt for å tildele enkle felt som en del av automatiserte distribusjoner, men logikken bak et beregnet felt krever alltid en tilpasset modul installert på serveren.
Beste praksis
Her er praksisene som erfarne Odoo-konsulenter følger når de arbeider med lagrede beregnede felt.
Erklær alle avhengigheter nøyaktig
Dekoratøren @api.depends() må liste opp hvert felt som beregningsmetoden din leser. Hvis du glemmer ett, vil ikke feltet oppdatere seg når den avhengigheten endres. Gå gjennom beregningsmetoden din linje for linje og sørg for at hver felt-tilgang er oppført i dekoratøren.
Hold beregningsmetoder raske
Beregningmetoden din kjører på hver post som påvirkes av en avhengighetsendring. I en travel Odoo-instans kan dette bety tusenvis av poster på en gang. Unngå databaseforespørsel inne i beregningsmetoder når det er mulig. Hvis du trenger å få tilgang til relaterte data, bruk feltene som allerede er lastet i stedet for å kjøre ytterligere søk.
Bruk bare store=True når du trenger det
Lagringsfelt bruker databaseplass og utløser skriveoperasjoner ved hver rekalkulering. Hvis du bare trenger å vise feltet i et skjema og aldri filtrere eller gruppere etter det, er et ikke-lagret beregnet felt det lettere alternativet. Ta denne avgjørelsen bevisst i stedet for å standardisere til lagret for alt.
Håndter kanttilfeller i beregningsmetoden
Ta alltid hensyn til tomme eller manglende verdier inne i beregningsmetoden din. Divisjon med null, manglende relaterte poster og nullverdier er vanlige årsaker til stille feil i beregnede felt. Legg til eksplisitte sjekker og sett sikre standardverdier når den normale beregningen ikke kan fortsette.
Plan for Initial Recomputation on Large Tables
Når du installerer en modul som legger til et nytt lagret beregnet felt, beregner Odoo det for hver eksisterende post i tabellen. På en tabell med hundretusener av rader kan dette ta betydelig tid. Test migreringen din i et staging-miljø først og planlegg for potensiell nedetid eller bakgrunnsprosessering når du distribuerer til produksjon.
Avoid Circular Dependencies
Hvis felt A avhenger av felt B og felt B avhenger av felt A, vil Odoo gi en feil når modulen lastes. Design avhengighetene til de beregnede feltene slik at de flyter i én retning.
Vanlige fallgruver
Forgetting store=True
Dette er den mest vanlige feilen. Feltet vises riktig i skjemaet, så alt ser fint ut under testing. Så prøver noen å legge det til som et filter eller inkludere det i en rapport, og det fungerer ikke. Før du skriver noen beregningslogikk, bestem på forhånd om du trenger at feltet skal være søkbart. Hvis ja, legg til store=True fra starten.
Missing a Dependency in @api.depends
Hvis metoden din leser partner_id.country_id, men dekoratoren din bare lister partner_id, vil ikke feltet oppdatere seg når landet endres på partnerposten. Spor den fulle stien til hver felt tilgang i metoden din og list hvert trinn eksplisitt i dekoratoren.
Silent Errors in the Compute Method
Hvis metoden din kaster et unntak for en post, hopper Odoo stille over beregningen for den posten og beholder den tidligere lagrede verdien. Feilen kan vises i serverlogger, men ingenting vises for brukeren. Dette kan føre til utdaterte eller feilaktige verdier som er vanskelige å spore. Test alltid metoden din mot poster som har manglende eller uvanlige data.
Performance Degradation on Large Datasets
En beregningsmetode som fungerer fint under utvikling kan bli en alvorlig flaskehals i produksjon hvis tabellen vokser til titusenvis av poster. Vær oppmerksom på hvor mange databaseforespørselene metoden din utløser per post. En enkelt ekstra forespørsel per post multiplisert med ti tusen poster er ti tusen forespørselene for en enkelt lagringsoperasjon.
Bruke sudo() inne i beregningsmetoder
Å kalle sudo() inne i en beregningsmetode for å omgå tilgangsrettigheter er en sikkerhetsrisiko. Hvis den beregnede verdien eksponerer data som den nåværende brukeren ikke skal se, motvirker det Odoos tillatelsesmodell å returnere den gjennom en beregningsmetode. Bruk sudo() inne i beregningsmetoder kun når du bevisst har tenkt gjennom sikkerhetsimplikasjonene.
Forvente umiddelbar rekalkulering i alle kontekster
I de fleste interaktive operasjoner er rekalkulering synkron. Men under batchimporter, bakgrunnsjobber eller visse ORM-operasjoner med kontekstflagg, kan Odoo utsette rekalkulering. Bygg ikke forretningslogikk som antar at den lagrede verdien alltid er oppdatert i det nøyaktige øyeblikket en post skrives. Verifiser oppførselen i den spesifikke konteksten der feltet ditt vil bli brukt.
Konklusjon
Lagringsberegnede felt er et av de mest nyttige verktøyene tilgjengelig når du bygger eller utvider Odoo. De lar deg automatisere beregninger, holde dataene dine konsistente, og gjøre poster søkbare og eksportable uten noe manuelt arbeid fra brukerne dine.
De viktigste punktene å huske:
- Bruk
store=Truenår du trenger at feltet skal være søkbart, filtrerbart eller eksportbart. - Deklarer alltid alle avhengigheter i
@api.depends(), inkludert tverrmodellbaner. - Hold beregningsmetoder raske og håndter kanttilfeller eksplisitt.
- For enkle formler er Odoo Studio et raskt alternativ. For noe mer komplekst, skriv Python.
- Planlegg for initial rekalkulering når du distribuerer til produksjon på store tabeller.
Enten du bygger en ny tilpasset modul, utvider en eksisterende Odoo-modell, eller utforsker Odoo-felt typer for første gang, er lagrede beregnede felt verdt å forstå dypt. De sitter i skjæringspunktet mellom Odoo ORM, databaselaget og forretningslogikken din.
Trenger du hjelp med din Odoo-implementering?
Dasolo hjelper selskaper med å implementere, tilpasse og optimalisere Odoo for et bredt spekter av forretningsbehov. Enten du trenger å legge til beregnede felt i datamodellen din, bygge rapporter drevet av beregnede verdier, eller ta din Odoo-utvikling videre, har teamet vårt erfaringen som trengs for å hjelpe.
Ta kontakt med oss hvis du trenger støtte til ditt Odoo-prosjekt. Vi er glade for å diskutere din brukstilfelle og finne den rette tilnærmingen for din bedrift.