PDA

View Full Version : سوال: آپدیت چند جدول وقتی امکان عدم درج در بعضی جداول وجود داشته



bftarane
سه شنبه 26 فروردین 1393, 19:05 عصر
سلام
فرض کنید سه تا جدول به شکل‌های زیر داریم
http://upload7.ir/imgs/2014-04/51545623395537387418.jpg

فرض کنید اطلاعات در جداول به صورت جداگانه درج می شن

یعنی سه تا دکمه درج داریم

و اطلاعات در جدول اول که جدول اصلی است حتماً درج میشه ولی در جدول دوم و سوم ممکنه کاربر داده ای درج نکنه

حالا یه مشکل دارم اینکه برای ویرایش در این صورت چه باید کرد؟
خوب ما موقع ویرایش اطلاعات رو از جداول واکشی می کنیم و در تکست باکس ها و کنترلهای مربوطه این مقادیر رو می ریزیم و بعد می گیم ویرایش کن این رکورد رو به شرطی که
ID=x
ولی در صورتی که فرضاً در جدول سوم اطلاعاتی برای کاربر درج نشده باشه، پس
به ازای اون کاربر در جدول سوم ID نداریم در این صورت چاره چیه؟



البته این یه مثال ساده بود ولی من در یک پروژه که مراحل درجش رو یک شخص دیگر انجام داده
با حدود 10 تا جدول مواجه هستم.

ممنون می شم راهنمایی کنید.

mRizvandi
چهارشنبه 27 فروردین 1393, 02:22 صبح
من متوجه نشدم مساله ات چی هست؟!
اینکه گفتید

به ازای اون کاربر در جدول سوم ID نداریم در این صورت چاره چیه؟
خُب چه مساله ای به وجود می آد؟ که دنبال راه چاره باشید؟

bftarane
چهارشنبه 27 فروردین 1393, 13:52 عصر
خوب فرضاً در جدول اول نام و نام خانوادگی رو کاربر درج کرده
در جدول دوم هم نشانی درج شده باشه
فرضاً در جدول سوم رنگ های مورد علاقه کاربران درج میشه
و برای درج در این سه جدول سه تا دکمه درج جداگانه داریم
حالا اگه کاربر دکمه سوم رو نزنه خوب در جدول رنگ‌ها براش چیزی ثبت نمی شه
حالا موقع ویرایش فرضاً کاربر حالا دلش می خواد رنگ‌هاش رو درج کنه
در حالتی که آی دی کاربر در همه جداول باشه می تونید بگیم
جدول اول رو آپدیت کن به شرطی که id=x
جدول دوم // // // // //
جدول سوم // // // // //

ولی وقتی این آی دی در جدول سوم نباشه چطور ویرایش باید صورت بگیره؟

البته همونطور که گفتم تعداد جداول اینجا حدود 10 تا هست.
فعلاً تنها راهی که به نظرم می رسه اینه که بگردم ببینم در جداول دیگه آیا این آی دی وجود داره یا نه اگه داشت که عمل آپدیت و اگه وجود نداشت عمل Insert انجام بشه. ولی چون جداول تعدادش زیاده فکر کنم این راه خوبی نباشه.

راه دیگه ای هم که به نظرم می رسه اینه که اگه کاربر دو تا دکمه درج دیگه رو به فرض کلیک نکرد برم به ازای اون کاربر در دو جدول دیگه دو تا سطر خالی درج کنم که فقط ID کاربر در اونا درج بشه. ولی مطمئن نیستم چه راهی خوبه.

mRizvandi
چهارشنبه 27 فروردین 1393, 14:55 عصر
ولی وقتی این آی دی در جدول سوم نباشه چطور ویرایش باید صورت بگیره؟


خب مشخصه که در جدول سوم به جای ویرایش باید درج صورت بگیره.

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

اگر در ASP.NET کار می کنید:
کاربر در یک فرم ویو اطلاعات رو ثبت/ویرایش/حذف می کنه (مثلا مشخصات کاربر)
هر اطلاعاتی که ثبت شد در یک گریدویو نمایش داده میشه (مثلا به اسم کاربران ثبت شده)
سپس برای هر زیربخش یک گریدویو و یک فرم ویو قرار بدید (گرید برای لیست جزییاتی که ثبت شده، مثلا رنگهای مورد علاقه اش) و فرم ویو هم برای درج/ویرایش/حذف یک گزینه (مثلا یک رنگ)
حالا کاربر از گرید اول یک گزینه رو انتخاب می کنه، سپس گریدهای زیرین پر می شوند (اگر دیتا باشه نمایش داده میشه در غیر این صورت گرید خالی است)
اصولا این روش پیاده سازی Master Detail هست.


راه دیگه ای هم که به نظرم می رسه اینه که اگه کاربر دو تا دکمه درج دیگه رو به فرض کلیک نکرد برم به ازای اون کاربر در دو جدول دیگه دو تا سطر خالی درج کنم که فقط ID کاربر در اونا درج بشه. ولی مطمئن نیستم چه راهی خوبه.
به هیچ وجه از همچین روشهایی برای رفع مساله استفاده نکنید! ساختار دیتابیستون اگر صحیح هست (که من شک دارم) با این کار دیگه کاملا زیر سوال میره!

meysam99
چهارشنبه 27 فروردین 1393, 15:56 عصر
من یک نمای ساده از روش کار رو میگم
اول جدول مشخصات پر میشود. که هیچ مشکلی در آن نداری.
در صفحه بعد میتوانی جدول مشخصات را نمایش دهی و یکی از آنها را انتخاب کنی و مقدار id اون رو بگیری و مشخصات زیر مجموعه آنرا اضافه کنید و بعد بعدی رو اضافه کنی.
خاصیت آپدیت و پاک کردن آبشاری رو هم انتخاب کن که وقتی یک جدول از مشخصات رو پاک کردی همه زیر مجوعه های آن هم پاک شود.
حال اگه میخوای جدول رنگ را را ویرایش کنی می توانی آنرا انتخاب کنی بعد انتخاب id همان جدول را داری و به راحتی ویرایش رو انجام میدهی

bftarane
چهارشنبه 27 فروردین 1393, 17:48 عصر
به هیچ وجه از همچین روشهایی برای رفع مساله استفاده نکنید! ساختار دیتابیستون اگر صحیح هست (که من شک دارم) با این کار دیگه کاملا زیر سوال میره!
خیلی خوشحال شدم که این قضیه رو گفتید. مطمئن شدم که این قضیه اشتباه هست و باید ازش اجتناب کنم.


این فرم مورد نظر هست
http://dentaliran.ir/add_resume.aspx

فایل جداول رو هم ضمیمه کردم (دبتابیس Access هست) که بیشترش رو یکی از همکاران سابق طراحی کرده و بقیه کار رو من باید انجام بدم ولی نمی دونم آیا این ساختار درست هست یا نه؟ ممنون می شم نظرتون رو در این مورد بدونم.

در مورد اون مسئله Master Detail هم باید امتحان کنم ببینم می تونم همچین کاری رو انجام بدم یا به مشکل می خورم ولی سوال داشتم می پرسم.

mRizvandi
چهارشنبه 27 فروردین 1393, 22:19 عصر
من سایت رو دیدم، به نظرم اگر کارفرما می خواد همه چیز رو با هم ببینه و ثبت کنه که کاریش نمیشه کرد!!!
اگر می تونید کارفرما رو راضی کنید مقداری طراحی رو استاندارد و ساده کنید.
برای هر بخش یک تب بسازید، اطلاعات هر بخش رو که شامل گرید و و فرم ویو هست در اون قرار بدید. (گرید با هر چیز دیگری که نیاز دارید)
اینطوری کاربر خیلی راحتتر متوجه اطلاعات میشه، راحتتر اطلاعات رو ثبت می کنه، ویرایش می کنه، میبینه و ...
کار شما هم برای پیاده سازی راحت میشه.
می تونید مشخصات اصلی رو بالای تب قرار بدید و زیرمجموعه ها داخل تب باشند.

bftarane
چهارشنبه 27 فروردین 1393, 22:58 عصر
گر کارفرما می خواد همه چیز رو با هم ببینه و ثبت کنه که کاریش نمیشه کرد!!!
منظورتون رو از کاریش نمی شه کرد متوجه نشدم (یعنی باید همون سطر خالی ها رو که گفتید اصولی نیست درج کنم؟):متفکر: شرمنده دوزاریم خیلی کجه.
ولی من توضیحات شما رو که خوندم به نظرم رسید لازم نیست سطر خالی درج کنم در جداول دیگه چه مرحله به مرحله باشه چه نباشه. در بدترین حالت کاربر هیچ اطلاعاتی هم که پر نکنه فرضاً فقط اسمش رو پر کنه در جدول اصلی یه رکورد درج میشه و جداول دیگه خالی می مونن.
موقع آپدیت از همه جداول اطلاعات رو با Left join واکشی می کنم نتیجه ای که می ده فقط نام کاربر خواهد بود و بقیه اطلاعات هم null خواهند بود.
یه صفحه هم می زارم به همین شکل صفحه درج و به کمک نتیجه ای که از Left Join گرفتم این ها رو پر می کنم، که در اینجا فقط تکست باکس نام کاربر پر خواهد شد و بقیه کنترلها خالی خواهند بود که حالا هر چی رو که خواست پر می کنه و من با همون شرط اگه id در جدول موجود بود برو آپدیت کن اگه موجود نبود برو Insert کن عمل به روزرسانی رو انجام خواهم داد. به نظرتون این عملی نیست؟


کاربر در یک فرم ویو اطلاعات رو ثبت/ویرایش/حذف می کنه (مثلا مشخصات کاربر)
هر اطلاعاتی که ثبت شد در یک گریدویو نمایش داده میشه (مثلا به اسم کاربران ثبت شده)
سپس برای هر زیربخش یک گریدویو و یک فرم ویو قرار بدید (گرید برای لیست جزییاتی که ثبت شده، مثلا رنگهای مورد علاقه اش) و فرم ویو هم برای درج/ویرایش/حذف یک گزینه (مثلا یک رنگ)
حالا کاربر از گرید اول یک گزینه رو انتخاب می کنه، سپس گریدهای زیرین پر می شوند (اگر دیتا باشه نمایش داده میشه در غیر این صورت گرید خالی است)
اصولا این روش پیاده سازی Master Detail هست.


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

حالا کاربر از گرید اول یک گزینه رو انتخاب می کنه، سپس گریدهای زیرین پر می شوند (اگر دیتا باشه نمایش داده میشه در غیر این صورت گرید خالی است)
مخصوصاً این تیکه رو متوجه نمی شم، منظورتون از انتخاب یک گزینه چیست؟

پس ببینید درست متوجه شدم؟ از نظر شما راه درست اینه که ثبت در چند مرحله انجام بشه. این طوری در همه جداول هم آی دی مشترک رو خواهیم داشت. درسته؟

mRizvandi
پنج شنبه 28 فروردین 1393, 11:18 صبح
منظورتون رو از کاریش نمی شه کرد متوجه نشدم
یعنی مجبور هستید در همون صفحه کل اطلاعات رو ثبت کنید، اگر داده ای بود ویرایش کنید، اگر نبود درج کنید! هر چند که کار قشنگی نیست، ولی اگر اصرا کارفرما اینطوری باشه باید پیاده سازیش کنید.


ولی من توضیحات شما رو که خوندم به نظرم رسید لازم نیست سطر خالی درج کنم در جداول دیگه چه مرحله به مرحله باشه چه نباشه. در بدترین حالت کاربر هیچ اطلاعاتی هم که پر نکنه فرضاً فقط اسمش رو پر کنه در جدول اصلی یه رکورد درج میشه و جداول دیگه خالی می مونن.
موقع آپدیت از همه جداول اطلاعات رو با Left join واکشی می کنم نتیجه ای که می ده فقط نام کاربر خواهد بود و بقیه اطلاعات هم null خواهند بود.
یه صفحه هم می زارم به همین شکل صفحه درج و به کمک نتیجه ای که از Left Join گرفتم این ها رو پر می کنم، که در اینجا فقط تکست باکس نام کاربر پر خواهد شد و بقیه کنترلها خالی خواهند بود که حالا هر چی رو که خواست پر می کنه و من با همون شرط اگه id در جدول موجود بود برو آپدیت کن اگه موجود نبود برو Insert کن عمل به روزرسانی رو انجام خواهم داد. به نظرتون این عملی نیست؟
بله همینطور هست، نیازی به ثبت رکورد null نیست و می تونید با Left Join اطلاعات لازم رو به دست بیارید.


برای این دو مورد آیا مثالی (مثلاً سایتی که این کار در اون انجام شده باشه) سراغ دارید که ببینم؟
سایت هست، اما خب دسترسی به صفحات ادمین وب سایت شرکتها امکانپذیر نیست.


پس ببینید درست متوجه شدم؟ از نظر شما راه درست اینه که ثبت در چند مرحله انجام بشه. این طوری در همه جداول هم آی دی مشترک رو خواهیم داشت. درسته؟
بله دقیقا همینطوره.

دو تا تصویر درست کردم، فکر می کنم به دید شما کمک کنه: (بعد از آپلود ترتیب عکسها رو برعکس نشون میده، اول عکس پایینی رو ببینید و سپس عکس بالایی رو دقت کنید)

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