مشاهده نسخه کامل
: جستجو در SQl
shadmehrshadow1
01-07-2012, 16:06
سلام
من یه جدول SQL دارم . توش 3 تا فیلد داره.
مثلا فیلد name,code,s
و توی این جدول 9 سطر داده وارد کردم. فیلد S شماره هست. مثلا سطر اول 1 و سطر دوم 2 الی 9
من میخوام مقدار name سطری رو که مقدار فیلد S اون 5 هست رو توی یه تکست باکس بریزم.
ممنون میشم کمکم کنید.
بنام خدا.
سلام.
از این دستور میتونید استفاده کنید:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
برای نمایش هم باید با DataAdapter اطلاعات رو دریافت کنید.برای مثال:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
خروجی DataTable حاوی اطلاعات درخواستی شماست که میتوانید ببینید:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
کانکشن استرینگ را فراموش نکنید که باید درست وارد کنید.
موفق و سربلند باشید در پناه حق.
shadmehrshadow1
20-07-2012, 19:02
سلامچند مورد سوال در مورد کار با SQl داشتم.ممنون میشم کمکم کنید.1- ما یک جدول داریم 3 فیلد داره. مثلا : الف) کد ب) نام ج ) هرچیزیمن میخوام وقتی که یه مقدار جدید میخوام به این جدول اضافه کنم چک کنه ببینه این نامی که من وارد کردم قبلا ثبت شده یا نه و اگه ثبت شده پیغام بده که این نام قبلا ثبت شده.2- حالا میخوام توی این جدولی که گفتم جست و جو کنم به این صورت که کد رو وارد میکنم و مقدار نام اون کد رو توی یک لیبل قرار بدم.تا حدودی این کاری انجام دادم به کمک دیتاگرید ولی میخوام وقتی که عمل جست و جو صورت گرفت و اون کد توی جودل نبود پیغام خطا بده. ( اگه روش بهتری برای جستو به غیر از دیتاگرید میدونید که بتونم مقدار نام روی توی لیبل بریزم بگید)3- و اینکه یه دکمه بزارم و با کلیک کردن روی اون تمام اطلاعات ثبت شده توی این جدول حذف بشه.ممنون.
shadmehrshadow1
21-07-2012, 15:26
یه چند مورد دیگه هم هست که ممنون میشم کمک کنید :
برای ثبت توی یه جدول که یه فیلدش کد هست میخوام کاری کنم که به صورت خودکار شماره بزنه براش . و با این کد این کار رو انجام میدم :
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
که مقدار txtint رو میریزم واسه اون کد.
همه چیز درسا پیش میره ولی وقتی که میخوام یه یلد رو حذف کنم به طور طبیعی شماره ها به هم میریزه . راه حل شما چیه ؟
فرض کنید ما یه جدول حضور داریم . من میخوام اسم 5 نفری که بیشترین حضور و کمترین حضور رو دارند رو به دست بیارم . حالا میتوشه اونا رو توی دیتا گرید ریخت.
و همین طور آخرین نفری که حضور زده.
فرض کنید که توی این جدول تاریخ هم وجود داره من میخوام روزی که بیشترین حضور توش هست رو به دست بیارم.
ممنون . ببخشید میدونم زیاد شد
shadmehrshadow1
25-07-2012, 16:26
ممنون میشم ااگه یکی به من کمک کنه.
سلام
بظاهر برادر و دوستمان علی آقا کمی مشغله پول شمردن پیدا کردند :31:
قتی که یه مقدار جدید میخوام به این جدول اضافه کنم چک کنه ببینه این نامی که من وارد کردم قبلا ثبت شده یا نه و اگه ثبت شده پیغام بده
هم میتوانید خودتان دستی بررسی کنید و از عدم تکراری شدن ممانعت کنید و هم میتوانید فیلد مورد نظر را در دیتابیس unique معرفی کنید تا خود دیتابیس این مورد را تضمین کند.
البته من دومی را پیشنهاد میکنم، بهتر است این موارد را به خود دیتابیس واگذار کنید، در این شرایط در شبکه و همزمانی اتصال کاربران هم مشکل نخواهید داشت.
حالا میخوام توی این جدولی که گفتم جست و جو کنم به این صورت که کد رو وارد میکنم و مقدار نام اون کد رو توی یک لیبل قرار بدم.تا حدودی این کاری انجام دادم به کمک دیتاگرید ولی میخوام وقتی که عمل جست و جو صورت گرفت و اون کد توی جودل نبود پیغام خطا بده
اینکه یه دکمه بزارم و با کلیک کردن روی اون تمام اطلاعات ثبت شده توی این جدول حذف بشه
روش ارتباط با دیتابیستان چیست؟ DataSet یا Entity و...؟
در همه این موارد شما امکان تعریف یک Query را دارید که دستور SQL ای را اجرا و نتیجه را بازپس دهد.
در هر دو مورد سوالات فوق شما میتوانید SQL ای تهیه و اجرا کنید.
البته میتوانید مستقیماً با connection و command هم خودتان SQL ها را اجرا کنیدف مثلاً:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
برای ثبت توی یه جدول که یه فیلدش کد هست میخوام کاری کنم که به صورت خودکار شماره بزنه براش
این مورد را هم بهتر است به autonumber خود دیتابیس محول کنید، روش تابع MAX تان خیلی جالب توجه نیست و در شبکه میتواند مکرراً باعث بروز خطا شود.
وقتی که میخوام یه یلد رو حذف کنم به طور طبیعی شماره ها به هم میریزه . راه حل شما چیه ؟
خوب چه مشکلی دارد؟ بهتر است کمی دید صنعتی داشته باشید و دیدتان را اصلاح کنید!
فرض کنید ما یه جدول حضور داریم . من میخوام اسم 5 نفری که بیشترین حضور و کمترین حضور رو دارند رو به دست بیارم . حالا میتوشه اونا رو توی دیتا گرید ریخت.
و همین طور آخرین نفری که حضور زده.
فرض کنید که توی این جدول تاریخ هم وجود داره من میخوام روزی که بیشترین حضور توش هست رو به دست بیارم.
جواب این سوال مستقیم به ساختار جداول و دیتابیستان برمیگردد...
موفق باشید.
shadmehrshadow1
26-07-2012, 12:43
سلام
جواب این سوال مستقیم به ساختار جداول و دیتابیستان برمیگردد...
.
مرسی . متوجه منظورتون نشدم تو اینجا.
shadmehrshadow1
26-07-2012, 16:37
چه جوری فیلدی رو unique کنم ؟ یکم بیشتر توضیح میدید
سلام
متوجه منظورتون نشدم تو اینجا
یعنی بدون داشتن دیتابیس یا نام جداول و نام و نوع فیلدها و روابط بین جداول نمیتوانم پاسخ داد و این اطلاعات در پست های شما وجود ندارد.
چه جوری فیلدی رو unique کنم ؟
به نمایه طراحی جدول در SSMS بروید و در محلی خالی راست کلیک کنید:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
asrit.net
26-07-2012, 17:57
برای یونیک کردن یک فیلد یکی از آسان ترین راه حل ها این است که آن را Primary Key کنید.
البته این راه حل همیشه جواب نمی دهد چون ممکن است فیلد شما آن فیلدی نباشد که قرار است
PK شود.
shadmehrshadow1
27-07-2012, 17:29
برای ثبت اطلاعات توی جدول چه طور باید بنویسیم که خودش شماره و کد رو به صورت خودکار بزنه.
مثلا یه جدول که 3 فیلد داره: code,name,family
از چه دستوری استفاده کنم که مقدار کد رو خودش بزنه. درحالت پیش فرض اینطور هست :
insert into table(code,name,family) value(meghdarcode,meghdarname,meghdarfamily)
این برای وقتی هست که مقدار کد رو ما خودمون میدیم. ولی وقتی میخوام مقدار کد به صورت خودکار و منحصر به فرد باشه باید از چه دستوری برای ثبت اطلاعات استفاده کرد.
و 1- ما یه جدول حضور داریم که 4 تا فیلد داره : codehozor,tarikh,saat,codekarmand
توی این جدول کارمندها میان و حضورششون رو اعلام می کنند. و ثبت می کنند.
من میخوام توی این جول کد 5 کارمندی رو بیشترین حضور رو داشتند رو به دست بیارم.
مثلا:
select max(codekarmand) from Table_Hozor
که توی این روش فقط کد یه کارمند که بیشترین حضور رو داشته رو میده. من میخوام نفر دوم سوم چهارم و پنجم رو هم به دست بیارم. نه اینکه فقط نفر اول از نظر بیشترین حضور رو پیدا کنم.
2- و یه مورد دیگه که تو این جدول همون طور که میبینید یه فیلد تاریخ هم هست. من میخوام وقتی که کد یه کارمند رو وارد میکنم توی جدول حضور که بهتون گفتم در فیلد تاریخ این کارمند بگرده و تاریخ آخرین حضورش رو بده.
مثلا کارمندی که کد کارمندی اون 4 هست . 4 تاریخ براش توی این جدول حضورش ثبت شده . میخوام وقتی که عدد 4 رو وارد می کنم از بین اون 4 تا تاریخ تاریخ آخری و جدید تر رو برگردونه.
3- درمورد سوال سوم هم اینکه همون طور که گفتم یه فیلد تاریخ توی این جدول وجود داره. می میخوام که همه ی این تاریخ ها رو چک کنه و ببینه که کدوم تاریخ بیشتر از همه تکرار شده.(به عبارتی در کدام تاریخ بیشترین حضور زده شده)
سلام
گرچه تعریف جاری تان هم خیلی دقیق نیست و میتوانید حالات مختلفی را فرض کرد و درنظرگرفت و جواب های مختلفی داد، ولی بحرحال میتوان جوابی داد ...
از چه دستوری استفاده کنم که مقدار کد رو خودش بزنه
طریقه معرفی یک ستون برای autonumber را که میدانید؟! باید گزینه identity را در خصایص آن ستون فعال کنید.
برای دستور insert هم باید کلاً از فیلد مورد نظر صرف نظر کنید، خود سیستم خودکار عدد یکتا را درج میکند.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اگر هم در برنامه نیاز به عدد درج شده دارید و میخواهید کاری روی آن انجام دهید کافی است دستور زیر را فوراً پس از insert اجرا کنید و مقدار آن را بخوانید:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
select max(codekarmand) from Table_Hozor
که توی این روش فقط کد یه کارمند که بیشترین حضور رو داشته رو میده
مطمئن هستید؟؟؟ چون این کدبظاهر فقط بزرگترین کدکارمندی جدول را برمیگرداند!
کارمند که بیشترین حضور رو داشته ... من میخوام نفر دوم سوم چهارم و پنجم رو هم به دست بیارم
تا بیشترین حضور را چی تعریف کنید؟! بیشترین تعداد یا بیشترین زمان؟!
اگر بیشترین تعداد حضور را لحاظ کنیم، کد زیر شاید بد نباشد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و اگر بیشترین زمان را لحاظ کنیم، خوب باید اطلاعات دقیق تری از نوع تاریخ-زمان شما در دسترس باشید و اینکه اصولاً چرا از نوع واحد datetime برای ذخیره هر دو فیلد مذکور در یک فیلد استفاده نکرده اید و...
میخوام وقتی که کد یه کارمند رو وارد میکنم توی جدول حضور که بهتون گفتم در فیلد تاریخ این کارمند بگرده و تاریخ آخرین حضورش رو بده
اگر آخرین تاریخ بزرگترین تاریخ تعزیف کنیم، پس به کد زیر میرسیم:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اگر هم بخواهیم ساعت را هم در این تعریف لحاظ کنیم:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
البته میتوان خود آخرین تاریخ را هم طور دیگری تعریف کرد، مثلاً بزرگترین pmk-autonumber ...
در کدام تاریخ بیشترین حضور زده شده
به شرطی که فیلدتاریخ شما حاوی زمان هم نباشد:
(چون همانطورکه گفتم ذات فیلدهای تاریخ sql زمان را هم میپذیرند که شاید نیاز باشد دستور زیر کمی اصلاح شود.)
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
موفق باشید.
shadmehrshadow1
28-07-2012, 17:57
واقعا ممنون. توضیحاتتون بسیار خوب بود و کمکم کرد.
اگه ما توی جدول Table_Hozor حضور افرادی ثبت شده باشه ولی این افراد هنوز کد حضور ندارند و جلوی فیلد کد حضورشون خالی باشه اونوقت وقتی دستور زیر رو استفاده می کنیم توی خروجی یه سطر رو هم برای این افراد در نظر میگیره . چه جوری میشه کاری کرد که دیگه این ها رو هم نشماره و توی خروجی نده .
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
مثلا خروجی به این صورت میشه :
کد کارمند : 3 5 3 4
تعداد : 9 9 8 7 6
همون طور که میبینی برای کد کارمند جای خالی میمونه.
و برای اینکه همین کار رو در بین 2 تاریخ انجام بدیم چه طور هست و یا در یک ماه خاص.
و اینکه من یکم روی کد بالا کار کردم ولی نتونستم کاری کنم که تعداد حضور یه فرد خاص رو به دست بیارم. مثلا تعداد حضور فردی که کد حضورش 3 هست .
یه مورد دیگه هم اینکه من میخوام میانگین حضور ماهانه رو به دست بیارم . مثلا ما بهش ماه رو میدیم (1391/01) و بعد به دست بیاریم که توی این ماه به طور میانگین چند حضور در روز زده شده.
و غیبت بیش از 2 روز. کارمندایی که بیش ار 2 روز غیبت دارند(حضوری ثبت نکردند توی جدول Table_Hozor ) رو به دست بیارم.
چه جوری میشه کاری کرد که نتیجه به دست اومده هم بر اساس تاریخ و هم ساعت مرتب بکنه.
یعنی اول بر اساس تاریخ بده و بعد بین اون تاریخ ها نتیجه رو بر اساس ساعت مرتب کنه.
shadmehrshadow1
30-07-2012, 10:51
ببخشید میدونم زیاد شد. ولی واقعا نیاز دارم. گیر کردم
سلام
اول لازم میدانم یک مورد قبلی را که ناشی از بی دقتی بوده اصلاح کنم و ان اینکه در یکی از دستورات SQL قبلی یک DESC فراموش ده بود که پست قبلی به همین منظور ویرایش شد.
افراد هنوز کد حضور ندارند و جلوی فیلد کد حضورشون خالی باشه اونوقت وقتی دستور زیر رو استفاده می کنیم توی خروجی یه سطر رو هم برای این افراد در نظر میگیره . چه جوری میشه کاری کرد که دیگه این ها رو هم نشماره و توی خروجی نده
....
همون طور که میبینی برای کد کارمند جای خالی میمونه
ساده است شرط بگذارید فلان فیلد خالی نباشد.
البته یک چیز را درست متوجه نشدم ....
در بالا شما به "کدحضور" اشاره کردید ولی بعدش گفتید "کدکارمند" خای خالی خواهد داشت!
بالاخره "کدحضور" میتواند خالی باشد یا "کدکارمند" ؟ اصلاً "کدکارمند" معنی دارد خالی باشد؟
تعداد حضور فردی که کد حضورش 3 هست
باز هم همان مشکل قبلی به نوعی اینجا هم وجود دارد؟ احتمالاً منظورتان "کدکارمند" نبوده؟ مگر موجودیت "کارمند" با کلید "کدکارمندی" اش شناسایی نمیشود؟ پس نباید بگوییم کارمندی با کد کارمندی فلان؟
اگر منظور کدکارمندی باشد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
مثلا ما بهش ماه رو میدیم ...
همانطورکه قبلاْ هم اشاره کردم، اطلاعات ارائه شده شما برای پاسخ این سوال کافی نیست، باید نوع و فرمت فیلد تاریخ شما مشخص شود.
>>باید اطلاعات دقیق تری از نوع تاریخ-زمان شما در دسترس باشید و اینکه اصولاً چرا از نوع واحد datetime برای ذخیره هر دو فیلد مذکور در یک فیلد استفاده نکرده اید و...
غیبت بیش از 2 روز
اگر فقط همین باشد قابل پاسخ دادن است ولی حتماً منظورتان "غیبت بیش از 2 روز در ماه" بوده که در این صورت همچنان باید مورد قبلی روشن شود.
چه جوری میشه کاری کرد که نتیجه به دست اومده هم بر اساس تاریخ و هم ساعت مرتب بکنه
ORDER BY
شاید بد نباشد جهت تکمیل اطلاعات و حل مشکلاتتان به طور زیرساختی با مفاهیم دیتابیس های رابطه ای و زبان SQL کتابهایی یا حداقل کتابی کامل) در این خصوص تهیه و مطالعه کنید.
بارها گفته ام که این تالارهای گفتگو فقط برای رفع اشکال موثر هستند و البته در این مورد خیلی خوب موثر هستند ولی برای یادگیری چندان ارزشی ندارند و برای یادگیری هیچ چیزی جای کتابها را نمیگیرد.
موفق باشید.
shadmehrshadow1
31-07-2012, 21:18
ساده است شرط بگذارید فلان فیلد خالی نباشد.البته یک چیز را درست متوجه نشدم ....در بالا شما به "کدحضور" اشاره کردید ولی بعدش گفتید "کدکارمند" خای خالی خواهد داشت!بالاخره "کدحضور" میتواند خالی باشد یا "کدکارمند" ؟ اصلاً "کدکارمند" معنی دارد خالی باشد؟ بله درسته منظورم کد کارمند بود.
یه مورد دیگه هم اینکه من میخوام میانگین حضور ماهانه رو به دست بیارم . مثلا ما بهش ماه رو میدیم (1391/01) و بعد به دست بیاریم که توی این ماه به طور میانگین چند حضور در روز زده شده.من ماه رو از نوع متن nvarchar قرار دادم. برای اینکه تاریخ شمسی رو بتونم ذخیره کنم. به نظرتون اگه از نوع datetime استفاده کنم بهتره ؟ که قبل از ثبت اطلاعات اون رو به میلادی تبدیل کنم تا میلادی ثبت بشه و موقع دریافت اطلاعات اون رو دوباره به شمسی تبدیل کنم.
اگر فقط همین باشد قابل پاسخ دادن است ولی حتماً منظورتان "غیبت بیش از 2 روز در ماه" بوده که در این صورت همچنان باید مورد قبلی روشن شود. بله در ماه . شما به نظرتون از چه نوع فرمتی استفاده کنم بهتره؟ همون رو بگید من تغییر میدم.
ORDER BYشاید بد نباشد جهت تکمیل اطلاعات و حل مشکلاتتان به طور زیرساختی با مفاهیم دیتابیس های رابطه ای و زبان SQL کتابهایی یا حداقل کتابی کامل) در این خصوص تهیه و مطالعه کنید.بارها گفته ام که این تالارهای گفتگو فقط برای رفع اشکال موثر هستند و البته در این مورد خیلی خوب موثر هستند ولی برای یادگیری چندان ارزشی ندارند و برای یادگیری هیچ چیزی جای کتابها را نمیگیرد. منم خیلی دوست دارم بتونم یه کتاب خوب پیدا کنم. ممنون میشم اگه سراغ دارید معرفی کنید . مخصوصا اگه نسخه الکترونیکی یا PDF اون موجود باشه . ممنون
shadmehrshadow1
04-08-2012, 13:48
سلام یه موردی هست خیلی وقته درگیرش هستم اینه که وقتی کانکشن رو به صورت زیر تعریف می کنم میتونم از توی دیتابیس داده ها رو بخونم ولی ولی وقتی داده ای رو به دیتابیس اضافه می کنم به طور موقت ذخیره میشه و بعد از خروج از برنامه به حالت اول برمیگرده و اطلاعاتی که ذخیره کرده بودم دیگه نیست.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنیدو مجبور میشم که به صورت زیر تعریف کنم تا کار بکنه.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنیدیعنی آدرس رو دستی بدم بهش.چرا این طور میشه. چیکار باید بکنم؟
سلام
منظورم کد کارمند
یعنی چطور؟ چطور کارمندی است که کد کارمندی ندارد؟ مگر "کدکارمندی" کلید جدول "کارمندان" نیست؟ پس چطور میتواند خالی باشد؟
برای اینکه تاریخ شمسی رو بتونم ذخیره کنم. به نظرتون اگه از نوع datetime استفاده کنم بهتره ؟
به نظرتون از چه نوع فرمتی استفاده کنم بهتره؟
از دیدگاهی سوال سختی است ولی شخصاً و مطمئناً datetime را ترجیح میدهم، برای تبدیلاتش هم میتوان کنترل های سفارشی تولید کرد و همچنین امکان پشتیبانی تاریخ شمسی در خود دستورات SQL هم وجود دارد ... !
شاید در نگاه اول سخت تر و پیپیده تر بنظر برسد و ساخت بستر اولیه پشتیبانی کامل تبدیلات شمسی هزینه زمانی اش زیاد بنظر برسد ولی هرچقدر پروژه بزرگ تر شود این هزینه زمانی کوپکتر شده و قابلیت هایش بیشتر رخ نشان میدهند...
و...
و...
...یه کتاب خوب پیدا کنم. ممنون میشم اگه سراغ دارید معرفی کنید
از بین کتاب های SQL ای که خواندم مورد زیر بنظر جالب تر می آمد.
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])
یعنی آدرس رو دستی بدم بهش. چرا این طور میشه. چیکار باید بکنم؟
خیر نیازی نیست.
همان رشته اتصال اولی سالم و صحیح و بدون مشکل است.
مشکل شما ناشی از اجرای برنامه از درون VS است.
VS با هر کامپایل همانطورکه فایل exe جدیدی می سازد یک نسخه از فایل DBName.mdf خالی شما را هم برداشته و کپی کرده و در کنار exe جدید تولید شده قرار میدهد.
در نتیجه هربار که با VS برنامه را اجرا میکنید (اگر موجب کامپایل مجدد شود که اغلب میشود) فایل جدیدی را در کنار exe استفاده میکند و با اجرای بعدی هم فایل قبلی حذف میشود.
اگر شما برنامه تان را کامپایل کند و بدون VS، خودتان مستقیم exe را اجرا کنید، متوجه میشوید که مشکلی نخواهید داشت.
موفق باشید.
shadmehrshadow1
06-08-2012, 16:12
یعنی چطور؟ چطور کارمندی است که کد کارمندی ندارد؟ مگر "کدکارمندی" کلید جدول "کارمندان" نیست؟ پس چطور میتواند خالی باشد؟
كد حضور كليد جدول حضور است. خب شايد كارمندي تازه اومده باشه و هنوز به هر دليلي كد نداشته باشه .
يه جوري اين مشكل رو حل كردم و فقط روي غيبت بيش از دو روز موندم.
از بین کتاب های SQL ای که خواندم مورد زیر بنظر جالب تر می آمد.
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])
خيلي ممنون حتما تهيه اش مي كنم. :11:
اي كاش نسخه Pdf هم داشت.
سلام
میبخشید کمی مشغله داشتم و از بحث خارج شدیم ...
كد حضور كليد جدول حضور است. خب شايد كارمندي تازه اومده باشه و هنوز به هر دليلي كد نداشته باشه .
يه جوري اين مشكل رو حل كردم و فقط روي غيبت بيش از دو روز موندم.
جدول ها و موجودیت های شما باید کلید یکتا داشته باشند.
ضمن اینکه در شرکت هم منطقی نیست کارمندی کار کند ولی کدکارمندی نداشته باشد.
یکی از بهترین روش های طراحی دیتابیس میتوانید چنین باشد که همه جداول و موجودیت های شما یک کلید PrimaryKey از جنس Autonumber داشته باشند و خود SQL Server خودکار عددی یکتای غیر تکراری تخصیص دهد.
و شما هم از همین برای primarykey ها و foreign key ها و delete و update و select و... و... استفاده کنید.
یعنی در تمام رگ های برنامه تان این کلیدهای یکتای غیر قابل تغییر autonumber جریان داشته باشند ولی هیچ کجا ان ها را به کاربرتان نشان ندهید!!!
اگر کاربر به کدکارمندی، کدملی، شماره نامه، کدفاکتور و.... نیاز دارد، مثل سایر فیلدهای یک فیلد هم برای این کار اضافه کنید! ولی برنامه تان بر این اساس کار نکند.
اینطوری اگر کدی را کاربر اشتباه زد و بعداً خواست تغییر دهد یا مثلاً فعلاً شماره کد ملی کسی را نداشت، مشکلی برای برنامه شما ایجاد نمیشود و برنامه شما به دقت و صحت کار خود را انجام میدهد.
در واقع شما از primarykey های قوی و readonly خودتان استفاده میکنید و به کاربر هم فیلدهایی که میخواهد را میدهید!
موفق باشید.
shadmehrshadow1
19-08-2012, 15:44
مرسی. خیلی ممنون
اگه بخواهیم ببینیم که آیا یک کارمند در یک ماه خاص مثلا 1391/05 چند روز ش رو حضوری در جدول حضور ثبت نکرده چه باید کرد.
سلام
همانطور که گفتم این مورد میتواند حالت های مختلف داشته باشد ...
==============
روش اول:
بهترین حالت آن است که جدول ویژه ای برای کارکرد ماهیانه افراد (طبیعتاً با یک کلید یکتا) داشته باشید.
یعنی یک سطر برای هر فرد در ماه.
این جدول یتواند ضمن بایگانی اطلاعات کامل فیش حقوقی فرد در آن ماه، معیار مشخصی برای جدول یک به چند دیگری باشد که به حضور و مرخصی و غیبت اشاره میکند.
همانطورکه اشاره شد جدول دیگری میتواند شامل رابطه یک به چند فوق باشد که موارد رخ داده به راحتی قابل ردگیری در ماه مربوطه هستند.
و...
==============
روش دوم:
فقط از یک جدول برای ثبت این وقایع استفاده کنید و فیلد تاریخ تان از نوع استاندارد datetime باشد.
طبیعتاً در این حالت نیاز به تبدیل تاریخ درون خود SQLServer دارید.
با اجرای فایل sql زیر درون دیتابیس تان، توابع کامل هجری شمسی به SQLServer افزوده خواهد شد.
Pr_AddMonths
Pr_GetDayOfYear
Pr_GetDayOfMonth
Pr_GetMonth
Pr_GetYear
Pr_GetDaysInMonth
Pr_IsLeapYear
Pr_IsValid
Pr_ToDateTime
و...
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
(احتمالاً لینک در آینده ویرایش خواهد شد)
مراحل نصب تاریخ شمسی در دیتابیس SQLServer:
1) اجرای GHDiamond.Sql.CLREnabled.sql
2) ریست سرویس SQLServer یا ریست رایانه
3) اجرای GHDiamond.Sql.Install.sql
البته بسته فوق شامل یک دیتابیس نمونه خالی هم است که فقط نیازی به اجرای مرحله (3) در فهرست فوق ندارد.
سپس میتوانید با تابع Pr_GetYear سال شمسی و با تابع Pr_GetMonth ماه شمسی را از datetime درون خود SQLServer استخراج کنید.
مثلاً دستور زیر میتواند تعداد سطرهای وابسته به هر فرد در هر ماه شمسی را باز گرداند.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و...
==============
روش سوم:
فقط از یک جدول برای ثبت این وقایع استفاده کنید و از نوعی فیلد تاریخ شمسی استفاده کنید.
مثلاً ذخیره سال و ماه در دو فیلد عددی مستقل...
یا بهتر از آن ذخیره تعداد ماه های گذشته از اول هجرت ...
(Y*12+M-1 عدد 16697 برای شهریور 1391 و...)
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و...
احتمالاْ بدترین حالت هم آن است که تاریخ را بصورت string شمسی ذخیره کنید. مثلاْ "1391/06/01"
اینطور هم باز میتوانید با دستور زیر مشکلتان را حل کنید.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و...
==============
البته کدهای فوق را میتوان برای بازدهی بیشتر بهینه تر نوشت.
همانطورکه قبلا گفتم پاسخ این مسئله وابستگی به ذات نحوه ذخیره سازی تاریخ شما و مواجه با آن دارد.
روش تان را انتخاب کنید، باز اگر مشکلی بود بفرمائید.
موفق باشید.
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.