PDA

View Full Version : سوال: پیدا کردن اختلاف دو تاریخ



samaram
جمعه 09 بهمن 1388, 19:06 عصر
من یک بانک دارم که یکی از ستون هاش تاریخه(date) و یکی دیگه مدت (moddat). میخوام مثلا وقتی فرمی بنام main رو باز میکنم فیلد name کلیه ی سطرهایی رو نشون بده که تفاوت تاریخشون با تاریخ فعلی سیستم به اندازه ی moddat شده.
مثلا تصور کنید سیستمم میخواد سررسید یه سری قرارداد رو بررسی کنه. مشتری اول در قراردادش گفته 4 ماهه(moddat = 4) قرارداد می بنده. حالا میخوایم هر روز که فرم main رو باز میکنیم لیست همه ی افرادی رو بده که زمان اتمام قراردادشون رسیده.
میشه در نوشتن این کد کمکم کنید؟

hamidreza20
جمعه 09 بهمن 1388, 20:51 عصر
سلام دوست عزیز خوب مدت رو به تاریخ اضافه کن و با تاریخ جاری سیستم مقایسه کن.
یا یه الگوریتم بنویس که روز و ماه و سال رو یه عدد بکنه و بعد مقدار مدت رو بهش اضافه کن و بعد مقایسه کن.

التماس دعا...

samaram
جمعه 09 بهمن 1388, 21:04 عصر
سلام دوست عزیز خوب مدت رو به تاریخ اضافه کن و با تاریخ جاری سیستم مقایسه کن.
یا یه الگوریتم بنویس که روز و ماه و سال رو یه عدد بکنه و بعد مقدار مدت رو بهش اضافه کن و بعد مقایسه کن.

التماس دعا...
ممنون. من با الگوریتم مشکل خاصی ندارم. مساله ام همون نحوه ی مراجعاتم به بانکه. یعنی با کد نویسیش مشکل دارم. مثلا با لود شدن صفحه چطور بگم برو در تمام فیلدها مدت رو به تاریخ اضافه کن(چطوری اضافه کنم اصلا؟!) و بعد حالا بیا ببین با تاریخ جاری سیستم برابره یا نه؟ دستور select استفاده کنم؟ چطور اینهمه درخواست و شرط رو در این دستور جای بدم؟

slashslash2009
جمعه 09 بهمن 1388, 21:17 عصر
private void button1_Click(object sender, EventArgs e)
{
label1.Text = "1381/2/4";
label2.Text = "1385/5/30";
label3.Text = (DateTime.Parse(label1.Text) - DateTime.Parse(label2.Text)).TotalDays.ToString();//تعداد تمام روزها
label4.Text = (int.Parse(label3.Text) / 30).ToString();//تعداد ماه
label5.Text = (int.Parse(label3.Text) % 30).ToString();//تعداد روز

}

private void button2_Click(object sender, EventArgs e)
{
if (DateTime.Parse(label1.Text) < DateTime.Parse(label2.Text))
MessageBox.Show("کوچکتر");
else
MessageBox.Show("بزرگتر");
}

Yasersadegh
شنبه 10 بهمن 1388, 08:31 صبح
سلام به همه دوستان عزيز

ممنون. من با الگوریتم مشکل خاصی ندارم. مساله ام همون نحوه ی مراجعاتم به بانکه. یعنی با کد نویسیش مشکل دارم. مثلا با لود شدن صفحه چطور بگم برو در تمام فیلدها مدت رو به تاریخ اضافه کن(چطوری اضافه کنم اصلا؟!) و بعد حالا بیا ببین با تاریخ جاری سیستم برابره یا نه؟ دستور select استفاده کنم؟ چطور اینهمه درخواست و شرط رو در این دستور جای بدم؟

دوست عزيز در پست زير يه كلاس گذاشتم كه عمليات رويه تاريخها (به شكل string ) رو انجام ميده!! شما مي تونيد با استفاده از اين كلاس براحتي كارتون رو انجام بديد! به صوت زير عمل كنيد:
اين كلاس يه تابع داره كه از تاريخ مشخص شده مدت مورد نظر رو كم مي كنه(مدت بايد تعداد روز باشد)! شما بايد با اين تابع مدت ذخيره شده در بانك رو از تاريخ جاري سيستم كم كنيد كه حاصل آن يك تاريخ است. سپس با استفاده از يك select ركوردهايي كه تاريخ آنها برابر با تاريخ بدست آمده مي باشد را پيدا كنيد! اينها قراردادشان به اتمام رسيده است!!
اميدوارم مفيد واقع شده باشد!:لبخندساده:

موفق باشيد:چشمک:

samaram
شنبه 10 بهمن 1388, 20:04 عصر
از هر دو تون ممنونم دوستان عزیز. اما ببینید مشکل من با محاسبه ی تفاوت تاریخ ها نیست. همونطور که عرض کردم من دقیق نمی تونم تحلیل کنم چطور باید دستور select رو بنویسم؟ چطور شرط رو درش جای بدم؟ چطور تقاضامو بذارم؟ متوجه میشید منظورمو؟ چطور با یک دستور selectبگم بیا و تک تک فیلدها رو بررسی کن و ببین کدومش تفاوت تاریخش به اندازه ی فیلد مدتش شده؟!

Yasersadegh
یک شنبه 11 بهمن 1388, 08:47 صبح
از هر دو تون ممنونم دوستان عزیز. اما ببینید مشکل من با محاسبه ی تفاوت تاریخ ها نیست. همونطور که عرض کردم من دقیق نمی تونم تحلیل کنم چطور باید دستور select رو بنویسم؟ چطور شرط رو درش جای بدم؟ چطور تقاضامو بذارم؟ متوجه میشید منظورمو؟ چطور با یک دستور selectبگم بیا و تک تک فیلدها رو بررسی کن و ببین کدومش تفاوت تاریخش به اندازه ی فیلد مدتش شده؟!

دوست عزیز من در پست قبلی به شما جواب همین سوالتونم توضیح دادم ولی باز یه طور دیگه توضیح می دم!!
ببینید شما سه تا string یا متغیر دارید:
1- تاریخ جاری سیستم- string-به نام S
2 - تاریخ ثبت قرارداد در دیتابیس - string -به نام D
3- مدت اتمام قرارداد - یه عدد که همون تعداد روز قرارداد است - به نام M

حالا شما با استفاده از تابع کم کردن تعداد روز از تاریخ (nDaybefore) که در کلاس معرفی شده وجود دارد M را از S کم می کنید!
A=nDayBefore(S,M);
حاصل یه تاریخ است که با A نام گذاری کردم! این تاریخی است که اگر قراردادی در این تاریخ ثبت شده باشد در تایخ S (یعنی تاریخ جاری سیستم) می رسد!
پس بنابراین ما قراردادهایی را که در تاریخ A ثبت شده اند را جستجو می کنیم!
"select * from gharardad where Date='"+A+"'"
با این دستور Select تمامی قراردادهایی که تاریخ پایان آنها امروز(یعنی تاریخ جاری سیستم) باشد پیدا می شوند!!

امیدوارم متوجه روش کار شده باشید!!
موفق باشید

don_alen
یک شنبه 18 بهمن 1388, 14:35 عصر
سلام
میشه اون کلاسو که میگین بزارین آقای Yasersadegh

samaram
دوشنبه 19 بهمن 1388, 21:11 عصر
دوست عزیز من در پست قبلی به شما جواب همین سوالتونم توضیح دادم ولی باز یه طور دیگه توضیح می دم!!
ببینید شما سه تا string یا متغیر دارید:
1- تاریخ جاری سیستم- string-به نام S
2 - تاریخ ثبت قرارداد در دیتابیس - string -به نام D
3- مدت اتمام قرارداد - یه عدد که همون تعداد روز قرارداد است - به نام M

حالا شما با استفاده از تابع کم کردن تعداد روز از تاریخ (nDaybefore) که در کلاس معرفی شده وجود دارد M را از S کم می کنید!



A=nDayBefore(S,M);




حاصل یه تاریخ است که با A نام گذاری کردم! این تاریخی است که اگر قراردادی در این تاریخ ثبت شده باشد در تایخ S (یعنی تاریخ جاری سیستم) می رسد!






پس بنابراین ما قراردادهایی را که در تاریخ A ثبت شده اند را جستجو می کنیم!






"select * from gharardad where Date='"+A+"'"








با این دستور Select تمامی قراردادهایی که تاریخ پایان آنها امروز(یعنی تاریخ جاری سیستم) باشد پیدا می شوند!!









امیدوارم متوجه روش کار شده باشید!!





موفق باشید:چشمک:












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

Yasersadegh
سه شنبه 20 بهمن 1388, 08:56 صبح
سلام به دوستان عزیز

سلام
میشه اون کلاسو که میگین بزارین آقای Yasersadegh


سلام. آره . شما اصلا اون کلاس رو یادتون رفته بذارید. ممنونم


من از تمامی دوستان معذرت می خوام به خاطر فراموش کردن گذاشتن لینک کلاس مورد نظر!!:اشتباه::خجالت:
این کلاس رو من تو تاپیک زیر لینک دادم!!
http://barnamenevis.org/forum/showpost.php?p=892503&postcount=416
موفق باشید:چشمک:

Yasersadegh
سه شنبه 20 بهمن 1388, 09:14 صبح
ضمنا هنوز یه بخشی از مشکلم مونده. ببینید همون اول چطور دونه دونه ی رکوردهای بانکم رو برای پیدا کردن d و m بررسی کنم؟ آخه هر رکورد یه d و یه m داره دیگه. باید اول برای هر رکورد این فیلدها رو از بانک بکشم بیرون و روشون کلاس شما که ظاهرا تفاوت ها رو بررسی میکنه اجرا کنم و بعد تازه وقتی تاریخ بدست اومد باقی کار.

بله دوست عزیز فرمایش شما درسته!!:لبخند:
برایه کل کار کد شما تقریبا شبیه کد زیر می باشد::متفکر:



OleDbCommand com = new OleDbCommand("select * from YourTable " , con);
con.Open();
OleDbDataReader dr;
dr = com.ExecuteReader();
while (dr.Read())
{
D=dr["فیلد تاریخ قرارداد"].ToString();
M=int.Parse(dr["فیلد مدت قرارداد به روز"]);
A=nDayBefor(S,M);
if(D==A)
{
//قرارداد این رکورد به پایان رسیده
}
else{
//قرارداد هنوز به پایان نرسیده
}
}


خوب دوست عزيز اميدوارم كه مشكلتون حل بشه!!
موفق باشيد:چشمک:

slashslash2009
سه شنبه 20 بهمن 1388, 10:25 صبح
اگر نوع فیلد تاریخت از جنس char(رشته) باشه بهتر میشه باهاش کار کرد

dt = consql.MySelect("Select * from table where date BETWEEN'" + date1 + "'AND'" + date2 + "'");

samaram
سه شنبه 20 بهمن 1388, 22:09 عصر
بله دوست عزیز فرمایش شما درسته!!:لبخند:
برایه کل کار کد شما تقریبا شبیه کد زیر می باشد::متفکر:



OleDbCommand com = new OleDbCommand("select * from YourTable " , con);
con.Open();
OleDbDataReader dr;
dr = com.ExecuteReader();
while (dr.Read())
{
D=dr["فیلد تاریخ قرارداد"].ToString();
M=int.Parse(dr["فیلد مدت قرارداد به روز"]);
A=nDayBefor(S,M);
if(D==A)
{
//قرارداد این رکورد به پایان رسیده
}
else{
//قرارداد هنوز به پایان نرسیده
}
}



خوب دوست عزیز امیدوارم که مشکلتون حل بشه!!



موفق باشید:چشمک:



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

samaram
چهارشنبه 28 بهمن 1388, 21:15 عصر
بله دوست عزیز فرمایش شما درسته!!:لبخند:
برایه کل کار کد شما تقریبا شبیه کد زیر می باشد::متفکر:



OleDbCommand com = new OleDbCommand("select * from YourTable " , con);
con.Open();
OleDbDataReader dr;
dr = com.ExecuteReader();
while (dr.Read())
{
D=dr["فیلد تاریخ قرارداد"].ToString();
M=int.Parse(dr["فیلد مدت قرارداد به روز"]);
A=nDayBefor(S,M);
if(D==A)
{
//قرارداد این رکورد به پایان رسیده
}
else{
//قرارداد هنوز به پایان نرسیده
}
}



خوب دوست عزيز اميدوارم كه مشكلتون حل بشه!!



موفق باشيد:چشمک:



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


string D,S,A;
System.Globalization.PersianCalendar pc = new System.Globalization.PersianCalendar();
S = pc.GetYear(DateTime.Now) + "/" + pc.GetMonth(DateTime.Now) + "/" + pc.GetDayOfMonth(DateTime.Now);
DTCompare objdate;
int M;
SqlCommand cmd = new SqlCommand("select name from [TB_customer]",con );
con.Open();
SqlDataReader dr;
dr = cmd.ExecuteReader();
while (dr.Read())
{
D = dr["date"].ToString();
M = int.Parse(dr["moddat"].ToString ());
A = objdate.NdayBefor(S, M);
if (D == A)
{
MessageBox.Show(" ");
}
else
{
MessageBox.Show(" ");
}

موقع اجرا روی خط زیر این خطا رو میده:


A = objdate.NdayBefor(S, M);

Error 10 Use of unassigned local variable 'objdate'


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

samaram
جمعه 30 بهمن 1388, 21:25 عصر
یه مشکل دیگه. دوستان سریع ترکمکم کنید. باید سریع تر پروژه امو ارائه بدم.
همین کدی که دوست عزیزمون یعنی yasersadegh دادن رو نوشتم. اما نمیدونم چطور تستش کنم!! این کد اگه تفاوت تاریخ ها به اندازه ی فیلد مدت در بانک بشه باید پیغام بده که قرارداد تموم شده. درسته؟ ولی پیغام نمیده! مقدار فیلد مدت 1 هست. تاریخ رو هم تاریخ دیروز میدم. اما بازم نمیگه "قرارداد تموم شده" چطور تستش کنم؟

Yasersadegh
دوشنبه 03 اسفند 1388, 09:24 صبح
سلام دوست عزيز


یه مشکل دیگه. دوستان سریع ترکمکم کنید. باید سریع تر پروژه امو ارائه بدم.
همین کدی که دوست عزیزمون یعنی yasersadegh دادن رو نوشتم. اما نمیدونم چطور تستش کنم!! این کد اگه تفاوت تاریخ ها به اندازه ی فیلد مدت در بانک بشه باید پیغام بده که قرارداد تموم شده. درسته؟ ولی پیغام نمیده! مقدار فیلد مدت 1 هست. تاریخ رو هم تاریخ دیروز میدم. اما بازم نمیگه "قرارداد تموم شده" چطور تستش کنم؟



من كدتون رو ديدم يه چندتا اشكال جزيي داشت كه جلوشون توضيح دادم!! كه مهمترينشون اينه كه شما برايه تاريخ جاري بايد روزها و يا ماهايي كه عدد آنها يه رقميه، با گذاشتن يه صفر پشتشون عدد رو دو رقمي كنيد!! كد اصلاح شده رو براتون نوشتم!!
برايه مدت كه به ماه هست مي تونيد M رو در 30 ضرب كنيد و به تابع Ndaybefore بفرستيد! البته خودم تا چند ساعت ديگه به كلاس DTCompare تابع NMonBefore و NMonAfter هم اضافه مي كنم و در تاپيك دانلود اين كلاس Update مي كنم، و شما مي تونيد از لينك قبلي دوباره دانلودش كنيد!!



OleDbConnection con = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;data source='database1.mdb';");
string D, S, A;
System.Globalization.PersianCalendar pc = new System.Globalization.PersianCalendar();
//date format dd/mm/yyyy
S = "";
if (pc.GetDayOfMonth(DateTime.Now) < 10)
S += "0" + pc.GetDayOfMonth(DateTime.Now).ToString() + "/";
else
S += pc.GetDayOfMonth(DateTime.Now).ToString() + "/";
if (pc.GetMonth(DateTime.Now) < 10)
S += "0" + pc.GetMonth(DateTime.Now).ToString() + "/";
else
S += pc.GetMonth(DateTime.Now).ToString() + "/";
S += pc.GetYear(DateTime.Now).ToString();

DTCompare objdate = new DTCompare();//nahveye tarif kelas
int M;
OleDbCommand cmd = new OleDbCommand("select name,tarikh,moddat from table1", con);
con.Open();
OleDbDataReader dr;
dr = cmd.ExecuteReader();
while (dr.Read())
{
D = dr["Tarikh"].ToString();//kalameye date Reserve shode ast!!
M = int.Parse(dr["moddat"]);
A = objdate.NdayBefor(S, M);
if (D == A)
{
MessageBox.Show(dr["name"].ToString()+" gharar dad be payan reside.");
}
else
{
MessageBox.Show(dr["name"].ToString() + " gharar dat be payan nareside!! ");
}
}

توجه : من اين كدو برايه اكسس نوشتم شما خودت به sql تغييرش بده!!

اميدوارم مشكلتون زودتر حل بشه!!
موفق باشيد:چشمک:

Yasersadegh
سه شنبه 04 اسفند 1388, 11:31 صبح
دوست عزيز كلاس جديد رو مي توني از لينك زير برداري!!
http://barnamenevis.org/forum/attachment.php?attachmentid=44563&d=1266913548

موفق باشي:چشمک:

slashslash2009
سه شنبه 04 اسفند 1388, 11:38 صبح
از چه کدهای سختی واسه یه کار کوچیک استفاده میکنید

samaram
سه شنبه 04 اسفند 1388, 11:58 صبح
اي بابا. بازم مشكل داره فكر كنم. ببينيد من تو بانك يه مشتري به اسم RAMIN دارم كه فيلد moddat براش مقدار 2 و فيلد tarikh مقدار 02/12/1388 هست.
با اين حساب امروز كه 04/12/1388 هست بايد برا اين مشتري پيغام اتمام قرار داد بده ديگه. درسته؟ ولي ميگه قراردادش هنوز تموم نشده!!

Yasersadegh
سه شنبه 04 اسفند 1388, 12:04 عصر
اي بابا. بازم مشكل داره فكر كنم. ببينيد من تو بانك يه مشتري به اسم RAMIN دارم كه فيلد moddat براش مقدار 2 و فيلد tarikh مقدار 02/12/1388 هست.
با اين حساب امروز كه 04/12/1388 هست بايد برا اين مشتري پيغام اتمام قرار داد بده ديگه. درسته؟ ولي ميگه قراردادش هنوز تموم نشده!!

دوست عزيز با همون كد قبلي تست كردين!؟ من اون كدو من از تويه برنامه اي كه تست كردم و جواب داد فرستادم براتون!! بعيده با كد قبلي جواب نده!! كدي كه نوشتيد و جواب نداده رو دوباره بزاريد تا ببينمش!!:اشتباه:
اگرم از كلاس جديده استفاده كرديد و از تابع NmonBefore، خوب نبايدم جواب بده! چون اون تابع دوماه قبل رو در نظر ميگيره نه دو روز قبل!!:لبخند:

منتظر پاسختون هستم!!:لبخندساده:

samaram
سه شنبه 04 اسفند 1388, 12:10 عصر
كلاس جديد رو اضافه كردم.(ضمنا اين فيلد mkharid همون moddat هست كه تغيير نام دادم)



string D, S, A;
S = "";
if (pc.GetDayOfMonth(DateTime.Now) < 10)
S += "0" + pc.GetDayOfMonth(DateTime.Now).ToString() + "/";
else
S += pc.GetDayOfMonth(DateTime.Now).ToString() + "/";
if (pc.GetMonth(DateTime.Now) < 10)
S += "0" + pc.GetMonth(DateTime.Now).ToString() + "/";
else
S += pc.GetMonth(DateTime.Now).ToString() + "/";
S += pc.GetYear(DateTime.Now).ToString();


DTCompare objdate = new DTCompare();//nahveye tarif kelas
int M;
SqlCommand cmd = new SqlCommand ("select name,tarikh,mkharid from TB_customer", con);
con.Open();
SqlDataReader dr;
dr = cmd.ExecuteReader();
while (dr.Read())
{
D = dr["Tarikh"].ToString();//kalameye date Reserve shode ast!!
M = int.Parse(dr["mkharid"].ToString ());
A = objdate.NdayBefor(S, M);
if (D == A)
{
MessageBox.Show(dr["name"].ToString() + " gharar dad be payan reside.");
}
else
{
MessageBox.Show(dr["name"].ToString() + " gharar dat be payan nareside!! ");
}
}

از اينكه پيگيري ميكنيد يه دنيا ممنونم. چون خيلي عجله دارم.

Yasersadegh
سه شنبه 04 اسفند 1388, 12:35 عصر
دوست عزيز من كدتون رو كپي كردم و يه پايگاه داده با جدول مورد نظر ساختم و همون تاريخها كه فرموديد رو وارد كردم هيچ مشكلي نبود و جواب داد!! نمي دونم مشكل كار شما كجاست!!:گیج:
شما يه بار ديگه با دقت بيشتر برنامت رو خط به خط با كليدهاي F10 و F11 چك كن ببين مشكل كجاست!!:متفکر:
منتظر جوابتون هستم!:چشمک:

samaram
سه شنبه 04 اسفند 1388, 13:05 عصر
نمیشه. نمیدونم چشه:گریه::گریه::گریه::گریه::گ یه::گریه:

samaram
سه شنبه 04 اسفند 1388, 13:47 عصر
S رو ریختم تو یه لیبل و رو فرم نمایش دادم دیدم داره تاریخ رو چپه نشون میده. یعنی اینطوری: 1388/12/04
بنابراین اومدم کد رو به این شکل اصلاح کردم:


System.Globalization.PersianCalendar pc = new System.Globalization.PersianCalendar();

//---------------------------------------------------
string D, S, A;
string s1="", s2="", s3="";
S = "";
if (pc.GetDayOfMonth(DateTime.Now) < 10)
s1 += "0" + pc.GetDayOfMonth(DateTime.Now).ToString() ;
else
s1 += pc.GetDayOfMonth(DateTime.Now).ToString() ;
if (pc.GetMonth(DateTime.Now) < 10)
s2 += "0" + pc.GetMonth(DateTime.Now).ToString();
else
s2 += pc.GetMonth(DateTime.Now).ToString() ;
s3 += pc.GetYear(DateTime.Now).ToString();
S = s3+"/" + s2+"/" + s1;
tsdate.Text = S;
label1.Text = S;
DTCompare objdate = newDTCompare();//nahveye tarif kelas
int M;
SqlCommand cmd = newSqlCommand ("select name,tarikh,mkharid from TB_customer", con);
con.Open();
SqlDataReader dr;
dr = cmd.ExecuteReader();
while (dr.Read())
{
D = dr["Tarikh"].ToString();//kalameye date Reserve shode ast!!
M = int.Parse(dr["mkharid"].ToString ());
A = objdate.NdayBefor(S, M);
if (D == A)
{
MessageBox.Show(dr["name"].ToString() + " gharar dad be payan reside.");
}
else
{
MessageBox.Show(dr["name"].ToString() + " gharar dat be payan nareside!! ");
}
}

اینطوری توی لیبل تاریخ رو درست نشون میداد ولی بازم درست کار نکرد. ببینید اگه من مشتری ای با نام RAMIN داشته باشم که فیلد تاریخ براش 02/12/1388 باشه و mkharid هم 2 باشه باید امروز که 04/12/1388 هست پیغام اتمام قرارداد بده.درست حساب میکنم؟

samaram
سه شنبه 04 اسفند 1388, 14:06 عصر
اینم دیتابس هامه. شاید کمکی بکنه:

slashslash2009
سه شنبه 04 اسفند 1388, 14:20 عصر
اصلا شما دارید به کل اشتباه میرید موقعی که یک رکوردیو ثبت میکنید باید پایان قراردادش رو هم همونجا بدست بیارید و همراهش ثبت کنید نه اینکه بیاید نمیدونم در فیلد modat عدد 4 را بریزه اینکه خیلی الکی میشه بعدشم کار باهاش خیلی سخت میشه شما باید تاریخ مدت قرار دادو با تاریخ همون روز جمع ببندید بعدش تاریخیو که بدست میارید رو در دیتابیستون ثبت کنید و هر دفعه در فرمی که میخواید باز کنید یا هر چیز دیگه (select) اون تاریخ ذخیره شده رو با تاریخ امروز مقایه کنید

samaram
سه شنبه 04 اسفند 1388, 14:39 عصر
اصلا شما دارید به کل اشتباه میرید موقعی که یک رکوردیو ثبت میکنید باید پایان قراردادش رو هم همونجا بدست بیارید و همراهش ثبت کنید نه اینکه بیاید نمیدونم در فیلد modat عدد 4 را بریزه اینکه خیلی الکی میشه بعدشم کار باهاش خیلی سخت میشه شما باید تاریخ مدت قرار دادو با تاریخ همون روز جمع ببندید بعدش تاریخیو که بدست میارید رو در دیتابیستون ثبت کنید و هر دفعه در فرمی که میخواید باز کنید یا هر چیز دیگه (select) اون تاریخ ذخیره شده رو با تاریخ امروز مقایسه کنید
منطق شما درسته. ولی مساله اونجاست که طرفی که من براش برنامه رو مینویسم میگه میخواد خودش تاریخ رو بده تا به این ترتیب بتونه قراردادهای عقب مونده اش رو درست ثبت کنه.
با چه کدی میتونم تاریخ رو با مدت (بر حسب ماه) جمع بزنم؟

slashslash2009
سه شنبه 04 اسفند 1388, 15:59 عصر
DateTime a = (DateTime.Parse("1386/4/2")).AddMonths(5);
label1.Text = a.ToString("d");
اینجوری میتونی به یک تاریخ چند ماه اضافه کرد حتی میتونی روز و سال رو هم اضافه کنی در این مثال 5 ماه به تاریخ 1386/4/2 اضافه شده که میشه 1386/9/2

samaram
سه شنبه 04 اسفند 1388, 16:32 عصر
DateTime a = (DateTime.Parse("1386/4/2")).AddMonths(5);
label1.Text = a.ToString("d");
اینجوری میتونی به یک تاریخ چند ماه اضافه کرد حتی میتونی روز و سال رو هم اضافه کنی در این مثال 5 ماه به تاریخ 1386/4/2 اضافه شده که میشه 1386/9/2
:متعجب:يعني به همين سادگي؟؟؟؟؟؟؟؟؟؟؟؟؟(الان سيستم پيشم نيست تا تست كنم). اون تاريخ داخل گيومه رو مثل شما شمسي بنويسم واقعا كار ميكنه؟

slashslash2009
سه شنبه 04 اسفند 1388, 19:40 عصر
والا بلا کار میکنه چه جورم

samaram
سه شنبه 04 اسفند 1388, 21:50 عصر
والا بلا کار میکنه چه جورم
من فعلا به عنوان تست این کد رو نوشتم:


DateTime a;
SqlCommand cmd = new SqlCommand ("select name,tarikh,mkharid from TB_customer", con);
con.Open();
SqlDataReader dr;
dr = cmd.ExecuteReader();
while (dr.Read())
{
a = (DateTime.Parse(dr["Tarikh"].ToString())).AddDays (int.Parse(dr["mkharid"].ToString()));
temp = ((DateTime.Parse(S) - a).ToString ());
if(temp =="0")
MessageBox.Show(dr["name"].ToString() );
}

میخوام با این کد اسم مشتری هایی رو نشون بدم که تفاوت تاریخشون 4 باشه. چطو میتونم ایکارو بکنم؟ آخه خروجی کسر دو تاریخ از نوع datetime بصوت مثلا 04:00:00 هستش و نمیتونم با قایسه ب نتیجه برسم. temp از نوع strin هست.

slashslash2009
سه شنبه 04 اسفند 1388, 21:55 عصر
دوست من دیگه خودت کدشو بنویس همه چیز داری واسه اینکه ساعتو در انتهای تاریخت نشون نده کدتو اینجوری کن

temp = ((DateTime.Parse(S) - a).ToString ("d"));
البته در این کد بالا نمیدونم جواب بده ولی در این یکی
(DateTime.Parse(dr["Tarikh"].ToString("d"))).AddDaysجواب میده

samaram
سه شنبه 04 اسفند 1388, 22:14 عصر
درستش کردم. کد کاملش شد این و خیلی هم راحت جواب میده. از همتون ممنونم دوستان گلم. هر کدومتون برای نوشتنش خیلی بهم کمک کردین.


DateTime a;
SqlCommand cmd = new SqlCommand ("select name,tarikh,mkharid from TB_customer", con);
con.Open();
SqlDataReader dr;
dr = cmd.ExecuteReader();
while (dr.Read())
{
a = (DateTime.Parse(dr["Tarikh"].ToString())).AddDays (int.Parse(dr["mkharid"].ToString()));
temp = ((DateTime.Parse(S) - a).ToString ());

if(temp =="4.00:00:00")
MessageBox.Show(dr["name"].ToString()+"is"+ temp );
}