PDA

View Full Version : درخواست کمک برای حل برنامه



adhami
چهارشنبه 02 اسفند 1385, 16:10 عصر
با سلام خدمت دوستان عزیز
من به یک مشکل برخوردم که امیدوارم بتونم با همفکری شما آن را حل کنم .
موضوع از این قرار است که من در حال نوشتن برنامه ای هستم که برای هر نفر با یک شماره پرسنلی خاص 8 نمره آزمون در نظر می گیرد برای گزارشگیری در یک فرمها من ناگزیر هستم که تمامی نمرات ثبت شده قبلی هر نفر را نشان بدهد مشکل من این است که وقتی یک نمره برای هر نفر ثبت کردم دفعه بعدی که می خواهم برای آن نفر نمره ثبت کنم باید در فیلد سوم باشد و به همین ترتیب تا فیلد هشتم ؟
من چه طوری می تونم بگم که این دفعه ای که نمره ثبت می شه چندمین دفعه است و برای کدوم فیلد اطلاعات باید update بشن.

منتظر راهنمایی های شما هستم .

behzad_gh
چهارشنبه 02 اسفند 1385, 20:50 عصر
سلام
مشکل شما برای این است که ساختار بانک اطلاعاتی رو درست طراحی نکردید. این کار شما یک مشکل اساسی داره که اگر تعداد نمرات بیشتر از ۸ بشه محلی برای ذخیره سازی داده ها وجود نداره. راه حل اول: شما باید یک جدول داشته باشید برای کارمندان که در اون جدول هر کارمند یک ID داره و یک جدول دیگر برای نمرات که برای هر نمره یک رکورد جدید ایجاد می‌کنید و ID کارمند و تاریخ رو در اون رکورد ذخیره می‌کنید . سپس هرزمان که نیاز به نمایش نمرات کارمند داشتید ردیف‌هایی که ID اونها برابر ID کارمنده رو استخراج می‌کنید و بر اساس تاریخ مرتب می‌کنید و نمایش می‌دهید.

التبه راه حل دیگری نیز هست که جدول جداگانه نداشته باشید: برای تمام نمرات یک ستون در نظر بگیرید ( یعنی هر ۸ ستون را یکی کنید ) و نمرات شخص مورد نظر پشت سر هم در همان ستون ثبت کنید . البته باید با استفاده از یک کاراکتر خاص مثلا - ، ؛ و ... نمرات را جدا کنید . سپس در برنامه برای نمایش آنها را با استفاده از دستور Split جدا کنید. :چشمک:

zerobit-ltd
پنج شنبه 03 اسفند 1385, 10:38 صبح
مشکل شما برای این است که ساختار بانک اطلاعاتی رو درست طراحی نکردید. این کار شما یک مشکل اساسی داره که اگر تعداد نمرات بیشتر از ۸ بشه محلی برای ذخیره سازی داده ها وجود نداره. راه حل اول: شما باید یک جدول داشته باشید برای کارمندان که در اون جدول هر کارمند یک ID داره و یک جدول دیگر برای نمرات که برای هر نمره یک رکورد جدید ایجاد می‌کنید و ID کارمند و تاریخ رو در اون رکورد ذخیره می‌کنید . سپس هرزمان که نیاز به نمایش نمرات کارمند داشتید ردیف‌هایی که ID اونها برابر ID کارمنده رو استخراج می‌کنید و بر اساس تاریخ مرتب می‌کنید و نمایش می‌دهید.
درستش همینه.




التبه راه حل دیگری نیز هست که جدول جداگانه نداشته باشید: برای تمام نمرات یک ستون در نظر بگیرید ( یعنی هر ۸ ستون را یکی کنید ) و نمرات شخص مورد نظر پشت سر هم در همان ستون ثبت کنید . البته باید با استفاده از یک کاراکتر خاص مثلا - ، ؛ و ... نمرات را جدا کنید . سپس در برنامه برای نمایش آنها را با استفاده از دستور Split جدا کنید.
کاملا غلطه.
اصل اول نرمال سازی پایگاه داده های رابطه ای، atomic بودن داده های هر فیلده که با این روش نقض می شه.
بعضی جاها می شه قواعد نرمال سازی رو رعایت نکرد؛ ولی تو این مورد، دلیلی برای این کار وجود نداره.

adhami
شنبه 05 اسفند 1385, 08:29 صبح
سلام
راه حل اول: شما باید یک جدول داشته باشید برای کارمندان که در اون جدول هر کارمند یک ID داره و یک جدول دیگر برای نمرات که برای هر نمره یک رکورد جدید ایجاد می‌کنید و ID کارمند و تاریخ رو در اون رکورد ذخیره می‌کنید . سپس هرزمان که نیاز به نمایش نمرات کارمند داشتید ردیف‌هایی که ID اونها برابر ID کارمنده رو استخراج می‌کنید و بر اساس تاریخ مرتب می‌کنید و نمایش می‌دهید.


با سلام وتشکر از جواب شما
من ابتدا بانک رو اینطوری طراحی کرده ام ولی مشکل من روی یکی از گزارش های برنامه می باشد .
با طراحی به صورت بالا من تقریبا بیشتر گزارشها و فرمهام رو درست کردم به جز یکی و چون راه حل دیگری به ذهنم نرسید مجبور شدم وقتی که اطلاعات یک کارمند update می شه در دو جدول متفاوت اینکار صورت بگیره . یکی به صورت راه حل اول خودتان و دیگری به صورتی که بتونم برای هر کارمند 8 تا نمره رو در یک رکورد داشته باشم (البته در تیبل دبگر).
البته قطعا یک کارمند بیشتر از 8 تا نمره نخواهد داشت.

behzad_gh
شنبه 05 اسفند 1385, 11:39 صبح
ولی مشکل من روی یکی از گزارش های برنامه می باشد .


مشکلتون چی هست ؟

adhami
شنبه 05 اسفند 1385, 12:10 عصر
سلام
من گزارشی که برای گرفتن آن مشکل دارم را ضمیمه کردم . همانطور که می بینید اسم هر نفر باید در این لیست بیاید با نمره های که از قبل برای آن ثبت کرده اند .
شرط این گزارش این است که مثلا تمام کارمندانی که تابه حال 4 نمره برای آنها ثبت شده رابرای ما به همراه نمرات قبلی آنها را در این فرم نشان دهد ؟

behzad_gh
شنبه 05 اسفند 1385, 12:57 عصر
اگر نمرات به ترتیب ثبت شود یعنی اگر نمره ۴ ثبت شده بود نمرات قبلی نیز وجود داشته باشد دستور جستجو به صورت زیر می‌باشد:

SELECT * FROM Table1 WHERE Num4 IS NOT Null AND Num5 IS Null

zerobit-ltd
شنبه 05 اسفند 1385, 14:15 عصر
شما با استفاده از query زیر می تونید از همون جدولی که به ازای هر نمره برای هر کارمند، یه رکورد درج می کرد، به جواب برسید.


select *
from tbl_Marks
where Employee_ID in (select Employee_ID
from tbl_Marks
group by Employee_ID
having count(Employee_ID) >= 4)
order by Employee_ID
تمام نمرات افرادی رو بر می گردونه که 4 تا نمره یا بیشتر براشون درج شده.
در نتیجه، دیگه نیازی به جدولی که تمام نمرات رو تو یه رکورد می ریزه، نیازی نیست.
به نظر من شما به جای حل منطقی مساله، فقط روی نتیجه ای که می خواستید به دست بیارید، تمرکز کردید.
با این دو تا جدول، شما یه اصل دیگه از قواعد نرمال سازی رو نقض کردید؛ الان شما redundancy دارید.
برای یه گزارش که نباید یه جدول جدید ایجاد کرد!

adhami
شنبه 05 اسفند 1385, 15:30 عصر
تمام نمرات افرادی رو بر می گردونه که 4 تا نمره یا بیشتر براشون درج شده.

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

zerobit-ltd
شنبه 05 اسفند 1385, 17:16 عصر
اگر مشکل شما اینه که به ازای هر نمره برلی هر نفر، یه ردیف جدید تو گزارش ایجاد نشه، دیگه این دست خودتونه.
می تونید تمام نمره های هر نفر رو بخونی و بعد اون ها رو فرم گزارشت، سر جاشون قرار بدی؛ فقط یه کوچولو برنامه نویسی می خواد.

adhami
یک شنبه 06 اسفند 1385, 09:20 صبح
می تونید تمام نمره های هر نفر رو بخونی و بعد اون ها رو فرم گزارشت، سر جاشون قرار بدی؛ فقط یه کوچولو برنامه نویسی می خواد.
سلام و ممنون
لطفا" درمورد همین کوچولو برنامه نویسی توضیح بیشتری بدین .

adhami
سه شنبه 08 اسفند 1385, 10:43 صبح
سلام خدمت دوستان
من نتونستم هنوز ایم گزارش درست کنم لطفا اگر کسی نظری داره بگه ؟
من منتظرم
ممنون

zerobit-ltd
سه شنبه 08 اسفند 1385, 15:10 عصر
امیدوارم از sql server استفاده کنید تا بتونید از کد زیر استفاده کنید.
خروجی این query، رکوردهایی با دوتا فیلده. یکی شماره کارمند و اون یکی تمام نمرات همون کارمند. یعنی عملا یه رکورد برای هر کارمند که تمام نمرات کارمند رو در بر می گیره.


set nocount on
declare @Employee_ID int,
@Marks varchar(4000)
declare @tbl table (Employee_ID int, Marks varchar(4000))
declare cur cursor
for select distinct Employee_ID
from tbl_Marks
where Employee_ID in (select Employee_ID
from tbl_Marks
group by Employee_ID
having count(Employee_ID) >= 4 and count(Employee_ID) <= 8)
order by Employee_ID

open cur
fetch next from cur
into @Employee_ID

while @@fetch_status = 0
begin
set @Marks = ''
select @Marks = @Marks + cast(Marks as varchar(4000)) + ','
from tbl_Marks
where Employee_ID = @Employee_ID
insert into @tbl
values (@Employee_ID, @Marks)

fetch next from cur
into @Employee_ID
end

close cur
deallocate cur

select *
from @tbl

adhami
سه شنبه 08 اسفند 1385, 15:46 عصر
سلام و ممنون از شما
از روالهای ذخیره شده استفاده کردید ؟