PDA

View Full Version : سوال: نمایش عدم وجود مقادیر برای هر سال در بازه زمانی چند ساله



momimomi
جمعه 19 شهریور 1395, 02:37 صبح
با سلام خدمت مهندسین بی شکست ایرانی

در برنامه من هر فرد باید سالی یک بار دوره آموزشی در کارنامه خدمتی خود داشته باشد
در یک جدول کد فرد و کد دوره گذرانده و تاریخ دوره را ثبت می کنم
حالا برای ایجاد کوئری از جدول فوق به منظور زیر چیکار کنم؟
نمایش سالهایی که فرد به دوره آموزشی نرفته برای مثلا بازه زمانی چند ساله
خروجی به این شکل نمایش داده شود:
1380
1382
1391
1394

2- از چه طریق محدودیت ایجاد کنم که هر فرد فقط بتونه سالی یک بار در دوره آموزشی شرکت کنه، یعنی فقط برای هرسال یک تاریخ در جدول آموزشی او ثبت شود و سیستم بر اساس دوره های ثبت شده برای فرد اجازه ثبت دوره ببش از سالی یک بار ندهد.

ممنون از دوستانی که وقت بذارن و یک دوست رو راهنمایی کنن
من همیشه به کمک شما دوستان ایمان دارم

مهرداد صفا
شنبه 20 شهریور 1395, 13:17 عصر
سلام.
اول که لطف کنید سوالات مربوط به TSQL رو در تالار مربوط به خودش مطرح کنید. اینجا تالار C#‎‎ هست و سوالات مربوط به این زبان باید اینجا مطرح بشه.
برای جلوگیری از ثبت رکورد تکراری می تونید از Unique constraint استفاده کنید.
برای این کار می تونید هنگام ساخت جدول، از کلید واژه Unique و ترکیب ستونهایی که باید مجموع مقادیرشون منحصر به فرد باشه به این صورت استفاده کنید:

create table CP
(PersonID int,CourseID int, Year NVarChar(4) unique(PersonID,CourseID,Year))




اگر قبلا جدول رو ایجاد کردید میتونید از دستور Alter table یا Create unique index برای اضافه کردن این Constraint استفاده کنید.
برای انتخاب سالهایی که در جدول ثبت نشده می تونید یک table variable تعریف کنید و تمام سالهای مد نظر رو درونش قرار بدید و همه رکوردهای این جدول به غیر از مواردی که در جدول اصلی ثبت شده رو انتخاب کنید.
به این صورت:

create table CP
(PersonID int,CourseID int, Year NVarChar(4) unique(PersonID,CourseID,Year))


insert into CP
values
(1,1,'1388'),
(1,1,'1390'),
(1,1,'1392'),
(1,1,'1393'),
(1,1,'1395');

declare @years table(year NVarChar(4));
declare @StartYear NvarChar(4)='1385';

while @startYear<='1395'
begin
insert into @years values(@StartYear);
set @StartYear+=1;
end;

select year from @Years where year not in (select Year from CP where PersonID=1);



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

momimomi
شنبه 20 شهریور 1395, 16:11 عصر
سلام دوست عزیز
ممنون که پاسخ دادی
این کدها رو برا اکسس میخوام
باسیشارپ برنامه می نویسم اما بانک اطلاعاتیم اکسسه

مهرداد صفا
یک شنبه 21 شهریور 1395, 09:54 صبح
سلام دوست عزیز
ممنون که پاسخ دادی
این کدها رو برا اکسس میخوام
باسیشارپ برنامه می نویسم اما بانک اطلاعاتیم اکسسه

سلام. خواهش می کنم.
در اصل کار تفاوتی نمی کنه. شما میتونید unique constraint رو روی access هم اعمال کنید.
برای کوئری هم اگر از VBA کمک بگیرید کارتون خیلی ساده تر میشه.
این لینک تالار اکسس (http://barnamenevis.org/forumdisplay.php?23-Access) هست.
دوستان لطفا جزئیات و توضیحات مربوط به مشکلتون رو به طور کامل مطرح کنید تا راحتتر بشه راهنمایی کرد.
موفق باشید.