/
/
استودیوی ساخت گزارش (Report Studio) محیط اصلی طراحی، ساخت و پیکربندی گزارشها در سامانه GraphBPMS است. در این محیط، طراح بدون نیاز به درگیری با کدهای پیچیده، منابع داده را به گزارش متصل میکند، پارامترها و فیلترهای ورودی را تعریف مینماید، ستونهای جدول را نامگذاری و مرتب کرده و با بهرهگیری از فرمولساز و توابع محاسباتی، ساختار نهایی دادهها را شکل میدهد. همچنین امکان تعبیه دکمههای عملیاتی برای باز کردن فرمها و پیشنمایش زنده جدول دادهها پیش از انتشار نهایی فراهم شده است. در این آموزش، مراحل طراحی یک گزارش استاندارد از اولین گام ورود به استودیو تا ثبت و مشاهده خروجی در پیشخوان را به صورت گامبهگام بررسی میکنیم.
برای آغاز طراحی یک گزارش تحلیلی جدید یا ویرایش ساختار گزارشهای پیشین، از صفحه پیشخوان مدیریت گزارشها (ReportManager) بر روی دکمه آبیرنگ و شاخص «ایجاد گزارش» در بالا سمت چپ کلیک میکنیم.
با کلیک بر روی این دکمه، صفحه استودیوی ساخت گزارش به آدرس ReportBuilderStudio گشوده میشود. در بدو ورود، بوم طراحی به صورت خالی بارگذاری شده و کلیه ابزارهای مدیریتی و پیکربندی در دسترس طراح قرار میگیرد:
نخستین گام در طراحی هر گزارش، ثبت مشخصات شناسنامهای و تعیین هویت سازمانی آن در تب «تنظیمات عمومی» (آیکن چرخدنده در بالای سایدبار) است. در حالت اولیه، این فیلدها خالی هستند:
در سناریوی کارگاه این دانشنامه، هدف پیادهسازی یک گزارش جامع عملیاتی برای مانیتورینگ پروژههای عمرانی و تأسیساتی به همراه ریز صورتوضعیتهای مالی آنهاست. لذا فیلدهای تب تنظیمات عمومی را به شرح زیر تکمیل میکنیم:
| عنوان فیلد | مقدار در سناریوی کارگاه | نقش معماری و کارکرد سیستمی |
|---|---|---|
| نام گزارش | لیست پروژه ها و اقلام |
عنوان شاخص و رسمی گزارش که در پیشخوان مدیریت، هدر پنجره پیشنمایش و منوهای ناوبری کاربران نمایش داده میشود. |
| گروه گزارش | فرآیندهای کسب و کار گراف |
تعیین شاخه موضوعی گزارش در درخت دستهبندی؛ این گروهبندی ساختار منوهای سامانه و فیلترهای سریع داشبورد را شکل میدهد. |
| تصویر | انتخاب تصویر شاخص سازمانی | بارگذاری تصویر یا آیکن اختصاصی جهت نمایش در کارتهای ویژوال داشبورد و پیشخوانهای گرافیکی پلتفرم GraphBPMS. |
| وضعیت فعال | بله (چکباکس تیکخورده) |
تعیین وضعیت حیات عملیاتی گزارش؛ در صورت غیرفعال بودن، گزارش در لیستهای عمومی کاربران پنهان شده و غیرقابل فراخوانی خواهد بود. |
| توضیحات | این گزارش با استفاده از دو منبع داده مستقل و وابسته ایجاد میشود و برای مشاهده اطلاعات پروژه ها و اقلام صورت وضعیت آنها ایجاد میشود | متن راهنمای کاربری که در جعبه اطلاعات گزارش و راهنماهای سیستمی جهت شفافسازی اهداف تحلیلی گزارش رندر میگردد. |
جهت آشنایی با ساختار گروهبندی گزارشها و تأثیر آن بر سازماندهی منوها و فیلترهای پیشخوان، به [REPORT-01] بخش ۳: جستجو و فیلتراسیون پیشرفته بر اساس گروهها رجوع فرمایید.
در گزارشساز GraphBPMS، دادهها از طریق «منابع داده» (Data Sources / Providers) مدیریت میشوند. دومین تب در سایدبار سمت راست استودیو با آیکن دیتابیس، «منابع داده» نام دارد. با ورود به این تب، امکان اتصال یک یا چند منبع داده به گزارش فراهم میگردد:
با کلیک بر روی دکمه «+ افزودن منبع داده»، یک کارت آکاردئونی جدید در سایدبار ایجاد میشود. عنوان این منبع را (که در سناریوی کارگاه، جدول اصلی پروژههاست) «لیست پروژه ها (master)» قرار میدهیم و بر روی دکمه آبیرنگ «اتصال داده» کلیک میکنیم:
با فشردن دکمه اتصال داده، پنجره مودال «مدیریت منبع داده» باز میشود که دو مسیر راهبردی را پیش روی طراح قرار میدهد:
یکی از درخشانترین ویژگیهای استودیوی GraphBPMS این است که اگر طراح در حین ساخت گزارش متوجه شود که به کوئری یا وبسرویس جدیدی نیاز دارد، ملزم به ترک استودیو و بازگشت به منوی Providers نیست. با کلیک بر روی کاشی «ایجاد منبع داده»، پنجره ساخت مستقیم پرووایدر با پشتیبانی از تنوع گستردهای از منابع دادهای گشوده میشود:
SELECT روی جداول پایگاهداده به همراه متغیرهای شرطی با علامت @.در سناریوی کارگاه ما، منابع داده قبلاً در کارگاه عملیاتی پیشخوان ایجاد و تست شدهاند. با کلیک بر روی کاشی «منابع داده موجود»، فهرست پرووایدرها لود میشود. منبع داده با عنوان «اطلاعات پروژه ها Master» (متصل به مدل دادهای پروژهها) را جستجو و انتخاب نموده و بر روی دکمه «ذخیره» کلیک میکنیم:
پس از اتصال منبع، کارت آکاردئونی در سایدبار بهروزرسانی شده و فیلدهای زیر در آن فعال میگردد:
هر گزارش در GraphBPMS میتواند از ترکیب چندین منبع داده مستقل و وابسته تشکیل شود. منابع مستقل معمولاً جداول سرجمع، پروژهها یا صورتحسابهای کلان را تشکیل میدهند و منابع وابسته، ریز اقلام و تراکنشهای مرتبط با هر سطر را مدیریت میکنند.
به محض اتصال منبع داده پروژهها به بوم استودیو، سیستم ساختار کوئری SQL را بررسی کرده و ستونها و پارامترهای آن را در دو بخش مجزا روی بوم مرکزی نمایش میدهد:
CategoryId که در کوئری با شرط WHERE (@CategoryId IS NULL OR CategoryId = @CategoryId) تعریف شده بود. این پارامتر در ابتدا به صورت یک کارت متنی ساده (Text) روی بوم قرار میگیرد:
اگر پارامتر CategoryId به صورت متنی باقی بماند، کاربر هنگام اجرای گزارش مجبور است کد عددی دستهبندی را حدس بزند و تایپ کند. برای جلوگیری از خطای انسانی و ایجاد تجربه کاربری استاندارد، ماهیت ورودی را به منوی کشویی هوشمند تبدیل میکنیم.
ابتدا در سایدبار سمت راست بر روی منبع مستر کلیک میکنیم تا کنترلهای آن فعال شود، سپس بر روی آیکن مداد آبیرنگ در کارت پارامتر CategoryId کلیک مینماییم:
با کلیک روی مداد، پنجره مودال «ویرایش پارامتر CategoryId» باز میشود. منوی کشویی نوع داده را از حالت متنی به گزینه «انتخابی (Selective)» تغییر میدهیم و بر روی دکمه ذخیره کلیک میکنیم:
در پلتفرم GraphBPMS، پارامترهای ورودی نقش فیلترهای تعاملی و متغیرهای تزریقی به کوئریهای SQL را ایفا میکنند. به جای یک فرمت ساده، طراح میتواند نوع دادهای هر پارامتر را دقیقاً متناسب با ماهیت فیلتر انتخاب کرده و سپس در تب «تنظیمات اختصاصی» در پنل سایدبار، رفتار دقیق ورودی را پیکربندی کند:
در پنجره مودال «ویرایش پارامتر»، گزینه اول یعنی «Nvarchar / متنی» را انتخاب میکنیم:
پس از انتخاب نوع متنی و ذخیره مودال، در پنل سایدبار و در تب «تنظیمات اختصاصی»، گزینههای جامعی برای کنترل دادههای متنی فعال میگردد:
WHERE (@Title IS NULL OR ProjectTitle LIKE N'%' + @Title + '%')
زمانی که فیلتر گزارش نیازمند مقادیر مقداری، آماری یا مالی باشد، در مودال ویرایش پارامتر گزینه دوم یعنی «Number / عدد» را برمیگزینیم:
با انتخاب این نوع، تب «تنظیمات اختصاصی» در سایدبار به پنل کنترل پیشرفته مقادیر ریاضی و عددی تغییر شکل میدهد:
Int (اعداد صحیح)، BigInt، Decimal یا Float (اعداد اعشاری و ارقام ریالی).WHERE (@MinBudget IS NULL OR BudgetAmount >= @MinBudget)
AND (@MaxBudget IS NULL OR BudgetAmount <= @MaxBudget)
برای فیلترهای زمانی، سررسیدها و بازههای تقویمی، گزینه سوم یعنی «Date / تاریخ» را در پنجره مودال برمیگزینیم:
پس از انتخاب تاریخ و ذخیره، تب «تنظیمات اختصاصی» در سایدبار امکانات عمیق بومیسازی و مدیریت تقویم را ارائه میدهد:
datetime دیتابیس).۱۴۰۵/۰۸/۱۵) یا باز شدن پنجره انتخاب از تقویم گرافیکی شمسی.WHERE (@FromDate IS NULL OR StartDateShamsi >= @FromDate)
AND (@ToDate IS NULL OR StartDateShamsi <= @ToDate)
برای فیلترهایی که منحصراً بر پایه ساعت، دقایق و ثانیهها تعریف میشوند، در مودال ویرایش گزینه چهارم یعنی «Time / زمان» انتخاب میگردد:
در تب «تنظیمات اختصاصی» سایدبار، کنترلهای رابط کاربری زمان در دسترس قرار میگیرند:
HH:MM).WHERE (@LogTime IS NULL OR CAST(EventTime AS TIME) >= @LogTime)
برای فیلترهای دودویی، شرطهای پرچم (Flag) یا بررسی وضعیتهای دوحالته، گزینه پنجم یعنی «Bit / بلی/خیر» در مودال ویرایش انتخاب میشود:
در تب «تنظیمات اختصاصی» سایدبار، کنترل رفتار سوئیچ یا چکباکس با انعطافپذیری بالایی ارائه شده است:
WHERE (@IsActive IS NULL OR IsActive = @IsActive)
ششمین نوع پارامتر، «Selective / انتخابی» است که به عنوان پارامتر اصلی کارگاه این سند جهت فیلتر دستهبندی پروژهها پیکربندی گردید. این نوع به تحلیلگر امکان میدهد مقادیر مجاز را از یک لیست ثابت یا مستقیماً از یک منبع داده خارجی واکشی نماید. در ادامه، تنظیمات تبهای سهگانه سایدبار برای پارامتر انتخابی به تفصیل بررسی شده است:
برای آنکه کاربر مجبور نباشد تمام فیلترها را تکمیل کند و با خالی گذاشتن فیلتر کل دادهها لود شوند، همیشه در کوئری شرطها را با الگوی (@Param IS NULL OR Column = @Param) پیادهسازی کنید تا عدم مقداردهی پارامتر معادل نادیدهگرفتن فیلتر باشد.
با ذخیره این مودال، کارت پارامتر به نوع Selective تبدیل شده و بلافاصله سه تب تخصصی پیکربندی در سایدبار سمت راست استودیو پدیدار میگردد:
در این تب، عنوان فنی متغیر (CategoryId) قفل است. در کادر «عنوان»، برچسب کاربرپسند را وارد میکنیم. سوئیچ «فقط خواندنی» نیز برای مواقعی تعبیه شده که مقدار فیلتر باید توسط سیستم تزریق شود و کاربر نتواند آن را دستکاری کند:
این تب تعیین میکند که آیتمهای منوی کشویی از کجا واکشی شوند. دو انتخاب پیش روی ماست: اتصال به یک «منبع داده» (Lookup Provider) یا تعریف دستی یک «لیست ثابت». همچنین فیلد کلید، فیلد عنوان، مدل نمایشی (مانند «لیست ساده با امکان جستجو») و سوئیچ حذف تکراریها در این بخش تنظیم میشود:
در این تب، میتوان اجباری بودن تکمیل فیلتر قبل از اجرای گزارش را تعیین کرد. همچنین برای پارامترهای متنی و عددی، امکان تعریف الگوهای پیشرفته عبارات منظم (RegExp Patterns) نظیر کد ملی، شماره موبایل یا فرمتهای کدینگ سازمانی به همراه پیام خطای سفارشی وجود دارد:
در متدولوژی استاندارد معماری GraphBPMS، یکپارچگی دادهها بین فرمساز و گزارشساز از اهمیت بنیادین برخوردار است. همانطور که در طراحی فرم مشخصات پروژه (متصل به جدول و موجودیت GB_Project) تعریف شده بود، فیلد دستهبندی پروژهها دارای سه مقدار مشخص بود:
عیناً همین مقادیر را در گزارشساز پیاده میکنیم. در تب تنظیمات اختصاصی پارامتر در استودیو، گزینه «لیست ثابت» را انتخاب میکنیم:
با کلیک بر روی دکمه مدیریت لیست داده، پنجره مودال «مدیریت لیست داده» باز میشود. سه رکورد متناظر را با کلیدهای عددی و عناوین فارسی وارد و ذخیره میکنیم:
ثبت دقیق کلیدهای عددی 1، 2 و 3 تضمین میکند که هنگام ارسال شرط به پایگاهداده، کوئری WHERE CategoryId = @CategoryId دقیقاً رکوردهای مرتبط در جدول GB_Project را فیلتر نماید.
پیش از ورود به سناریوهای پیشرفتهتر، ابتدا صحت عملکرد منبع داده متصلشده و فیلترهای آن را در تب «پیش نمایش منبع» (آیکن چشم در بالای بوم) اعتبارسنجی میکنیم. این تب شامل دو پنل آکاردئونی هوشمند است: «جستجو در فرم» (فیلترهای ورودی) و «لیست دادهها» (گرید خروجی):
هنگامی که بر روی منوی کشویی کلیک میکنیم، سه گزینه تعریفشده در لیست ثابت (عمرانی، IT، تأسیسات) با ظاهری آراسته و قابلیت جستجو باز میشوند:
گزینهای را انتخاب نکرده (تا همه دادهها واکشی شوند) و بر روی دکمه آبیرنگ «پیش نمایش» کلیک میکنیم. کوئری با موفقیت اجرا شده و هر ۳ رکورد واقعی پایگاهداده در جدول دادهها رندر میشوند:
همانطور که در تصویر بالا مشاهده میشود، عناوین ستونها در ابتدا همان نامهای انگلیسی جداول پایگاهداده هستند. برای استانداردسازی گزارش سازمانی، به تب «تنظیمات منبع» بازگشته و عنوان پارامتر و تکتک کارتهای خروجی را با معادلهای دقیق و خوانای فارسی جایگزین میکنیم:
| نام فیلد دیتابیس | عنوان نمایشی در گزارش | نوع دادهای | توضیحات محتوایی در سناریو |
|---|---|---|---|
Id | شناسه | عددی (کلید اصلی) | شناسه یکتای رکورد در جدول GB_Project (نقش کلید والد در ارتباط مستر-دیتیل) |
ProjectCode | کد پروژه | متنی | کد استاندارد سازمانی پروژه (نظیر PRJ-101، PRJ-102) |
ProjectTitle | عنوان پروژه | متنی | نام کامل و رسمی پروژه عمرانی/صنعتی |
CategoryId | شناسه دسته بندی | عددی | کد دستهبندی فنی |
CategoryTitle | عنوان دسته بندی | متنی | شرح دستهبندی (عمرانی، فناوری اطلاعات، تأسیسات) |
StartDateShamsi | تاریخ شروع پروژه | تاریخ شمسی | تاریخ آغاز عملیات کارگاهی |
DueDateShamsi | مهلت تحویل پروژه | تاریخ شمسی | تاریخ سررسید و بهرهبرداری |
BudgetAmount | بودجه مصوب به ریال | مبلغی / عددی | اعتبار مالی پروژه (قابلیت اعمال توابع تجمیعی Sum) |
ProgressPercent | درصد پیشرفت | درصدی (۰ تا ۱۰۰) | شاخص فیزیکی پیشرفت پروژه |
SitePhoto | تصویر شاخص پروژه | چندرسانهای / تصویر | آدرس فایل یا باینری عکس شاخص کارگاه |
Coordinates | موقعیت کارگاه | مختصات GIS | طول و عرض جغرافیایی محل اجرای پروژه روی نقشه |
اکنون اگر مجدداً به تب پیشنمایش منبع مراجعه کنیم، میبینیم که عنوان فیلتر بالای صفحه به «دستهبندی موضوعی» تغییر یافته و تمامی ستونهای گرید خروجی با سرستونهای استاندارد و زیبای فارسی رندر میشوند:
تا این مرحله، کار با ساختار پایه استودیو، اتصال اولین منبع داده، تعریف پارامترهای فیلتر و مشاهده خروجی در قالب یک جدول ساده را تجربه کردیم. اکنون در این کارگاه عملی، به سراغ یکی از کاربردیترین قابلیتهای استودیو میرویم: طراحی گزارشهای سلسلهمراتبی و پیوند چند منبع داده به یکدیگر (Master-Detail).
در دنیای واقعی کسبوکارها، دادهها همیشه تکسطحی نیستند؛ بلکه اغلب رابطهای به شکل «والد و فرزند» (Parent-Child) دارند:
اگر بخواهیم تمام این اقلام را در یک جدول ساده قرار دهیم، عنوان پروژه به تعداد تکتک هزینههایش تکرار میشود و جدول به شدت شلوغ و ناخوانا میگردد. اما در گزارش Master-Detail، کاربر در نگاه اول فقط لیست تمیز پروژهها را میبیند؛ و هر زمان که روی علامت مثبت (+) کنار یک پروژه کلیک کند، زیرجدول اقلام صورتوضعیتِ همان پروژه به صورت آکاردئونی باز میشود.
برای ایجاد این ارتباط در استودیوی GraphBPMS، نیازی به نوشتن کوئریهای پیچیده SQL JOIN نیست. سازوکار کار بسیار ساده و بصری است:
@ProjectId در کوئری خود است (WHERE ProjectId = @ProjectId).Id پروژه) دریافت کند.Id آن سطر را برداشته، به پارامتر @ProjectId تزریق میکند و در کسری از ثانیه، ریز اقلام مرتبط را واکشی مینماید.WHERE ProjectId = @ProjectId
در ادامه، این سناریوی عملیاتی را در پنج گام گامبهگام پیادهسازی میکنیم:
در سایدبار سمت راست استودیو، به تب «منابع داده» میرویم و مجدداً بر روی دکمه «+ افزودن منبع داده» کلیک میکنیم:
آیتم آکاردئونی دوم اضافه میشود. نام آن را «صورتوضعیتها و اقلام هزینه (detail)» تایپ نموده و بر روی دکمه آبیرنگ «اتصال داده» کلیک میکنیم:
از پنجره منابع داده موجود، منبع داده با عنوان «صورت وضعیت ها و اقلام هزینه Details» را انتخاب کرده و بر روی «ذخیره» کلیک میکنیم:
این گام ساختاری تعیینکننده است: در کارت منبع دوم در سایدبار، فیلد «نوع منبع داده» را از مستقل به «وابسته» تغییر میدهیم. بلافاصله فیلد جدیدی به نام «منبع داده مورد نظر» ظاهر میشود که در آن، منبع والد یعنی «لیست پروژه ها (master)» را انتخاب میکنیم:
با انتخاب این منبع، بوم استودیو ساختار کوئری منبع وابسته صورتوضعیتها را رندر میکند. این منبع دارای یک متغیر ورودی شرطی به نام ProjectId در کوئری SQL خود است:
همچنین ۹ فیلد خروجی اقلام هزینه روی بوم چیده میشوند:
اکنون باید حلقه اتصال رابطه والد و فرزند را برقرار کنیم: به سیستم اعلام کنیم که پارامتر ورودی ProjectId منبع فرزند، از کدام ستون ردیف انتخابشده منبع والد مقدار بگیرد؟
روی بوم منبع دیتیل، بر روی آیکن مداد آبیرنگ در کارت پارامتر ProjectId کلیک میکنیم:
پنجره حیاتی «ویرایش پارامتر ProjectId» باز میشود. این پنجره شامل بخش «اتصال داده» است:
ProjectId نباید در فرم فیلترهای بالای صفحه به عنوان یک فیلد جستجو نمایش داده شود، بلکه باید به صورت سیستمی و پشتصحنه از کلید سطر کلیکشده والد تغذیه گردد.با انتخاب ستون خروجی، دو منوی کشویی هوشمند فعال میشوند که مستقیماً به خروجیهای منبع والد (پروژهها) متصل هستند:
Id (شناسه یکتای پروژه) را انتخاب میکنیم. این مقدار دقیقاً به متغیر @ProjectId در کوئری SQL پاس داده خواهد شد:ProjectTitle (عنوان پروژه) را انتخاب میکنیم تا سیستم در لایههای نمایشی بداند عنوان متناظر با این کلید چیست:بدین ترتیب، نگاشت کامل رابطه والد-فرزند شکل میگیرد:
بر روی دکمه سبز رنگ «ذخیره» کلیک میکنیم تا اتصال رابطهای ثبت شود:
اگر به تب «پیش نمایش منبع» برویم، کنترل ورودی ProjectId را میبینیم. با کلیک بر روی پیشنمایش، کلیه ۷ قلم صورتوضعیت مالی با مقادیر مبالغ و وضعیت تایید رندر میشوند:
به تب تنظیمات منبع بازمیگردیم و عناوین ستونهای منبع دیتیل را به معادلهای استاندارد فارسی تغییر میدهیم:
استودیوی ساخت گزارش GraphBPMS دارای مجموعهای غنی از ابزارهای مهندسی لایه نمایش است که امکان پیادهسازی محاسبات پویا، قالببندیهای شرطی و تغییر چیدمان ستونها را بدون نیاز به کدهای سمت دیتابیس مهیا میسازد:
0، سیستم عرض ستون را متناسب با محتوا به صورت خودکار تنظیم میکند.Sum: محاسبه مجموع مقادیر ستون (ایدهآل برای فیلدهای بودجه و مبالغ صورتوضعیت).Count: شمارش تعداد ردیفها.Avg: میانگینگیری عددی.Min / Max: استخراج کمترین و بیشترین مقدار ثبتشده.در سمت چپ هر کارت، یک آیکن چرخدنده خاکستری قرار دارد که منوی ابزارهای پیشرفته داده را باز میکند:
یکی از ویژگیهای برجسته استودیوی ساخت گزارش GraphBPMS، توانایی تعریف ستونهای محاسباتی کاملاً پویا با استفاده از کدهای جاوااسکریپت سفارشی (Custom JS) است. این قابلیت بدون نیاز به ایجاد فیلدهای محاسباتی در پایگاهداده یا دستکاری کوئریهای SQL، به طراح اجازه میدهد منطقهای تجاری پیچیده، محاسبات ریاضی و قالببندیهای شرطی را در سطح سلولهای هر سطر پیادهسازی کند.
روی بوم منبع مستر (پروژهها)، به انتهای فهرست کارتهای خروجی اسکرول کرده و بر روی دکمه «+ افزودن ستون» کلیک میکنیم:
پنجره مودال «افزودن ستون» گشوده میشود. در کادر «نام ستون سفارشی»، عنوان «مهلت باقی مانده انجام این پروژه» را درج نموده و بر روی دکمه آبیرنگ «افزودن» کلیک میکنیم:
کارت ستون جدید با عنوان درجشده و نوع پیشفرض «داده» بلافاصله در انتهای کارتهای خروجی روی بوم مستقر میشود:
در سمت چپ کارت ستون جدید، بر روی آیکن چرخدنده خاکستریرنگ کلیک میکنیم تا منوی ابزارهای پیشرفته باز شود. سپس گزینه اول یعنی «</> کاستوم کد» را انتخاب مینماییم:
پنجره مودال ویرایشگر کد با عنوان اختصاصی «کاستوم کد برای ستون: مهلت باقی مانده انجام این پروژه» باز میشود:
همانطور که در کامنت نمونه اولیه محیط ادیتور مشاهده میشود (// var result = args.row.ColumnName;)، موتور ارزیابی جاوااسکریپت GraphBPMS در یک کانتکست ایزوله اجرا شده و در پایان پردازش، مقدار نهایی را مستقیماً از متغیر result واکشی میکند. لذا طراحان هرگز نباید از دستور return در سطح بالای کد استفاده کنند، بلکه نتیجه محاسبات یا تگهای HTML باید مستقیماً درون متغیر result مقداردهی شوند. همچنین دسترسی به فیلدهای سطر جاری منحصراً از طریق آبجکت args.row صورت میپذیرد.
اکنون کدهای جاوااسکریپت محاسباتی را در ویرایشگر درج میکنیم. در این سناریو، تاریخ سررسید پروژه (DueDateShamsi) از سطر جاری خوانده شده، با تاریخ جاری سیستم (محاسبهشده بر پایه تقویم استاندارد بدون وابستگی به مرورگر) مقایسه میشود و تعداد روزهای باقیمانده به همراه وضعیت درصد پیشرفت (ProgressPercent) در دو خط رندر میگردد:
قطعهکد استاندارد و تستشده جهت کپی و استفاده در این سناریو:
// ۱. دریافت تاریخ سررسید و درصد پیشرفت از سطر جاری
var dueDateStr = args.row.DueDateShamsi;
var progress = Number(args.row.ProgressPercent) || 0;
var result = "";
// ۲. در صورت تکمیل بودن ۱۰۰٪ پروژه
if (progress >= 100) {
result = '<div style="line-height: 1.4;">' +
' <span style="color: #15803d; font-weight: bold;">✓ تحویل داده شده</span>' +
' <div style="font-size: 11px; color: #15803d; margin-top: 2px;">(پیشرفت: ۱۰۰٪)</div>' +
'</div>';
} else if (!dueDateStr) {
result = '<span style="color: #94a3b8;">تاریخ نامشخص</span>';
} else {
// ۳. تجزیه تاریخ سررسید شمسی (مثال: 1405/08/15)
var parts = String(dueDateStr).split('/');
var dueYear = parseInt(parts[0], 10);
var dueMonth = parseInt(parts[1], 10);
var dueDay = parseInt(parts[2], 10);
// ۴. استخراج تاریخ امروز شمسی به صورت ریاضی خالص از روی تقویم میلادی
var d = new Date();
var gy = d.getFullYear() - 1600;
var gm = d.getMonth();
var gd = d.getDate() - 1;
var g_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
var j_days = [31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29];
var g_day_no = 365 * gy + Math.floor((gy + 3) / 4) - Math.floor((gy + 99) / 100) + Math.floor((gy + 399) / 400);
for (var i = 0; i < gm; ++i) g_day_no += g_days[i];
if (gm > 1 && ((gy % 4 == 0 && gy % 100 != 0) || (gy % 400 == 0))) ++g_day_no;
g_day_no += gd;
var j_day_no = g_day_no - 79;
var j_np = Math.floor(j_day_no / 12053);
j_day_no %= 12053;
var jy = 979 + 33 * j_np + 4 * Math.floor(j_day_no / 1461);
j_day_no %= 1461;
if (j_day_no >= 366) {
jy += Math.floor((j_day_no - 1) / 365);
j_day_no = (j_day_no - 1) % 365;
}
var jm = 0;
for (var j = 0; j < 11 && j_day_no >= j_days[j]; ++j) {
j_day_no -= j_days[j];
jm = j + 1;
}
var jd = j_day_no + 1;
var todayMonth = jm + 1;
// ۵. تبدیل هر دو تاریخ به روز مطلق از مبدأ جهت محاسبه دقیق روزهای باقیمانده
var dueTotalDays = (dueYear - 1400) * 365 + Math.floor((dueYear - 1400) / 4) + (dueMonth <= 6 ? (dueMonth - 1) * 31 : 186 + (dueMonth - 7) * 30) + dueDay;
var todayTotalDays = (jy - 1400) * 365 + Math.floor((jy - 1400) / 4) + (todayMonth <= 6 ? (todayMonth - 1) * 31 : 186 + (todayMonth - 7) * 30) + jd;
var daysLeft = dueTotalDays - todayTotalDays;
var statusText = "";
var statusColor = "";
if (daysLeft < 0) {
statusText = "⚠️ " + Math.abs(daysLeft) + " روز گذشته";
statusColor = "#dc2626";
} else if (daysLeft <= 30) {
statusText = "⏳ " + daysLeft + " روز (فوری)";
statusColor = "#d97706";
} else {
statusText = "⏱ " + daysLeft + " روز باقیمانده";
statusColor = "#0284c7";
}
// ۶. تخصیص خروجی نهایی به متغیر result (ترکیب وضعیت مهلت و درصد پیشرفت)
result = '<div style="line-height: 1.4;">' +
' <div style="color: ' + statusColor + '; font-weight: bold;">' + statusText + '</div>' +
' <div style="font-size: 11px; color: #475569; margin-top: 2px;">پیشرفت: <strong>' + progress + '%</strong></div>' +
'</div>';
}
در انتهای کدهای درجشده، بر روی دکمه آبیرنگ «ذخیره» در پایین سمت چپ پنجره مودال کلیک میکنیم تا کدهای ستون تأیید گردند:
پس از بستن مودال کاستوم کد، الزامی است که حتماً بر روی دکمه «ذخیره» (سبز رنگ) یا «ذخیره و بازگشت» (آبی رنگ) در نوار ابزار بالای استودیو کلیک کنید. ذخیره کردن کل گزارش باعث میشود متادیتای ستون جدید و کدهای جاوااسکریپت به صورت پایدار در پایگاهداده GraphBPMS ذخیره و ثبت رسمی شوند.
اکنون به تب «پیش نمایش منبع» در بالای بوم مراجعه کرده و بر روی دکمه آبیرنگ «پیش نمایش» کلیک میکنیم. همانطور که در تصویر زیر مشاهده میشود، ستون «مهلت باقی مانده انجام این پروژه» در گرید عملیاتی با جلوهای چشمنواز رندر شده است:
نمای کلوزآپ ستون نشان میدهد که چگونه کد جاوااسکریپت وضعیت هر پروژه را به صورت هوشمند تفکیک کرده است: پروژههای با مهلت کافی با نماد ساعت آبیرنگ (مانند ۱۰۵ روز باقیمانده)، پروژههای با مهلت اضطراری با نماد ساعت شنی نارنجی (مانند ۳۰ روز فوری)، و در خط دوم، درصد پیشرفت فیزیکی کارگاه در یک نگاه به تصمیمگیرندگان منتقل میشود:
برای ترکیب فیلدها، درج مقادیر ثابت یا سیستمی و انجام محاسبات بدون نیاز به کدنویسی جاوااسکریپت، ابزار فرمولساز (∑) به عنوان بستر Low-Code / No-Code استودیو طراحی شده است. در این کارگاه، یک ستون ترکیبی تحت عنوان «جزئیات تکمیلی پروژه در یک نگاه» ایجاد میکنیم.
روی بوم منبع مستر (پروژهها)، به انتهای لیست فیلدهای خروجی اسکرول کرده و بر روی دکمه «+ افزودن ستون» کلیک میکنیم:
پنجره مودال «افزودن ستون» باز میشود. در فیلد «نام ستون سفارشی»، عنوان «جزئیات تکمیلی پروژه در یک نگاه» را وارد کرده و بر روی دکمه آبیرنگ «افزودن» کلیک مینماییم:
کارت فیلد جدید با عنوان ثبتشده و نوع پیشفرض «داده» به خروجیهای گزارش اضافه میگردد:
بر روی آیکن چرخدنده در بالای سمت چپ کارت ستون کلیک کرده تا منوی کشویی عملیات نمایان گردد. سپس بر روی گزینه دوم یعنی «∑ فرمول ساز» کلیک میکنیم:
پنجره مودال اختصاصی تحت عنوان «فرمول ساز برای ستون: جزئیات تکمیلی پروژه در یک نگاه» گشوده میشود. این پنجره شامل انتخابگر منابع مقدار (مقدار ثابت، سیستمی، کوئری استرینگ، ستون منبع داده)، کادر درج مقدار و کادر «نتیجه نهایی» جهت ساخت ترکیبهای متنی و محاسباتی است:
فرمولساز GraphBPMS از چهار منبع داده پشتیبانی میکند. اولین شاخصه، «مقدار ثابت» است که برای افزودن پیشوندها، پسوندها یا جداکنندههای متنی ثابت کاربرد دارد. رادیوباتن «مقدار ثابت» را انتخاب کرده، متن دلخواه مانند جزئیات تکمیلی پروژه : را در کادر «مقدار مورد نظر» تایپ نموده و بر روی دکمه آبیرنگ «+» (افزودن) کلیک میکنیم:
به محض کلیک بر روی دکمه پلاس، مقدار ثابت در کادر «نتیجه نهایی» به صورت یک چیپ (Chip) مستقل با امکان حذف تعاملی (×) قرار میگیرد:
دومین شاخصه، متغیرهای سیستمی هستند که امکان استخراج اطلاعات بلادرنگ نشست کاربری و بستر اجرایی را بدون کدنویسی فراهم میسازند. با انتخاب رادیوباتن «سیستمی»، منوی کشویی مقادیر سیستمی فعال میشود:
در این سناریو، گزینه «تاریخ جاری» را انتخاب کرده و بر روی دکمه پلاس کلیک میکنیم. همانطور که در تصویر زیر مشاهده میشود، متغیر سیستمی به صورت چیپ تیره سیستمی 3 در کنار مقدار ثابت قبلی درون کادر «نتیجه نهایی» مینشیند:
سومین شاخصه قدرتمند فرمولساز، «کوئری استرینگ» (QueryString) است. این قابلیت زمانی کاربرد حیاتی دارد که گزارش از طریق یک لینک خارجی، پیشخوان داشبورد، یا پاپآپهای فرمساز با پارامترهای ارسالی در آدرس URL فراخوانی شود. با انتخاب این رادیوباتن، نام پارامتر موجود در آدرس صفحه (مانند query_string_title) را درج میکنیم تا در صورت وجود در URL، مقدار آن به صورت خودکار در این فیلد فرمول جایگزین گردد:
یک نکته تجربی و بسیار مهم در فرمولساز این است که جهت خوانایی عبارات متنی ترکیبی، میان المانهای مختلف فاصله (Space) ایجاد شود. بدین منظور، مجدداً رادیوباتن «مقدار ثابت» را انتخاب کرده، درون کادر «مقدار مورد نظر» یک یا چند فاصله (اسپیس) قرار میدهیم و بر روی دکمه پلاس کلیک میکنیم تا یک چیپ فاصله خالی به عنوان جداکننده در انتهای کادر نتیجه نهایی اضافه گردد:
چهارمین و محوریترین شاخصه، «ستون منبع داده» است. با فعالسازی این رادیوباتن، تمامی فیلدهای واکشیشده توسط کوئری منبع داده درون منوی انتخابی لیست میشوند. در این گام فیلد ProjectCode را انتخاب کرده و بر روی دکمه آبیرنگ پلاس کلیک میکنیم:
با همین الگو و با درج فواصل متنی ثابت در میان آیتمها، میتوان فیلدهای تکمیلی نظیر CategoryTitle (عنوان دستهبندی موضوعی) را به ترکیب فرمول ملحق ساخت:
همچنین برای فیلدهای عددی مانند درصد پیشرفت پروژه (ProgressPercent)، میتوان ابتدا یک مقدار ثابت با عنوان درصد پیشرفت: تعریف نمود و سپس فیلد عددی متناظر را پس از آن متصل کرد تا عبارت نهایی در سلولهای گزارش به صورتی کاملاً رسا و شفاف رندر شود.
پس از تکمیل فرمول و مشاهده چیدمان کامل چیپها در کادر نتیجه نهایی، بر روی دکمه سبز رنگ «ذخیره» در پایین سمت چپ پنجره مودال کلیک میکنیم:
دقیقاً مشابه سناریوی ستونهای Custom JS، پس از تأیید فرمول در مودال، ضروری است که حتماً بر روی دکمه «ذخیره» یا «ذخیره و بازگشت» در نوار ابزار بالای استودیو کلیک کنید تا تعریف متادیتا و فرمول ستون جدید به صورت پایدار در پایگاهداده ذخیره گردد و موتور گزارشساز بتواند آن را در تب پیشنمایش کامپایل و رندر نماید.
اکنون به تب «پیش نمایش منبع» رفته و بر روی دکمه «پیش نمایش» کلیک میکنیم. همانطور که در تصویر زیر به وضوح مشاهده میشود، ستون شخصیسازیشده «جزئیات تکمیلی پروژه در یک نگاه» به عنوان آخرین ستون گرید رندر شده و تمامی بخشهای ثابت، متغیرهای سیستمی، کد پروژه، دستهبندی و درصد پیشرفت را در یک نگاه به کاربران نمایش میدهد:
| ویژگی مقایسه | فرمولساز ویژوال (Formula Builder) | کاستوم کد جاوااسکریپت (Custom JS) |
|---|---|---|
| سطح مهارت موردنیاز | کاربر عمومی / تحلیلگر کسبوکار (No-Code / Low-Code) | توسعهدهنده فرانتاند و برنامهنویس (Full-Code) |
| نوع محاسبات | عملیات ریاضی ساده (+, -, *, /) و الحاق رشتههای متنی ثابت |
منطق شرطی پیشرفته (if-else, switch)، توابع ریاضی پیچیده، حلقهها |
| خروجی بصری | رشته متنی یا عدد خام در سلول | تولید المانهای غنی HTML5، نوارهای پیشرفت داینامیک، استایلهای شرطی CSS و بجهای رنگی |
| نمونه کاربردی در کارگاه | تولید کدینگ کامل پروژه: [ProjectCode] + ' - ' + [ProjectTitle] یا محاسبه مالیات بر ارزش افزوده ۱۰٪: [BudgetAmount] * 0.10 |
نمایش نوار وضعیت فیزیکی پروژه به صورت Progress Bar گرافیکی بر اساس درصد پیشرفت |
یکی از قدرتمندترین تمایزهای گزارشساز GraphBPMS با سایر ابزارهای BI و گزارشگیری سنتی، تبدیل گزارش از یک صفحه ایستا به یک مرکز فرماندهی و درگاه عملیاتی (Action-Oriented Portal) است. طراح میتواند ستونهای دکمهای تعاملی تعریف کند که با کلیک کاربر روی هر سطر، فرم فرایندی مرتبط در حالت ویرایش باز شود، گردشکارهای سازمانی کلید بخورد، یا اعلان صادر گردد.
روی بوم منبع مستر (لیست پروژهها)، به انتهای لیست کارتهای خروجی اسکرول میکنیم و بر روی دکمه «+ افزودن ستون» کلیک مینماییم:
پنجره مودال «افزودن ستون» باز میشود. نام ستون را «باز کردن فرم پروژه» وارد کرده و روی افزودن کلیک میکنیم:
کارت خروجی جدید بلافاصله در انتهای لیست فیلدهای مستر قرار میگیرد:
در گوشه سمت چپ بالای کارت جدید، منوی ماهیت فیلد را از حالت پیشفرض «داده» به گزینه «دکمه» تغییر میدهیم:
سپس بر روی آیکن چرخدنده کارت کلیک کرده و گزینه «تنظیمات دکمه» را انتخاب میکنیم تا پنل تخصصی دکمه در سایدبار سمت راست استودیو گشوده شود:
در این تب، عنوان دکمه را بر روی «باز کردن فرم پروژه» تنظیم نموده، سبک متن را مشخص میکنیم و از کتابخانه آیکنها، آیکن چشم (fa-eye) را جستجو و برمیگزینیم:
در تب دوم، منوی کشویی «نوع عملیات» قرار دارد که تعیینکننده رفتار اجرایی دکمه در سطح پلتفرم است. استودیوی ساخت گزارش از ۶ نوع عملیات تخصصی پشتیبانی میکند:
| نوع عملیات | رفتار و عملکرد سیستمی | پارامترها و تنظیمات اختصاصی | کاربرد ملموس در سازمان |
|---|---|---|---|
| ۱. فرم (Form) | فراخوانی و باز کردن فرم الکترونیک متصل به فرایند بر اساس شناسه رکورد سطر جاری. | انتخاب فرم، نوع نمایش (ویرایش / مشاهده / ثبت)، نوع باز شدن (Popup / Tab)، نگاشت شناسه رکورد. | ویرایش مشخصات پروژه، اصلاح اطلاعات پرسنلی، تأیید درخواست. |
| ۲. گزارش (Report) | هدایت کاربر به یک گزارش تحلیلی دیگر به صورت سلسلهمراتبی (Drill-down). | انتخاب گزارش مقصد، نگاشت پارامترهای ارسالی از ستونهای سطر جاری. | مشاهده گزارش گردش مالی حساب متناظر با مشتری سطر جاری. |
| ۳. قالب چاپ (Print Template) | ارسال مستقیم دادههای سطر یا گزارش به موتور چاپ Stimulsoft Reports. | انتخاب تمپلیت چاپ، تولید PDF بلادرنگ یا هدایت به پیشنمایش پرینت. | صدور فیش حقوقی، چاپ قرارداد یا صدور پرینت رسمی صورتوضعیت. |
| ۴. ارسال اعلان (Notification) | صدور و ارسال نوتیفیکیشن درونسازمانی، پیامک یا ایمیل بر اساس ردیف. | تعیین گیرندگان، قالب پیام، ارسال بر اساس فیلدهای سطر. | ارسال هشدار تأخیر پروژه به مدیر پروژه متناظر با ردیف. |
| ۵. URL | باز کردن یک پیوند وب داخلی، روت اختصاصی سامانه یا آدرس خارجی. | آدرس URL با قابلیت الصاق متغیرهای سطر در QueryString (نظیر ?id=@Id). |
اتصال به درگاه بانکی، پورتال استعلام اسناد یا سامانه ناظر بیرونی. |
| ۶. نمایش پیام (Message) | نمایش دیالوگ پیام، آلرت تأیید (Confirm) یا اطلاعات تکمیلی. | عنوان پیام، متن پیام (با فیلدهای پویا)، دکمههای تایید/انصراف. | نمایش خلاصه وضعیت پروژه پیش از تصمیمگیری مدیریتی. |
در سناریوی کارگاه، میخواهیم کاربر با کلیک روی دکمه هر پروژه، فرم جامع مشخصات پروژه (متصل به موجودیت GB_Project) را در حالت ویرایش و به صورت پنجره شناور (Popup) باز کند. تنظیمات این بخش را به شرح زیر اعمال میکنیم:
فرممشخصات پروژه (فرم الکترونیک متصل به موجودیت GB_Project)ویرایش (Edit Mode) جهت امکان بهروزرسانی فیلدهاPopup (پنجره شناور مودال روی گرید)Id همان سطر را بردارد و فرم ویرایش متناظر با همان شناسه را بارگذاری کند!اتصال ستون دکمهای به فرم الکترونیک، حلقه مفقوده میان گزارشگیری و ثبت عملیات را برطرف میکند. کاربر بدون خروج از محیط گزارش، اطلاعات پروژه را اصلاح کرده و پس از بستن پاپآپ، گرید گزارش با تغییرات جدید بهروزرسانی میشود.
پس از تکمیل تمامی پیکربندیهای هویتی، اتصال منابع مستر و دیتیل، نگاشت رابطهای کلیدها، فارسیسازی ستونها و تعریف ستون دکمهای، فرآیند را ذخیره و نهایی میکنیم.
در نوار ابزار بالای استودیو سمت چپ، بر روی دکمه آبیرنگ «ذخیره و بازگشت» کلیک میکنیم:
با کلیک بر روی این دکمه، تغییرات در پایگاهداده ذخیره شده و به صفحه پیشخوان مدیریت گزارشها (ReportManager) هدایت میشویم. گزارش «لیست پروژه ها و اقلام» در گروه «فرآیندهای کسب و کار گراف» و وضعیت فعال، رسماً در جدول ثبت و مستقر میگردد:
در سطر این گزارش در پیشخوان، بر روی آیکن چشم آبیرنگ (**مشاهده / پیشنمایش سریع**) در ستون عملیات کلیک میکنیم:
پنجره تمامصفحه پیشنمایش گزارش باز میشود. در سمت راست این پنجره، یک نوار کناری سورمهای تیره قرار دارد که ساختار دوگانه منابع گزارش را تفکیک کرده است: منبع اول «لیست پروژه ها master» و منبع دوم «صورتوضعیتها و اقلام هزینه detail»:
هنگامی که بر روی دکمه پیشنمایش منبع مستر کلیک میکنیم، لیست پروژهها بارگذاری میشود. توجه فرمایید: در ستون «شناسه» در ابتدای هر ردیف، یک فلش مثلثی بازشونده (Expand Triangle) پدیدار شده است:
اینک هنگامی که بر روی فلش مثلثی سطر اول (پروژه «احداث پست برق ۴۰۰ کیلوولت غرب») کلیک میکنیم، سطر والد باز شده و زیرجدول تودرتوی فرزند (Nested Child Grid) مستقیماً در زیر همان ردیف رندر میشود!
به یاد بیاورید که در بخش ۵، پارامتر ورودی ProjectId در منبع دیتیل را به ستون Id منبع مستر متصل کردیم. با کلیک بر روی فلش سطر اول، سامانه مقدار شناسه همان پروژه را به کوئری دیتیل ارسال کرد؛ در نتیجه دقیقاً صورتوضعیتهای مالی مرتبط با پروژه واکشی و در زیرجدول نمایش داده شد!
همچنین کاربر میتواند با کلیک بر روی منبع دوم («صورتوضعیتها و اقلام هزینه detail») در سایدبار سمت راست، کل اقلام هزینه را به صورت یک گرید مستقل و یکپارچه مشاهده نماید:
اکنون کارکرد ستون عملیاتی «باز کردن فرم پروژه» را ارزیابی میکنیم. مجدداً از پیشخوان بر روی اکشن مشاهده کلیک میکنیم:
پس از کلیک روی پیشنمایش، جدول پروژهها رندر میشود. در انتهای جدول، ستون عملیاتی جدید «باز کردن فرم پروژه» با دکمههای آراسته و آیکن چشم آبیرنگ قرار دارد:
هنگامی که بر روی دکمه سطر اول (پروژه احداث پست برق ۴۰۰ کیلوولت غرب) کلیک میکنیم، پنجره شناور (Popup Modal) فرم مشخصات پروژه (موجودیت GB_Project) بلادرنگ روی صفحه باز میشود:
PRJ-101، بودجه مصوب، مهلت تحویل).در خروجی عملیاتی پلتفرم GraphBPMS، تمام قابلیتهای مهندسی لایه نمایش در یک گرید یکپارچه متبلور میشوند. جدول زیر ساختار واقعی گرید خروجی را پس از فعالسازی ستون فرمولساز، ستون کاستوم JS و ردیف تهجمعهای آماری (Footer Summary Row) به نمایش میگذارد:
| شناسه | کدینگ کامل پروژه (فرمولساز Formula Builder) |
دستهبندی | بودجه مصوب (ریال) (ستون منبع داده) |
مالیات ارزشافزوده (۱۰٪) (فرمولساز: Budget * 0.10) |
شاخص پیشرفت کارگاهی (کاستوم کد Custom JS) |
عملیات سازمانی (ستون دکمهای Action) |
|---|---|---|---|---|---|---|
| ▼ ۱ | PRJ-101 — احداث پست برق ۴۰۰ کیلوولت غرب |
عمرانی | ۵۰,۰۰۰,۰۰۰,۰۰۰ | ۵,۰۰۰,۰۰۰,۰۰۰ | 👁 باز کردن فرم | |
| ► ۲ | PRJ-102 — پیادهسازی زیرساخت فیبر نوری ناحیه صنعتی |
فناوری اطلاعات | ۲۵,۰۰۰,۰۰۰,۰۰۰ | ۲,۵۰۰,۰۰۰,۰۰۰ | 👁 باز کردن فرم | |
| ► ۳ | PRJ-103 — تجهیز سیستم تهویه و اطفا حریق مرکز مانیتورینگ |
تأسیسات | ۱۵,۰۰۰,۰۰۰,۰۰۰ | ۱,۵۰۰,۰۰۰,۰۰۰ | 👁 باز کردن فرم | |
| تعداد رکوردها: ۳ پروژه (تابع Count) جمع و میانگین کل (تهجمعهای پاورقی گرید): | ۹۰,۰۰۰,۰۰۰,۰۰۰ ریال (Sum) | ۹,۰۰۰,۰۰۰,۰۰۰ ریال (Sum) | میانگین: ۶۶.۷٪ (Avg) | — | ||
توجه داشته باشید که ستونهای «کدینگ کامل پروژه»، «مالیات بر ارزش افزوده» و «شاخص پیشرفت کارگاهی» هیچگونه جدول یا فیلد فیزیکی جدیدی در دیتابیس اشغال نکردهاند. همچنین محاسبات تهجمع (Sum و Avg و Count) به صورت خودکار توسط موتور استودیو در سمت کلاینت روی دادههای واکشیشده محاسبه میشوند که موجب حفظ تمیزی مدل داده و بالاترین سرعت بارگذاری در پلتفرم سازمانی میگردد.
پس از ساخت و انتشار گزارش، برای تنظیم سطوح دسترسی کاربران و رونوشت به نقشها به [REPORT-01] بخش ۱۲: ماتریس مجوزها، برای طراحی قالبهای چاپی شکیل Stimulsoft به [REPORT-03] استودیوی خروجی قالب چاپ، و برای افزودن داشبوردهای بصری نموداری به [REPORT-05] استودیوی خروجی نمودار مراجعه فرمایید.