Johdanto
Jos olet käyttänyt Odoota, olet todennäköisesti nähnyt kenttiä, joiden arvo syntyy automaattisesti. Tallennettu laskettu kenttä vie tämän pidemmälle: arvo lasketaan ohjelmallisesti ja kirjoitetaan suoraan tietokantaan, joten sitä käsitellään kuten tavallista saraketta.
Tämä ero ei ole vain tekninen yksityiskohta. Kun arvo on tallennettu, sitä voidaan hakea, suodattaa, ryhmitellä ja viedä tehokkaasti tietokannasta. Laskettu mutta ei tallennettu kenttä lasketaan aina pyydettäessä eikä sovi tehokkaaseen tietokantahakuun.
Tässä oppaassa käydään läpi tallennettujen laskettujen kenttien periaatteet Odoon tietomallissa, miten kenttä luodaan joko Studio-työkalulla tai Pythonilla, käytännön käyttötapaukset sekä virheet ja suorituskykyasiat, joihin kannattaa varautua.
Mikä on tallennettu laskettu kenttä Odoossa
Odoo-malleissa jokaisella kentällä on tehtävänsä: yleensä käyttäjä antaa arvon. Laskettu kenttä eroaa tästä, koska sen arvo tuotetaan Python-funktiolla sen sijaan, että käyttäjä kirjoittaisi sen käsin.
Tallennettu laskettu kenttä on yksinkertaisesti laskettu kenttä, jolla on store=True. Kun riippuvuudet muuttuvat, Odoo suorittaa laskentafunktion ja kirjoittaa tuloksen tietokantaan — kenttä käyttäytyy sen jälkeen kuten mikä tahansa tallennettu sarake.
Kuvausperiaate Pythonissa
Yksinkertainen malli on määritellä kenttä, laskea arvo compute-metodissa ja merkitä kenttä tallennettavaksi. Compute-metodi lukee tarvittavat kentät ja asettaa tuloksen kohdekenttään.
store=True -parametri erottaa tallennetun laskennallisen kentän laskettavasta, ei-tallennetusta kentästä. Ilman sitä arvoa ei säilötä tietokantaan, vaan se lasketaan joka kerta, kun kenttää luetaan.
Käyttäjän näkökulmasta tallennettu laskettu kenttä näyttää samanlaiselta kuin muut kentät: lomakkeissa, listanäkymissä ja raporteissa arvo näkyy ja sitä voi suodattaa, ryhmittää ja viedä. Käyttöliittymä ei erikseen ilmoita, onko arvo laskettu vai syötetty manuaalisesti.
Tallennettu vs. ei-tallennettu laskettu kenttä
Tämän eron ymmärtäminen on tärkeää Odoo-kehityksessä:
- Ei-tallennettu laskettu kenttä: arvo lasketaan lennossa aina lukemisen yhteydessä. Sitä ei voi suoraan käyttää hakuehdoissa, suodattimissa tai ryhmittelyssä. Se on tilankäytöltään kevyt mutta ei osallistu SQL-hakuun.
- Tallennettu laskettu kenttä: arvo lasketaan riippuvuuksien muuttuessa ja säilötään tietokannassa. Se on haettavissa, suodatettavissa ja vietävissä, mutta vie tilaa kuten mikä tahansa sarake.
Valinta ei perustu siihen, kumpi on yleisesti parempi, vaan siihen, mitä kenttältä tarvitset. Jos arvoa näytetään vain yhdessä lomakkeessa, ei-tallennettu riittää. Jos aiot suodattaa, lajitella tai aggregoida sen perusteella, valitse tallennettu.
Miten kenttä toimii
Kun määrittelet tallennetun kentän, Odoon ORM asettaa automaattiset recompute-triggereitä sen mukaan, mitä kenttiä merkitset @api.depends()-koristeluun.
Kun jokin riippuvuuskentistä muuttuu, Odoo merkitsee kyseiset tietueet uudelleenlaskentaa vaativiksi, suorittaa compute-metodin ja kirjoittaa tuloksen takaisin tietokantaan.
Uudelleenlaskennan elinkaari
Prosessi etenee tyypillisesti seuraavasti:
- Käyttäjä tai automaatio muuttaa riippuvuuskenttää.
- Odoo havaitsee muutoksen ja löytää vaikuttavat tietueet.
- Compute-metodi suoritetaan näille tietueille.
- Laskettu arvo kirjoitetaan tietokantaan.
- Kenttä on nyt päivitetty ja käytettävissä hauissa, suodattimissa ja vientitiedoissa.
Yleensä recompute tapahtuu saman transaktion sisällä. Suurissa erissä Odoo voi lykätä osan laskennoista ja prosessoida ne taustalla.
Riippuvuudet liittyvien mallien yli
@api.depends() tukee pistemerkkijonoja (dotted paths), joiden avulla voit reagoida myös liittyvien mallien kenttien muutoksiin.
Esimerkiksi riippuvuus partner_id.country_id.name varmistaa, että maan nimen muutos partnerissa laukaisee recomputen myös muissa malleissa, jotka käyttävät tätä polkua.
Tämä kyky seurata muutoksia eri mallien kentissä on yksi Odoon vahvimmista puolista: muutoksen aikaan saama vaikutus liikkuu automaattisesti läpi riippuvuushierarkian.
Vaikutus tietokantaan
Koska kenttä tallennetaan, Odoo luo sitä vastaavan sarakkeen PostgreSQL-tauluun. Näin kenttä osallistuu suoraan SQL-kyselyihin, mikä tekee hauista ja suodatuksista nopeita ja tehokkaita.
Liiketoimintatapaukset
Käytännön esimerkkejä tallennetuista kentistä
1. Myynti: kateprosentti rivikohtaisesti
Myyntitiimi haluaa nähdä kateprosentin myyntitiliriveillä nopeasti. Tallennettu kenttä laskee myyntihinnan ja ostohinnan erotuksen ja tallentaa prosenttiosuuden riville. Myyntipäällikkö voi sitten suodattaa huonoja katteita sisältäviä rivejä tai ryhmitellä tilauksia katealueiden mukaan.
2. CRM: päivät ilman aktiviteettia liidillä
CRM-malliin lisättävä tallennettu kenttä voi laskea päivät viimeisestä aktiviteetista. Ajoitetulla toiminnolla recompute voidaan ajaa päivittäin, jolloin myyjät voivat suodattaa passiiviset liidit ilman manuaalista seurantaa.
3. Varastointi: nettosaatavuus
Monimutkaisissa varastoasetuksissa tallennettu kenttä voi sisältää esilasketun arvojen, kuten saatavan määrän miinus varattu määrä. Näin tuotteita voidaan suodattaa ja lajitella saatavuuden mukaan ilman kalliita laskelmia käyttöliittymän riviä kohden.
4. Kirjanpito: myöhässä olevien laskujen määrä asiakkaalla
Asiakkaan tietueeseen tallennettu laskuri myöhässä olevista laskuista antaa tilitoimistolle mahdollisuuden lajitella kontakteja nopeasti maksuriskin mukaan — tämä toimii sujuvasti, koska arvo on tallennettu tietokantaan.
5. Tuotanto: arvioitu kokonaiskesto valmistusosalle
Tuotannossa BOM:iin tallennettu kenttä voi summata työvaiheiden kestot. Suunnittelijat voivat suodattaa ja järjestää BOMeja kokonaiskeston mukaan, ja arvo päivittyy automaattisesti, kun työvaiheita lisätään tai muokataan.
Kentän luominen tai muokkaaminen
Kentän luontitavat
Kentän voi luoda kahdella pääasiallisella tavalla: Odoo Studiolla yksinkertaisiin kaavoihin tai Python-moduulilla monimutkaiseen logiikkaan.
Odoo Studio
Studio mahdollistaa laskettujen kenttien lisäämisen ilman koodausta. Kun lisäät kokonaisluku-, liuku- tai rahakentän, voit käyttää yksinkertaista kaavaeditoria, joka hallinnoi riippuvuuksia taustalla. Tämä sopii hyvin suoriin laskutoimituksiin saman tietueen kenttien välillä.
Studio on nopea ratkaisu yksinkertaisiin tarpeisiin, mutta se ei korvaa Pythonin tarjoamaa joustavuutta silloin, kun logiikka käyttää liittyviä malleja, ehtoja tai kokoelmien aggregointia.
Mukautettu Python-moduuli
Kaikessa muussa kuin peruslaskuissa kannattaa kirjoittaa kenttä Pythonissa osana omaa moduulia. Silloin voit määritellä compute- ja riippuvuuslogiikan tarkasti ja hyödyntää ORM:ää tehokkaasti.
Esimerkiksi myyntiriveille voi lisätä marginaaliprosenttikentän, joka laskee erotuksen suhteessa myyntihintaan ja tallentaa sen tietokantaan, ja @api.depends-listaan merkataan hinta- ja ostohintakentät.
Kun moduuli asennetaan, Odoo luo uuden sarakkeen tietokantaan, laskee arvon olemassa oleville riveille ja alkaa seurata riippuvuuksien muutoksia.
Käytä x_-etuliitettä omille kentille välttääksesi nimeämisristiriitoja ja noudata tätä käytäntöä Odoo-kehityksessä.
Tallennetun kentän muokattavaksi tekeminen
Oletuksena laskettavat kentät ovat vain luettavia. Jos haluat sallia manuaalisen korjauksen, määrittele compute-metodin lisäksi inverse-metodi. Inverse ajaa, kun käyttäjä kirjoittaa kenttään, ja voi päivittää lähdetietoja niin, että manuaalinen muutos säilyy.
Odoo Studio -kentät ja XML-RPC
Jos hallitset Odoo-tietokannan kenttiä XML-RPC:n kautta, voit luoda peruskenttiä ir.model.fields-mallin kautta. Tallennettujen kenttien laskentalogiikka kuitenkin vaatii palvelinpuolen Python-koodin, joten monimutkaiset compute-kentät toteutetaan moduulissa.
Parhaat käytännöt
Parhaat käytännöt tiimeiltä, jotka työskentelevät paljon tallennettujen kenttien kanssa
Ilmoita kaikki riippuvuudet täsmällisesti
Merkitse @api.depends()-koristeluun kaikki kentät, joita compute-metodisi lukee. Unohdus johtaa tilanteeseen, jossa kenttä ei päivity odotetusti. Käy läpi koodisi ja varmista, että kaikki kenttiviittaukset näkyvät riippuvuuksissa.
Pidä compute-metodit nopeina
Compute-metodit ajetaan kaikille niille tietueille, jotka muuttuvat riippuvuuksien vuoksi. Ruuhkaisessa järjestelmässä tämä voi tarkoittaa tuhansia rivejä. Vältä ylimääräisiä hakukyselyjä metodeissa ja käytä jo ladattuja kenttiä aina kun mahdollista.
Käytä store=True vain kun tarvitset sitä
Tallennetut kentät vievät tilaa ja aiheuttavat tietokantakirjoituksia recomputessa. Jos kenttää käytetään vain näyttötarkoituksessa ilman suodatuksia tai raportointia, ei-tallennettu on kevyempi vaihtoehto.
Käsittele reunatapaukset compute-metodissa
Tarkista nollajako, puuttuvat liittyvät tietueet ja null-arvot. Nämä ovat yleisimpiä virheidä laskettavissa kentissä. Aseta turvalliset oletusarvot tilanteisiin, joissa normaali laskenta ei onnistu.
Suunnittele alkuperäinen recompute suurille taulukoille
Kun moduuli asentaa uuden tallennetun kentän, Odoo recomputtaa kaikki olemassa olevat rivit — tämä voi kestää paljon aikaa suurilla tietomäärillä. Testaa migraatiot esikaupallisessa ympäristössä ja varaudu mahdolliseen taustaprosessointiin tai käyttökatkokseen tuotannossa.
Vältä syklisiä riippuvuuksia
Jos kenttä A riippuu kentästä B ja kenttä B kentästä A, Odoo antaa virheen moduulia ladattaessa. Suunnittele riippuvuudet yhteen suuntaan.
Yleisimpiä sudenkuoppia
Unohtunut store=True
Yleisimmistä virheistä on jättää store=True pois. Kenttä näyttää toimivan lomakkeella, mutta suodatus tai raportit eivät toimi. Päätä etukäteen, pitääkö kenttä olla haettavissa, ja lisää store=True heti tarvittaessa.
Puuttuva riippuvuus @api.dependsissa
Jos compute-metodi lukee partner_id.country_id mutta riippuvuuksiin merkitään vain partner_id, kenttä ei päivity kun maan tieto muuttuu. Listaa kaikki polun vaiheet riippuvuuksiin.
Hiljaiset virheet compute-metodissa
Jos compute-metodi heittää poikkeuksen tietueella, Odoo ohittaa recomputen tälle riville ja säilyttää vanhan arvon. Virhe näkyy yleensä lokissa mutta ei käyttäjälle, mikä voi johtaa vanhentuneisiin tietoihin. Testaa metodeja tilanteilla, joissa data voi olla epätavallista.
Suorituskyvyn heikkeneminen suurilla aineistoilla
Toimiva kehitysaikainen metodi voi tulla pullonkaulaksi tuotannossa, kun rivejä on kymmeniätuhansia. Varmista, ettei compute-metodi tee ylimääräisiä kyselyjä per rivi — yksi lisäkysely per rivi voi tarkoittaa kymmeniätuhansia kyselyjä tallennusta kohden.
sudo() compute-metodeissa
sudo()-kutsun käyttö compute-metodissa ohittaa käyttöoikeudet ja voi rikkoa tietoturvamallin. Käytä sudo():a vain, kun olet tietoinen tietoturvariskeistä ja tarkoituksella haluat kiertää oikeudet.
Välittömän recomputen oletus kaikissa konteksteissa
Interaktiivisissa toiminnoissa recompute on usein synkroninen, mutta batch-importissa, taustajobseissa tai tietyissä ORM-konteksteissa recompute voidaan lykätä. Älä rakenna liiketoimintalogiikkaa, joka olettaa kentän olevan aina välittömästi päivittynyt kirjoituksen jälkeen.
Yhteenveto
Tallennetut laskettavat kentät ovat erittäin hyödyllisiä Odoo-laajennuksissa: ne automatisoivat laskelmia, pitävät datan eheänä ja tekevät tiedoista suodatettavia ja vietäviä ilman käyttäjän käsityötä.
Keskeiset muistettavat asiat:
- Käytä store=True silloin kun kentän pitää olla haettavissa, suodatettavissa tai vietävissä.
- Ilmoita kaikki riippuvuudet @api.dependsissa, myös eri mallien polut.
- Pidä compute-metodit suorituskykyisinä ja käsittele reunatapaukset eksplisiittisesti.
- Odoo Studio sopii yksinkertaisiin kaavoihin; monimutkaiseen logiikkaan kirjoita Python.
- Suunnittele alkuperäinen recompute ennen tuotantoon vientiä suurilla tauluilla.
Olitpa rakentamassa uutta moduulia, laajentamassa olemassa olevaa mallia tai tutustumassa Odoon kenttätyyppeihin, tallennetut laskettavat kentät yhdistävät ORM:n, tietokannan ja liiketoimintasäännöt — niiden ymmärtäminen kannattaa.
Tarvitsetko apua Odoo-implementaatiossa?
Dasolo auttaa yrityksiä ottamaan Odoon käyttöön, räätälöimään ja optimoimaan sen eri liiketoimintatarpeisiin. Kun tarvitset apua laskettavien kenttien lisäämisessä, raporttien rakentamisessa tai syvällisemmässä Odoo-kehityksessä, tiimimme osaaminen on käytettävissäsi.
Ota yhteyttä, niin keskustellaan tarpeistasi ja etsitään teille sopiva ratkaisu.