PDA

View Full Version : چگونگی ایجاد یک جدول موقتی از اطلاعات select شده قبل از insert



minaalamshahi
یک شنبه 28 اسفند 1390, 10:26 صبح
با سلام
من احتیاج دارم که کاربر چندین مقدار رو add بزنه و تایید نهایی بزنه و اگر تایید نهایی رو نزد هیچ مقداری براش insert نشه
چون در insert می خوام کلا چک کنم که اگر ساعت انتخابی کمتر از مقداری خاص نباشه که اگر مجموع ساعات کمتر یا بیشتر از مقداری بود کاربر حق شرکت در مجموعه را ندارد.
حتما به اجبار مجبور باشه حتما 12 ساعت یا 24 ساعت بستگی به درجه خودش انتخاب کنه.
ممنون میشم بهم بگین چطور می تونم اطلاعات select شده رو بدون درج شدن بعد از هر بار add زدن به طور موقت یک جایی نگه دارم.

ahmad156
یک شنبه 28 اسفند 1390, 10:56 صبح
شما میتونین یه DataTable با فیلدهای جدول پایگاه داده رو بسازین بعد چک کنین بعد از DataTable توی جدول insert کنین

minaalamshahi
شنبه 05 فروردین 1391, 12:54 عصر
چطوری میتونم این کار و بکنم
میشه بیشتر راهنمایی کنین

در مورد کاری که می خوام بکنم هم یه مقدار بیشتر توضیح میدم
مثلا کاربر انتخاب می کنه
از منوی کشویی درس معارف بعد Add میزنه و چند درس دیگه رو حالا باید چک بشه اگر مجموع ساعات درسته و کاربر هم دگمه تایید نمهایی رو زد در یک جدول دیگه درج بشن

C#.net
شنبه 05 فروردین 1391, 13:07 عصر
روی مساله تمرکز کنید نه راه حل؛



مثلا کاربر انتخاب می کنه
از منوی کشویی درس معارف بعد Add میزنه و چند درس دیگه رو حالا باید چک بشه اگر مجموع ساعات درسته و کاربر هم دگمه تایید نمهایی رو زد در یک جدول دیگه درج بشن
مساله شما اینه،
برای حلش این می تونه یه راه حل باشه که نیازی هم به ذخیره سلکت نداره:
1- کاربر درس معارف رو انتخاب و دکمه Add رو می زنه
2- در هندلر دکمه Add ، بررسی کنید تا حالا مجموعا چند ساعت درس برداشته
3- حالا ببینید درس انتخابی (مثلا معارف)چند ساعت هست.
4- چک کنید سقف مجاز کاربر چقدر هست
5- موارد 2و3 رو با هم جمع کنید و با 4 مقایسه کنید.
6- اگر اوکی بود، درس جدید رو ذخیره کنید!

minaalamshahi
یک شنبه 06 فروردین 1391, 12:36 عصر
نه
راه این نیست
اونها باید درسها رو انتخاب کنن و اگر مجموع دقیقا 24 ساعت شده همه رو براشون درج کنه و گرنه تمام واحد های انتخابی برگردن من حتما باید بعد از دگمه تایید نهایی همه رو درج کنم
تا هیچ کس نتونه حتی 1 ساعت کمتر برداره و همه مجبور به برداشتن همون تعداد مجمع 24 ساعت باشن و در جدول مخصوصی به نام selectLesson دروس انتخابی یکجا درج بشن.
راه حلش همون جدول موقتی هست اما نمیدونم چطور بایداین کار و بکنم
و مسئله دیگه اینکه هر درس که برداشته میشه از مجموع کم بشه اما اگر تایید نهایی رو نزد و از صفحه خارج شد
چطور دروس انتخابی رو برگردونم.
مثلا ظرفیت درس معارف 25 نفر باشه اگر کاربر این درس رو برداشت مجموع 24 بشه اما اگر تایید نهایی رو نزد باز بشه همون 25 نفر

C#.net
یک شنبه 06 فروردین 1391, 13:17 عصر
خوب اگر مساله شما این هست بهتره تا قبل از تایید نهایی چیزی رو تو دیتابیس ذخیره نکنید، با فرض اینکه یه کلاس دارید که اطلاعات متناظر هر درس درش وجود داره(نام، واحد و ...)
پس از اضافه کردن هردرس اون به لیستی از درس های انتخاب شده اضافه کنه، با فشردن دکمه تایید نهایی این لیست اعتبارسنجی می شه و در صورت معتبر بودن در دیتابیس ذخیره می شه، اگه از ORM استفاده می کنید یا تو پروژتون چیزی شبیه DTO یا POCO که کارتون ساده تره ، یه همچین کاری باید انجام بدید:


// متناظر با اطلاعات جدول دیتابیس
public class Course
{
public int ID { get; set; }
public string Name { get; set; }
public int Unit { get; set; }
public int Time { get; set; }
}



// لیست دروس انتخابی کاربر
List<Course> selectedCourses = new List<Course>();



// عملیات اضافه نمودن دروس
Course course = new Course { ID = 1, Name ="تست", Time = 2, Unit = 1 };
selectedCourses.Add(course);



// عملیات تایید نهایی
if (CheckCourses(selectedCourses))// تابع اعتبارسنجی لیست
{
// عملیات ثبت در دیتابیس
SaveCourses(selectedCourses);
}

minaalamshahi
یک شنبه 06 فروردین 1391, 13:21 عصر
از اصطلاحاتی که به کاربر بردید چیزی نمید دونم
میشه یه sample کوچیک بدارین

C#.net
یک شنبه 06 فروردین 1391, 13:36 عصر
کد هایی که بالا قرار دادم یه مثال ساده هست، یکم در موردش توضیح می دم:

1- شما در پروژتون یه کلاس ایجاد می کنید به نام Course که به ازای هر ستون جدول درس ها در دیتابیستون یک پراپرتی داره مثل مثال بالا.(تکه کد1)

2- برای پیاده سازی عملیات اضافه نمودن دروس یه لیستی از کلاس Course دارید(تکه کد2) که هر بار کاربر درسی رو اضافه کرد یه درس به لیست اضافه می شه(تکه کد 3)

3- فرض کردم یه تابع می نویسید به نام CheckCourses که ورودیش لیست درس ها هست، این تابع قاعده تعداد ساعت و اینها رو که گفتید رو در لیست(ونه جدول موقت) بررسی می کنه و در صورت اوکی بودن مقدار true برمی گردونه

4- وقتی کاربر دکمه تایید نهایی رو می زنه تابع CheckCourses درس های لیست رو بررسی می کنه و اگه همه چی مرتب بود شما اطلاعات درس های درون لیست رو در دیتابیس ثبت می کنید

minaalamshahi
یک شنبه 06 فروردین 1391, 13:39 عصر
توی این چند خط کدی که لطف کردین گذاشتین
یه مشکل هنوز باقی می مونه من درس رو به عنوان یک کاربر امنخاب می کنم ظرفیت نفراتی که می تونن این درس رو انتخاب کنن کم میشه اما اگر تایید نهایی رو نزد چی؟
ظرفیت ها کم شده اما درس انتخاب نشده
از یک نفر سوال پرسیدم گفت از جدول موقت استفاده کن
جریان این جدول موقت چیه؟
مسئله دیگه اینکه من میخوام بعد از هر انتخاب کاربر درسی رو که انتخاب کرده و تعدا ساعتی و زمان رو که انتخاب کرده ببینه

C#.net
یک شنبه 06 فروردین 1391, 13:52 عصر
جدول موقت راه پر هزینه ای هست و شما ناچار می شید یه بخش از منطقتون رو تو دیتابیس ذخیره کنید سینتکسش هم اینه:


SELECT *
INTO #TempTable
FROM YourTable


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

minaalamshahi
یک شنبه 06 فروردین 1391, 13:58 عصر
خوب اگر فقط مثلا 1 ظرفیت مونده باشه و چند نفر در حال انتخاب باشن و دروس رو انتخاب کنن و بعد تایید نهایی بزنن به خیااینکه این درس براشون رزرو شده چی که خوب منطقش هم درسته
انتخاب واحد دانشگاه هم همینطور بود
اگر خواست یک درس رو ویرایش کنه یا درسی رو اضافه کنه ودرس دیگه ای رو حذف کنه؟

C#.net
یک شنبه 06 فروردین 1391, 14:07 عصر
این می شه مساله هم زمانی و mutual resource، حتی اگه از جدول موقت یا هر راه حل دیگه ای هم استفاده کنید این مساله وجود داره

با این کد اونی که زود تر تایید نهایی رو بزنه براش ثبت می شه و برای بقیه یه اکسپشن بر می گرده که می تونید هندلش کنید
فقط توجه کنید عملیات ذخیره دروس باید ترنزکشنال (http://www.google.com/#hl=en&sclient=psy-ab&q=c%23+transactionscope+example&oq=c%23+transactionscope&aq=2&aqi=g4&aql=&gs_l=hp.3.2.0l4.1502l7227l0l10159l20l13l0l7l7l1l44 2l4732l3-10j3l20l0.frgbld.&pbx=1&bav=on.2,or.r_gc.r_pw.r_qf.,cf.osb&fp=ead7a852a2ede9f5&biw=1266&bih=728)باشه در این صورت مادامی که دروس برای یک کاربر ثبت می شه کاربرای دیگه نمی تونند اطلاعات رو در جدول(لاک شده) ثبت کنند


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

minaalamshahi
یک شنبه 06 فروردین 1391, 14:11 عصر
هم اینکه می خوام همون لحظه بعداز هر Add زدن اون لیستی رو که گفتین به یه طریقی به جدولی که با javascript ساختم و با dataset بایندش می کنم
به کار بر انتخاب جاری رو نشون بدم
هم اینکه کاربر بعد از تاییئ نهایی باز هم امکام ویرایش داره

C#.net
یک شنبه 06 فروردین 1391, 14:19 عصر
یعنی در آن واحد فقط یک نفر در جدول درج انجام بده؟
مسئله ویرایش رو چطور می تونم حل کنم؟
توی روشی که شما گفتین دروس Add میشن در یک list اما من به کاربر چی نشون بدم؟

- در کسر کوچکی از ثانیه، بله
- ویرایش یعنی حذف و اضافه؟ اگر بله در بالا عرض کردم
- همون اطلاعات لیست رو

پیشنهاد می کنم قبل از این که وارد کد نوشتن بشید، مسالتون رو به طور کامل دوباره تحلیل کنید، چه جداولی باید اضافه بشه، مساله هم زمانی(سناریو های ممکن)
برنامه شما اونقدر ها هم ساده نیست که بدون تحلیل وارد کد نویسی بشید

minaalamshahi
یک شنبه 06 فروردین 1391, 14:24 عصر
ویرایش هم حذف و اضافه هست و هم تغییر اطلاعات یک رکورد مثلا ساعت یک درس

minaalamshahi
یک شنبه 06 فروردین 1391, 14:59 عصر
مسئله هم زمانی با توجه به راه حل پیشنهادی شما به وجود امده اما با روشی که من قبلا بهش فکر کرده بودم ایممشکل مطرح نبود اما مشکلات دیگه ای داشت من می خواستم اگر یک کاربر درسی رو انتخاب کرد در جدول selectLesson یک فیلد داشته باشم با عنوان تایید موقت و در select جدولم این مقدار رو select کنم و اگر تایید نهایی رو زد و همه دروس انتخاب شده درست بود تایید نهایی درج بشه و همه به جدولی در پایین صفحه منتثل بشه و این جدول خالی بشه
اما در روش شما من اصلا نمی دونم گردید بالای صفحه رو که مربوط به تایید موقت هست چطور با list بایند کنم و یا چطور ویراش کنم

البته روش شما بهتره چون در روش من کاربر اگر تایید نهایی رو نزنه و یکسری دروس انتخاب موقت شدن که باید کاربر admin بره و اونها رو برگردونه یا از timer استفاده کنم که مثلا اگر بعد از 1 ساعت تایی نهایی نزد اونا به حال عادی برگردن که باز هم مشکلات دیگه ای داشت و.......

minaalamshahi
یک شنبه 06 فروردین 1391, 15:05 عصر
برای توضیح بیشتر من گریدم رو با جاوا اسکریپت میسازم و با dataset بایندش می کنم

C#.net
یک شنبه 06 فروردین 1391, 15:16 عصر
دو تا جدول واقعی مشابه (نه موقت) در دیتابیس تعریف کنید، یکی ثبت موقت و یکی ثبت نهایی
وقتی تایید نهایی رو کاربر زد اطلاعات جدول ثبت موقت رو به جدول ثبت نهایی منتقل کنید. (شبیه همون راه حل خودتون)

minaalamshahi
یک شنبه 06 فروردین 1391, 15:22 عصر
گفتم که این روش مشکل داره برا ی همین اومدم اینجا تاپیک گداشتم
اگر کاربر من تایید نهایی رو نزنه یکسری دروس انتخاب موقت شدن از ظرفیت کم شده اما تایید نهایی نیستن باید زمانشون بررسی بشه باtimer چک بشه که مثلا اگر یک سات هست که از انتخاب موقت میگدره و تایید نهایی نشدن پاک بشن و.... ویا احتیاجه که یه نفر این جدول رو مدام خالی کنه
این روش بهینه و درست نیست

minaalamshahi
یک شنبه 06 فروردین 1391, 15:30 عصر
ممنون من سعی می کنم روش خود شما رو کامل کنم و از اون روش مشکل رو حل کنم
اگر ایدهای به ذهنتون رسید ممنون میشم منو راهنمایی کنید .

minaalamshahi
دوشنبه 07 فروردین 1391, 01:51 صبح
تا اینجا که من متوجه شدم transaction زمانی کاربرد داره که میخوایم چندین دستور حتما اجررا بشه و یا اصلا اجرا نشه
حالا اگر من بخوام در یک لحظه فقط برای یک نفر دستورات داخل transaction اجرا بشه چی؟
چون ممکنه که یک درس باقی مونده باشه و چند نفر اونو انتخاب کرده باشن و میخوام کسی که اولین بار add رو زده برای اون چک بشه اگر محموع دروس و ساعات درست هست کلیه انتخابها براش ثبت بشه
و حالا نفر بعدی چون دیگه در این درس خاص که 1 نفر ظرفیت داشت و حالا نداره هیچ دستوری دیگه براش اجرا نشه
برای اینکار لازمه که در ان واحد دستورات یک نفر که به پایگاه رسید به یه روشی پایگاه برای این کاربر قفل بشه کلیه دستورات رو انجام بده بعد درخواست بعدی رو چک کنه
برای این مشکل من باید به نظر شما چه کنم؟

minaalamshahi
دوشنبه 07 فروردین 1391, 02:11 صبح
آیا transaction جداول رو هم قفل می کنه؟

minaalamshahi
دوشنبه 07 فروردین 1391, 10:43 صبح
در مرود این مسئله امکانش هست کسی منو راهنمایی کنه؟

C#.net
دوشنبه 07 فروردین 1391, 12:08 عصر
آیا transaction جداول رو هم قفل می کنه؟
بله، شما کافیه کدهای مربوطه رو داخل ترنزکشن بنویسید، برای تست می تونید داخل ترنزکشن یه breakpoint بزارید، حالا همزمان اگر بخواید اطلاعات جدول رو از دیتابیس مشاهده کنید متوجه می شید جدول قفل شده

اما یه پیشنهاد برای پاک کردن دروس موقت بعد از یه مدت.
تو جدول ثبت موقت یه ستون به نام TimeStamp یا همچین چیزی اضافه کنید از نوع datetime
وقتی درسی ثبت موقت شد این ستون با مقدار DateTime.Now از تو برنامه پر بشه
حالا هر وقت خواستید درس های قابل انتخاب رو نشون بدید قبلش سراغ این جدول برید و درس هایی که بیش از مثلا 1 ساعت از ثبت موقتشون گذشته رو پاک کنید

minaalamshahi
جمعه 11 فروردین 1391, 12:08 عصر
من برای درج مسئله رو به این صورت نوشتم که کاربر دروسی رو که می خواد انتخاب می کنه و در list ,add میشه و در گرید بایندش می کنم و اگر گزینه ای حدف شد از لیست حدف و مجددا به گرید بایند می کنم و وقتی تایید نهایی رو زد همه در db درج میشه
حالا اگر خواست ویرایش کنه به مشکل بر می خورم چون اگر کاربر بخواددرسی رو اصلا حدف کنه و به جاش یه درس دیگه رو برداره به مشکل بر می خورم چون شخص باید 24 ساعت درس داشته باشه اگه یه درس 3 ساعتی رو مثلا حذف کنه و به جاش اصلا درس دیگه ای رو برنداره ؟
اگر یه درس دیگه برداره میشه چک کرد که مثلا اگر5ساعته داره برمیداره بهش پیغام بدیم اگه بر نداره باید چیکار کنم؟
یا مثلا بخواد اصلا حدف نکنه و فقط ساعت دروس رو کم یا زیاد کنه مثلا یه درس 4 ساعته رو تغییر بده به 3 ساعت و درس دیگه ای 3 ساعته رو تغییر بده به 4 ساعت؟

C#.net
جمعه 11 فروردین 1391, 12:36 عصر
اگه یه درس 3 ساعتی رو مثلا حذف کنه و به جاش اصلا درس دیگه ای رو برنداره ؟
اگر یه درس دیگه برداره میشه چک کرد که مثلا اگر5ساعته داره برمیداره بهش پیغام بدیم اگه بر نداره باید چیکار کنم؟


خوب وقتی تایید نهایی رو زد شما قبل ثبت در دیتابیس لیست رو بررسی کنید، اگر از لحاظ تعداد ساعت مشکلی نداشت ثبت می کنید، اگه تعداد ساعت مثلا کمتر از 24 بود(یه درس 2 ساعته رو حذف کرده و درس دیگه ای بر نداشته) پیغام می دید 3 ساعت کم داره

minaalamshahi
جمعه 11 فروردین 1391, 12:59 عصر
نه مشکل من روی insert نیست که
من مثلا درسها رو insert کردم
حالا کاربر می خواد مثلا درس معارف رو حدف کنه ادبیات برداره من چطوری اینو کنترل کنم وقتی که کاربر درس معارف رو حدف کرد ادبیات رو اصلا یادش رفت برداره یا اصلا برنداشت
یا مثلا می خواد یه درس 3 ساعته رو بکنه 4 ساعت و برعکس ساعت یه درس 4 ساعته رو بکنه 3 ساعت؟

minaalamshahi
جمعه 11 فروردین 1391, 13:05 عصر
برای توضیح بیشتر من رکوردها رو یکی یکی update می کنم
برای update دگمه مثل insert برای ثبت دسته جمعی ندارم

C#.net
جمعه 11 فروردین 1391, 13:12 عصر
خوب اون لیستی که داشتید برای دروسی بود که قراربود اضافه بشه، درست؟
یه لیست دیگه برای دروسی که کاربر می خواد حذف کنه داشته باشید، برای حذف هم مادامی که کاربر درسی(یا درس هایی) رو به جاش انتخاب نکرده که ساعتش تراز بشه، حذف از دیتابیس انجام نشه و بهش پیغام خطا بده...
به عبارت دیگه همه کار در حافظه انجام می شه ، پس از بررسی اگه مشکلی وجود نداشت تغییرات به دیتابیس منعکس می شه

minaalamshahi
جمعه 11 فروردین 1391, 13:22 عصر
نمیشه شاید کاربر فقط بخواد ساعات دورس رو تغییر بده و حدف یکی از تغییرات هستش و برای حدف هم فرض می کنیم ما یه جدول موقت با listساختیم برای برای دورسی که کاربر برای حذف انتخاب کرده یه جدول ثابت هم داریم برای کلیه دروسی که فعلا در db وجود داره دوباره تازه بیام یه list , یه جدول موقت دیگه بسازیم برای دورسی که می خواد به جای دورس حدفی بگیره چی میشه اونوقت؟
تو کد نویسیس هم احتمال خطا زیاد میشه.