Przejdź do głównej zawartości

Analiza finansów z NetSuite — od połączenia do rachunku zysków i strat

~45 minut · działające połączenie NetSuite, załadowana księga główna, miesięczny rachunek zysków i strat, zestawienie wiekowania należności i zaplanowane odświeżanie

To ścieżka na pierwszy dzień dla kontrolera finansowego lub analityka FP&A: na końcu pobierzesz księgę główną bezpośrednio z NetSuite, przekształcisz ją w miesięczny rachunek zysków i strat, który czyta się jak sprawozdanie, zbudujesz zestawienie wiekowania należności, umieścisz oba wyniki na pulpicie i ustawisz automatyczne odświeżanie całości. Bez eksportu do arkusza kalkulacyjnego i ręcznego przepisywania — liczby pochodzą z NetSuite i pozostają aktualne.

Połączysz się raz, pobierzesz dane raz, a potem zajmiesz się tym, co naprawdę ważne: przekształcaniem surowych wierszy księgi głównej w zestawienia, które biznes czyta w poniedziałek rano.

NetSuitePobranie SuiteQLTabela KGGrupuj i sumujRZiS
Połącz się, jednorazowo pobierz księgę główną, a następnie przekształć ją w czytelne zestawienia — wszystko do ponownego uruchamiania według harmonogramu.
  • Obszar roboczy PlaidCloud i projekt, w którym będziesz pracować (rozpocznij okres próbny, jeśli go potrzebujesz).
  • Działające połączenie NetSuite. Najpierw wykonaj instrukcje z artykułu Połączenie z NetSuite — potrzebujesz włączonych w NetSuite OAuth 2.0 i REST Web Services, identyfikatora klienta integracji, identyfikatora certyfikatu, identyfikatora konta oraz klucza prywatnego w formacie PEM. Zanim zaczniesz tutaj, upewnij się, że Wyślij żądanie testowe kończy się powodzeniem.
  • Do przekształcania danych nie jest potrzebny SQL — wykonasz je za pomocą standardowych kroków transformacji. Jedyny tekst zapytania to pobranie z NetSuite, a każde zapytanie pobierające jest podane. Miej w osobnej karcie otwarty artykuł Przykłady zapytań NetSuite SuiteQL; ten samouczek z niego korzysta.

Przepływ pracy to potok, który pobiera i przekształca dane.

  1. Otwórz projekt i przełącz się na kartę Przepływy pracy.
  2. Kliknij Nowy przepływ pracy, nadaj mu nazwę, na przykład NetSuite Financials, i otwórz go.

Jedno zapytanie SuiteQL zwraca rok aktywności księgowań — każde konto, każdy miesiąc — co wystarczy do zbudowania rachunku zysków i strat oraz, w dalszej kolejności, innych zestawień.

  1. Dodaj krok Żądanie REST. Na karcie Żądanie ustaw Połączenie na swoje połączenie NetSuite, Metoda na POST, a Punkt końcowy na /services/rest/query/v1/suiteql.

  2. W polu Treść żądania wpisz poniższe zapytanie SuiteQL opakowane jako {"q": "…"}:

    SELECT
    TO_CHAR(t.trandate, 'YYYY-MM') AS period,
    a.accttype AS account_type,
    a.acctnumber AS account_number,
    BUILTIN.DF(a.id) AS account_name,
    tal.amount AS amount
    FROM transactionaccountingline tal
    JOIN transaction t ON t.id = tal.transaction
    JOIN account a ON a.id = tal.account
    WHERE tal.posting = 'T'
    AND tal.accountingbook = 1
    AND t.trandate BETWEEN TO_DATE('2026-01-01', 'YYYY-MM-DD')
    AND TO_DATE('2026-12-31', 'YYYY-MM-DD')
    ORDER BY period, a.acctnumber
  3. Na karcie Odpowiedź ustaw miejsce docelowe na Tabela — nazwij ją netsuite_gl — i ustaw typy kolumn: amount → Waluta, wszystkie pozostałe → Tekst. (SuiteQL zwraca liczby i daty jako tekst; to typ sprawia, że wartości amount można sumować.)

  4. Kliknij Wyślij żądanie testowe, aby potwierdzić, że zapytanie działa, a następnie uruchom krok. Masz teraz tabelę netsuite_gl: jeden wiersz na konto na miesiąc, ze znakowaną kwotą księgowania.

Krok 3: przekształć księgę główną w rachunek zysków i strat

Dział zatytułowany „Krok 3: przekształć księgę główną w rachunek zysków i strat”

Teraz analiza, wykonana jednym krokiem transformacji obsługiwanym myszą — bez SQL. Rachunek zysków i strat to po prostu zsumowana księga główna: konta przychodów i kosztów, pogrupowane w kilka pozycji, ze zmienionym znakiem, tak aby przychody były dodatnie. Krok Table Extract robi to wszystko na kartach Wybór danych tabeli i Filtry danych.

  1. Dodaj krok Table Extract. Ustaw jego Źródło na netsuite_gl, a Cel na nową tabelę netsuite_pnl.

  2. Na karcie Filtry danych zachowaj tylko konta przychodów i kosztów (pomiń konta bilansowe): dodaj filtr, w którym account_type jest jedną z wartości Income, OthIncome, COGS, Expense, OthExpense.

  3. Na karcie Wybór danych tabeli kliknij Podsumuj, aby włączyć agregację, a następnie skonfiguruj trzy kolumny docelowe:

    • period — mapowana bezpośrednio ze źródła. Podsumowanie: Grupuj według.
    • pnl_line — wyrażenie (poniżej), które zamienia każdy typ konta na pozycję raportu. Podsumowanie: Grupuj według.
    • amount — wyrażenie netsuite_gl.amount * -1 (zmiana znaku). Podsumowanie: Suma.

    Dla pnl_line kliknij dwukrotnie komórkę wyrażenia i wprowadź poniższy kod (edytor pozwala wybierać kolumny i funkcję case z grupy Warunki myszą):

    case(
    (netsuite_gl.account_type.in_(['Income', 'OthIncome']), '1 - Revenue'),
    (netsuite_gl.account_type == 'COGS', '2 - Cost of Goods Sold'),
    (netsuite_gl.account_type.in_(['Expense', 'OthExpense']), '3 - Operating Expenses'),
    )
  4. Uruchom krok.

Wyrażenie amount * -1 to jedyny zabieg księgowy: zmiana znaku kwoty dodatniej dla obciążeń sprawia, że przychody są dodatnie, a koszty ujemne, więc trzy pozycje każdego miesiąca sumują się do zysku netto. Następnie Suma z opcją Grupuj według dla period i pnl_line zwija wszystkie konta do tych trzech pozycji na miesiąc. Wyrażenia korzystają z edytora PlaidCloud obsługiwanego myszą — zobacz Zaawansowane użycie Data Mapper oraz opis wyrażeń.

Otwórz tabelę netsuite_pnl. Dla każdego miesiąca masz trzy liczby:

okres pnl_line amount
2026-01 1 - Revenue 486,200.00
2026-01 2 - Cost of Goods Sold -190,540.00
2026-01 3 - Operating Expenses -212,880.00

Odczytaj bezpośrednio z tabeli:

  • Zysk brutto = przychody + koszt własny sprzedaży (koszt własny sprzedaży jest już ujemny) → 486,200 − 190,540 = 295,660.
  • Zysk netto = suma trzech pozycji → 82,780.
  • Marża brutto % = zysk brutto ÷ przychody → ok. 61%.

Najpierw trzeba uzgodnić wyniki: uruchom w NetSuite jego własny rachunek zysków i strat za ten sam miesiąc i sprawdź, czy przychody i zysk netto się zgadzają. Jeśli nie, prawie zawsze chodzi o różnicę zakresu — filtr spółki zależnej lub waluty albo niedopasowanie okresu księgowania do daty transakcji (zobacz uwagę o okresach). Zaufaj potokowi dopiero wtedy, gdy wyniki się zgadzają.

Drugi sukces pierwszego dnia, według tego samego schematu: połącz, pobierz, przekształć. Zacznij od przepisu na otwarte należności, a następnie podziel je na przedziały według tego, jak bardzo faktura jest przeterminowana.

  1. Dodaj kolejny krok Żądanie REST (to samo połączenie, POST, punkt końcowy suiteql) z następującą treścią:

    SELECT
    t.tranid AS invoice_number,
    BUILTIN.DF(t.entity) AS customer,
    TO_CHAR(t.trandate, 'YYYY-MM-DD') AS invoice_date,
    TO_CHAR(t.duedate, 'YYYY-MM-DD') AS due_date,
    t.foreigntotal AS invoice_total,
    t.foreignamountunpaid AS amount_unpaid
    FROM transaction t
    WHERE t.type = 'CustInvc'
    AND t.foreignamountunpaid <> 0
    ORDER BY t.tranid

    Załaduj wynik jako netsuite_open_ar, ustawiając invoice_total i amount_unpaid → Waluta, invoice_date i due_date → Data, a pozostałe → Tekst.

  2. Dodaj krok Table Extract odczytujący netsuite_open_ar do nowej tabeli netsuite_ar_aging. Na karcie Wybór danych tabeli kliknij Podsumuj i skonfiguruj trzy kolumny docelowe:

    • aging_bucket — wyrażenie (poniżej), które oznacza każdą fakturę etykietą według stopnia przeterminowania. Podsumowanie: Grupuj według.
    • invoices — dowolna kolumna, np. invoice_number. Podsumowanie: Liczba.
    • balance — mapowana z amount_unpaid. Podsumowanie: Suma.

    Dla aging_bucket wprowadź to wyrażenie — mierzy ono liczbę dni po terminie płatności (różnica dat daje dni) i nadaje etykietę przedziału:

    case(
    ((func.today() - netsuite_open_ar.due_date) <= 0, '0 - Current'),
    ((func.today() - netsuite_open_ar.due_date) <= 30, '1 - 1-30 days'),
    ((func.today() - netsuite_open_ar.due_date) <= 60, '2 - 31-60 days'),
    ((func.today() - netsuite_open_ar.due_date) <= 90, '3 - 61-90 days'),
    else_='4 - Over 90 days',
    )
  3. Uruchom krok. netsuite_ar_aging pokazuje teraz w pięciu wierszach, ile należności jest bieżących, a ile przeterminowanych o 30/60/90+ dni — to widok windykacyjny, który biznes czyta w pierwszej kolejności. (due_date musi mieć typ Data, aby odejmowanie dat działało — ustawiono to wyżej na karcie Odpowiedź kroku Żądanie REST.)

Liczby w tabeli są w porządku, ale to wykres wysyła się dyrektorowi finansowemu. Opublikuj netsuite_pnl i netsuite_ar_aging, a następnie wykonaj instrukcje z samouczka Tworzenie pulpitu, aby dodać:

  • wykres słupkowy zysku netto (lub przychodów) według period oraz
  • wykres kołowy lub słupkowy należności balance według aging_bucket.

To działający na żywo pulpit finansowy z NetSuite — bez eksportu, odświeżany przy każdym uruchomieniu przepływu pracy.

  1. Uruchom cały przepływ pracy raz, od góry do dołu, aby potwierdzić, że każdy krok kończy się powodzeniem.
  2. Zaplanuj przepływ pracy — co miesiąc zgodnie z cyklem zamknięcia lub co noc, jeśli chcesz, aby zestawienie wiekowania należności było świeże każdego ranka.

Ponieważ każde pobranie w całości zastępuje tabelę, każde uruchomienie ponownie wyodrębnia wycinek zdefiniowany przez klauzulę WHERE — ogranicz go do potrzebnego okna (bieżący rok, tylko otwarte faktury) zamiast całej historii.

Zaczynając od pustego przepływu pracy, udało się pobrać dane księgi głównej i należności z NetSuite na żywo, przekształcić je w miesięczny rachunek zysków i strat oraz zestawienie wiekowania należności za pomocą dwóch standardowych kroków transformacji — bez SQL — umieścić je na pulpicie i ustawić ich odświeżanie. To podstawowa pętla raportowa zespołu finansowego, teraz zautomatyzowana.