Warsztat: obiekt Nieruchomość krok po kroku
Instrukcja do samodzielnej pracy: w około 65 minut zbudujesz obiekt Nieruchomość z polami wszystkich podstawowych typów, relacjami, formułą i Roll-Up Summary.
W ok. 65 minut (plus 15 minut zadania samodzielnego) zbudujesz w swoim Salesforce obiekt Nieruchomość z polami wszystkich podstawowych typów. Przy każdym kroku masz zrzut ekranu, a czerwone numery na zrzucie odpowiadają numerom w tekście. Pełne wyjaśnienia każdego typu pola i jego pułapek we Flow znajdziesz w lekcji Pola i typy pól w Salesforce.
Zanim zaczniesz
Potrzebujesz: przeglądarki Chrome i darmowego konta Salesforce Developer Edition z uprawnieniami administratora.
Gdzie pracujesz: koło zębate w prawym górnym rogu → Setup → zakładka Object Manager.
Trzy zasady na cały kurs:
-
Etykieta po polsku, nazwa API po angielsku. Salesforce psuje nazwy tworzone z polskich liter. Pole z nazwą API zawsze poprawiaj ręcznie.
-
Typ pola wybierasz raz. Zmiana typu później bywa niemożliwa albo kasuje dane. Przeczytaj opis kroku, zanim klikniesz Next.
-
Opisuj każde pole w Description. Za pół roku nikt nie będzie pamiętał, po co powstało.
Twój ekran może się nieznacznie różnić od zrzutów, np. edytorem formuł. Przyciski i pola mają jednak te same nazwy.
Etap 1: utwórz obiekt Nieruchomość (10 min)
Krok 1.1. W Object Managerze kliknij Create (1) → Custom Object (2).
Krok 1.2. Wpisz nazwy:
-
Label: Nieruchomość
-
Plural Label: Nieruchomości
-
Object Name: Property - popraw ręcznie, Salesforce podpowie błędne "Nieruchomo".
-
Record Name: Nazwa nieruchomości
Krok 1.3. Zostaw Data Type = Text (1). Zaznacz Allow Reports, Allow Activities, Track Field History (2).
Record Name - Text czy Auto Number?
Record Name to nazwa, pod którą rekord pokazuje się wszędzie: na listach, w wynikach wyszukiwania, w polach Lookup i na powiązanych listach. Data Type decyduje, skąd ta nazwa pochodzi.
-
Text - nazwę wpisuje użytkownik, np. Kwiatowa 5/12, Gdańsk. Wybierasz, gdy rekord ma naturalną, czytelną nazwę.
-
Auto Number - Salesforce sam nadaje kolejny numer według wzoru, np. OF-00001, a pole jest tylko do odczytu. Wybierasz, gdy rekord nie ma sensownej nazwy własnej: oferta, zgłoszenie, zamówienie.
Nieruchomość zostaje na Text, bo adres niesie informację - NR-00001 w podpowiedzi pola Lookup nie powie nic. Auto Number zobaczysz w etapie 4, na obiekcie Oferta. Salesforce dokłada przy tym polu własne ostrzeżenie: przy masowym wstawianiu rekordów przez API pewniejszy jest Text. Typ da się zmienić po utworzeniu obiektu, ale zmiana dotyka wszystkich istniejących rekordów - decyduj, zanim wprowadzisz dane.
Co włączają opcje na tym ekranie
| Opcja | Co dostajesz |
|---|---|
| Allow Reports | Obiekt pojawia się w kreatorze raportów i dashboardów. Bez tego dane siedzą w bazie, ale nie policzysz ich w raporcie. |
| Allow Activities | Do rekordu podepniesz zadania i wydarzenia - historia telefonów, spotkań i przypomnień na osi aktywności. |
| Track Field History | Odblokowuje przycisk Set History Tracking na obiekcie. Wskazujesz do 20 pól, a Salesforce zapisuje każdą zmianę: kto, kiedy, z czego na co. |
| Allow in Chatter Groups | Rekordy można dodawać do grup Chattera. Na kursie niepotrzebne. |
| Enable Licensing | Dotyczy pakietów dystrybuowanych przez AppExchange. Zostaw puste. |
| Allow Sharing, Allow Bulk API Access, Allow Streaming API Access | Razem decydują o klasie obiektu: zaznaczone = Enterprise Application (reguły współdzielenia, masowy import przez Bulk API, zdarzenia Streaming API), odznaczone = Light Application. Zostaw zaznaczone - odznaczenie odcina reguły współdzielenia i masowy import. |
| Deployment Status | In Development ukrywa obiekt przed zwykłymi użytkownikami, widzą go tylko administratorzy. Deployed udostępnia go wszystkim, którzy mają uprawnienia. |
| Allow Search | Rekordy wyskakują w globalnej wyszukiwarce i w podpowiedziach pól Lookup. |
| Add Notes and Attachments related list to default page layout | Na układzie strony ląduje sekcja na notatki i pliki - np. zdjęcia albo skan umowy przy nieruchomości. |
| Launch New Custom Tab Wizard after saving this custom object | Po zapisaniu Salesforce od razu otworzy kreator zakładki. To właśnie dzieje się w Kroku 1.5. |
Dwie ostatnie pozycje to sekcja Object Creation Options - Salesforce pokazuje ją wyłącznie przy tworzeniu obiektu. Resztę zmienisz później przyciskiem Edit na obiekcie.
Krok 1.4. Na dole formularza:
-
Deployment Status: Deployed
-
Zaznacz Allow Search
-
Zaznacz obie opcje z sekcji Object Creation Options
-
Kliknij Save
Krok 1.5. Otworzy się kreator zakładki - trzy ekrany, z których dwa zwykle przeklikuje się przyciskiem Next bez czytania. To błąd: właśnie te dwa decydują o tym, czy ktokolwiek zobaczy Twój obiekt w systemie.
Gdyby kreator się nie otworzył, znajdziesz go ręcznie: w Setup wpisz Tabs, a w sekcji Custom Object Tabs kliknij New (1).
Ekran 1 - wygląd zakładki. Pole Object jest już wypełnione (1). Kliknij ikonę lupy przy Tab Style (2) i wybierz ikonę, np. Building - wybór ikony otwiera się w osobnym oknie przeglądarki. Pola Description i Splash Page możesz zostawić puste. Kliknij Next.
Ekran 2 - Add to Profiles. Tu ustawiasz, kto widzi zakładkę. Dla każdego profilu masz trzy opcje:
| Ustawienie | Co oznacza |
|---|---|
| Default On | zakładka jest od razu w pasku nawigacji |
| Default Off | zakładka istnieje, ale użytkownik musi sam ją sobie dodać przez App Launcher |
| Tab Hidden | użytkownik nie widzi zakładki i nie może jej dodać |
W tym orgu pracujesz na profilu System Administrator - ustaw mu Default On (1) i kliknij Next (2). Na górze ekranu jest też pole Apply one tab visibility to all profiles, które ustawia to samo wszystkim naraz. W orgu kursowym wygodne, w produkcyjnym niebezpieczne - jednym kliknięciem pokazujesz obiekt całej firmie.
Ukrycie zakładki nie ukrywa danych. Tab Hidden zabiera tylko pozycję w nawigacji. Rekordy nadal będą widoczne w wyszukiwarce, raportach i pod bezpośrednim linkiem, bo o dostęp do danych odpowiadają uprawnienia do obiektu, nie zakładka. To dwie osobne rzeczy i mylenie ich jest jednym z częstszych błędów początkujących administratorów.
Ekran 3 - Add to Custom Apps. Wskazujesz, w których aplikacjach zakładka ma się pojawić (1). Jeśli nie zaznaczysz żadnej, zakładka powstanie, ale nie znajdziesz jej w żadnym pasku nawigacji - tylko w App Launcherze. Kliknij Save.
Krok 1.6. Sprawdź widoczność zakładki na profilu, z którego korzystasz. W Setup wpisz w wyszukiwarce Profiles i otwórz System Administrator. Zjedź na dół strony do sekcji Custom Tab Settings (1) - zobaczysz tam pozycję Nieruchomości z wartością Default On, czyli dokładnie to, co ustawiono w kreatorze. Żeby zmienić tę wartość, klikasz Edit u góry profilu i odnajdujesz tę samą sekcję w trybie edycji.
Ta strona wygląda różnie w różnych organizacjach i warto o tym wiedzieć, zanim zaczniesz szukać nie tam, gdzie trzeba. Decyduje ustawienie Enhanced Profile User Interface. Gdy jest wyłączone, jak w tym orgu, profil to jedna długa strona podzielona na sekcje i ustawienia zakładek znajdziesz w Custom Tab Settings. Gdy jest włączone, profil ma widok kafelkowy, a te same ustawienia siedzą w Object Settings - razem z uprawnieniami do obiektu i do pól.
Niezależnie od wyglądu zasada jest ta sama: jeśli użytkownik mówi "nie widzę tego obiektu", zaczynasz szukać na jego profilu.
Dla obiektu Oferta zakładki nie tworzymy. Oferta jest rekordem podrzędnym w relacji Master-Detail, więc nie istnieje samodzielnie - każda musi mieć przypisaną Nieruchomość. Tworzona z powiązanej listy na rekordzie Nieruchomości dostaje to powiązanie automatycznie. Gdyby powstawała z własnej zakładki, użytkownik musiałby za każdym razem wskazywać rodzica ręcznie, a przy pomyłce oferta wylądowałaby przy złej nieruchomości.
Krok 1.7. Sprawdź wynik: API Name ma wartość Property__c (1).
Checklista etapu 1:
-
API Name obiektu to
Property__c -
Zaznaczone Allow Reports i Allow Search
-
Istnieje zakładka Nieruchomości
Etap 2: pierwsze pole krok po kroku (10 min)
Każde pole tworzysz tym samym kreatorem w 4 krokach. Przejdziemy go raz na polu Ulica i numer.
Krok 2.1. W obiekcie otwórz Fields & Relationships i kliknij New (1). Cztery pola na liście (2) Salesforce dodał sam.
Krok 2.2 (kreator 1/4). Zaznacz Text (1) i kliknij Next.
Krok 2.3 (kreator 2/4). Wypełnij pola:
-
Field Label: Ulica i numer
-
Length: 120
-
Field Name: Street
-
Help Text: Wpisz ulicę z numerem, np. ul. Lipowa 5/12.
-
Required: zostaw puste
-
Kliknij Next
Krok 2.4 (kreator 3/4). Nic nie zmieniaj, kliknij Next. Tu decydujesz, które profile widzą pole (1) i czy tylko je czytają (2).
Krok 2.5 (kreator 4/4). Zostaw zaznaczony układ strony (1). Kliknij Save & New (2), żeby od razu dodać kolejne pole.
Checklista etapu 2:
-
Pole
Street__cjest na liście pól -
Umiesz powiedzieć, czym różni się Field Label od Field Name
Etap 3: pozostałe pola (20 min)
Powtarzaj kreator z etapu 2 dla każdego wiersza tabeli. Różni się tylko krok 2/4. W krokach 3/4 i 4/4 nic nie zmieniasz.
| Typ (krok 1/4) | Field Label | Field Name | Co ustawić w kroku 2/4 |
|---|---|---|---|
| Text Area | Krótki opis | Short_Description | nic więcej |
| Text Area (Long) | Opis oferty | Listing_Description | Visible Lines: 6 |
| Text Area (Rich) | Opis marketingowy | Marketing_Description | Length: 10000, Visible Lines: 10 |
| Text (Encrypted) | Numer księgi wieczystej | Land_Register_Number | Length: 20, Mask Type: Last Four Characters Clear, Mask Character: * |
| E-mail agenta | Agent_Email | nic więcej | |
| Phone | Telefon agenta | Agent_Phone | nic więcej |
| URL | Wirtualny spacer | Virtual_Tour_URL | nic więcej |
| Number | Powierzchnia (m2) | Area_m2 | Length: 6, Decimal Places: 2, Required |
| Currency | Cena | Price | Length: 10, Decimal Places: 2, Required |
| Percent | Prowizja | Commission_Rate | Length: 3, Decimal Places: 2 |
| Auto Number | Numer oferty | Listing_Number | Display Format: NR-{YYYY}-{0000}, Starting Number: 1 |
| Date | Dostępna od | Available_From | Default Value: TODAY() |
| Date/Time | Termin prezentacji | Next_Viewing | nic więcej |
| Time | Godzina dni otwartych | Open_House_Time | nic więcej |
| Checkbox | Umeblowane | Is_Furnished | Default Value: Unchecked |
| Picklist | Status | Status | wartości: Nowa, Dostępna, Zarezerwowana, Sprzedana |
| Picklist (Multi-Select) | Udogodnienia | Amenities | wartości: Balkon, Winda, Miejsce parkingowe, Ogród, Piwnica |
| Geolocation | Lokalizacja | Location | Decimal, Decimal Places: 6 |
Jak to wygląda na ekranie
Number - długość (1), miejsca po przecinku (2), pole wymagane (3):
Currency - te same ustawienia co Number:
Date - wartość domyślna TODAY() (1):
Checkbox - wartość domyślna (1):
Picklist - wybierz Enter values (1), wpisz wartości, każdą w nowej linii (2), zaznacz Use first value as default (3), zostaw Restrict picklist (4):
Uwaga na pułapki:
-
Kod pocztowy albo numer telefonu zapisuj jako Text, nie Number. Number usuwa zera z przodu.
-
Wartości picklisty wpisuj starannie. Późniejsza zmiana nazwy wartości psuje automatyzacje.
Checklista etapu 3:
-
Na liście pól jest 19 pól własnych (z końcówką
__c) -
Wszystkie nazwy API są po angielsku, bez polskich znaków
Etap 4: relacje (15 min)
4.1. Lookup: Sprzedający
Krok 1. Nowe pole na Nieruchomości, typ Lookup Relationship. W Related To wybierz Contact (1).
Krok 2. Wpisz nazwy i popraw podpowiedzi Salesforce:
-
Field Label: Sprzedający
-
Field Name: Seller
-
Child Relationship Name: Properties - Salesforce podpowie błędne "Nieruchomo_ci"
-
Po usunięciu kontaktu: zostaw Clear the value of this field
Co znaczą trzy opcje w "What to do if the lookup record is deleted?"
Ta sekcja odpowiada na jedno pytanie: co ma się stać z nieruchomością, gdy ktoś usunie kontakt wpisany w polu Sprzedający.
| Opcja | Co się dzieje po usunięciu kontaktu |
|---|---|
| Clear the value of this field | Nieruchomość zostaje, pole Sprzedający robi się puste. Salesforce nie pozwoli wybrać tej opcji, jeśli zaznaczysz wyżej Required - bo pole wymagane nie może zostać puste. |
| Delete this record also | Razem z kontaktem znika nieruchomość. To kasowanie kaskadowe i Salesforce sam przy nim ostrzega: usuwanie omija reguły współdzielenia, więc użytkownik może jednym ruchem skasować rekordy, do których nie ma dostępu. |
| Don't allow deletion of the lookup record | Salesforce zablokuje usunięcie kontaktu tak długo, jak wskazuje na niego choć jedna nieruchomość. |
Na kursie zostaje Clear the value of this field - domyślne i najbezpieczniejsze zachowanie dla zwykłego powiązania. Pozostałe dwie to decyzja projektowa: kaskadowe kasowanie ma sens tylko wtedy, gdy rekord nie ma racji bytu bez tego drugiego, a wtedy zwykle właściwszym narzędziem jest Master-Detail z punktu 4.3. Blokada usuwania chroni spójność danych, ale kosztem użytkownika, który zobaczy komunikat o odmowie i nie będzie wiedział, co go blokuje.
Krok 3. Klikaj Next do końca kreatora (6 kroków) i Save.
4.2. Nowy obiekt Oferta
Utwórz drugi obiekt jak w etapie 1: Label Oferta, Plural Oferty, Object Name Offer. Jedna różnica - pole nazwy:
-
Data Type: Auto Number
-
Display Format:
OF-{00000} -
Starting Number: 1
4.3. Master-Detail: Oferta należy do Nieruchomości
Krok 1. Na obiekcie Oferta utwórz pole typu Master-Detail Relationship (1). Related To: Nieruchomość.
Krok 2. Field Name: Property (1), Child Relationship Name: Offers (2), Sharing Setting: zostaw Read/Write (3).
Krok 3. Next do końca i Save.
Krok 4. Na obiekcie Oferta dodaj pole Currency: Field Label Kwota oferty, Field Name Amount, Length 10, Decimal Places 2.
Uwaga: usunięcie nieruchomości usunie też wszystkie jej oferty. Tak działa Master-Detail.
Checklista etapu 4:
-
Na Nieruchomości jest pole
Seller__ctypu Lookup(Contact) -
Istnieje obiekt
Offer__cz polamiProperty__ciAmount__c
Etap 5: formuła i Roll-Up Summary (10 min)
5.1. Roll-Up Summary: Najwyższa oferta
Krok 1. Wróć na obiekt Nieruchomość → New. Typ Roll-Up Summary (1) jest już aktywny, bo istnieje relacja Master-Detail z etapu 4.
Krok 2. Field Label Najwyższa oferta, Field Name Highest_Offer, Next.
Krok 3. Ustaw podsumowanie:
-
Summarized Object: Oferty
-
Typ: MAX
-
Field to Aggregate: Kwota oferty
-
Filter Criteria: zostaw All records
Next do końca i Save.
5.2. Formula: Cena za m2
Krok 1. Nowe pole typu Formula. Wybierz typ wyniku Currency (1), wpisz Field Label Cena za m2 i Field Name Price_per_m2 (2).
Krok 2. Wpisz formułę:
IF( Area_m2__c > 0, Price__c / Area_m2__c, NULL )
Krok 3. Kliknij Check Syntax (1). Musi pojawić się zielony komunikat "No syntax errors".
Krok 4. Next do końca i Save.
Uwaga: formuła i Roll-Up Summary są tylko do odczytu. Nikt, także automatyzacja, nie wpisze do nich wartości ręcznie.
Druga uwaga, ważniejsza: formuła niczego nie zapisuje na rekordzie - przelicza wynik dopiero w chwili, gdy ktoś na rekord patrzy. Skoro nic się nie zapisuje, nic się też nie dzieje: zmiana wartości pola formuły nie uruchomi Flow uruchamianego rekordem (record-triggered flow) ani reguły walidacji. Pole Cena za m2 może jutro pokazać inną liczbę, a żaden automat tego nie zauważy. Jeśli coś ma się wydarzyć w momencie zmiany, robi to Flow, nie formuła - wrócimy do tego w lekcji Before-Save czy After-Save.
Checklista etapu 5:
-
Check Syntax pokazał brak błędów
-
Na liście pól są
Highest_Offer__ciPrice_per_m2__c
Checklista końcowa i zadanie samodzielne
Tak powinna wyglądać lista pól Nieruchomości po warsztacie (fragment, razem 26 pól):
Sprawdź, zanim przejdziesz dalej:
-
Obiekt Nieruchomość ma 22 pola własne i 4 standardowe
-
Obiekt Oferta ma pola
Property__ciAmount__c -
Żadna nazwa API nie zawiera polskich znaków ani obciętych słów
-
Istnieje zakładka Nieruchomości
Zadanie samodzielne (15 min): na obiekcie Oferta dodaj bez instrukcji:
-
Picklist Status oferty: Złożona, Zaakceptowana, Odrzucona
-
Date Data ważności z wartością domyślną
TODAY() + 14 -
Roll-Up Summary Liczba ofert (COUNT) na Nieruchomości
Co dalej: w kursie Zapytania SOQL nauczysz się wyciągać dane z obiektów, a w kursie Salesforce Flow zbudujesz pierwszy Flow. Gdyby coś w warsztacie było niejasne, wróć do lekcji Pola i typy pól w Salesforce.





























