PDA

View Full Version : مشکل در اجرای دستور Select



AliReza Vafakhah
سه شنبه 11 بهمن 1390, 23:54 عصر
سلام دوستان

صلاح دیدم تاپیک را در این بخش ایجاد کنم ، البته با اجازه مدیریت

من سه تا جدول دارم

جدول ورزشکاران :
نام \ نام خانوادگی \ کدورزشکار \ زمان پرداخت شهریه (روزهای ماه به عنوان مثال 15 ام هر ماه)

جدول شهریه های پرداخت شده :
کد ورزشکار \ تاریخ پرداخت شهریه \ مبلغ

جدول شهریه های پرداخت نشده :
کد ورزشکار \ تاریخ پرداخت نشدن شهریه \ مبلغ

توضیح در رابطه با دوجدول شهریه :

رکورد های جدول شهریه های پرداخت شده توسط کاربر درج میشه ، یعنی کاربر ورزشکار X را انتخاب کرده و تایید دریافت شهریه آنرا در جدول ثبت می کند.

اما رکوردها در جدول شهریه های پرداخت نشده توسط نرم افزار درج میشه.


خوب اصل مطلب :

مشکل من اینجاست که می خواهم جدول شهریه های پرداخت نشده را با توجه به جدول شهریه های پرداخت شده و زمان پرداخت شهریه Update کنم.

به عنوان مثال :
می خوام افرادی که زمان پرداخت شهریه آنها 20 ام ماه بوده و شهریه خود را پرداخت نکردند را با توجه به جدول شهریه های پرداخت شده و تاریخ پرداخت (چون مشخصات آنها در جدول شهریه های پرداخت شده با توجه به تاریخ مربوطه ذخیره نشده) شناسایی کنم و در جدول شهریه های پرداخت نشده مشخصات ورزشکار را ذخیره کنم.

با تشکر

tiphooo
چهارشنبه 12 بهمن 1390, 02:42 صبح
دوست عزیز شما چرا از دو جدول برای این کار استفاده می کنید .این کار با ایجاد یک جدول و یک فیلد اضافه مبنی بر پرداخت و یا عدم پرداخت شهریه ایجاد کنید . مثلا فیلدی از نوع bit که مقدار صفر و یک را به خود بگیرد ایجاد کرده و حالت پیش فرض همه صفر باشد با پرداخت شهریه در موعد مقرر مقدار فیلد یک بشود و هر زمان که گزارش بگیرید مشخص است که در یک تاریخ مثلا بیستم چه کسانی فیلد آنها صفر است (شهریه پرداخت نکرده اند) و چه کسانی فیلد آنها یک است (شهریه پرداخت کرده اند). و دیگر نیاز نیست شما برای کسانی که شهریه پرداخت نکرده اند کاری انجام بدهید چون از اول همه پیش فرض شهریه پرداخت نکرده اندو فقط زمانی که کسی شهریه پرداخت می کند این مقدار عوض می شود. با روش خودتان شما در بعدالظهر روز پرداخت شهریه نمی توانید گزارشی بگیرید که چه کسانی هنوز شهریه پرداخت نکرده اند چون شما مجبورید روز بعد این کار را انجام دهید چون هنوز شاید کسانی باشند که بخواهند پرداخت انجام دهند و مثلا اگر کسی فردای ان روز شهریه را پرداخت کند شما مجبورید که رکورد درج شده برای عدم پرداخت را حذف کنید و اگر فراموش کنید یادتان نرود دارید برنامه را برای یک باشگاه ورزشی و یک عده ورزشکار می نویسید!!! ولی در حالتی که شرح داده شد برای عدم پرداخت نیاز به کاری نیست و اگر شخص شهریه را بخواهد ماه بعد پرداخت کند دو ماه بعد هم اگر شما بخواهید گزارش بگیرید مشخص است که طرف کل شهریه اش را پرداخت کرده.

mahan.2002
پنج شنبه 13 بهمن 1390, 07:05 صبح
با سلام

بنظرم ساختاری که در نظر گرفتید خیلی درست نباشه
شما جداولتون رو اینطور نظر بگیر

جدول ورزشکاران ( شماره ورزشکار ، نام ، نام خانوادگی،..)

جدول قیمت هر فعالیت (شماره پایه ورزش، نام فعالیت ورزشی ( فوتبال، شنا، ..) ، مبلغ ماهیانه) نام هر نوع فعالیت و قیمت ان را در این جدول قرار دهید مثلا فوتبال .، شنا ...

جدول پایه شهریه: ( شماره ثبت شهریه، شماره پایه ورزش (کلید خارجی ) ،سال ، ماه )

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

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


خوشحال می شم کمکتون کرده باشم. موفق باشید

maktoom
پنج شنبه 13 بهمن 1390, 12:35 عصر
سلام
اگه می خوای بدونید چرا این اشکال در طراحی جداولتون پیش اومده و دوستانی که پاسخ دادن بر چه اساسی جداول پیشنهادیشون رو ارائه دادن باید به این نکته دقت کافی داشته باشید:
در طراحی یک پایگاه داده دید شما باید مفهومی باشه و نه موضوعی.
موضوع پرداخت یا عدم پرداخت و اسامی افراد میتونه در قالب یک مفهوم باشه که پیاده سازیش بمراتب راحتتره. به جای دیدن اون بعنون یک موضوع.

AliReza Vafakhah
پنج شنبه 13 بهمن 1390, 22:57 عصر
از دوستان گرامی تشکر می کنم.

هر زمانی که برنامه پایگاه داده دارم قبلا از هرکاری ، طراحی بانک رو چندبار میام رو کاغذ، اما این سری خودم هم قبول دارم طراحی بانکم افتضاح بوده. حالا خودم هم سردرگم موندم.

به هر حال از دوستان محترم تشکر میکنم و به نظرم ایده دوست گرامی tiphooo راست کار برنامه من هست و از روز اول باید به این فکر می افتادم .

AliReza Vafakhah
شنبه 22 بهمن 1390, 22:07 عصر
سلام

دوستان من یکی از جدول ها رو پاک کردم و حالا دو جدول بیشتر نیست که یکی همون جدول Tbl_SportsMan و دیگری هم جدول Tbl_Payment که یه فیلد از نوع Bool بهش اضافه کردم که مشخص می کنه که ورشکار شهریه پرداخت کرده یا نه.

حالا به یه مشکل در Update جدول Tbl_Payment برخورد کردم.

من می خواهم جدول به این صورت Update بشه.

به عنوان مثال : افرادی که باید در 21 ام ماه (فیلد TimeForPay در جدول Tbl_SportsMan) شهریه پرداخت می کردند ولی شهریه آنها پرداخت نشده (با توجه به وجود رکورد ثبت پرداخت در جدول Tbl_Payment) مشخص شوند و در آخر در جدول Tbl_Payment کد ورزشکار و تاریخ پرداخت نشدن شهریه ذخیره شود.

مشکل من دستور Select و Update هست ، البته اینجا باید ابتدا ارتباط بین دو جدول ایجاد شود و بعد از اون ورزشکارانی که در خروجی به نمایش گذاشته شده اند در جدول Tbl_Payment درج شوند.

این دستور رو نوشتم اما رکوردهایی رو برمی گردنه که در جدول Tbl_Payment مشخصات ورزشکار درج شده. حالا من بلعکس دستور را می خواهم . یه چیزی شبیه به not


Select Distinct Code_V, Family_V from Tbl_SportsMan, Tbl_Payment
Where (Tbl_Payment.Code_V = Tbl_SportsMan.Code_V)
and (Tbl_SportsMan.TimeForPay_V = '3')
and (Tbl_Payment.DatePay >= '1390/11/13') and (Tbl_Payment.DatePay <= '1390/11/20'));

tiphooo
شنبه 22 بهمن 1390, 23:31 عصر
منظورتون رو خوب متوجه نشدم ولی چیزی را که خودتان می خواهید شاید شبیه کد زیر باشد
SELECT * FROM Tbl_SportsMan
WHERE (TimeForPay_V = '3') AND Code_V NOT IN (
SELECT DISTINCT Code_V FROM Tbl_Payment
WHERE DatePay BETWEEN '1390/11/13' AND '1390/11/20')

AliReza Vafakhah
شنبه 22 بهمن 1390, 23:36 عصر
منظورتون رو خوب متوجه نشدم ولی چیزی را که خودتان می خواهید شاید شبیه کد زیر باشد


تشکر دقیقا همین که شما نوشتید کار من رو راه انداخت.

حالا میشه یه جا تمام رکوردهایی که از نتیجه دستور SQL که شما قرار دادید رو در Tbl_Payment درج و یا Update کرد؟

tiphooo
یک شنبه 23 بهمن 1390, 19:33 عصر
Update که قاعدتا نمی شود انجام داد نتیجه SELECT شما مقادیری هستند که در جدول Tbl_Payment وجود ندارند و مادامی که وجود ندارند پس Update عملکردی نخواهد داشت
ولی Insert می توانی انجام دهی به صورت :
INSERT INTO Tbl_Payment (فیلد1وفیلد2و....)
SELECT فیلد1وفیلد2و.... FROM Tbl_SportsMan
WHERE (TimeForPay_V = '3') AND Code_V NOT IN (
SELECT DISTINCT Code_V FROM Tbl_Payment
WHERE DatePay BETWEEN '1390/11/13' AND '1390/11/20')

فیلد 1و فیلد2 و .... یا باید متناظر باشد یا مقدار ثابت وارد کنید مثلا برای تاریخ مقدار خود تاریخ را وارد کنید
مثلا SELECT V_Code,'1390/11/23'

AliReza Vafakhah
سه شنبه 16 اسفند 1390, 00:16 صبح
دوست عزیز تشکر

حالا یه مشکل دیگه با دستور SQL دیگه دارم.

برای اینکه مشخص کنم امروز موئد شهریه چه کسانی هست ، از جدول Tbl_SportsMan به این شکل یک Query میگیرم.

Select * From Tbl_SportsMan Where TimeForPay_V = 10

حالا مشکل من اینه :
در کد بالا رکوردهایی که در خروجی به نمایش گذاشته می شوند افرادی هستند که امروز باید شهریه پرداخت کنند و حالا من می خواهم ورزشکاری که امروز شهریه خود را پرداخت کرده دیگه در Query بالا به نمایش گذاشته نشه به همین دلیل از این دستور استفاده میکنم که جواب نمیده (با توجه به جدول Tbl_Payment)

Select * From Tbl_SportsMan (Where TimeForPay_V = 10) and (Code_V Not In (Select * from Tbl_Payment (Where DatePay = '1390/12/15')
and (isPayed = 'True' )))

AliReza Vafakhah
چهارشنبه 17 اسفند 1390, 23:48 عصر
دوستان راه حلی سراغ ندارید؟

tiphooo
پنج شنبه 18 اسفند 1390, 02:49 صبح
Select * From Tbl_SportsMan (Where TimeForPay_V = 10) and (Code_V Not In (Select * from Tbl_Payment (Where DatePay = '1390/12/15')

and (isPayed = 'True' )))
در دستوری که نوشتید جایی که Code_V Not In نوشتید داخل پرانتز Select * چه معنی دارد؟
شما می خواهید یک فیلد را مقایسه کنید با تمام فیلدها؟
syntax شما اشتباه است . برای مقایسه یک فیلد از فیلد متناظرش استفاده کنید یعنی به جای * فیلد کد ورزش کار را از جدول Tbl_Payment بگذارید ظاهرا بقیه موارد درست است

AliReza Vafakhah
پنج شنبه 18 اسفند 1390, 16:42 عصر
تشکر دوست عزیز

کاملا حق با شما بود. کد را به این شکل تغییر دادم و مشکل حل شد.


Select * From Tbl_SportsMan (Where TimeForPay_V = 10) and (Code_V Not In (Select Code_V From Tbl_Payment (Where DatePay = '1390/12/15')

and (isPayed = 'True' )))