خانه / آموزش Microsoft BI / درس بیست و چهارم- تمرین برای Container

درس بیست و چهارم- تمرین برای Container

حل یک نمونه تمرین با کمک کانتینر ها (Container)

فرض کنید تعدادی فایل تکست داخل یک فولدر داریم و قصد داریم فایل های داخل این فولدر را بخوانیم و داخل یک مقصد تجمیع کنیم.

مطابق آموزه های گذشته باید در اینجا از Foreach Loop Container استفاده کنیم. Foreach را باز میکنیم تا آن را کانفیگ کنیم.

نوع Enumerator را روی Foreach File Enumerator میگذاریم و فولدر را Browse میکنیم.

در قسمت Files فرمت را روی *.txt قرار میدهیم ، یعنی تمام فایل های txt را برای ما بخواند و بیاورد.

گزینه Traverse Subfolders ، به این موضوع اشاره میکند که اگر داخل فولدر مد نظرمان ، فولدر دیگری بود ، آنها را هم برایمان بررسی کند.

در قسمت  Variable Mapping ، یک متغیر به نام FileName ایجاد میکنیم. در واقع Container ما در اینجا هر سری اسامی فولدر ها را میخواند و داخل متغیر FileName میریزد.

حال وارد Data Flow Task میشویم. Flat File Source را قرار میدهیم و آن را به یک OLE DB Destination متصل میکنیم.

حال باید کانکشن Flat File Source را داینامیک کنیم تا هر تعداد فایلی که داخل فولدر داریم را بتوانیم بخوانیم.

در قسمت Connection Managers روی کانکشن کلیک راست کرده و Properties را میزنیم و در قسمت Expressions ، پنجره Expressions Editor را باز میکنیم.

Property را روی Connection String قرار میدهیم و قسمت Expressions را مطابق تصویر کانفیگ میکنیم.

عکس 30:39

حال فرض کنید این فایل ها مدام در حال تغییر و آپدیت شدن هستند. برای اینکه از ورود دیتای تکراری در مقصد جلوگیری کنیم ، باید از truncate استفاده کنیم و دیتای داخل جدول مقصد را پاک کنیم ، این دستور فقط دیتا را پاک میکند و کاری به متادیتا و Structure جدول ندارد.

این دستور را میتوان در قالب Execute SQL Task قرار داد.

عکس 42:34

عکس 43:56

گاهی اوقات پیش میاید که در هنگام ساخت یک پکیج نیاز به پیش بردن کار به واسطه یک کد C# یا .Net باشد. در این موارد از Script Task میتوانیم استفاده کنیم.

همچنین شما میتوانید با این کامپوننت ، به یک متغیر مقدار دهی کنید و در ادامه از آن متغیر مقدار دهی شده استفاده کنید.

خلاصه هر جا که کامپوننت های SSDT نیازتون رو براورده نکرد میتونید با نوشتن کد سی شارپ نیازتون رو برطرف کنید.

فرض کنید اکنون میخواهیم با کمک Script Task ، یک عدد تصادفی از ۱ تا ۱۰ تولید کرده و با توجه به این عدد ، فروش منطقه ای که آیدی آن متناظر با عدد رندوم ما میباشد را محاسبه کنیم.

برای کار کردن به صورت بهینه با Script Task ، باید یک متغیر را تعریف کنیم ، آن را به این Script Task بفرستیم تا مقدار دهی شود و سپس آن را در ادامه پکیج استفاده کنیم.

عکس 57:08

حال به سراغ کانفیگ Script Task میرویم.

عکس 57:38

ReadOnly Variable ها متغیر هایی هستند که در طول پکیج فقط میخواهیم دیتای آنها را بخوانیم و از آن استفاده کنیم و قصد اعمال تغییری رو آنها نداریم.
ReadWrite Variable ها بر خلاف نوع قبلی ، هم قابلیت خوانده شدن و هم قابلیت تغییر پذیری را دارند.

در این قسمت متغیر مورد نظرمان را قرار میدهیم زیرا قصد ایجاد تغییر در متغیر را داریم.

حال دکمه Edit Script… را میزنیم تا وارد محیط کدنویسی شویم.

عکس 1:02:24

همانگونه که در تصویر میبینیم ، محیطی user firendly دارد. حال کد مد نظرمان برای تولید عدد رندوم از ۱ تا ۱۰ را مینویسیم.

توجه کنید برای دسترسی به متغیر های SSIS در کد از دستور Dts استفاده میکنیم.

عکس 1:04:59

در ادامه باید از FactInternetSales ، فروش ناحیه ای که کد آن تولید شده را در دیتابیس مقصد قرار دهیم.

Data Flow Task را باز میکنیم ، OLE DB Source و OLE DB Destination را قرار میدهیم و سراغ کانفیگ سورس میرویم.

عکس 1:06:40

حال قسمت Parameters را انتخاب میکنیم.و همانند تصویر زیر آن را کانفیگ میکنیم.

عکس 1:06:53

حال Destination را کانفیگ میکنیم و پکیج را اجرا میکنیم.

پس از اجرای پکیج به سراغ جدول ساخته شده میرویم تا وضعیت دیتا ها را ببینیم.

عکس 1:08:58

مطابق تصویر ، در میابیم عددی که به صورت رندوم برای ما تولید شده ، عدد ۷ بوده زیرا ناحیه فروش در کل دیتا ها این عدد است و نتیجه میگریم کد Script Task و پکیج مان به درستی اجرا شده اند.

مثال دیگر :

حال میخواهیم با استفاده از Forloop Container و Script Task ، ۱۰۰ عدد تصادفی ایجاد کنیم ، اگر عدد تولید شده زوج بود به مقدار ستون Even یک واحد اضافه شود و اگر فرد بود به ستون Odd یک واحد اضافه شود. توجه کنید که هر دوی این ستون ها دارای مقدار اولیه ۰ میباشند.

در این مثال قصد انتقال داده نداریم و در نتیجه از Data Flow Task استفاده نمیکنیم.

دو متغیر به نام های Result و Counter میسازیم که کاربرد این دو را در ادامه توضیح خواهیم داد.

عکس 1:15:08

عکس 1:15:11

حال Container را کانفیگ میکنیم. در تنظیمات این Container میخواهیم یک حلقه For 100 تایی را شبیه سازی کنیم.
در نتیجه InitExpression را روی ۱ و EvalExpression و AssignExpression را مطابق تصویر مقدار دهی میکنیم.

عکس 1:17:41

یعنی متغیر Counter از ۱ شروع شود و تا ۱۰۰ ادامه پیدا کند و هر بار که کانیتر کامل اجرا شد ، یک مقدار به Counter  اضافه شودو مادامی که مقدارش به ۱۰۰ برسد.

حال سراغ Script Task میرویم تا عدد تصادفی را ایجاد کنیم ، در نتیجه بدین شکل این کامپوننت را کانفیگ میکنیم.

عکس 1:18:15

عکس 1:18:44

کدی که در تصویر نوشته شده ، یک عدد از ۱ تا ۱۰۰۰ تولید میکند و در داخل متغیرمان میریزد.

حال باید تشخیص دهیم عدد تولید شده زوج است یا فرد؟!

دو کامپوننت Execute SQL Task قرار داده و کدهای زیر را در هر کدام قرار میدهیم.

UPDATE [Even_Odd_Count]

SET [even] = [even] + 1

و

UPDATE [Even_Odd_Count]

SET [odd] = [odd] + 1

عکس 1:20:26

عکس 1:21:09

حال باید پکیج را طوری تنظیم کنیم که اگر عدد تولید شده فرد بود به سوی کامپوننت Execute SQL Task ای که آن را Update Odd نامیده برود و هر موقع زوج تولید شد ، به سوی Update Even برود.

به خطوطی که میان تسک ها وجود دارند ، Precedence Constraint میگویند. با استفاده از این خطوط میتوان حالات اجرا بین تسک ها را تعیین کرد.

این خطوط سه حالت دارند : Success – Failure – Completion

بر روی خطوط دبل کلیک کرده تا پنجره تنظیمات مربوطه باز شود. Evaluation Operation را روی حالت Expression and Constraint قرار میدهیم و Value را هم روی Success میگذاریم. یعنی در حالتی تسک بعدی اجرا میشود که هم تسک قبلی موفقیت آمیز باشد و هم شرطی که در تنظیمات Precedence Constraint تعیین میکنیم ، برقرار بوده باشد.

عکس 1:29:29

شرط مد نظر را به صورت زیر مینویسیم :

عکس 1:31:41

مطابق همین تنظیمات را برای Update Odd نیز انجام میدهیم.

عکس 1:32:43

حال پکیج را اجرا میکنیم و سپس نتیجه را در جدولمان بررسی میکنیم.

عکس 1:33:59

مطابق تصویر متوجه میشویم که به واسطه کانتینر ، عملیاتمان به درستی و ۱۰۰ بار اجرا شده است.

فرض کنید دو کامپوننت مطابق تصویر داریم که تسک بعدی آنها مشترک است. در حالت عادی برای این دو کامپوننت حالت Logial And برقرار است ، یعنی هر دوی این کامپوننت ها باید Evaluate شوند تا تسک بعدی آغاز شود.

ولی میتوان این تنظیمات را تغییر داد و Logical And را مطابق تصویر به Logical Or تغییر داد.

عکس 1:40:07

یعنی اگر کامپوننت ۱ یا ۲ هر کدام که اجرا شدند ، کامپوننت بعدی شروع به اجرا کند.

درباره‌ی علیرضا حسن نژاد

همچنین ببینید

طراحی ساختار SSAS Tabular Model

درس سی ام – طراحی SSAS Tabular Model

ساخت و طراحی Tabular Model اصطلاحی داریم به نام SSRS یا SQL Server Reporting Server …

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

معادله امنیتی (فقط عدد بنویسید) *