PDA

View Full Version : مشكل در برنامه نويسي



mehran63
پنج شنبه 24 مرداد 1392, 16:46 عصر
کد زیر اطلاعات رو به درستی از اکسل به DataTable میریزه و در DataGridView به درستی نشون میده
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog of = new OpenFileDialog();
of.Filter = "Excel 2007 Files|*.xlsx";
of.Title = "Open Excel 2007 Files";
DialogResult dr = new DialogResult();
dr = of.ShowDialog();
if (dr == DialogResult.Cancel)
return;

string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;
Data Source= " + of.FileName + " ;Extended Properties=\"Excel 12.0;HDR=No;\"";

string strSQL = "SELECT * FROM [QueryExportToExcel$]";

OleDbConnection excelConnection = new OleDbConnection(connectionString);
excelConnection.Open();

OleDbCommand dbCommand = new OleDbCommand(strSQL, excelConnection);
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(dbCommand);

DataTable dTable = new DataTable();
dataAdapter.Fill(dTable);

DataGridView1.DataSource = dTable;

int tehran = 0;
int esfahan = 0;
int shiraz = 0;
for (int i = 0; i < dTable.Rows.Count; i++)
{
string s=dTable.Rows[i][0].ToString().Trim();
if (s.Contains ( "تهران"))
{
tehran += Convert.ToInt32(dTable.Rows[i][1]) * 2;
}
if (s.Contains( "اصفهان"))
{
esfahan += Convert.ToInt32(dTable.Rows[i][1]) * 3;
}
if (s.Contains( "شیراز"))
{
shiraz += Convert.ToInt32(dTable.Rows[i][1]) * 5;
}

}
label1.Text ="امتیاز:"+ (tehran + esfahan + shiraz).ToString();

dTable.Dispose();
dataAdapter.Dispose();
dbCommand.Dispose();

excelConnection.Close();
excelConnection.Dispose();

}
}
فايل Excel را ميتوانيد از لينك زير برداريد
فایل اکسل (http://www.uplooder.net/cgi-bin/dl.cgi?key=4279bc04aba19af41b33b6da53e64145)
همانطور که میبینید اطلاعات از یه فایل Excel خوانده شده و در DataTable ریخته میشه و از اونجا برای عملیاتی که نیاز دارم استفاده میکنم
همانطور که در برنامه میبینید به ازای هر شهری که در فایل excel وجود دارد یک If گذاشتم
مشکل ایجاست که اگه یه شهر به این فایل اکسل اضافه بشه اونوقت من باید برنامه رو دوباره تغییر بدم و یه If دیگه هم واسه اون اضافه کنم.
برای رفع این مشکل چه کنم که دوباره برنامه رو تغییر ندم؟

tooraj_azizi_1035
پنج شنبه 24 مرداد 1392, 16:52 عصر
اگه از اصفهان به بعد 2 تا 2 تا اضافه میشه (منظورم ضریب هست) می تونی بعد از if تهران یه else بنویسی و +=2 کنی if های بعد از تهران هم لازم نیست.

mehran63
پنج شنبه 24 مرداد 1392, 16:54 عصر
نه؛ اون اعداد ترتيبي نداره

tooraj_azizi_1035
پنج شنبه 24 مرداد 1392, 16:57 عصر
پس باید ضریب رو هم در فایل اکسل ذخیره کنید و مستقیماً اون رو بخونید و ضرب کنید چون شما به دلیل وجود ضرایب مختلف if اضافه می کنید.

int counter;
for (int i = 0; i < dTable.Rows.Count; i++)
{
counter+=int.Parse(dTable.Rows[i][1].ToString().Trim());//ضرایب

mehran63
پنج شنبه 24 مرداد 1392, 17:11 عصر
فيلدهاي فايل اكسل دست من نيست
در واقع اين برنامه كارش اينه كه فايل اكسل رو كه كاربر در برنامه انتخاب ميكنه امتيازش رو حساب ميكنه
اين فايل اكسل خروجي يك برنامه حسابداريه، به همين خاطر امكان داره نام شهرها اضافه بشه. همچنين ضريب هر شهر هم در مقاطعي تغيير ميكنه

mehran63
جمعه 25 مرداد 1392, 11:01 صبح
من در برنامم دو تا مشکل دارم
یه فایل اکسل دارم که باید تک تک رکوردهاش رو بررسی کنم تا با هر کدوم یه رفتاری رو انجام بدم (همون ضرایب) در واقع این برنامه برای یک فایل اکسل نیست، برای فایل های اکسلی است که نام شهرها و ضرایب آن هم با نظر کاربر در فایل اکسل تغییر میکند(البته لازم به توضیح است که ضرایب در فایل اکسل وجود ندارد). این برنامه در واقع باید این انعطاف رو داشته باشه که با این تغیرات بتونه درست کار کنه

tooraj_azizi_1035
جمعه 25 مرداد 1392, 14:09 عصر
یه switch بنویسید که همه استان های ممکن رو شامل باشه.

مهرداد صفا
شنبه 26 مرداد 1392, 01:34 صبح
با سلام.
دوستان توجه داشته باشید که علت بیشتر از 90 درصد تاپیکهایی که در انجمن ایجاد می شوند "مشکل در برنامه نویسی" است. حالا شما فرض کنید که تمام این نوع تاپیکها با عنوان "مشکل در برنامه نویسی" ایجاد شوند!!! چه اتفاقی خواهد افتاد؟ (حداقل) خود شما بعد از یک مدت و با ایجاد چند تاپیک چگونه آنها را از یکدیگر تشخیص خواهید داد؟

عنوان تاپیک شما باید حداکثر مطابقت با مطالب مطرح شده در آن را داشته باشد تا:
1- فرد دیگری که با همین مشکل رو به روست با دیدن نام تاپیک به آن هدایت شود.
2- موتور های جستجو مثل گوگل روی عنوان صفحات و متن درون heading ها که در اینجا همان عنوان تاپیک است حساسیت بیشتری دارند و درنتیجه افراد بیشتری که به دنبال موضوعات مطرح شده در تاپیک هستند از طریق گوگل و .. به تاپیک هدایت می شوند و به جواب خود می رسند.
3- دوستان عزیزی که ممکن است به جواب سوال شما واقف باشند و قصد کمک کردن دارند سریعتر به تاپیک هدایت می شوند ودر نتیجه شما هم زودتر به جواب می رسید.
4- در نتیجه موارد فوق تعداد تاپیهای تکراری کمتر شده و تاپیکها پربارتر می شوند.

مدیران محترم لطفا این تاپیک رو حذف و ویرایش نکنید بلکه دوستانی که به این مطلب برخورد می کنند موارد بالا رو مد نظر داشته باشند.

cherchil_hra
شنبه 26 مرداد 1392, 09:39 صبح
شما می توانید یک جدول به عنوان ضریب ایجاد بکنید و با جدول بدست آمده از فایل اکسل، آن را ادغام کنید. اگر همه کاربران از یک ضریب استفاده می کنند و ضریب ها براساس کاربر تغییر نمی کند select بدون شرط در غیر این صورت کوئری select روی جدول ضریبتون از رو براساس کاربر ایجاد می کنید.

برای نمونه من جدول رو به صورت دستی در برنامه ایجاد کردم که کلید اصلی F1 هست:
f1 : نام شهر (که همنام با ستون فایل اکسل شماست) | factor: ضریب مصرف

private DataTable FillFactor()
{
var dt = new DataTable("MyTown");

dt.Columns.Add("f1", typeof (string));
dt.Columns.Add("Factor", typeof (int));

dt.PrimaryKey = new[] { dt.Columns[0] };

dt.Rows.Add("تهران", 2);
dt.Rows.Add("اصفهان", 3);
dt.Rows.Add("شیراز", 5);

return dt;
}


اول از همه دستور Select رو به شکل زیر تغییر بده تا براساس شهر مقادیر با هم جمع بشوند: string strSQL = "SELECT f1,sum(f2) as [sum] FROM [Sheet1$] group by f1";

f1 و f2 اسم ستون هات هست که با انتخاب فایل و دستور select * در دیتاگرید نشون داد.
f1 رو کلید اصلی قرار میدی.

حالا کاری که باید انجام بشه ادغام دو جدول باهم هست که با دستور زیر انجام می شود:
dTable.Merge(dt);
بدین ترتیب ستون های همنام و کلید (یعنی F1) با هم ادغام می شوند.

حالا شما باید یک ستون محاسباتی ایجاد کنید که از ضرب دو ستون sum و factor به وجود می آید:
dTable.Columns.Add("result", typeof (int));
dTable.Columns["Result"].Expression = "sum * Factor";

در نهایت حاصل جمع سطرها رو بدین ترتیب محاسبه می کنیم:
label1.Text = "امتیاز:"+dTable.Compute("sum(Result)", "").ToString();

که در کل کد button1_Click شما اینجوری میشه:

OpenFileDialog of = new OpenFileDialog();
of.Filter = "Excel 2007 Files|*.xlsx";
of.Title = "Open Excel 2007 Files";
DialogResult dr = new DialogResult();
dr = of.ShowDialog();
if (dr == DialogResult.Cancel)
return;

string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;
Data Source= " + of.FileName +
" ;Extended Properties=\"Excel 12.0;HDR=No;\"";

var dt = FillFactor();
string strSQL = "SELECT f1,sum(f2) as [sum] FROM [Sheet1$] group by f1";

OleDbConnection excelConnection = new OleDbConnection(connectionString);
excelConnection.Open();

OleDbCommand dbCommand = new OleDbCommand(strSQL, excelConnection);
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(dbCommand);

DataTable dTable = new DataTable();
dTable.PrimaryKey = new[] { dTable.Columns["f1"] };
dataAdapter.Fill(dTable);

dTable.Merge(dt);
dTable.Columns.Add("result", typeof (int));
dTable.Columns["Result"].Expression = "sum * Factor";
label1.Text = "امتیاز:"+dTable.Compute("sum(Result)", "").ToString();
DataGridView1.DataSource = dTable;

dTable.Dispose();
dataAdapter.Dispose();
dbCommand.Dispose();

excelConnection.Close();
excelConnection.Dispose();
}



موفق باشید!