سلام
میبخشید ویندوز عوض کردم، کمی الاف شدم ... !
سه جدول زیر را در نظر بگیرید ...
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
رابطه جداول هم کاملاً مشخص است.
دو جدول اول با فیلد کلیدشان با جدول سوم ارتباط دارند.
(
پیشنهاد میکنم برای سادگی بحث و رفع مشکل، شما هم اگر مثال و ابهامی داشتید روی همین مدل سه جدولی فوق با همین فیلدها توضیح داده و بحثتان را مطرح کنید.
)
حالا وضعیت های مختلف را بررسی میکنیم:
----- زمان اضافه کردن فاکتور جدید (Invoices-INSERT)
شما سطر را در دیتابیس INSERT میکنید و یک ID_Invoice صدردصد سالم و منجحصر به فرد و مخصوص همین فاکتور میگیرد.
بعد هم تک تک کالاها را با توجه به کدشان که ID_Good باشد و شماره فاکتور که ID_Invoice باشد (و از مرحله قبل گرفته اید) به جدول Invoices_Goods اضافه میکنید.
چون ID_Invoce منحصر به فرد است با سایر برنامه های شبکه هم مشکلی ایجاد نمیشود.
----- زمان تغییر موارد فیلدهای فاکتور در جدول اصلی (Invoices-UPDATE)
چون تمام ارتباط جدول فوق با جدول Invoices_Goods با فقط و فقط ID_Invoice اش است و آن هم اصلاً کاربر نمیبینید و قابل تغییر هم نیست هر تغییری در سطح جدول Invoices مشکلی ایجاد نمیکنم و نیازی به تغییر و نگرانی برای جدول نظیر Invoices_Goods وجود ندارد!
باز هم چون ID_Invoce منحصر به فرد است بقیه برنامه های شبکه هم کار خودشان را میکنند.
هر کسی زودتر فاکتور را ویرایش کند و ذخیره کند، تا همان لحظه ویرایش او ذخیره میشود.
مثلاً
کسی تاریخ فاکتور را 1388 گذاشته و Save کند، ذخیره میشود، پشت او کسی فاکتور را 1350 بگذارد و چند میلی ثانیه بعد ذخیره کند، خوب مقدار جدید ذخیره میشود، کاملاً هم منطقی نیست. ایرادی میبینید؟؟؟
اگر هم کسی بعد از ویرایش ما فاکتور را Delete کند، خوب فرمان داده و حذف میشود! اگر هم قبل از ذخیره تغییرات کس دیگری Delete کند، چون کلید منحصر است شرط Update-Where بعدی بدون شک سطری نمی یابد و چیزی را تغییر نمیدهد.
یک نفر که مجوز داشته حذفش کرده، به برنامه ارتباطی ندارد!
----- زمان حذف کلی یک فاکتور (Invoices-DELETE)
چون کلید منحصر به فرد است، اگر کسی قبش ویرایش و یا حذف کرده باشد، مشکلی ایجاد نمیشود.
یا کلید وجود دارد که دستور Delete حذفش میکند یا قبلاً و زودتر کسی حذفش کرده که Delete-Where دیگری چیزی برای حذف پیدا نمیکند.
طبیعتاً بعد از حدف فاکتور اصلی باید زیر مجموعه های Invoices_Goods هم حذف شود که برای انها هم دقیقاً همین وضعیت پیش می آید و اگر کلیدشان هنوز موجود باشد، حذف خواهند شد و بعد هم تمام دستورات Delete-Where و Update-Where جاهای دیگر صادق نخواهد شد.
(برای حذف زیر مجموعه ها میتوان از تنظیم آبشاری در زمان تعریف Relation استفاده کنید و Enforce را فعال کنید. یا میتوان از تریگرها استفاده کرد.)
-----
واقعاً من مشکلی نمیبینم؟ اگر تردیدی دارید مطرح کنید.
اگر فکر میکنید مشکلی ایجاد میکند شرح دهید؟
مهم برای برنامه ان است که تداخل پیش نیایید و مثلاً اگر سطر حذف شود و کسی Update کند ...
- اصلاً مهم نیست و کاملاً منطقی است که سطر حذف شده و Update دیگر معنی ندارد و نباید انجام شود (کسی انتظار دیگری ندارد!)
- ولی نباسید چنین شود که چون سطر اصلی را نیافته سطر اشتباهی دیگری را تغییر ندهد. (این است که باید در برنامه تضمینش کنید.)
منظورتون نمونه سورسه یا همینجا توضیح بدم؟
منظورم چیزی مثل همین شرح فوق بود.
اگر تداخلی در تئوری فوق درک میکنید، لطفاً بیان کنید.
موفق باشید.