Gå til indhold

Brugerdefinerede objekter

Findes også på 28 sprog

English · Español · 日本語 · Português (Brasil) · Français · Deutsch · Italiano · 한국어 · 简体中文 · Português (Portugal) · 繁體中文 · Bahasa Indonesia · Türkçe · Polski · Tiếng Việt · ไทย · Nederlands · العربية · עברית · Українська · हिन्दी · Русский · Svenska · Norsk bokmål · Suomi · Español (México) · Français (Canada) · Deutsch (Schweiz)

In a truck body shop, a custom white box body hangs on chains above a standard truck chassis, already fitted with its doors, lights and mud flaps.
Billedet er lavet med AI

Modul 3 af 10 i kapitlet Dataarkitektur i Salesforce, kapitel 3 i kurset Data Architect. Hvert modul står på egne ben. Forrige: Kig på moderskibet: standarddatamodellerne · Næste: Hvor bor disse data?

Spørgsmålet, dette modul besvarer: Når Salesforce ikke har det, hvad får du så egentlig, når du bygger dit eget objekt?

I sidste modul så vi på, hvad Salesforce allerede har bygget. Nogle gange har den ikke det, du har brug for. Steve Trucking kører lastbiler, og der findes intet standardobjekt for lastbiler. Så du bygger et: et brugerdefineret objekt (custom object).

Her er det, jeg vil have dig til at se i dette modul. Et brugerdefineret objekt oprettes i metadata ligesom alt andet i modul 1, og i det øjeblik det findes, følger der en række standardfunktioner med. Det er ikke en tom tabel. Og skærmen, du udfylder for at oprette det, stiller dig arkitekturspørgsmål, uanset om du lægger mærke til det eller ej.

Gå til Setup → Object Manager → Create → Custom Object, og du får én lang formular. De fleste udfylder de to første felter og klikker på Save. Lad os sætte farten ned og læse den.

Label og Plural Label (etiket i ental og flertal). »Truck« og »Trucks«. Det er dem, brugerne ser, i faner, sidelayouts og rapporter. Du kan ændre dem senere uden de store smerter.

Object Name. Det her er anderledes: Det er API-navnet, det navn, som kode, integrationer, rapporter og nu agenter bruger. Skriv »Truck«, og Salesforce gør det til Truck__c. At ændre det senere betyder, at du skal finde alt, der henviser til det, og det er reversibilitetstesten fra kapitel 1 igen. Få det her rigtigt første gang.

Description (beskrivelse). Udfyld den. Hver gang. I modul 1 sagde jeg, at metadata ikke længere er pynt: Den næste admin læser det her, og det gør ethvert AI-værktøj, der prøver at forstå din org, også. Et brugerdefineret objekt med en tom beskrivelse er en kasse uden etiket.

Record Name (postnavn). Hvert brugerdefineret objekt har et Name-felt, og det er her, du beslutter, hvad det er. Et Text-navn som »Truck 117« eller et Auto Number som T-000184, som Salesforce udfylder for dig. Læs advarslen på den skærm: Hvis du planlægger at indsætte store mængder poster via API’et, beder Salesforce dig bruge Text. Det er platformen, der fortæller dig noget om skala, før du har oprettet en eneste post.

Afsnittet Record Name på skærmen New Custom Object: feltet Record Name, datatypen Text og advarslen om at bruge datatypen Text, hvis du planlægger at indsætte store mængder poster via API'et

Salesforce Setup, New Custom Object: afsnittet Record Name med sin advarsel (skærmbillede, 12. oktober 2026). Fuld størrelse

Optional Features (valgfrie funktioner). Allow Reports, Allow Activities, Track Field History, Allow in Chatter Groups. Slået fra som standard. Hver af dem er en funktion, du slår til for dette objekt; beslut det med vilje.

Object Classification (objektklassifikation). Allow Sharing, Allow Bulk API Access, Allow Streaming API Access, alle slået til som standard. Skærmen siger det ligeud: Med dem slået til er objektet et Enterprise Application-objekt; med dem slået fra er det et Light Application-objekt. De navne svarer til Salesforces licenser til app-abonnementer: En Lightning Platform Light App har ingen deling på postniveau og kan ikke bruge Bulk API eller Streaming API, og en Enterprise App kan. Mit råd: Lad dem være slået til, medmindre du ved præcis, hvorfor ikke. Slå Bulk API-adgang fra på et objekt, du senere skal indlæse store mængder i, og du finder ud af, hvorfor det betød noget.

Deployment Status og Search. »In Development« skjuler objektet for brugerne, mens du bygger det; »Deployed« gør det live. Og Allow Search er slået fra som standard, så brugerne finder ikke disse poster i den globale søgning, før du slår den til. Den fanger folk hver gang.

Afsnittene Object Classification, Deployment Status og Search Status: Allow Sharing, Allow Bulk API Access og Allow Streaming API Access er markeret; Deployed er valgt; Allow Search er ikke markeret

Standardindstillingerne: de tre API-indstillinger slået til, Deployed, og Allow Search slået fra (skærmbillede, 12. oktober 2026). Fuld størrelse

Klik på Save, og Object Manager viser dig objektet: API-navnet Truck__c, et flueben i Custom, etiketterne, deployment-statussen. Se dog ned ad venstre side: Fields & Relationships, Page Layouts, Lightning Record Pages, Record Types, Validation Rules, Triggers, Flow Triggers, Object Access, Field Access. Den liste er modul 1 gjort synligt. Et objekt er ikke bare lagerplads; det er stedet, hvor al den adfærd hænger fra.

Object Manager med objektet Truck: API Name Truck__c, Custom markeret, etiketter i ental og flertal og listen i venstre side fra Fields & Relationships til Validation Rules

Object Manager, Truck: API-navnet Truck__c, Custom og alt det, der hænger på et objekt (skærmbillede, 12. oktober 2026). Fuld størrelse

Åbn Fields & Relationships på et splinternyt brugerdefineret objekt, og det har allerede felter. Hvert brugerdefineret objekt får et standardsæt:

  • Name, postnavnet, du lige har valgt, som bruges i sidelayouts, relaterede lister, lookups og søgeresultater.
  • Owner, den bruger eller kø, der ejer posten.
  • Created By og Last Modified By, de brugere, der oprettede den og sidst ændrede den.
  • Currency, hvis flere valutaer er slået til, og Division, hvis din org bruger divisioner.

Og nedenunder post-id’et fra modul 1 samt oprettelses- og ændringsdatoerne. Eksportér et par poster med Data Loader, så ser du dem alle.

Et af dem kan forsvinde. Gør dit brugerdefinerede objekt til detaljesiden i en master-detail-relation, og Owner-feltet forsvinder: Ejerskabet kommer i stedet fra masterposten. Det er en større sag, end det lyder, og vi vender tilbage til det i modul 7 og 8.

Præfikser og suffikser: hvad du kigger på

Sektion kaldt “Præfikser og suffikser: hvad du kigger på ”

I sidste modul sagde jeg, at standardobjekter hverken har præfiks eller suffiks. Det har alt andet, og når du først kan læse dem, fortæller en feltliste dig præcis, hvad du kigger på.

Sådan ser det udDet er
Account, CaseEt standardobjekt eller -felt: intet præfiks, intet suffiks
Truck__cEt brugerdefineret objekt eller et brugerdefineret felt som Unit_Number__c
abc__Inspection__cEt brugerdefineret objekt fra en managed package: abc er leverandørens namespace
Delivery_History__bEt big object (modul 4)
Shipment__xEt eksternt objekt: dataene bor i et andet system (modul 4)
Allergies__pcEt brugerdefineret kontaktfelt på en personkonto (modul 2)
Truck__rRelationen bag et brugerdefineret lookup, når du følger det i en forespørgsel

Et par ting at lægge mærke til.

Indtil videre er det en liste. Sådan underviser jeg i det: som lag. Der er tre slags objekter, standard, brugerdefinerede og fra managed packages, og hver af dem kan have de samme slags felter: de standardfelter, objektet kom med, og de brugerdefinerede felter, nogen har tilføjet.

Standardobjekter. Account har hverken præfiks eller suffiks, og det har dens standardfelter heller ikke: Name, Industry, OwnerId. Du kan tilføje brugerdefinerede felter til de fleste standardobjekter, og hvert felt, du tilføjer, ender på __c: Region__c (Custom Fields (opens in a new tab)). Det suffiks er det, der beskytter dig. Salesforce tilføjer nye standardfelter til Account i sine releases, og fordi dine altid ender på __c og deres aldrig gør, kan et fremtidigt standardfelt aldrig støde sammen med et felt, du allerede har.

Brugerdefinerede objekter. Dit eget objekt ender på __c, Truck__c (Custom Objects (opens in a new tab)), og det gør de brugerdefinerede felter, du sætter på det, også: Unit_Number__c. Men de felter, det blev født med, dem fra forrige afsnit, er standardfelter: Name, OwnerId, CreatedDate, uden suffiks. Så selv på dit eget objekt fortæller suffikset dig, hvem der lavede hvert felt.

Objekter fra managed packages. Når du installerer en managed package fra AppExchange, kommer dens objekter og felter med leverandørens namespace-præfiks: abc__Inspection__c og felter som abc__Result__c. Det præfiks er unikt for leverandøren, og det ændrer sig ikke (Namespace Prefix (opens in a new tab)). Med Salesforces egne ord føjes præfikset til hver komponent for at gøre den unik: name__c bliver til prefix__name__c (AppExchange Object Prefixes and the API (opens in a new tab)). Så to leverandører kan begge levere et objekt ved navn Invoice__c uden nogensinde at støde sammen med hinanden eller med dig. Pakkens objekter har stadig deres standardfelter, Name og OwnerId, uden præfiks. En pakke kan også tilføje sine egne felter med præfiks til standardobjekter, som abc__Score__c på Account. Og du kan tilføje dine egne brugerdefinerede felter til en pakkes objekter: Depot__c på abc__Inspection__c får dit __c-suffiks, men aldrig leverandørens præfiks, fordi det er dig, der har lavet det, ikke dem (Known Issue: unmanaged custom field on a managed package object (opens in a new tab)).

At læse navnene Tre typer objekter, hver læst i de samme fire lag. Et standardobjekt, bygget af Salesforce: Account; dets standardfelter, som Name, OwnerId og Industry, har intet suffiks; en administreret pakke kan tilføje sine egne felter, som abc__Score__c; dine brugerdefinerede felter ender på __c, som Region__c. Et brugerdefineret objekt, bygget af dig: Truck__c; dets standardfelter, Name, OwnerId og CreatedDate, har intet suffiks; ingen pakkefelter, fordi objektet er dit; dine brugerdefinerede felter ender på __c, som Unit_Number__c. Et objekt fra en administreret pakke, installeret fra leverandøren abc: abc__Inspection__c; dets standardfelter har intet præfiks; pakkens egne felter bærer præfikset, som abc__Result__c; og felter, du tilføjer, som Depot__c, får dit suffiks __c, men aldrig leverandørens præfiks. Nedenunder: intet suffiks er Salesforces, __c er brugerdefineret, og abc__ er leverandørens, og det ændres aldrig. Standardobjekt bygget af Salesforce OBJEKTET Konto DETS STANDARDFELTER Name, OwnerId, Industry: intet suffiks EN PAKKES FELTER abc__Score__c, hvis en pakke tilføjer et DINE BRUGERDEFINEREDE FELTER Region__c Brugerdefineret objekt bygget af dig OBJEKTET Truck__c DETS STANDARDFELTER Name, OwnerId, CreatedDate: intet suffiks EN PAKKES FELTER ingen: objektet er dit DINE BRUGERDEFINEREDE FELTER Unit_Number__c Objekt fra en administreret pakke installeret, fra leverandøren abc OBJEKTET abc__Inspection__c DETS STANDARDFELTER Name, OwnerId, CreatedDate: intet præfiks EN PAKKES FELTER abc__Result__c DINE BRUGERDEFINEREDE FELTER Depot__c: dit suffiks, aldrig deres præfiks Intet suffiks: Salesforces. __c: brugerdefineret. abc__: leverandørens, og det ændres aldrig. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Læs et hvilket som helst API-navn, og du ved, hvem der lavede det. Intet suffiks: Salesforce. __c uden præfiks: din org. abc__ foran: leverandøren. Det betyder noget, hver gang du planlægger en ændring. Det, der er dit, kan du ændre. Det, der er Salesforces, konfigurerer og udvider du. Det, der er leverandørens, er for det meste låst: Nogle få ting, som sidelayouts og hjælpetekst, kan du redigere, men det meste af pakken og hvert eneste API-navn tilhører leverandøren, og deres opgraderinger bringer deres ændringer med (Editable Properties After Package Promotion or Installation (opens in a new tab)).

Unmanaged packages gør ikke. Installér en unmanaged package, og dens objekter lander i din org, som om du selv havde bygget dem, uden præfiks. Hvis den har et Truck__c med, og du allerede har et, har du en navnekollision. Tjek før du installerer.

Det er nemt at oprette et brugerdefineret objekt; det er præcis derfor, jeg mener, vi opretter for mange af dem. Skærmen New Custom Object laver gladelig et Customer__c til dig i en org, der allerede har Account. Så før du klikker, så stil spørgsmålet fra sidste modul: Har moderskibet allerede det her? Hvis det har, så brug det. Hvis ikke, så byg det, og udfyld hele skærmen som en arkitekt.

Næste modul stiller et endnu tidligere spørgsmål: Skal disse data overhovedet være i Salesforce?

  • Om Salesforce allerede har et standardobjekt til det her, før du bygger et brugerdefineret.
  • API-navnet, valgt én gang, og en beskrivelse skrevet til både mennesker og maskiner.
  • Postnavnet: Text eller Auto Number, med den forventede volumen i tankerne.
  • Hvilke valgfrie funktioner, hvilken API-adgang og hvilken søgning der skal slås til, med vilje.
  • Hvad suffikserne i en org fortæller dig: brugerdefineret, managed, big object, eksternt objekt, personkonto.
  • Om en pakke, du er ved at installere, kan støde sammen med det, du har bygget.