PDA

View Full Version : سوال: جستجو درون DataReader و فیلتر کردن



rayson
سه شنبه 22 مرداد 1392, 19:22 عصر
با سلام.
من اطلاعات خاصی را از جدول میگیرم و درون DA میریزم.دستور سلکت من به صورت زیر که میاد اطلاعات گروه را برا اساس آی دی جسجو کرده و درون DA میریزه .
Select id_sal,id_group_employ,id_madrak_tahsili from employ where id_group_employ=@id_group_employ;
حال من دوباره میخوام بر اساس id_madrak_tahsili درون da جستجو کرده و اطلاعت خاصی را که میخواهم بکشم بیرون . حال اگر اطلاعاتی وجود دارد بیاد ثبت کند.
من فقط میخوام بدونم چطوری باید درون da جستجو کرد .
ممنون میشم راهنمایی کنید.
با تشکر.

veniz2008
سه شنبه 22 مرداد 1392, 20:53 عصر
سلام.
این موارد بسیار تکراری هست و. میتونستی یه سرچ بزنی تا کلی تاپیک واست بیاد.
نتیجه سلکت رو میتونی بریزی توی یه دیتاتیبل و در محیط سی شارپ میتونی اون دیتاتیبل رو دوباره فیلتر کنی :


dt.DefaultView.RowFilter = "id_madrak_tahsili = " + TxtID.Text;

Mahmoud.Afrad
سه شنبه 22 مرداد 1392, 21:54 عصر
فیلتر کردن دیتاریدر راه درستی نیست. میتونی کوئری رو به صورت داینامیک بسازی و در آخر اجراش کنی. توی تاپیک دیگرت مثال زدم. (http://barnamenevis.org/showthread.php?412577-%D8%AB%D8%A8%D8%AA-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-%DA%A9%D9%84%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%DA%AF%D8%B1%D9%88%D9%87-%D8%AE%D8%A7%D8%B5%DB%8C-%D8%A7%D8%B2-%D8%A7%D9%81%D8%B1%D8%A7%D8%AF-%D8%AD%D8%B0%D9%81-%D8%AF%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%AC%D8%AF%D9%88%D9%84-%D8%A8%D8%AF%D9%88%D9%86-%DA%A9%D9%84%DB%8C%D8%AF)ثبت اطلاعات به صورت کلی برای گروه خاصی از افراد + حذف داده از جدول بدون کلید (http://barnamenevis.org/showthread.php?412577-%D8%AB%D8%A8%D8%AA-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-%DA%A9%D9%84%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%DA%AF%D8%B1%D9%88%D9%87-%D8%AE%D8%A7%D8%B5%DB%8C-%D8%A7%D8%B2-%D8%A7%D9%81%D8%B1%D8%A7%D8%AF-%D8%AD%D8%B0%D9%81-%D8%AF%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%AC%D8%AF%D9%88%D9%84-%D8%A8%D8%AF%D9%88%D9%86-%DA%A9%D9%84%DB%8C%D8%AF&p=1848471&viewfull=1#post1848471)

rayson
سه شنبه 22 مرداد 1392, 23:45 عصر
من روشی میخوام که به صورت دودویی جستجو کند این روش به صورت دودویی است ؟
حالا من اگر این روش به کار ببرم چطوری خالی یا پر بودن آن را شناسایی کنم ؟
این روش ؟
dt.rows.count==0
کار نمیده !

Mahmoud.Afrad
چهارشنبه 23 مرداد 1392, 00:03 صبح
منظورت از دودویی دقیقا چیه؟
خالی و پر بودن نیازی نیست. همونطور که توی اون یکی تاپیکت گفتم برای اینزرت ، وقتی اطلاعات قراره از جدول دیگه ای بیاد ، میشه سلکت رو درون اینزرت قرار داد.

شما اون تکه کدی که قراره سلکت کنه و بعد اینزرت کنه رو بزار و بگو دقیقا چه چیزهایی قراره اینزرت بشن.

rayson
چهارشنبه 23 مرداد 1392, 00:30 صبح
منظورت از دودویی دقیقا چیه؟
منظورم روش دودویی برای جستجو کردن در درون جدول .
کد من به صورت زیر است .
dt = new DataTable();
if (first_click == 1) {
SqlDataAdapter da = new SqlDataAdapter("select id_group_employ,id_madrak_tahsili,code_ozviat from employ ",con);
da.Fill(dt);
dt.DefaultView.RowFilter = "id_group_employ=" + mojaz_cmb_group.SelectedValue;
dt.DefaultView.RowFilter = "id_madrak_tahsili=" + mojaz_cmb_madrak_tahsili.SelectedValue;

if (// اگر داده ای وجود داشت)
{
con_temp.Open();
while(/*تا زمانی که مقدار هست*/){

myCodeOzviat = dt["code_ozviat"].ToString();// !!!
myidGroup = Convert.ToInt32(dt["id_group_employ"]);// !!!
myidMadrak = Convert.ToInt32(dt["id_madrak_tahsili"]); //!!!
SqlCommand cmdInsert = new SqlCommand{CommandText = "insert into mojaz(sonati,felezi,sakhteshode,code_ozviat,id_sal ,id_group_employ,id_madrak_tahsili) VALUES (@sonati,@felezi,@sakhteshode,@code_ozviat,@id_sal ,@id_group_employ,@id_madrak_tahsili)"};
cmdInsert.Parameters.AddWithValue("@sonati", mojaz_txt_sonati.Text);
cmdInsert.Parameters.AddWithValue("@felezi", mojaz_txt_felezi.Text);
cmdInsert.Parameters.AddWithValue("@sakhteshode", mojaz_txt_sakhte_shode.Text);
cmdInsert.Parameters.AddWithValue("@code_ozviat",myCodeOzviat);
cmdInsert.Parameters.AddWithValue("@id_sal", mojaz_cmb_sal.SelectedValue);
cmdInsert.Parameters.AddWithValue("@id_group_employ", myidGroup);
cmdInsert.Parameters.AddWithValue("@id_madrak_tahsili", myidMadrak);

cmdInsert.Connection = con_temp;

cmdInsert.ExecuteNonQuery();

}
MessageBox.Show(" اطلاعات با موفقیت ثبت شد ", "");
con.Close();
con_temp.Close();

}
else {
MessageBox.Show(" چنین مقادیری وجود ندارد ", "");

}

}

قسمت if نمیدانم چه شرطی برای چک کردن خالی یا پر بودن بگذارم.
و در قسمت ریختن اطلاعات درون 3 متغییر myCodeOzviat , idGroup,idMadrak مشکل دارم.
همچنین بخش شرط وایل که تا زمانی که خالی نشده جدول ( به انتها نرسیده ) حلقه ادامه داشته باشد.
با تشکر.

veniz2008
چهارشنبه 23 مرداد 1392, 01:35 صبح
منظورم روش دودویی برای جستجو کردن در درون جدول .

خود sql از روش B+_Tree برای ذخیره سازی و جستجو کردن استفاده میکنه بنابراین نگران سرعت نباش.
http://fa.wikipedia.org/wiki/%D8%AF%D8%B1%D8%AE%D8%AA_%D8%A8%DB%8C%E2%80%8C%D9% BE%D9%84%D8%A7%D8%B3
میتونی به یکباره دیتاتیبل رو فیلتر کنی و نیازی نیست چندین بار این کار رو انجام بدی :

dt.DefaultView.RowFilter = "id_group_employ=" + Convert.ToInt32(mojaz_cmb_group.SelectedValue) + " AND id_madrak_tahsili=" + Convert.ToInt32(mojaz_cmb_madrak_tahsili.SelectedV alue);


قسمت if نمیدانم چه شرطی برای چک کردن خالی یا پر بودن بگذارم.
if(dt.DefaultView.Count == 0)
{
// هیچ رکوردی با شرط وارد شده پیدا نشد
}

در قسمت ریختن اطلاعات درون 3 متغییر myCodeOzviat , idGroup,idMadrak مشکل دارم.بعد از فیلتر کرد، با متد ToTable سطرهای برگشتی رو مجددا به جدول تبدیل کن و داخل دیتاتیبل (یا یک دیتاتیبل جدید) بریز :


dt = dt.DefaultView.ToTable();
MessageBox.Show(dt.Rows[0][1].ToString());

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

for(inti =0 ; i < dt.DefaultView.Count; i++)
{
myCodeOzviat = dt.Rows[i]["code_ozviat"].ToString();
myidGroup = Convert.ToInt32(dt.Rows[i]["id_group_employ"].ToString());
myidMadrak = Convert.ToInt32(dt.Rows[i]["id_madrak_tahsili"].ToString());
SqlCommand cmdInsert = new SqlCommand{CommandText = "insert into mojaz(sonati,felezi,sakhteshode,code_ozviat,id_sal ,id_group_employ,id_madrak_tahsili) VALUES (@sonati,@felezi,@sakhteshode,@code_ozviat,@id_sal ,@id_group_employ,@id_madrak_tahsili)"};
cmdInsert.Parameters.AddWithValue("@sonati", mojaz_txt_sonati.Text);
cmdInsert.Parameters.AddWithValue("@felezi", mojaz_txt_felezi.Text);
cmdInsert.Parameters.AddWithValue("@sakhteshode", mojaz_txt_sakhte_shode.Text);
cmdInsert.Parameters.AddWithValue("@code_ozviat",m yCodeOzviat);
cmdInsert.Parameters.AddWithValue("@id_sal", mojaz_cmb_sal.SelectedValue);
cmdInsert.Parameters.AddWithValue("@id_group_emplo y", myidGroup);
cmdInsert.Parameters.AddWithValue("@id_madrak_tahs ili", myidMadrak);

cmdInsert.Connection = con_temp;

cmdInsert.ExecuteNonQuery();
}
موفق باشید.

Mahmoud.Afrad
چهارشنبه 23 مرداد 1392, 01:49 صبح
این کجاش دودویی هست؟!!!

اگر منظورت اینه براساس چند شرط جستجو کنه خب شرط ها رو and کن.
درضمن اصلا در اینجا نیازی به فیلتر کردن dt نداری میتونی شرط ها رو در قسمت where کوئری بنویسی. یعنی اصلا نیازی به dt نداری چه برسه به اینکه بخواهی فیلترش کنی.

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



if (first_click == 1)
{
SqlCommand cmdInsert = new SqlCommand
{
CommandText =
"insert into mojaz(sonati,felezi,sakhteshode,id_sal,code_ozviat ,id_group_employ,id_madrak_tahsili) " +
"select (@sonati,@felezi,@sakhteshode,@id_sal, code_ozviat, id_group_employ, id_madrak_tahsili)" +
"from employ " +
"where id_group_employ=@id_group_employ and id_madrak_tahsili=@id_madrak_tahsili",
Connection = con_temp
};
cmdInsert.Parameters.AddWithValue("@sonati", mojaz_txt_sonati.Text);
cmdInsert.Parameters.AddWithValue("@felezi", mojaz_txt_felezi.Text);
cmdInsert.Parameters.AddWithValue("@sakhteshode", mojaz_txt_sakhte_shode.Text);
cmdInsert.Parameters.AddWithValue("@id_sal", mojaz_cmb_sal.SelectedValue);
cmdInsert.Parameters.AddWithValue("@code_ozviat", myCodeOzviat);
cmdInsert.Parameters.AddWithValue("@id_group_emplo y", myidGroup);
cmdInsert.Parameters.AddWithValue("@id_madrak_tahsili", myidMadrak);

con_temp.Open();
int count = cmdInsert.ExecuteNonQuery();
con_temp.Close();

if (count > 0)
{
MessageBox.Show(" اطلاعات با موفقیت ثبت شد ");
}
else
{
MessageBox.Show(" چنین مقادیری وجود ندارد ");
}
}




*آپدیت:
حالا که نگاه انداختم متوجه شدم این جدول mojaz یا اضافه است یا اینکه اگر هم به وجودش نیاز باشه اصلا درست طراحی نشده. یعنی مطمئنم طراحی دیتابیست مشکل داره که این همه افزونگی داده داری و ستون های مشترک(که کلید خارجی نیستند) توی جدولهات تکرار شدن.

rayson
چهارشنبه 23 مرداد 1392, 02:32 صبح
سلام .


و نمیدونم برای چی داری اطلاعات یک جدول رو در یک جدول دیگه میریزی. اصلا چرا این کارو میکنی؟ فکر کنم طراحی دیتابیست نرمال نیست. اگر میتونی جداولتو تشریح کن. اگر بتونی یک دیاگرام از دیتابیس بزاری بهتره.من اطلاعات را از یک جدول به جدول دیگر نمیریزم( اقای ونیز روش جابه جای جدول را پیشنهاد کردند) ، من 2 عدد کمبو دارم که میخوام اطلاعات من بر اساس این 2 کمبو باکس فیلتر شودند و اطلاعات باقی مانده به شکل بالا ثبت شوند.
دیاگرام :
جدول مجاز کامل نیفتاده :id_madrak_tahsili هم توش هست.

109037



محمودجان کد شما اطلاعات چند کاربر هم ثبت میکند ؟


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

veniz2008
چهارشنبه 23 مرداد 1392, 02:55 صبح
من اطلاعات را از یک جدول به جدول دیگر نمیریزم( اقای ونیز روش جابه جای جدول را پیشنهاد کردند)
من دقیقا چه کاری رو پیشنهاد دادم؟؟
کدوم پست؟ لطفا لینک بده تا ببینم چه پیشنهادی دادم. چون یادم نمیاد درباره طراحی چیزی رو پیشنهاد داده باشم!

rayson
چهارشنبه 23 مرداد 1392, 03:03 صبح
من دقیقا چه کاری رو پیشنهاد دادم؟؟
کدوم پست؟ لطفا لینک بده تا ببینم چه پیشنهادی دادم. چون یادم نمیاد درباره طراحی چیزی رو پیشنهاد داده باشم! عزیزم چرا ناراحت میشید تو کدنویسی منظورم بود در پست بالا که گفتید بعد از فیلتر درون تیبل جدید بریزید اطلاعات رو.
البته من منظور اقای محمود را درست متوجه نشدم
ایشون گفتند
در ضمن این روشی که با حلقه اطلاعات یه جدولو بگیری بعد دوباره توی جدول دیگه درج کنیمن گمان کردم جابه جایی dtرا بیان کردند و از این باره ببخشید. اشتباه متوجه شدم.
ونیز کدی که گفتید من پیاده کردم بسیار ممنون فقط سرعت برنامه بسیار پایین آمد:((

Mahmoud.Afrad
چهارشنبه 23 مرداد 1392, 03:14 صبح
بله اون کدی که من گذاشتم معادل بهینه کد خودت هست. امتحان میکردی متوجه میشدی.


این کار رو قبل از شروع پروژه باید میکردی تا دیتابیست کارش تموم بشه بعد بری سراغ کدنویسی.

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


ونیز کدی که گفتید من پیاده کردم بسیار ممنون فقط سرعت برنامه بسیار پایین آمد:((
کد کی سرعتش کمه؟

rayson
چهارشنبه 23 مرداد 1392, 03:17 صبح
این کار رو قبل از شروع پروژه باید میکردی تا دیتابیست کارش تموم بشه بعد بری سراغ کدنویسی.به پایان رسیده بود ولی وقتی برنامه به جلو رفت کمبود احساس شد.

بله اون کدی که من گذاشتم معادل بهینه کد خودت هست. امتحان میکردی متوجه میشدی.
کد شما قسمت ریختن اطلاعات درون سه متغیر idGroup,mycodeOzviat,idMadrak را ندارد .

Mojaz : هر ساله یک سری مقادیر برای کارمندان ثبت میشود که متراژ کارکردی است که برای هر کارمند در نظر گرفته میشود ( مثلا کارمند x میتواند در سال 91 ، 300 متر ساخته شده داشته باشد.
karkard : فعالیتهای هر کارمند در سال جاری را ثبت میکند ( مثلا کارمند x در یک سال ممکنه 10 تا کار 30 متری گیرش بیاد در طول یک سال ).
سنتی و ... : اصطلاحات معماری ، عمران ، برق در زمینه مکان هاس ( مثلا یک ساختمان که از نوع سنتی هست کار برق کشی داره و یک کارمند بر اساس متراژ آنجا را کابل کشی میکند)( کارمند طراح داریم ، ناظر داریم و ..)
جدول مدرک بله مدرک تحصیلی کارمند را مشخص میکند و همچنین کارکرد مجاز بر اساس گروه ( طراحی و نظارت و ...) و مدرک ( معماری و ....) هست و یا کد عضویت کارمند داده میشود.
جدول Employ: این جدول اطلاعات شخصی یک کارمند + کدعضویت مشخص میکند.
جدول سال : ما بدلیل وجود سال های مختلف کاری باید یک بار اطلاعات کارمند را وارد کنیم و چندین بار از آن استفاده کنیم.

کد کی سرعتش کمه؟ کدی که دوستمون اقای ونیز دادند.به شدت سرعت پایین آورد.
با تشکر.

veniz2008
چهارشنبه 23 مرداد 1392, 03:18 صبح
عزیزم چرا ناراحت میشید تو کدنویسی منظورم بود در پست بالا که گفتید بعد از فیلتر درون تیبل جدید بریزید اطلاعات رو.
ناراحتی چرا؟
پست قبلیم فقط سوالی بود. برداشت من این بود که شما میگید من روی طراحی جداول نظر دادم. من چون از پروژه شما بی خبرم بنابراین نمیتونم روی جداول شما نظری بدم و تعجب من به این خاطر بود.
من اتفاقا تاکید کردم داخل یک "دیتاتیبل" بریز نه داخل یک "تیبل" تا اشتباه برداشت نشه که ظاهرا شما اشتباه برداشت کردی. بخاطر این گفتم داخل یک دیتاتیبل دیگه بریز چون ممکنه اطلاعات قبل از فیلتر شدن رو نیاز داشته باشی.
من نمیدونم واقعا آیا نیاز شما به فیلتر در سمت سی شارپ هست یا با همون فیلتر در سمت sql به نتیجه مطلوب میرسی. جواب من به این خاطر بود که احساس کردم نیاز شما فیلتر در سمت سی شارپ هست.
بهرحال اگر طراحی جداولتون اشتباه هست حتما اونها رو بهینه کنید و بعد اقدام به کدنویسی کنید.
امیدوارم موفق باشید.

rayson
چهارشنبه 23 مرداد 1392, 03:34 صبح
من اتفاقا تاکید کردم داخل یک "دیتاتیبل" بریز نه داخل یک "تیبل" تا اشتباه برداشت نشه که ظاهرا شما اشتباه برداشت کردی. بخاطر این گفتم داخل یک دیتاتیبل دیگه بریز چون ممکنه اطلاعات قبل از فیلتر شدن رو نیاز داشته باشی. اول از همه باز هم ببخشید.
دوم اینکه همین که شما و آقا محمود در این وقت شب به من کمک میکنید باید دستتون را به گرمی بفشارم و تشکر کنم چون دارید وقت برای من میگذارید.

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


بهرحال اگر طراحی جداولتون اشتباه هست حتما اونها رو بهینه کنید و بعد اقدام به کدنویسی کنید.دیاگرام و توضیحات در پست بالا گذاشتم به نظر شما مشکلی وجود دارد ؟ ممنون میشم شما هم در این باره من را راهمایی کنید.
با تشکر.

Mahmoud.Afrad
چهارشنبه 23 مرداد 1392, 03:39 صبح
کد شما قسمت ریختن اطلاعات درون سه متغیر idGroup,mycodeOzviat,idMadrak را ندارد .نه دیتاتیبلی و نه دیتاریدری در کار نیستا! اینها مگر از جدول employ نمیاد؟ خب وقتی اینزرت و سلکت رو ترکیب کردم توسط سلکت بدست میاد و همونجا ثبت میشه. یعنی همه کار تو کوئری انجام میشه. به سلکت درون اینزرت توجه کن ، آیدی مدرک ، آیدی گروه و کد عضویت از جدول employ سلکت میشه و بقیه به صورت پارامتری(@) از طرف برنامه به sql ارسال میشن.


جدول سال : ما بدلیل وجود سال های مختلف کاری باید یک بار اطلاعات کارمند را وارد کنیم و چندین بار از آن استفاده کنیم.این تنها دلیل ایجاد جدول سال هست؟ این جدول همین ستونها رو داره یا بیشتر میشه؟


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

جدول group_employ گروه ها رو داره. اینکه هر کارمند در چه گروه هایی هست کجا مشخص میشه؟

یه سری ستون در جدول employ هستند بعد از تاریخ عضویت. اونها چی هستند؟


اگر میتونی اسکریپت جداولتو بزار.

rayson
چهارشنبه 23 مرداد 1392, 04:04 صبح
این تنها دلیل ایجاد جدول سال هست؟ این جدول همین ستونها رو داره یا بیشتر میشه؟
در حال حاضر بله .


پس با این حساب جدول مدرک تحصیلی فقط باید با جدول employ داشته باشه. و آیدی مدرک تحصیلی در جدول mojaz اضافه است.
بله اول هم جدول مدرک و گروه وجود نداشت ، بعد خواستم این قابلیت را برنامه داشته باشد که گروه و مدرک را خود کاربر نام گذاری کند اول بعد به هر کارمندنسبت بدهد.

جدول group_employ گروه ها رو داره. اینکه هر کارمند در چه گروه هایی هست کجا مشخص میشه؟
گروه نظارت و طراحی و ... در این جدول هستند و در جدول employ مشخص میشود که کارمند در چه گروه ای است.
کل سنتی و کل ساخنه شده و کل فلزی : این 3 خانه ( جمع تمام کارکرد یک کارمند در چندین سال نمایش میدهد )( مثلا یک کارمند 5 سال کار میکنه و در هر سال 10 تا 15 تا کار انجام میده با متراژ متفاوت که همه اینها در این خانه جمع میشوند).
مانده سنتی ، فلزی ، ساخته شده ( هرچی مجاز در این خانه ریخته میشود و کارکرد هر سال - مجاز میشود و مانده فعالیت هر کارمند باقی می ماند که سال قبل با سال جدید هم جمع میشو) ( مثلا یک کارمند سال 1 ، 300 تا مجاز مگیرد و در هما ن سال 1 400 متر کار انجام میدهد (باقی مانده سال 1 =100- است ) در سال 2 مجاز 500 وارد میشود و با مقدار مانده جمع میشود(400 میشود) که ممکنه منفی یا مثبت + اعشاری باشد )

rayson
چهارشنبه 23 مرداد 1392, 04:25 صبح
برنامه خطا : Incorrect syntax near ','. میده که کلی گشتم تو برنامه ولی , اضافی ندیدم.

این سه مقدار وارد نمیشه در هیچ کجای کد شما :
cmdInsert.Parameters.AddWithValue("@code_ozviat", myCodeOzviat);
cmdInsert.Parameters.AddWithValue("@id_group_employ", myidGroup);
cmdInsert.Parameters.AddWithValue("@id_madrak_tahsili", myidMadrak);
متغیر موجود خالی هستند.
کد شما وقتی جستجو کرد اگر 10 تا کاربر با مشخصات داده شده یکی بودند چطوری حلقه ایجاد میکند ؟

Mahmoud.Afrad
چهارشنبه 23 مرداد 1392, 04:32 صبح
با توجه به این توضیحات جدول سال اضافه است. در هر جدولی نیاز به سال داشتی کاربر باید سال رو مستقیما وارد کنه. توسط تکست باکس یا ماسک تکست باکس.

جدول مدرک فقط باید با جدول employ رابطه داشته باشه.

در جدول مجاز به جای آیدی سال خود سال رو بزار. آیدی مدرک تحصیلی هم از جدول مجاز باید حذف بشه.

اگر یک کارمند در چند گروه باشه چی؟ در اینصورت به یک جدول واسطه نیاز هست تا مشخص کنه هر کارمند در چه گروه هایی هست. با این حساب آیدی گروه از جدول employ حذف میشه. آیدی کارمند به همراه آیدی گروه در این جدول واسطه درج میشه.

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

rayson
چهارشنبه 23 مرداد 1392, 04:38 صبح
میشه دیتا بیس که گفتید دیاگرامش به من بدید ؟
منظورم اینه طرحش رسم کنید در نرم افزاری مثل paint .
من در بخش دیتا بیس سایت سوال کردم ولی باز هم نتونستم به دیتا بیس مورد نظر برسم ( مخصوصا بخش اگر کارمند در بیش از یک گروه باشد) .
ممنون میشم این بخش هم راهنمایی کنید که من دیتا بیس را ویرایش کنم.
فقط چون بخش سال من روشی بهتر در بارش ندارم تغیر ایجاد نکنید و همچنین جدول گروه و مدرک هم طوری باشد که کاربر خودش نام گروه و مدرک اضافه کند .
با تشکر.

Mahmoud.Afrad
چهارشنبه 23 مرداد 1392, 05:02 صبح
یا از جداولت اسکریپت بگیر بزار و یا دو فایل دیتابیس رو آپلود کن آدرسشو بزار.

rayson
چهارشنبه 23 مرداد 1392, 14:18 عصر
تنها چیزی که من میخوام بذونم این است که ، چطوری باید به کارمند دو گروه نسبت داد .
اگر گروه را برای کارمند چند بار بشه نسبت داد پس داده های کل و مانده از جدول employ حذف میشود.

متن بالا که خودم قرار دام را حذف کردم و QUOTE کردم سوالم را :
آبا این جدول مناسب این کار است ؟(عکس)
یک توضیح هم بدم که چه اتفاقی قرار بیفته:
1- کاربر گروه ها را وارد میکند که در جدول Group ذخیره میشود.
2-کارمند علاوه بر مشخصات فردی ، گروه یا گروه های کارمند را مشخص میکند ( گروه ها از جدول Group خوانده و در لیستی برای انتخاب کردن آنها نمایش داده میشود)
3- هنگام انتخاب کردن گروه و ثبت هر چندتا گروه وجود داشته باشد در جدول Group_karmandan + کد عضویت ثبت میشود.
4- در جدول مجاز هم حالت مختلف ثبت داده وجود دارد که گروه اتخاب شود یا کد عضویت وارد شود .
ممنون میشم یکی من را راهنمایی کند لطفااااااااااااااااااا :((

109063

http://barnamenevis.org/images/misc/pencil.png

Mahmoud.Afrad
چهارشنبه 23 مرداد 1392, 16:35 عصر
متن بالا که خودم قرار دام را حذف کردم و QUOTE کردم سوالم را :
آبا این جدول مناسب این کار است ؟(عکس)
یک توضیح هم بدم که چه اتفاقی قرار بیفته:
1- کاربر گروه ها را وارد میکند که در جدول Group ذخیره میشود.
2-کارمند علاوه بر مشخصات فردی ، گروه یا گروه های کارمند را مشخص میکند ( گروه ها از جدول Group خوانده و در لیستی برای انتخاب کردن آنها نمایش داده میشود)
3- هنگام انتخاب کردن گروه و ثبت هر چندتا گروه وجود داشته باشد در جدول Group_karmandan + کد عضویت ثبت میشود.
4- در جدول مجاز هم حالت مختلف ثبت داده وجود دارد که گروه اتخاب شود یا کد عضویت وارد شود .
ممنون میشم یکی من را راهنمایی کند لطفااااااااااااااااااا :((

109063

http://barnamenevis.org/images/misc/pencil.png
جدول واسطه درسته ولی چرا جدول گروه رو به جدول مجاز ارتباط دادی؟

rayson
چهارشنبه 23 مرداد 1392, 16:52 عصر
جدول واسطه درسته ولی چرا جدول گروه رو به جدول مجاز ارتباط دادی؟
میخوام قابلیت جستجو در جدول مجاز را بر اساس گروه هم ایجاد کنم.
جدول مجاز بر اساس سال ، گروه ، مدرک تحصیلی و کد عضویت باید قابل جستجو باشد.
با تشکر.

Mahmoud.Afrad
چهارشنبه 23 مرداد 1392, 17:11 عصر
میخوام قابلیت جستجو در جدول مجاز را بر اساس گروه هم ایجاد کنم.
جدول مجاز بر اساس سال ، گروه ، مدرک تحصیلی و کد عضویت باید قابل جستجو باشد.
با تشکر.
نیازی نیست توی جدول مجاز هم بیاری. برای این نوع جستجوها میتونی با join اطلاعات چند جدول رو بیرون بکشی.

من باشم اینطوری طراحی میکنم.
http://upload7.ir/images/54383648144189376268.png

جدول مجاز و جدول کارکرد چون ستونهای مشترک دارند رو میشه یکی کرد. یک ستون به اسم type اضافه میکنی تا بتونی نوع مجاز رو از کارکرد تفکیک کنی.

rayson
چهارشنبه 23 مرداد 1392, 18:12 عصر
سلام محمود جان .
جدول mojaz_karkard : کاکرد در هر سال بالای 1000 داده درونش ثبت میشود. و اگر با مجاز یکی شود این کار باعث فشار آمدن به آن نمیشود ؟
همچنین جدول کارکرد کل و مانده قرار ندادید.
بگم که اطلاعات کارمندان( مانده ، مجاز ، کارکرد کل ) به سایت قرار ارسال شود و در یک صفحه سایت نمایش داده میشوند . اینکار نیاز به وجود اطلاعات درون دیتا بیس میکند( کارکرد کل و مانده ) .
باقی جداول بسیار خوب و ممنون .
با تشکر.

Mahmoud.Afrad
چهارشنبه 23 مرداد 1392, 18:23 عصر
نه مشکلی نداره. اگر دوست داری جدا باشند جداشون کن و ستون type رو حذف کن.

گفتم که ، کارکرد کل و مانده برای کارمندان رو میشه با سلکت بدست آورد. پس نیازی نیست جدول جدا یا ستون جدا داشته باشه. کلا فیلدهایی که قراره از ستونهای دیگه بدست نیاز به ذخیره ندارند و هر وقت نیاز بود محاسبه خواهند شد. میتونی کوئری ها رو به صورت StoredProcedure در بیاری تا اگر سایت هم خواست از این دیتابیس استفده کنه راحت باشی و کوئری ها رو دوباره نویسی نکنی.

در مورد نمایش در سایت ، نمیدونم چه روندی رو پیش گرفتی. ولی میتونی توی سایت کانکشن رو طوری تنظیم کنی که بیاد از دیتابیس شما استفاده کنه.
یا اینکه هر بار که جدول مجاز-کارکرد تغییر کرد اونوقت اطلاعات مورد نیاز محاسبه و به سایت ارسال بشه.

rayson
چهارشنبه 23 مرداد 1392, 18:33 عصر
با تشکر از شما . بله حق با شماست کوئری برای حسابرسی کل و مانده بهتر است.
من دیتا بیس را به شکل دیتا بیس شما تغییر میدم و کل برنامه را ویرایش میکنم فقط من همانطور که در بالا گفتم مشکل با خواندن چند گروه دارم که یک روش به نظر من رسید و تاپیک
http://barnamenevis.org /showthread.php?414026 (http://barnamenevis.org/showthread.php?414026)
ایجاد کردم یک سر بزنید ببینید روش گرفتن گروه مناسب است ؟( اگر نظری داشتید در همانجا بگید )
در کل ممنون .
با تشکر.

rayson
پنج شنبه 24 مرداد 1392, 20:36 عصر
سلام ، شما فیلد گروه و مدرک تحصیلی را از جدول مجاز_کارکرد حذف کردید.
حال برای جسجو درون این جدول بر اساس مدرک و یا گروه به چه صورت باید جستج کرد ؟
شما گفتید با دستور join اینکار میشه انجام داد ؟>
اگر میشه یک مثال بزنید. و توضیح بیشتر بدید.
با تشکر .

Mahmoud.Afrad
پنج شنبه 24 مرداد 1392, 22:26 عصر
مثال زدن فایده نداره. شما یک مروری روی دستور join داشته باشید همه چی دستتون میاد.

مثلا میخواهید کارمندانی که کد مدرک تحصیلی 1 دارند و در مجاز-کارکرد ثبت شدند را بدست بیارید

select employee.name,
employee.family,
mojaz_karkard.*
from madrak_tahsili
inner join employee
on madrak_tahsili.id_madrak_tahsili = employee.id_madrak_tahsili
inner join mojaz_karkard
on employee.code_ozviat = mojaz_karkard.code_ozviat
where madrak_tahsili.id_madrak_tahsili = 1

rayson
پنج شنبه 24 مرداد 1392, 22:58 عصر
من میخوام بر اساس گروه جستجو کنم برام مهم نیست که مال کدام کارمند است ( اسم .و فامیل و ... ) من در واقع فقط میخوام وقتی گفتم گروه مثلا طراحی بیاد مقادیر مجاز(سنتی ، فلزی ، ساخته شده + کد عضویت + سال) گروه طراحی را برام نشون بده .
همچنین برای ثبت هم به همین صورت است.
سمت دیتا بیس سرعت بیشتری دارد و یا سمت برنامه ؟
من تو برنامه بگم اگر مثلا گروه طراحی انتخاب شد بره تو جدول group_in_employ کد عضویت هایی که چنین گروه ای دارند را کد عضویت آنها را برگردونه من از این روش استفاده کنم مناسب است ؟

Mahmoud.Afrad
پنج شنبه 24 مرداد 1392, 23:22 عصر
اذیت نکن دیگه! یه نگاه بنداز ببین کد چه کار میکنه بعد خودت تغییرش بده.

با فرض اینکه کد گروه رو داشته باشی میتونی به جای 1 بزاری توی کوئری زیر:

select mojaz_karkard.*
from mojaz_karkard
inner join employee
on mojaz_karkard.code_ozviat = employee.code_ozviat
inner join employee_in_group
on employee_in_group.code_ozviat = employee.code_ozviat
where employee_in_group.id_group = 1

rayson
پنج شنبه 24 مرداد 1392, 23:40 عصر
به خداقصد اذیت ندارم.
خوب من با این روش کار نکردم برای همین سوالاتی که میپرسم یکم عجیب است( روش کد نویسی در طرف اس کیو ال میگم ) .
اوکی من اگر کد گروه را ندانم یعنی معلوم نباشه که هر گروه چه آی دی داره چطوری میتونم بفهمم چه کدی باید جای 1 بگذارم ؟
من این کد در بخش QUERy باید بنویسم(نوشتم چطوری باید فراخوانیش کنم در برنامه ؟) ؟ یا یک Stored ایجاد کن ؟
و همچنین * در اولین خط چه کاری انجام میدهد ؟
خیلی ببخشید :(
با تشکر.

Mahmoud.Afrad
پنج شنبه 24 مرداد 1392, 23:53 عصر
گفتی میخوای بر حسب کد گروه جستجو کنی. حتما گروه ها و کدشون رو در یک کمبو مثلا لود کردی. کافیه selectedvalue کمبوباکس گروه رو بزاری جای 1.



دوستانه توصیه میکنم یه آموزش sql هم بخونی.

rayson
جمعه 25 مرداد 1392, 00:09 صبح
گفتی میخوای بر حسب کد گروه جستجو کنی.
where employee_in_group.id_group = cmb_search_group.selectedvalue به این روش ؟


دوستانه توصیه میکنم یه آموزش sql هم بخونی.
این که 100% من تو کار کدنویسی تازه آمدم و تازه دارم به ضعف های خودم میرسم که کم هم نیستند .

خوب اگر بگید در کدام قسمت باید این کد پیاده کنم ممنون میشم. Stored Procedures ?

veniz2008
جمعه 25 مرداد 1392, 03:23 صبح
و همچنین * در اولین خط چه کاری انجام میدهد ؟

به ندرت پیش میاد که آقای افراد از کوره در برن و دیگه جواب ندن! ولی تا ایشون نفس میگیرن!! من جواب این موارد رو بهت میدم.
منظور از * همه فیلدهای اون جدول هست. به جای اینکه نام تک تک فیلدها رو قید کنیم میتونیم از یک * استفاده کنیم.


where employee_in_group.id_group = cmb_search_group.selectedvalue به این روش ؟
آورین. درسته. فقط باید به کمبوباکس (موقع مقدار دهی) خاصیت valuemember رو بزاری روی employee_in_group.id_group .

cmb_search_group.ValueMember = "employee_in_group.id_group";


این که 100% من تو کار کدنویسی تازه آمدم و تازه دارم به ضعف های خودم میرسم که کم هم نیستند .این pdf واسه sql خیلی خوبه. هم ساده توضیح داده هم کدهاش جامع هست. میتونی هر کدی رو که مشکل داشتی بهش مراجعه کنی.
http://barnamenevis.org/showthread.php?351151-%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-%DA%A9%D9%86%DB%8C%D8%AF-%DA%A9%D8%A7%D9%85%D9%84%D8%AA%D8%B1%DB%8C%D9%86-%D9%88-%D9%BE%D8%B1%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%D 8%AA%D8%B1%DB%8C%D9%86-%D8%AF%D8%B3%D8%AA%D9%88%D8%B1%D8%A7%D8%AA-SQL-%28-%D8%AC%D8%AF%DB%8C%D8%AF-%29&highlight=%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF


خوب اگر بگید در کدام قسمت باید این کد پیاده کنم ممنون میشم. Stored Procedures ?
اجباری نداری از stored procedure استفاده کنی و میتونی درون محیط ویژوال کوئری هات رو بنویسی (هرچند اگر از stored procedure استفاده کنی به مراتب بهتره).
موفق باشی.

rayson
جمعه 25 مرداد 1392, 04:02 صبح
دستتون درد نکنه.
خیلی زحمت کشیدید.
قایل هم خیلی خوب بود من تا الان که این پیام میدم 20 صفحه مطالعه کردم خیلی کامل و بی نقص .
از هر دو شما متشکرم.