PDA

View Full Version : ساختار جدول ارجاعات



mr.sirwan
سه شنبه 23 اردیبهشت 1399, 15:33 عصر
سلام و درود دوستان
بنده توی نرم افزارم میخوام مکانیسم ارجاع نامه رو پیاده کنم، البته قبلا پیاده کرده بودم و درست کار میکنه به شرطی که سلسله مراتب اداری رعایت بشه، یعنی شخص x به شخص y ارجاع بده و شخص y به شخص z و به همین صورت ارجاع تکی براش جوابگو بود، ولی بعضی مواقع پیش میاد که خود ارجاع گیرنده، نامه رو ارجاع نمیده به شخص بعدی و این کار رو میسپاره به یه نفر دیگه که به جاش ارجاع رو انجام بده، خب اینجا زنجیره ارجاعات به هم میخوره و توی نمایشش بصورت نمودار درختی توی کنترل treeview به مشکل میخورم و نمیتونم درخت ارجاعات رو درست نمایش بدم.
بصورت خیلی ساده بخوام ساختار جدول ارجاعاتم رو بیان کنم به این شکل هستش:


Id, LetterId, SenderId, ReceiverId, SendDate, Description, ReferType


خب با این اوصاف به این نتیجه رسیدم که باید یه فیلد کنترلی هم توی این ساختار باشه مثل شماره سطح یا عمق هر گره از درخت که بشه توسط اون فیلد عمق درخت رو پیمایش و به ترتیب گره های هر درخت رو توی تری ویو نمایش داد، اما بازم یه جاهایی ممکنه مشکل بوجود بیاد، برای همین بذارید با رسم شکل هم توضیح بدم که درکش راحتتر باشه:


151693


حالا طبق این شکلی که گذاشتم چندتا حالت پیش میاد که فعلا همینا به ذهنم رسیده و اگر دوستان مورد جدیدی به ذهنشون اومد و یا برای همین چند مورد راه حل مناسبی در نظر داشتن ممنون میشم راهنمایی کنن:

1. اگر کسی خارج از این ساختار (یعنی کسی غیر از این افراد که توی ارجاعات شرکت داشتن) یه ارجاع جدیدی رو انجام داد Level اون ارجاع جدید رو عدد یک قرار بده
2. اگر کاربر جزو این ساختار بود و خواست یه ارجاع جدید انجام بده، مقدار Level آخرین ارجاعی که توش دخیل بوده رو واکشی کن و یکی بهش اضافه کن (این مورد بیشتر روش گیرم چون مشخص نمیشه کاربر توی کدوم مرحله به بقیه ارجاع جدید میزنه مثلا برای کاربر محسن، اگه بخواد ارجاع جدیدی انجام بده، از کجا باید فهمید این ارجاع جدید باید توی لول 1 باشه یا توی لول 4؟)

در کل دوستان اگر ساختار بهتری وجود داره برای پیاده سازی این مکانیسم لطف کنین و بنده رو راهنمایی کنید، اگر اطلاعات و جزئیات بیشتری برای این مسئله نیاز بود بفرمایید تا اضافه کنم

the king
سه شنبه 23 اردیبهشت 1399, 17:41 عصر
سلام و درود دوستان
بنده توی نرم افزارم میخوام مکانیسم ارجاع نامه رو پیاده کنم، البته قبلا پیاده کرده بودم و درست کار میکنه به شرطی که سلسله مراتب اداری رعایت بشه، یعنی شخص x به شخص y ارجاع بده و شخص y به شخص z و به همین صورت ارجاع تکی براش جوابگو بود، ولی بعضی مواقع پیش میاد که خود ارجاع گیرنده، نامه رو ارجاع نمیده به شخص بعدی و این کار رو میسپاره به یه نفر دیگه که به جاش ارجاع رو انجام بده، خب اینجا زنجیره ارجاعات به هم میخوره و توی نمایشش بصورت نمودار درختی توی کنترل treeview به مشکل میخورم و نمیتونم درخت ارجاعات رو درست نمایش بدم.
بصورت خیلی ساده بخوام ساختار جدول ارجاعاتم رو بیان کنم به این شکل هستش:


Id, LetterId, SenderId, ReceiverId, SendDate, Description, ReferType


خب با این اوصاف به این نتیجه رسیدم که باید یه فیلد کنترلی هم توی این ساختار باشه مثل شماره سطح یا عمق هر گره از درخت که بشه توسط اون فیلد عمق درخت رو پیمایش و به ترتیب گره های هر درخت رو توی تری ویو نمایش داد، اما بازم یه جاهایی ممکنه مشکل بوجود بیاد، برای همین بذارید با رسم شکل هم توضیح بدم که درکش راحتتر باشه:


151693


حالا طبق این شکلی که گذاشتم چندتا حالت پیش میاد که فعلا همینا به ذهنم رسیده و اگر دوستان مورد جدیدی به ذهنشون اومد و یا برای همین چند مورد راه حل مناسبی در نظر داشتن ممنون میشم راهنمایی کنن:

1. اگر کسی خارج از این ساختار (یعنی کسی غیر از این افراد که توی ارجاعات شرکت داشتن) یه ارجاع جدیدی رو انجام داد Level اون ارجاع جدید رو عدد یک قرار بده
2. اگر کاربر جزو این ساختار بود و خواست یه ارجاع جدید انجام بده، مقدار Level آخرین ارجاعی که توش دخیل بوده رو واکشی کن و یکی بهش اضافه کن (این مورد بیشتر روش گیرم چون مشخص نمیشه کاربر توی کدوم مرحله به بقیه ارجاع جدید میزنه مثلا برای کاربر محسن، اگه بخواد ارجاع جدیدی انجام بده، از کجا باید فهمید این ارجاع جدید باید توی لول 1 باشه یا توی لول 4؟)

در کل دوستان اگر ساختار بهتری وجود داره برای پیاده سازی این مکانیسم لطف کنین و بنده رو راهنمایی کنید، اگر اطلاعات و جزئیات بیشتری برای این مسئله نیاز بود بفرمایید تا اضافه کنم

ساختار اینه :
Id, LetterId, SenderId, ReceiverId, SendDate, Description, ReferType, ReferId


151694
هر کدوم موقع ارجاع مشخص می کنند که کدوم نامه رو ارجاع می کنند، طبعا sirwan میتونه نامه های 100 و 103 و 106 رو ارجاع کنه که با توجه اون ReferId ئه Level متفاوتی خواهد بود.
نمایش اطلاعات هم ساده است، هر چی اطلاعات در کوئری هست می خونید و گره هایش را در یک لیست می سازید، فعلا فقط لیست ئه، شاخه و پدر و فرزند در کار نیست.
بعد از اینکه همه گره ها خونده شد، پدر هر گره رو پیدا می کنید و بهش متصل می کنید. شاخه ها به تدریج ایجاد میشه، تا جایی که دیگه پدر جدیدی پیدا نشه.

اصلا مهم نیست که با چه ترتیبی اطلاعات خونده میشه، نیازی نیست نگران این باشید که اول گره Level 5 ساخته شده و هنوز اطلاعات Level 1 رو نخوندیم.
Level ها به تدریج ایجاد میشه و شاخه ها ایجاد میشه. هر کدوم که گره پدر شون پیدا شد بهش متصل می کنید و هر کدوم نبود متصل نشده نگه می دارید تا گره پدرش ایجاد بشه و بعدا متصل اش کنید. مثال این الگوریتم رو در این تاپیک ها نوشته بودم :
نقل قول: کمک در مورد treeviwe (https://barnamenevis.org/showthread.php?558699-%DA%A9%D9%85%DA%A9-%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-treeviwe&p=2424655&viewfull=1#post2424655)

و این البته ویژوال بیسیک ئه و روتین ساده تری داره :
نقل قول: Treeview and Mysql
151111
(https://barnamenevis.org/showthread.php?558937-Treeview-and-Mysql)

mr.sirwan
چهارشنبه 24 اردیبهشت 1399, 14:54 عصر
تشکر از لطفتون استاد خیلی کمک بزرگی بود، خودم قبلا حالت والد و فرزندی رو روی Sender و Receiver انجام میدادم و فقط برای حالت های تک فرزندی جوابگو بود، ولی با فرمایشات شما تغییرات رو انجام دادم و مشکل برطرف شد، منتها سناریوی بنده یکم با سناریوی لینکهایی که گذاشتین متفاوت هست، به این خاطر که هر سطر از جدول خودش باید تبدیل به دو گره بشه که این مسئله رو هم درست کردم و از تابع بازگشتی دارم استفاده میکنم

این دو حالت رو هم برای فیلد ParentId پیاده کردم ظاهرا که مشکلی وجود نداره:
1. اگر کسی خارج از این ساختار (یعنی کسی غیر از این افراد که توی ارجاعات شرکت داشتن) یه ارجاع جدیدی رو انجام داد Parent اون ارجاع جدید رو null قرار بده

2. اگر کاربر جزو این ساختار بود و خواست یه ارجاع جدید انجام بده، آیدی آخرین ارجاعی که توش دخیل بوده رو واکشی کن و اون رو به عنوان Parent ارجاع جدید درنظر بگیر


بازم تشکر از راهنماییتون