PDA

View Full Version : جستجو از طریق تاریخ (برنامه نویسی سی شارپ)



my_world
سه شنبه 04 بهمن 1390, 12:08 عصر
سلام
باید کد کالا و تاریخ گردش کالا رو از textbox ها بخونم، توی جدول گردش کالا سرچ کنم و نتیجه رو توی gridview نمایش بدم (ورودی و خروجی و موجودی و ... ). تاریخ رو از چه نوع تعریف کنم واسه نمایش gridview ؟ و اینکه دستوراتی که الان دارم با کد کالا سرچ میکنه و همه چیزایی که میخوام رو نمایش میده. فقط تاریخ رو نمیدونم چطور اضافه کنم توی دستورات. کد این قسمت هم اینه:





private void button2_Click(object sender, EventArgs e)
{
F_kala_search f = new F_kala_search();
f.ShowDialog();
txt_kala.Text = f.selected_code;
lbl_kala.Text = f.selected_name;
Refresh_data();
}
private void Refresh_data()
{
if (txt_kala.Text != "")
{
dataGridView1.DataSource = DataAccess.getdata("select * from

gardeshe_kala where code_kala="+ txt_kala.Text);
long voroodi = 0, khorooji = 0, mojoodi = 0;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
voroodi += long.Parse(dataGridView1.Rows[i].Cells

["voroodi"].Value.ToString());
khorooji += long.Parse(dataGridView1.Rows[i].Cells

["khorooji"].Value.ToString());
}
mojoodi = voroodi - khorooji;
textBox1.Text = "موجودی فعلی: " + mojoodi.ToString();
}
}

gilas1368
سه شنبه 04 بهمن 1390, 12:33 عصر
من برای تاریخ از nvarchar استفاده می کنم و باهاش مثل یه رشته رفتار می کنم
برای جستجو از طریق تاریخ هم انگار که یه رشته رو دارم جستجو می کنم

my_world
سه شنبه 04 بهمن 1390, 12:38 عصر
میشه خواهش کنم کدش رو بنویسین لطفن.

gilas1368
سه شنبه 04 بهمن 1390, 12:46 عصر
نوعشو که باید از داخل دیتابیس تعیین کنین
ولی برای جستجو این کمکتون می کنه:

sqlconnection con=new sqlconnection("آدرس پایگاه داده");
sqlcommand com =new sqlcommand("select * from Tablename where Fieldname='"تاریخ موردنظر"'",con);
sqldataadapter da=new sqldataadaper(com);
datatable dt=new datatable();
con.open();
da.fill(dt);
datagridview1.datasource=dt;
con.close();

sepehr.net
سه شنبه 04 بهمن 1390, 12:48 عصر
سلام
فیلد تاریخ رو در دیتابیس از نوع Varchar بگیر
برای جستجو هم مثل بقیه فیلد ها عمل کن
Select * From MyTable Where MyDate Between @Date1 And @Date2

ehsanmaleki
سه شنبه 04 بهمن 1390, 13:29 عصر
سلام

من از دوستان عزیزی که راه حل NVarChar رو پیشنهاد دادن تشکر میکنم. این یک راه حل سریع برای رسیدن به خروجیه.
ولی باید این نکته رو در نظر بگیریم که از نوع فیلد فقط می توانیم یک Query ساده در حدود یه بازه تاریخی مشخص اجرا و خروجی بگیربم. ولی وقتی نیاز به محاسباتی مثل جمع بین تاریخ باشه به مشکل میخوریم. حتی اگر بخوایم از CAST استفاده کینم هم به دلیل اینکه تعداد روز در ماه های میلادی با شمسی متفاوته باز هم به مشکل خواهیم خورد.

پیشنهاد بنده اینه که فیلد ها رو DateTime در نظر گرفته بشه.
در زمان نمایش تاریخ تاریخ روی Grid هم دو تا راه حل وجود داره :
1- استفاده از Culture در Framework که خودش معادل شمسی رو نشون میده و کمی پیچیدست.
2- تبدیل تاریخ میلادی به شمسی در رویداد ItemDataBound مربوط به Grid.

برای تبدیل تاریخ هم دو تا راه وجود داره :
1- استفاده از PerisanCalendar خود Framework.
2- بنده یک کلاس تبدیل تاریخ به C# تولید کردم که میتونم در اختیارتون قرار بدم و کار باهاش بسیار راحته.

موفق با شید.

sepehr.net
سه شنبه 04 بهمن 1390, 13:38 عصر
پیشنهاد بنده اینه که فیلد ها رو DateTime در نظر گرفته بشه.

بله ، وقتی از نوع رشته ایی گرفته بشه مشکلاتی که شما اشاره کردید رو داره ، اما قابل حل هستند
ولی اگه تاریخ از نوع دیت تایم گرفته بشه ، وقتی کریستال مستقیما به دیتابیس وصل بشه تاریخ میلادی درون گزارشات نمایش داده میشه و برای رفع اون مشکل باید درگریر نوشتن تبدیل تاریخ درون کریستال بشیم که دردسر های خود رو داره
ولی برای جمع و تفریق تاریخ ها از هم میشه با ساخت چند تا function ساده مشکل رو حل کرد
ولی در کل هر دو روش استفاده میشه

ahmad000012
سه شنبه 04 بهمن 1390, 15:31 عصر
دوستان تاجاییکه من فهمیدم برای تاریخ شمسی
ذخیره تو پایگاه و ارتباط مستقیم با پایگاه در گزارشگیری کریستال باید تاریخ از نوع رشتهای باشه
آیا با این روش هیچ مشکلی بین مقایسه دو تاریخ نداریم
سوال : تاریخ باید تو یک رشته اینطوری وارد بشه 13/11/1390
اگه کسی سورسی داره که با این روش کار میکنه بهم بده ممنون میشم

sepehr.net
سه شنبه 04 بهمن 1390, 15:38 عصر
به نظر من بهترین راه حل همینه
مشکل که هست ، ولی باید یه جوری با مشکلات کنار بیای :دی

تاریخ رو باید با یک فرمت خاص ذخیره کنی تا جواب بده و مشکلی پیش نیاد اون هم به این صورت هست 1390/11/04

ahmad000012
سه شنبه 04 بهمن 1390, 16:18 عصر
الان تست کردم خوب بود
اما وقتی تاریخ را از سیستم گرفته و با persiancalender اونوتبدیل به شمسی داخل رشته ذخیره می کنم تو بعضی از تاریخها یکم مشکل وجود داره
مثل تاریخ امروز که میزنه 1390/11/4 اما باید این باشه 1390/11/04
راه حلی برای این وجود نداره

sepehr.net
سه شنبه 04 بهمن 1390, 16:31 عصر
خوب باید فرمت تاریخ رو خودت تبدیل کنی به اون قالب دیگه

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

ahmad000012
سه شنبه 04 بهمن 1390, 17:06 عصر
متوجه نشدم

sepehr.net
سه شنبه 04 بهمن 1390, 18:15 عصر
خودت یه تابع بساز که ورودی یه تاریخ بگیره ، خروجی تاریخ رو با اون فرمتی که دوست داری برگردونه ، هر جایی که میخوای تاریخ رو تو دیتابیس ذخیره کنی ، تاریخ وارد شده رو به این تابع پاس بده و خروجی این تابع رو تو دیتابیس ذخیره کن

ehsanmaleki
چهارشنبه 05 بهمن 1390, 11:11 صبح
دیت تایم گرفته بشه ، وقتی کریستال مستقیما به دیتابیس وصل بشه تاریخ میلادی درون گزارشات نمایش داده میشه و برای رفع اون مشکل باید درگریر نوشتن تبدیل تاریخ درون کریستال بشیم که دردسر های خود رو داره

سلام مجدد

من از شما تشکر میکنم به نکته خوبی اشاره کردید. من این موضوع رو از قلم انداختم.
برای کریستال هم من یک Function در SQL Sevrverدارم که تاریخ میلادی نوع DateTime به عنوان ورودی میگیره و خروجی رشته به شما بر میگردونه. لذا وقتی شما در کریستال می خواید گزارش رو نشون بدید کافیه فیلد تاریخ رو به این تابع بدید :
SELECT myName, dbo.MiladiTOShamsi(myDaye) AS FaDate FROM myTable

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

من این تابع رو هم پیوست کردم تا دوستان بتونن استفاده کنن.

my_world
جمعه 07 بهمن 1390, 20:29 عصر
سلام
فیلد تاریخ رو در دیتابیس از نوع Varchar بگیر
برای جستجو هم مثل بقیه فیلد ها عمل کن
Select * From MyTable Where MyDate Between @Date1 And @Date2


error میده. ضمنن من کاری به شمسی و میلادی ندارم الان. مشکلم اینه که اصلن توی textbox که وارد کنم تاریخم رو، چه کدی بنویسم که اون تاریخ رو سرچ کنه. لطفن کمک کنین. من مبتدی ام.

ali_habibi1384
جمعه 07 بهمن 1390, 22:20 عصر
براي تاريخ نيازي به تابع نوشتن نداري توي اين ابزار تكست (http://barnamenevis.org/showthread.php?318486-%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1-%D8%AA%D9%83%D8%B3%D8%AA-%D8%A8%D8%A7%D9%83%D8%B3-%D8%AD%D8%B1%D9%81%D9%87-%D8%A7%D9%8A-%D8%A8%D8%A7%D9%83%D9%84%D9%8A-%D8%A7%D9%85%D9%83%D8%A7%D9%86%D8%A7%D8%AA-%D8%A8%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D8%B3%D9%88%D8%B1%D8%B3) باكسي كه طراحي كردم همه چيز آماده هست
براري نوع هم همون nVarchar راه خوبي هست.
اگه نياز دارين واقعا كه حتما نوعش تاريخ باشه يه فيلد نوع تاريخ هم اضافه كنيد اما موقع ذخيره و تغييرات با استفاده از Persiandate در C# اونو تبديل كنيد تا معادل ميلاديش هم داشته باشيد. اونوقت موقع جستجو از ميلادي و موقع گزارش از شمسي استفاده ميكنيد

ali_habibi1384
جمعه 07 بهمن 1390, 22:26 عصر
error میده. ضمنن من کاری به شمسی و میلادی ندارم الان. مشکلم اینه که اصلن توی textbox که وارد کنم تاریخم رو، چه کدی بنویسم که اون تاریخ رو سرچ کنه. لطفن کمک کنین. من مبتدی ام.

between براي اعمال رياضي فيلد عددي كاربرد داره نه رشته از <>= استفاده كنيد

my_world
دوشنبه 10 بهمن 1390, 17:37 عصر
براي تاريخ نيازي به تابع نوشتن نداري توي اين ابزار تكست (http://barnamenevis.org/showthread.php?318486-%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1-%D8%AA%D9%83%D8%B3%D8%AA-%D8%A8%D8%A7%D9%83%D8%B3-%D8%AD%D8%B1%D9%81%D9%87-%D8%A7%D9%8A-%D8%A8%D8%A7%D9%83%D9%84%D9%8A-%D8%A7%D9%85%D9%83%D8%A7%D9%86%D8%A7%D8%AA-%D8%A8%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D8%B3%D9%88%D8%B1%D8%B3) باكسي كه طراحي كردم همه چيز آماده هست
براري نوع هم همون nVarchar راه خوبي هست.
اگه نياز دارين واقعا كه حتما نوعش تاريخ باشه يه فيلد نوع تاريخ هم اضافه كنيد اما موقع ذخيره و تغييرات با استفاده از Persiandate در C#‎ اونو تبديل كنيد تا معادل ميلاديش هم داشته باشيد. اونوقت موقع جستجو از ميلادي و موقع گزارش از شمسي استفاده ميكنيد

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

my_world
دوشنبه 10 بهمن 1390, 21:20 عصر
من یه توضیح میدم که چکار کردم که لطف کنین بگین اشکال کارم کجاس:
اول اینکه یه کلاس DataAccess دارم و تابع getdata :


public static DataTable getdata(string command)
{
sqlcmd.CommandText = command;
sqlcmd.Connection = sqlcon;
sqladapter.SelectCommand = sqlcmd;
DataTable dt = new DataTable();
sqladapter.Fill(dt);
return dt;
}

حالا توی فرم مورد نظرم (فرم F_gardeshe_kala) یه textbox و یه comboBox1 گذاشتم و gridview.
و کد load اینه که تاریخهای save شده توی جدولمو میخونه:

private void F_gardeshe_kala_Load(object sender, EventArgs e)
{
comboBox1.DataSource = DataAccess.getdata("select * from gardeshe_kala");
comboBox1.DisplayMember = "date";
comboBox1.ValueMember = "date";

}

و کد button اینه که میخوام تاریخ خاصم رو search کنه:


dataGridView1.DataSource = DataAccess.getdata("select * from gardeshe_kala where date="+ comboBox1.SelectedValue);


در حال حاضر error ای که داره بهم میده اینه:


Conversion failed when converting the nvarchar value '1390/10/23' to data type int.


value '1390/10/23' هم که اولین تاریخ جدولم هستش.
با توجه به اینها لطف کنین بگین چطور کدهام رو اصلاح کنم. اگه میشه دقیق توضیح بدین چون خیلی مبتدی ام و خیلی سر در نمیارم. مرسی