نمایش نتایج 1 تا 3 از 3

نام تاپیک: ساختار جدول ارجاعات

  1. #1

    ساختار جدول ارجاعات

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

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

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


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

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

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

  2. #2

    نقل قول: ساختار جدول ارجاعات

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

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

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


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

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

    در کل دوستان اگر ساختار بهتری وجود داره برای پیاده سازی این مکانیسم لطف کنین و بنده رو راهنمایی کنید، اگر اطلاعات و جزئیات بیشتری برای این مسئله نیاز بود بفرمایید تا اضافه کنم
    ساختار اینه :
    Id, LetterId, SenderId, ReceiverId, SendDate, Description, ReferType, ReferId

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

    اصلا مهم نیست که با چه ترتیبی اطلاعات خونده میشه، نیازی نیست نگران این باشید که اول گره Level 5 ساخته شده و هنوز اطلاعات Level 1 رو نخوندیم.
    Level ها به تدریج ایجاد میشه و شاخه ها ایجاد میشه. هر کدوم که گره پدر شون پیدا شد بهش متصل می کنید و هر کدوم نبود متصل نشده نگه می دارید تا گره پدرش ایجاد بشه و بعدا متصل اش کنید. مثال این الگوریتم رو در این تاپیک ها نوشته بودم :
    نقل قول: کمک در مورد treeviwe

    و این البته ویژوال بیسیک ئه و روتین ساده تری داره :
    نقل قول: Treeview and Mysql
    ضمیمه 151111

  3. #3

    نقل قول: ساختار جدول ارجاعات

    تشکر از لطفتون استاد خیلی کمک بزرگی بود، خودم قبلا حالت والد و فرزندی رو روی Sender و Receiver انجام میدادم و فقط برای حالت های تک فرزندی جوابگو بود، ولی با فرمایشات شما تغییرات رو انجام دادم و مشکل برطرف شد، منتها سناریوی بنده یکم با سناریوی لینکهایی که گذاشتین متفاوت هست، به این خاطر که هر سطر از جدول خودش باید تبدیل به دو گره بشه که این مسئله رو هم درست کردم و از تابع بازگشتی دارم استفاده میکنم

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

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


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

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •