یادآوری
همانطور که می دانید، در فیلدهای انتخابگر حرفی با تابع گردش کار، داده های مورد نیاز (کد، نام، طبقه بندی و جزئیات) از طریق یک تابع استخراج داده ها (WorkFieldSSViewMyName) از پایگاه مبدا (مثلا سیستم مالی نوسا) خوانده می شود. سوالی که در اینجا به ذهن می رسد این است که این داده ها چگونه از پایگاه مبدا خوانده و نمایش داده می شود. در جواب به این سوال باید بگوییم این داده ها توسط موجود WorkADOSelect و با استفاده از پارامترهای processedParams و rawParams استخراج و خوانده می شود.
همانطور که در مستندات قبلی گفته شد، مدل استفاده از processedParams برای زمانی است که View وجود دارد. در این مدل ویژگیهای WorkADOSelect برابر ویژگیهای متناظرهای آن در processedParams تعیین می شود و این ویژگیها که از قبل نوشته و پیاده سازی شده اند، از طریق View داده ها را می خوانند. در ادامه مطلب ابتدا با جزئیات تعامل رابط کاربری انتخابگر حرفی با تابع استخراج داده ها، از طریق مدل پیش ساخته processedParams آشنا می شویم و سپس با ذکر محدودیتهای processedParams، روش دسترسی مستقیم به داده ها با استفاده از پارامترهای خام rawParams را بررسی می کنیم.
نحوه کارکرد روش processedParams در خواندن و نمایش داده ها
داده های فیلد انتخابگر حرفی در دو جا پردازش و نمایش داده می شود: فرم ورود اطلاعات و محاوره انتخاب محتوا.
فرم ورود اطلاعات
هدف نهایی، انتخاب و قرار گرفتن داده های مورد نظر در فرم ورود اطلاعات است. در شکل زیر در یک فرم ورود اطلاعات، یک مثال از فیلد انتخابگر حرفی با نام کالا را ملاحظه می کنید:
در این فرم با کلیک روی تکمه انتخاب محتوا ()، فرم انتخاب محتوا به شکل زیر باز می شود:
محاوره انتخاب محتوا
در این محاوره همانند شکل زیر، فهرست داده ها به کاربر نمایش داده می شود و کاربر می تواند با استفاده از جستجو و ابزارهای دیگری که در محاوره موجود است، محتوای مورد نظر خود را انتخاب نماید:
ویژگیهای این محاوره به شرح زیر است:
- داده های کد (nwv_Code)، نام (nwv_Name)، جزئیات (nwv_Detail) و دسته بندی* (nwv_Category) از طریق View خوانده می شود.
- سه مورد از داده ها (کد، نام و دسته بندی*) در محاوره انتخاب محتوا بصورت یک فهرست نمایش داده می شود.
- این فهرست حداکثر شامل 1000 سطر می باشد.
- فیلد جزئیات مربوط به هر سطر، پس از کلیک روی تکمه ملاحظه جزئیات نشان داده می شود.
- فهرست داده ها قابل جستجو در کد و نام انتخابگر حرفی است.
- فهرست داده ها بطور پیش فرض براساس کد مرتب شده است اما اگر جستجو براساس نام انجام شود، آنگاه مرتب سازی بر اساس نام انجام می شود.
- این فهرست قابل فیلتر براساس دسته بندی* (در این مثال نام انبار) است.
- این فهرست قابل فیلتر براساس وابسته به کار بودن* است.
- این فهرست قابل فیلتر از طریق جستجوی پارامتریک در فیلدهای گردش کار است.
*: این موارد در تنظیمات فیلد انتخابگر حرفی تعیین و فعال می شود. در غیر این صورت، در محتوای محاوره تاثیری نخواهند داشت.
و در نهایت پس از انتخاب و تصویب روی سطر مورد نظر، داده های این سطر به فیلد انتخابگر حرفی در فرم ورود اطلاعات منتقل و به شکل زیر مشاهده می شود:
در این فرم از نمایش نیز تکمه ترکیبی shift+ ، فرم نمایش کامل (جزئیات) انتخابگر حرفی را باز می کند.
Call کردن تابع استخراج داده ها
پروسه ای که در قسمت قبل توضیح داده شد یعنی از زمانی که تکمه انتخاب محتوا () کلیک می شود تا زمانی که محتوای مورد نظر انتخاب و تصویب شده و در فرم ورود اطلاعات نمایش داده می شود Event های متعددی از طریق Call کردن تابع استخراج محتوا اجرا می شود. برای مثال چند مورد از Event ها به شرح زیر است:
- کلیک روی تکمه > باز شدن محاوره انتخاب محتوا > نمایش 1000 سطر از فهرست داده ها
- انتخاب دسته بندی مورد نظر از فهرست دسته بندیها و فیلتر شدن فهرست داده ها بر اساس دسته بندی منتخب
- فیلتر کردن فهرست داده ها از طریق جستجوی کد
- فیلتر کردن فهرست داده ها از طریق جستجوی نام
- فیلتر کردن فهرست داده ها از طریق جستجوی پارامتریک
- انتخاب و تصویب یک سطر از فهرست داده ها و نمایش این محتوا در فرم ورود اطلاعات
بدیهی است که در هر یک Eventها محتوای ویژگیهای processedParams بسته به شرایط، تعیین می شود. برای مثال:
- اگر فیلد انتخابگر حرفی وابسته به کار باشد، آنگاه در processedParams.FromClause ، جداول پایگاه مبدا (سیستم مالی) با جدول تراکنشهای گردش کار join می گردد.
- اگر فیلد انتخابگر حرفی دارای دسته بندی باشد آنگاه processedParams.SelectClause تغییر می کند و ستون دسته بندی به آن اضافه می شود .
- وقتی در محاوره انتخاب محتوا، یک دسته بندی خاص انتخاب می شود، آنگاه processedParams.WhereClause تغییر می کند و شرط دسته بندی به آن And می شود.
نکته مهم: یادآوری می شود که در حالت استفاده از processedParams تمام Event ها و اسکریپتها و Query های مرتبط با آنها از قبل پیش بینی و پیاده سازی شده است.
حال سوال این است که این روند چه کاستی دارد که باید به دنبال استفاده از rawParams باشیم.
چرا rawParams ؟
تجربه ای که تاکنون از کاربری فیلدهای انتخابگر حرفی داریم نشان می دهد که تقریبا 99 درصد نیازهای کاربر، از طریق الگوی processedParams تامین می شود. اما ممکن است در موارد نادر، و به هر دلیل این الگوی از پیش تعریف شده، نیازهای کاربر را برآورده نکند. برای نمونه به مثالهای زیر توجه کنید:
مثال 1: تغییر تعداد سطرهای پیش فرض فهرست داده ها
فرض کنید در یک سازمان، گردش کارهای متعددی وجود دارد که در هر کدام از آنها فیلدهای انتخابگر حرفی متعددی پیاده سازی شده است. بدیهی است که خواندن 1000 سطر به تعداد مکرر، بار زیادی روی سرور می گذارد و باعث کندی و افت کارآیی سیستم خواهد شد. حال مدیر سیستم فرایندها می خواهد تعداد پیش فرض سطرهای فهرست را از 1000 به مثلا 10 تغییر دهد.
مثال 2: تغییر مبنای مرتب سازی فهرست داده ها
همانطور که گفته شد، فهرست داده ها بر اساس کد یا نام و به شکل حرفی مرتب سازی می شود. حال فرض کنید در یک گردش کار خاص، کاربر می خواهد فهرست داده ها بر اساس نام دسته بندی (در این مثال نام انبار) مرتب شود.
مثال 3: مرتب سازی دسته بندی براساس کد دسته بندی
برای مثال فرض کنید در یک انتخابگر حرفی، فهرست دسته بندی (مثلا نام انبار) در حالت عادی به صورت حرفی مرتب می شود. حال فرض کنید هر انبار یک کد خاص دارد و الگوی فیلد دسته بندی به صورت (نام انبار +":" + کد انبار) نمایش داده می شود. در این موارد و بویژه زمانی که تعداد انبارها زیاد است، کاربران راحت تر هستند که با کد انبار کار کنند. لذا در این حالت باید دسته بندی ها را براساس کد مرتب کنیم.
ملاحظه می کنید این مثالها با الگوی قبلی قابل پیاده سازی نیست. در این موارد این امکان وجود دارد که با استفاده از rawParams استخراج داده ها را کاملا به شکل دلخواه و User Dfined تعریف کنیم. به عبارت دیگر باید ویژگیهای processedParams را شبیه سازی و مطابق نیازهای خود شخصی سازی کنیم.
دسترسی مستقیم به پایگاه مبدا از طریق پارامترهای خام rawParams
در این روش، هیچ Eventی از قبل پردازش نشده و باید با استفاده از پارامترهای rawParams تمام Eventهای انتخابگر حرفی را در فرم ورود اطلاعات و محاوره انتخاب محتوا پیاده سازی کنیم. در واقع در اینجا یک سری پارامترهای خام وجود دارد که بسته به تنظیمات فیلد انتخابگر حرفی و Eventها بطور خودکار مقدار دهی می شود و ما باید با استفاده از مقادیر این پارامترها، ویژگیهای WorkADOSelect (SelectClause,FromClause, WhereClause, OrderByClause)را در تابع استخراج داده ها درج کنیم.
به این منظور ساختار rawParams در سه نوع (Kind) و به شرح زیر ارائه می شود:
- (Kind=0) : نمایش فهرست داده ها(ssfrpkItemList)
این بخش داده ها را از پایگاه مبدا می خواند و به شکل یک فهرست نمایش می دهد. برای مثال در نمایش فهرست داده ها در محاوره انتخاب محتوا (شکل زیر)، از این پارامترها استفاده می شود:
در این حالت ساختار rawParams به شرح زیر است:
شرح
|
نام پارامتر
|
فهرست بر اساس کار (Owner) فيلتر شود. این پارامتر براساس تنظیمات انتخابگر حرفی و بصورت خودکار مقداردهی می شود. یعنی اگر در تنظیمات، گزینه فیلترینگ براساس کار، فعال باشد مقدار این پارامتر true و در غیر این صورت false خواهد بود.
|
filterByOwner: Boolean
|
کلید Owner. منظور کلید کاری است که انتخابگر حرفی وابسته به آن است.
|
ownerKey: Number
|
فهرست بر اساس دسته بندی انتخاب شده (categoryStr)، فیلتر شود. این پارامتر براساس تنظیمات انتخابگر حرفی و بطور خودکار مقداردهی می شود. به این صورت که اگر گزینه دسته بندی فعال باشد، مقدار این پارامتر true و در غیر این صورت false خواهد بود.
|
filterByCategory: Boolean
|
اطلاعات دسته بندی (Category) نيز بازگردانده شود: این پارامتر نیز همانند پارامتر قبلی بطور خودکار از تنظیمات تعیین می شود. یعنی اگر انتخابگر حرفی دارای دسته بندی باشد true و در غیر این صورت false خواهد بود.
|
getCategoryData: Boolean
|
عبارت شرط دسته بندی (Category): یعنی همان دسته بندی انتخاب شده توسط کاربر
|
categoryStr: String
|
عبارت شرط نام (Name): یعنی عبارتی که در فیلد نام برای جستجو وارد شده است.
|
nameQueryStr: String
|
عبارت شرط کد (Code): عبارتی که در فیلد کد برای جستجو وارد شده است.
|
codeQueryStr: String
|
آرايه کليدهاي محدودکننده: منظور آرایه ایست از کلیدهای کارها که از جستجوی پارامتریک بدست می آید. یادآوری می شود که فهرست داده ها براساس این آرایه فیلتر می شود.
|
filterCodeArray: array of Number
|
حداکثر تعداد سطرهاي فهرست داده ها
|
topCount: Number
|
در این حالت برای نوشتن ویژگیهای WorkADOSelect باید شرایط زیر را در نظر بگیریم:
فهرست فيلدهای متناظر با کد (nwv_Code) ، نام (nwv_Name) و جزئیات (nwv_Detail) و اگر پارامتر getCategoryData مقدار true داشته باشد، فیلد متناظر دسته بندی (nwv_Category) نیز به فهرست فیلدها اضافه می شود
ضمنا باید تعداد سطرهای فهرست با توجه به مقدار پارامتر topCount تعیین شود.
|
SelectClause
|
در اینجا جدولهای اطلاعاتی مورد نیاز (مثلا جدول محصولات _Mats در پایگاه مالی) درج می شود و اگر پارامتر filterByOwner مقدار true داشته باشد آنگاه باید با جدول تراکنشهای گردش کار inner join شود
|
FromClause
|
فهرست فیلدها براساس محتوای پارامترهاي filterByOwner و ownerKey و nameQueryStr و codeQueryStr و filterBycategory و categoryStr محدود می شود.
|
WhereClause
|
در اینجا مرتب سازی فهرست داده ها را بر مبنای فیلد
کد يا نام یا هر الگوی دیگری که در نظر داریم تعیین می کنیم.
|
OrderByClause
|
نتیجه: در هر مرحله از پروسه کار با انتخابگر حرفی که نیاز به نمایش فهرست داده ها باشد (مثلا در محاوره انتخاب محتوا)، تابع استخراج داده ها با شرط kind=0 صدا زده می شود.
- (kind=1) : نمایش داده ها برای یک کد خاص (ssfrpkDataByCode)
هر گاه نیاز داشته باشیم، داده های یک کد خاص را نمایش دهیم باید از این پارامترها استفاده کنیم. این مورد در جاهای متعددی استفاده می شود که در زیر به سه مورد اشاره می شود:
- فرم ورود اطلاعات: وقتی در محاوره انتخاب محتوا یک سطر حاوی یک کد خاص را انتخاب و محاوره را تصویب می کنیم، داده های این سطر در فیلد انتخابگر حرفی در محاوره ورود اطلاعات نمایش داده می شود:
- محاوره نمایش کامل: در فرم ورود اطلاعات، کلید ترکیبی Shift+ و در فرم انتخاب محتوا، کلید «ملاحظه جزئیات» فرم نمایش کامل انتخابگر حرفی را به شکل زیر باز می کند:
- انواع گزارشهای گردش کار: در هر گزارشی که شامل فیلدهای انتخابگر حرفی از نوع تابع گردش کار باشد، در هنگام نمایش انتخابگر حرفی، تابع استخراج داده ها با kind=1 صدا زده می شود. برای مثال در شکل زیر، گزارش فهرست کارها به همراه فیلدهای قابل تعریف را مشاهده می کنید. در این گزارش، ستونهای کد محصول و نام محصول متعلق به یک فیلد انتخابگر حرفی است که محتوای این ستونها با صدا زدن تابع استخراج داده ها، از پایگاه مبدا خوانده شده و نمایش داده می شود.
در این حالت، ساختار rawParams به شکل زیر است:
کد انتخابگر حرفی: کد منتخب و مورد نظر کاربر
|
code: String
|
فهرست بر اساس کار (Owner) فيلتر شود: این پارامتر براساس تنظیمات انتخابگر حرفی و بصورت خودکار مقداردهی می شود. یعنی اگر در تنظیمات، گزینه فیلترینگ براساس کار، فعال باشد مقدار این پارامتر true و در غیر این صورت false خواهد بود.
|
filterByOwner: Boolean
|
کلید Owner: منظور کلید کاری است که انتخابگر حرفی وابسته به آن است.
|
ownerKey: Number
|
فيلد جزئيات نيز بازگردانده شود: این پارامتر بطور خودکار و در زمانی که کاربر، فرم ورود اطلاعات یا محاوره جزئیات را مشاهده می کند مقدار true می گیرد.
|
getDetail: Boolean
|
در محاوره نمایش کامل (جزئیات)، فيلد دستهبندي نيز نمایش داده شود: اگر در تنظیمات انتخابگر حرفی، گزینه دسته بندی فعال باشد آنگاه این پارامتر بطور خودکار مقدار true و در غیر این صورت مقدار false به خود می گیرد.
|
getCategory: Boolean
|
در این قسمت، ویژگیهای WorkADOSelect شامل موارد زیر می باشد:
نتیجه: هرگاه اطلاعات یک کد منتخب نمایش داده می شود در واقع تابع استخراج داده ها با k=1 صدا زده می شود.
فهرست فيلدهای متناظر با نام (nwv_Name) و جزئیات (nwv_Detail) و دسته بندی (nwv_Category)
|
SelectClause
|
در اینجا جدولهای اطلاعاتی مورد نیاز (مثلا جدول محصولات _Mats در پایگاه مالی) درج می شود
|
FromClause
|
در اینجا عبارت شرط بر اساس کد منتخب (rawParams.code) می باشد.
|
WhereClause
|
"": در اینجا چون تنها یک سطر منتخب از فهرست داده ها نمایش داده می شود لذا مرتب سازی معنی ندارد و این ویژگی Null می باشد
|
OrderByClause
|
- (kind=2): نمایش فهرست دسته بندی ها (ssfrpkCategoryList)
در این قسمت، لیست دسته بندی ها از پایگاه مبدا خوانده شده و نمایش داده می شود. برای مثال در محاوره انتخاب محتوا، فهرست دسته بندی ها در یک ناحیه بصورت کشویی قابل نمایش و انتخاب است. نمونه این فهرست با عنوان «نام انبار»، در شکل زیر نمایش داده شده است:
در این حالت ساختار rawParams بصورت زیر است:
filterByOwner: Boolean
|
فهرست دسته بندی ها بر اساس کار (Owner) فيلتر شود. این پارامتر براساس تنظیمات انتخابگر حرفی و بصورت خودکار مقداردهی می شود. یعنی اگر در تنظیمات، گزینه فیلترینگ براساس کار، فعال باشد مقدار این پارامتر true و در غیر این صورت false خواهد بود.
|
ownerKey: Number
|
کلید Owner. منظور کلید کاری است که انتخابگر حرفی وابسته به آن است.
|
ملاحظه می کنید که تنها عامل محدود کننده فهرست دسته بندی ها، وابسته بودن انتخابگر حرفی به کار است.
در این بخش، ویژگیهای WorkADOSelect به شکل زیر می باشد:
فیلد متناظر با دسته بندی (nwv_Category)
|
SelectClause
|
در اینجا جدولهای اطلاعاتی مورد نیاز (مثلا جدول محصولات _Mats در پایگاه مالی) درج می شود و اگر پارامتر filterByOwner مقدار true داشته باشد آنگاه باید با جدول تراکنشهای گردش کار inner join شود
|
FromClause
|
شرايط لازم براي محدودسازي بر اساس پارامترهاي filterByOwner و ownerKey (کلید کار) می باشد
|
WhereClause
|
"nwv_Category": یعنی این که بر مبنای الگوی دسته بندی و به شکل حرفی مرتب می شود. البته مبنای مرتب سازی می تواند هر فیلد دیگر (مثلا کد انبار) یا الگوی ترکیبی از فیلدهای جداول پایگاه مبدا باشد.
|
OrderByClause
|
توضیح مهم: در توضیحات ویژگیهای WorkADOSelect در انواع مختلف rawParams گفته شد که فیلدها باید متناظر با فیلدهای ساختار انتخابگر حرفی (nwv_Code, nwv_Name, nwv_Detail, nwv_Category) باشد. منظور از متناظر این است که باید با استفاده از عبارت AS فیلدهای مورد نظر از پایگاه مبدا را همنام فیلدهای ساختاری انتخابگر حرفی نماییم. برای مثال فرض کنید ستون pr_Title از یک جدول اطلاعاتی متناظر نام انتخابگر حرفی است. در این صورت باید این ستون را به شکل زیر بنویسیم :
pr_Title AS nwv_Name
یادآوری می شود که در مدل استفاده از SQL View این کار در View انجام می شود.
حال که با پارامترهای rawParams آشنا شدیم وقت آن است که با یک واقعی، با نحوه کاربرد این پارامترها در تابع استخراج داده ها آشنا شویم:
مثال استفاده از rawParams در تابع استخراج داده ها
کالاهای موجود در انبار
فرض کنید در یک گردش کار تامین کالاها، فیلد کالا به شکل انتخابگر حرفی با تابع گردش کار است. تابع استخراج این فیلد به شکل زیر است:
function WorkFieldSSViewProduct(rawParams, processedParams) {
WorkADOSelect.ComputerName="nosa-test";
WorkADOSelect.SqlInstanceName = "";
WorkADOSelect.DBName = "_AccXP_hamayesh992";
WorkADOSelect.FromClause="_Mats" +
" inner join _MatStock on mat_Key=mst_MatKey " +
" inner join _Stocks on mst_StockKey=st_Key";
WorkADOSelect.WhereClause=" (1=1) ";
if (rawParams.kind==0) {
rawParams.topCount=70;
WorkADOSelect.SelectClause =" top " + rawParams.topCount+
" mat_Code as nwv_Code, mat_Name as nwv_Name"+
", cast(mat_Desc as nvarchar(max)) as nwv_Detail" +
", st_Name as nwv_Category";
if (rawParams.categoryStr) {
WorkADOSelect.WhereClause +=" and st_Name ='" + rawParams.categoryStr + "'";
}
if (rawParams.codeQueryStr) {
WorkADOSelect.WhereClause +=" and mat_Code like '%" + rawParams.codeQueryStr + "%'" ;
}
else if (rawParams.nameQueryStr) {
WorkADOSelect.WhereClause +=" and mat_Name like '%" + rawParams.nameQueryStr + "%'" ;
}
if (rawParams.nameQueryStr) {
WorkADOSelect.OrderByClause="nwv_Name";
} else {
WorkADOSelect.OrderByClause="nwv_Code";
}
}
if (rawParams.kind==1) {
WorkADOSelect.SelectClause = "mat_Name as nwv_Name" +
", cast(mat_Desc as nvarchar(max)) as nwv_Detail" +
", st_Name as nwv_Category" ;
WorkADOSelect.WhereClause = "mat_Code='" + rawParams.code + "'";
}
if (rawParams.kind==2) {
WorkADOSelect.SelectClause ="distinct st_Code, (cast(st_Code as nvarchar)+': '+st_Name) as nwv_Category";
WorkADOSelect.WhereClause = "";
WorkADOSelect.OrderByClause="st_Code";
}
WorkADOSelect.HavingClause="";
return WorkADOSelect.Execute();
}
همانطور که ملاحظه می کنید، در این مثال، انواع ساختار rawParams با رنگهای مختلف تفکیک شده است. حال هر یک از بخشهای این تابع را به ترتیب تحلیل می کنیم:
بخش اول تابع
WorkADOSelect.ComputerName="nosa-test";
WorkADOSelect.SqlInstanceName = "";
WorkADOSelect.DBName = "_AccXP_hamayesh992";
WorkADOSelect.FromClause="_Mats" +
" inner join _MatStock on mat_Key=mst_MatKey " +
" inner join _Stocks on mst_StockKey=st_Key";
WorkADOSelect.WhereClause=" (1=1) ";
سه سطر اول این تابع، نام کامپیوتر حاوی سیستم مالی، نام SqlInstance و نام پایگاه اطلاعات سیستم مالی را مشخص کرده است. سپس :
-- در FromClause جدول کالاها (_Mats) آورده شده و برای نمایش دسته بندی (نام انبار)، جداول _MatStock و _Stocks با آن join شده است.
whereClause -- برابر (1=1) قرار داده شده است و به این معنی است که تمام موارد بدون محدودیت بازیابی شود. در اینجا ممکن است این سوال پیش بیاید که اگر قرار نیست محدودیتی وجود داشته باشد چرا برای WhereClause چنین محتوایی را تعیین می کنیم. در جواب این سوال باید بگوییم که در بخشهای بعدی قرار است از طریق عملگر AND محدودیتهایی به این ویژگی اضافه شود. لذا چون عملکر AND نمی تواند در ابتدای عبارت قرار بگیرد، شرط (1=1) به عنوان پیش فرض درج می شود.
نمایش فهرست داده ها، Kind=0
if (rawParams.kind==0) {
rawParams.topCount=70;
WorkADOSelect.SelectClause =" top " + rawParams.topCount+
" mat_Code as nwv_Code, mat_Name as nwv_Name"+
", cast(mat_Desc as nvarchar(max)) as nwv_Detail" +
", st_Name as nwv_Category";
if (rawParams.categoryStr) {
WorkADOSelect.WhereClause +=" and st_Name ='" + rawParams.categoryStr + "'";
}
if (rawParams.codeQueryStr) {
WorkADOSelect.WhereClause +=" and mat_Code like '%" + rawParams.codeQueryStr + "%'" ;
}
else if (rawParams.nameQueryStr) {
WorkADOSelect.WhereClause +=" and mat_Name like '%" + rawParams.nameQueryStr + "%'" ;
}
if (rawParams.nameQueryStr) {
WorkADOSelect.OrderByClause="nwv_Name";
} else {
WorkADOSelect.OrderByClause="nwv_Code";
}
}
در این بخش، فهرست داده ها استخراج و نمایش داده می شود. مراحل این بخش به شرح زیر است:
rawParams.topCount=70;
در اینجا حداکثر تعداد سطرهای فهرست، برابر با 70 تعیین شده است.
WorkADOSelect.SelectClause =" top " + rawParams.topCount+
" mat_Code as nwv_Code, mat_Name as nwv_Name"+
", cast(mat_Desc as nvarchar(max)) as nwv_Detail" +
", st_Name as nwv_Category";
در SelectClause ابتدا تعداد سطرها با استفاده از پارامتر topCount محدود شده است و سپس فیلدهای متناظر با کد، نام، جزئیات و دسته بندی تعیین شده است.
if (rawParams.categoryStr) {
WorkADOSelect.WhereClause +=" and st_Name ='" + rawParams.categoryStr + "'";
}
در این قسمت شرط شده است که اگر نام دسته بندی (categoryStr) انتخاب شده باشد، آنگاه فهرست داده ها بر اساس این دسته بندی محدود گردد. ملاحظه می کنید که این شرط با عملگر AND به WhereClause اضافه شده است.
if (rawParams.codeQueryStr) {
WorkADOSelect.WhereClause +=” and mat_Code like ‘%” + rawParams.codeQueryStr + “%’” ;
} else if (rawParams.nameQueryStr) {
WorkADOSelect.WhereClause +=” and mat_Name like ‘%” + rawParams.nameQueryStr + “%’” ;
}
این قسمت برای جستجوی در کد و یا نام انتخابگر حرفی است. در این قسمت شرط شده است که اگر پارامتر کد (codeQueryStr) وارد شده باشد آنگاه فهرست داده ها براساس این کد فیلتر شود و اما اگر پارامتر نام (nameQueryStr) وارد شده باشد آنگاه فهرست داده ها براساس نام فیلتر گردد. نکته قابل توجه در این مثال این است که عبارتهای جستجو بین دو کاراکتر ‘%’ قرار گرفته است از عملگر مقایسه ای like استفاده شده است. بنابراین متوجه می شوید که حتی نوع مقایسه داده ها در جستجو و محدودسازی داده ها نیز کاملا قابل تعریف است.
if (rawParams.nameQueryStr) {
WorkADOSelect.OrderByClause="nwv_Name";
} else {
WorkADOSelect.OrderByClause="nwv_Code";
}
این قسمت برای تعیین نحوه مرتب سازی فهرست داده ها براساس نوع جستجوست. در اینجا شرط شده است که اگر جستجو در نام انجام می شود آنگاه مرتب سازی براساس نام انتخابگر حرفی (nwv_Name) و در غیر این صورت، براساس کد انتخابگر حرفی (nwv_Code) باشد.
سوال چالشی: با توجه به توضیحی که داده شد، به نظر شما نمایش پیش فرض فهرست داده ها یعنی قبل از اینکه کاربر تصمیم به جستجو و فیلتر کردن فهرست داده ها داشته باشد به چه ترتیبی است؟
نمایش داده های مربوط به یک کد خاص (k=1)
if (rawParams.kind==1) {
WorkADOSelect.SelectClause = "mat_Name as nwv_Name" +
", cast(mat_Desc as nvarchar(max)) as nwv_Detail" +
", st_Name as nwv_Category" ;
WorkADOSelect.WhereClause = "mat_Code='" + rawParams.code + "'";
}
در این حالت، SelectClause مشابه نوع قبلی است با این تفاوت که چون در این حالت، کد انتخابگر حرفی مشخص است و توسط کاربر انتخاب شده است لذا دیگر نیازی به فیلد کد انتخابگر حرفی (nwv_Code) نیست. نکته بعد مربوط به WhereClause است که شرط روی کد انتخابگر حرفی گذاشته شده است به این صورت که کد کالا (mat_Code) برابر با کد انتخاب شده (rawParams.code) تعیین می شود.
نمایش فهرست دسته بندی (k=2)
if (rawParams.kind==2) {
WorkADOSelect.SelectClause ="distinct st_Code, (cast(st_Code as nvarchar)+': '+st_Name) AS nwv_Category";
WorkADOSelect.WhereClause = "";
WorkADOSelect.OrderByClause="nwv_Category";
}
در ادامه، این بخش از تابع، سطر به سطر شرح داده می شود:
WorkADOSelect.SelectClause ="distinct st_Code, (cast(st_Code as nvarchar)+': '+st_Name) nwv_Category";
در این مرحله الگوی «کد انبار: نام انبار» به عنوان مبنای دسته بندی تعریف می شود. توجه کنید که به علت تکرار این الگو در داده ها، از distinct برای حذف تکرارها استفاده شده است. دقت کنید که در این سطر ابتدا کد انبار و سپس ترکیب کد انبار: نام انبار درج شده است که st_Code اولی برای مرتب سازی عددی استفاده خواهد شد و st_Code دوم با نوع حرفی و برای ترکیب با نام انبار استفاده شده است.
WorkADOSelect.WhereClause = "";
در مورد WhereClause نیز ملاحظه می کنید که برابر Null قرار داده شده است و علت آن این است که می خواهیم تمام دسته بندی ها بدون محدودیت استخراج شود.
WorkADOSelect.OrderByClause="st_Code";
و در انتها OrderByClause مبنای مرتب سازی، را کد دسته بندی (st_Code) تعیین کرده است. به این ترتیب دسته بندی براساس کد انبار انجام خواهد شد.
سوال چالشی: اگر برای مرتب سازی بجای کد انبار از الگوی دسته بندی (کد انبار: نام انبار) استفاده شود، چه اتفاقی می افتد و ترتیب دسته بندی به چه شکل تغییر می کند؟
بخش پایانی تابع
WorkADOSelect.HavingClause="";
return WorkADOSelect.Execute();
در این قسمت ابتدا HavingClause برابر Null قرار گرفته است. علت این کار این است که اگر چنانچه قبلا و در جایی از برنامه گردش کار، این ویژگی مقداردهی شده باشد، مقدار آن Null شده و تاثیری در نتیجه اجرای WorkADOSelect نداشته باشد. و در نهایت WorkADOSelect اجرا شده و نتیجه آن بازگشت داده می شود.
توضیح: برای پرهیز از پیچیدگی سعی شده است که با ذکر یک مثال نسبتا ساده و واقعی، مفاهیم و امکانات این روش ارائه شود. بدیهی است که این مدل برای برای انتخابگرهای حرفی از نوع وابسته به کار و نیز برای فیلتر کردن فهرست داده ها با جستجوی پارامتریک نیز قابل استفاده است که در این موارد، ویژگیهای WorkADOSelect کمی پیچیده تر خواهد شد.