زبان پرس و جوی Beancount - پرس و جوهای مالی مشابه SQL
Beancount دارای یک زبان پرس و جوی قدرتمند و شبیه به SQL (BQL) است که به شما امکان می دهد داده های مالی خود را با دقت برش دهید، تجزیه کنید و تحلیل کنید. چه بخواهید یک گزارش سریع ایجاد کنید، یک ورودی را اشکال زدایی کنید یا یک تجزیه و تحلیل پیچیده انجام دهید، تسلط بر BQL کلید باز کردن پتانسیل کامل دفتر حسابداری متن ساده شما است. این راهنما شما را با ساختار، عملکردها و بهترین شیوه های آن آشنا می کند. 🔍
ساختار و اجرای پرس و جو
هسته اصلی BQL، سینتکس آشنا و الهام گرفته از SQL آن است. پرس و جوها با استفاده از ابزار خط فرمان bean-query اجرا می شوند، که فایل دفتر شما را پردازش می کند و نتایج را مستقیماً در ترمینال شما برمی گرداند.
فرمت پرس و جوی پایه
یک پرس و جوی BQL از سه بند اصلی تشکیل شده است: SELECT، FROM و WHERE.
SELECT <target1>, <target2>, ...
FROM <entry-filter-expression>
WHERE <posting-filter-expression>;
SELECT: مشخص می کند که کدام ستون های داده را می خواهید بازیابی کنید.FROM: کل تراکنش ها را قبل از پردازش فیلتر می کند.WHERE: خطوط ثبت تکی را بعد از انتخاب تراکنش فیلتر می کند.
سیستم فیلتر دو سطحی
درک تفاوت بین بندهای FROM و WHERE برای نوشتن پرس و جوهای دقیق بسیار مهم است. BQL از یک فرآیند فیلتر دو سطحی استفاده می کند.
-
سطح تراکنش (
FROM) این بند بر روی کل تراکنش ها عمل می کند. اگر یک ت راکنش با شرطFROMمطابقت داشته باشد، کل تراکنش (شامل تمام ثبت های آن) به مرحله بعدی منتقل می شود. این روش اصلی فیلتر کردن داده ها است، زیرا یکپارچگی سیستم حسابداری دوبل را حفظ می کند. به عنوان مثال، فیلتر کردنFROM year = 2024تمام تراکنش هایی را که در سال 2024 رخ داده اند انتخاب می کند. -
سطح ثبت (
WHERE) این بند ثبت های تکی را درون تراکنش های انتخاب شده توسط بندFROMفیلتر می کند. این برای ارائه و تمرکز بر روی بخش های خاصی از یک تراکنش مفید است. با این حال، آگاه باشید که فیلتر کردن در این سطح می تواند یکپارچگی یک تراکنش را در خروجی "از بین ببرد"، زیرا ممکن است فقط یک طرف از یک ورودی را ببینید. به عنوان مثال، می توانید تمام ثبت ها را به حسابExpenses:Groceriesخود انتخاب کنید.
مدل داده
برای پرس و جوی موثر داده های خود، باید درک کنید که Beancount چگونه آن را ساختار می دهد. یک دفتر کل لیستی از دستورالعمل ها است، اما BQL در درجه اول بر روی ورودی های Transaction تمرکز دارد.
ساختار تراکنش
هر Transaction یک ظرف با ویژگی های سطح بالا و لیستی از اشیاء Posting است.
Transaction
├── date
├── flag
├── payee
├── narration
├── tags
├── links
└── Postings[]
├── account
├── units
├── cost
├── price
└── metadata
انواع ستون های موجود
شما می توانید هر یک از ویژگی های تراکنش یا ثبت های آن را SELECT کنید.
-
ویژگی های تراکنش این ستون ها برای هر ثبت در یک تراکنش واحد یکسان هستند.
SELECT
date, -- تاریخ تراکنش (datetime.date)
year, -- سال تراکنش (int)
month, -- ماه تراکنش (int)
day, -- روز تراکنش (int)
flag, -- علامت تراکنش، به عنوان مثال، "*" یا "!" (str)
payee, -- پرداخت کننده (str)
narration, -- توضیحات یا یادداشت (str)
tags, -- مجموعه ای از برچسب ها، به عنوان مثال، #trip-2024 (set[str])
links -- مجموعه ای از لینک ها، به عنوان مثال، ^expense-report (set[str]) -
ویژگی های ثبت این ستون ها مختص هر خط ثبت تکی هستند.
SELECT
account, -- نام حساب (str)
position, -- مقدار کامل، شامل واحدها و هزینه (Position)
units, -- تعداد و ارز ثبت (Amount)
cost, -- مبنای هزینه ثبت (Cost)
price, -- قیمت استفاده شده در ثبت (Amount)
weight, -- موقعیت تبدیل شده به مبنای هزینه آن (Amount)
balance -- جمع کل در حال اجرا از واحدها در حساب (Inventory)
توابع پرس و جو
BQL شامل مجموعه ای از توابع برای تجمیع و تبدیل داده ها، مشابه SQL است.