طرح مسئله: فیلدهای Cascading Combo که امکان تعریف گزینه های یک لیست کشویی به صورت چند سطحی را فراهم می کنند ماهیت رابطه از نوع aggregation با مدل داده ای فرایند دارند. مشابه انواع روابط با مدل داده ای فرایندها، داده معادل با انتخاب کاربر در این فیلد بر روی فرم های فرایندی در جدول Junction مدل داده ای فرایند نگهداری می شود. همانطور که در طراحی ارتباط بین مدل داده پایه چند سطحی مورد استفاده در Cascading Combo با مدل داده ای فرایند یک رابطه از نوع aggregation با پایین ترین سطح مدل داده پایه چند سطحی برقرار می شود،تنها داده مربوط به پایین ترین سطح در ستون ForeignKey جدول Junction دیتا مدل نگهداری می شود. در بسیاری از مواقع در گزارش ها نیاز داریم اطلاعات مربوط به سطوح بالاتر را نیز در خروجی گزارش قرار دهیم. در ادامه نحوه تهیه کوئری مورد نیاز گزارش ارائه شده است.
راه حل: مدل داده ای پایه سه سطحی شکل 1 را در نظر بگیرید. در این مدل داده ای بالاترین سطح نام بانک ها،سطح دوم نام شهرها و سطح سوم شعب بانک مورد نظر در هر شهر را در بر می گیرند.

مطابق شکل 2 یک ارتباط از نوع Aggregation یک به یک بین مدل داده ای فرایند و پایین ترین سطح از مدل داده پایه مورد نظر ایجاد شده است و رابطه به صورت Cascading Combo روی فرم قرار گرفته است.

مطابق شکل 3 کاربر به ترتیب بانک،شهر و در نهایت شعبه مورد نظر خود را انتخاب می کند.

برای نمایش اطلاعات هر سه سطح از Cascading Combo به همراه فیلدهای دیگر دیتا مدل فرایند در خروجی یک گزارش کوئری پایه از کوئری ارائه شده در ادامه استفاده می کنیم:
SELECT
DataModel.SSN
,Bank.[BankName]
,City.CityName
,Branch.BrachName
FROM [Demo_Didgah_BPMS].[dbo].[ddm_CodingPractice] as DataModel
inner join [Demo_Didgah_BPMS].[dbo].[ddm_CodingPracticeJunction] as DatamodelJunction on DatamodelJunction.PrimaryKey=DataModel.Guid
inner join [Demo_Didgah_BPMS].[dbo].[bpm_ProcessInstances] as PIn on PIn.BusinessKey=DataModel.Guid
left join [Didgah_DynamicDataModel].[dbo].[ddm_BankTable_City_Branch] as Branch on Branch.Guid=DatamodelJunction.ForeignKey
left join [Didgah_DynamicDataModel].[dbo].[ddm_BankTable_CityJunction] as CityJunction on CityJunction.ForeignKey=Branch.Guid
left join [Didgah_DynamicDataModel].[dbo].[ddm_BankTable_City] as City on City.Guid=CityJunction.PrimaryKey
left join [Didgah_DynamicDataModel].[dbo].[ddm_BankTableJunction] as BankJunction on BankJunction.ForeignKey=City.Guid
left join [Didgah_DynamicDataModel].[dbo].[ddm_BankTable] as Bank on Bank.Guid=BankJunction.PrimaryKey
order by BankName
در ادامه ساختار کوئری ارائه شده شرح داده شده است:
- فیلد SSN از دیتا مدل اصلی فرایند انتخاب شده است.
- فیلد BankName از جدول حاوی نام بانک ها که هنگام ساخت مدل داده پایه مورد استفاده در بالاترین سطح ایجاد شده است انتخاب شده است.
- فیلد CityName از جدول حاوی نام شهرها که هنگام ساخت مدل داده پایه مورد استفاده در دومین سطح ایجاد شده است انتخاب شده است.
- فیلد BranchName از جدول حاوی نام شعبه ها که هنگام ساخت مدل داده پایه مورد استفاده در پایین ترین سطح ایجاد شده است انتخاب شده است.
- در اولین join استفاده شده در کوئری ارتباط بین مدل داده ای فرایند و جدول Junction فرایند جهت دسترسی به داده فیلد Cascading Combo انتخاب شده روی فرم که در ستون ForeignKey ذخیره می شود ایجاد شده است.
- در دومین join استفاده شده در کوئری ارتباط بین جدول دیتا مدل فرایند و جدول ProcessInstances جهت نمایش آخرین وضعیت مقادیر فیلدها برای هر اجرا از فرایند مشخص شده است.
- با توجه به اینکه رابطه ایجاد شده بین مدل داده ای فرایند و مدل داده پایه مورد استفاده با پایین ترین سطح در مدل داده پایه ایجاد شده است و مقدار نگهداری شده در جدول Junction فرایند در ستون ForeigKey در واقع همان مقدار Guid در جدول ddm_BankTable_City_Branch است ابتدا ارتباط با این جدول از مدل داده پایه برقرار شده و سپس مطابق با برابری مقدار ForeignKey جدول Junction سطوح پایین تر مدل داده پایه با مقدار Guid از جدول یک سطح بالاتر مدل داده پایه بین جداول join زده شده است. این سلسله مراتب در شکل 1 قابل مشاهده است. ارتباط از پایین ترین سطح شروع و تا بالاترین سطح پیش می رویم. توجه داشته باشید به ازای هر سطح از مدل داده پایه مورد استفاده یک جدول اصلی حاوی مقادیر اصلی جدول سطح مورد نظر و یک جدول Junction که حاوی ارتباط بین سطوح مدل داده پایه است به صورت سیستمی در پایگاه داده DynamicDataModel ایجاد می شود.
- جهت حذف نشدن یک رکورد در خروجی کوئری در صورت مقدار نداشتن یکی از سطوح در مدل داده ای پایه از left join استفاده شده است.
نتیجه اجرای کوئری در شکل 4 قابل مشاهده است.
