PDA

View Full Version : سیستم صدور قبض تلفن تک کاربره ...



s_mostafa_h
سه شنبه 13 آذر 1386, 10:10 صبح
سلام به همه دوستان . من می خوام در ابتدای امر یه پروژه اینجا شروع کنم ، از آن جهت که هم خودم از دوستان یه چیزی یاد بگیرم و هم دوستان به من کمک کنند . فقط خواهشا اصل موضوع به انحراف کشیده نشه که اگه یکی داخل این تاپیک اومد ، حرف هایی .... بزنه !:لبخند:
پس شروع می کنیم .
فرض می کنیم ، این پروژه تک کار بره است ، بنابراین یک یوز و یک پسورد داره .
1 - در داخل فرم اول :اطلاعات هر مشتری باید ثبت بشه ، بتونه تغییرات لازم را در آن بده ، اطلاعات هم به صورت رمز در داخل Sql ذخیره بشه . در داخل این فرم کاربر می توانه تمام تغییرات از جمله حذف ، اضافه و ... و هم چنین قابلیت جستجو را خواهد داشت .
2 - هر مشتری بالطبع ، دارای Details های مختلفی از جمله اینکه حساب های شخصی داره و در یک Range زمانی باید اطلاعاتش از جمله انجام محاسبات برای صدور قبض شخصی و ... داره که در یه فرم دیگه این کار انجام میشه . خصوصیات این فرم هم شبیه فرم قبلی است ، منتها یک سری محاسبات ساده و ... دارد . در این فرم ، احضار هر مشتری به سه طریق ، جستجو ، وارد کردن نام خانوادگی و یا شماره پرونده امکان پذیر است . همچنین قابلیت صدور قبض به صورت تکی و کلی از یک تاریخ تا تاریخ معنی را دارد .
3 - ....
تا اینجا زیاد حرف زدیم . مراحل بعدی را هم به کمک دوستان در طراحی ادامه می دهیم .
نام پروژه را TelephoneProject قرار می دهیم .

خوب ، برای ورود به سیستم ، کاربر باید یوزر و پسورد خود را وارد کند .
نام دیتا بیس ما Telephone است که آنرا در اس کیو ال ایجاد می کنیم . داخل این دیتابیس یه جدول به نام username درست می کنیم که فیلد های آن :
1 - id از نوع int می باشد . 2 - uid از نوع char با طول 25 می باشد 3 - pwd از نوع char با طول 25 می باشد .
فرمی مانند شکل طراحی می کنیم ، نام فرم را frmStart و نام دو دکمه را هم btnCancel و btnOK و نام دو تکست باکس را هم به ترتیب : txtUserName و txtPWD قرار می دهیم .
روی نام پروژه TelephoneProjectراست کلیک کرده گزینه addو سپس گزینه newfolderانتخاب کنید و یه پوشه درست کنید تا فرم ها را داخل این پوشه قرار دهیم .اگه فرم درست شد هم می توانید آنرا بریده و داخل پوشه بگذارید
کد فرم را باز کرده و فضای نام اس کیو ال را به این ترتیب به آن آضافه می کنیم :


using System.Data.SqlClient;

داخل کلاس public partial class frmStart : Form موارد ذیل را تعریف کنید .


protected const string SQL_CONNECTION_STRING = "Server=localhost;" +
"DataBase=Telephone;Integrated Security=SSPI";
static string Connectionstring = SQL_CONNECTION_STRING;
SqlDataAdapter userAdapter = new SqlDataAdapter();
DataView UserView = new DataView();
//---------------------------------
protected const string NO_RECORDS_FOUND_MESSAGE = "چنین کاربری وجود ندارد";
protected const string Empty_MESSAGE = "نام کاربر و کلمه عبور باید کامل گردد";
protected const string CAPTION_TITLE = "نتیجه جستجو";
protected bool didPreviouslyConnect = false;
تا اینجا اگه مشکلی هست ، دست یاری دوستان را می طلبیم .:چشمک:

s_mostafa_h
سه شنبه 13 آذر 1386, 11:29 صبح
قبل از اینکه فرم ورود کاربر ، را باز کنیم باید از باز بودن Sql مطمئن باشیم . بنابراین یک فرم وضعیت بنام فرم frmStatus ایجاد می کنیم و یک Label با نام lblStatus داخل فرم قرار داده و خاصیت autosize آنرا false و خاصیت duck آنرا هم fill و خاصیت TextAlign را هم MiddleCenterمی کنیم . داخل این فرم ( frmStatus )یه تابع تعریف می کنیم :


public void Show(string Message)
{

lblStatus.Text = Message;

this.Show();

Application.DoEvents();

}


سپس در داخل فرمی که باید یوزر و پسورد وارد شود یعنی فرم frmStart ، در رویداد Load آن می نویسیم :


#region ------------ L O A D I N G -----------

private void frmStart_Load(object sender, EventArgs e)
{
Forms.frmStatus frmStatusMessage = new Forms.frmStatus();

if (!didPreviouslyConnect)
{
frmStatusMessage.Show("Connecting to SQL Server");
}

bool isConnecting = true;

while (isConnecting)
{
try
{

SqlConnection myConnection = new SqlConnection(Connectionstring);
myConnection.Open();
isConnecting = false;
didPreviouslyConnect = true;

}
catch
{
frmStatusMessage.Close();
MessageBox.Show("Connection Failed!");
Application.Exit();

}

}

frmStatusMessage.Close();
}
#endregion

مهدی رحیم زاده
سه شنبه 13 آذر 1386, 11:55 صبح
دوست عزیز
سلام
می تونی که برنامه رو اینجا بزاری !!!
اگه آره بزارش ، ممنون میشم ...

s_mostafa_h
سه شنبه 13 آذر 1386, 12:15 عصر
دوست عزیز
سلام
می تونی که برنامه رو اینجا بزاری !!!
اگه آره بزارش ، ممنون میشم ...

هیچ مشکلی نیست ، منتها چون قدم به قدم داریم پروژه را درست می کنم ، مجبورم هر مرحله فایل های جدید را قرار دهم . به هر حال ، پروژه باید با همت دوستان ، انشاا... تموم بشه .
------- > فایل به همراه دیتا بییس <------------

s_mostafa_h
سه شنبه 13 آذر 1386, 12:46 عصر
یک فرم دیگه به نام frmMain داخل پوشه Forms ایجاد نمایید ، تا اگه یوزر و پسورد وارد شد و مورد تایید قرار گرفت ، این فرم را نشان دهد .
کد های ذیل را در رویداد دکمه btnOk بنویسید :


#region ---------- Authentication User ----------------
private void btnOK_Click(object sender, EventArgs e)
{
//------->Step :1
if ((txtUserName.Text.Trim().Length == 0) || (txtPWD.Text.Trim().Length == 0))
{
MessageBox.Show(Empty_MESSAGE, CAPTION_TITLE);
txtPWD.Text = "";
txtUserName.Text = "";
return;
}
//------>Step :2
string strFilter;
strFilter = "SELECT id,uid,pwd FROM username WHERE" +
" pwd='" + txtPWD.Text + "' AND" +
" uid='" + txtUserName.Text + "'";
// "AND id_user="+get_id;
userAdapter = new SqlDataAdapter(strFilter, Connectionstring);
SqlCommandBuilder UserCmd = new SqlCommandBuilder(userAdapter);
DataTable UserTable = new DataTable();
userAdapter.Fill(UserTable);
UserView =
new DataView(UserTable, "", "", DataViewRowState.OriginalRows);

//---->Step :3

if (UserView.Count == 0)
{

MessageBox.Show(NO_RECORDS_FOUND_MESSAGE, CAPTION_TITLE);
txtPWD.Text = "";
txtUserName.Text = "";

}
else
{

this.Hide();
Forms.frmMain MainPage = new Forms.frmMain();
MainPage.ShowDialog();

}
}
#endregion

داخل جدول username نام یوزر را مثلا aa و فیلد pwd را هم 11 بگیرید .
برای راحتی کاربر ، می توانید در رویداد KeyDown هر تکست باکس کد خای ذیل را بنویسید :


private void txtUserName_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyValue)
{
case 13://for enter
btnOK_Click(sender, e);
break;
case 40://for arrow down key
txtPWD.Focus();
break;
}
}
//---------------------------------
private void txtPWD_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyValue)
{
case 13://for enter
btnOK_Click(sender, e);
break;
case 38://for arrow up key
txtUserName.Focus();
break;
}
}

فعلا Bye

s_mostafa_h
چهارشنبه 14 آذر 1386, 07:20 صبح
خوب تا اینجا ، کسی نظری نداره ، راه حل ساده تر یا بهتر ؟

sinpin
چهارشنبه 14 آذر 1386, 08:12 صبح
خوب تا اینجا ، کسی نظری نداره ، راه حل ساده تر یا بهتر ؟

سلام دوست عزیز
چون نظر خواسته بودید؛ پس بدون مقدمه باید بگم که روشی که واسه کد نویسی بکار بردید صحیح نیست.
در واقع شما دارید منطق Business Logic Layer و Data Layer رو در سطح همون Presentation Layer پیاده سازی میکنید. یا به بیانی دیگه : کدی که شما توی فرمهاتون مینویسید به شدت به دیتابیس و قوانین برنامه تون وابسته است که مشکلات زیادی (مثل : عدم توانایی استفاده مجدد از کد، وابستگیهای بیمورد، از دست دادن انعطاف در نگهداری و بسط پذیری و ....) ایجاد میکنه.
پیشنهاد میکنم این لینک رو ببینید :
http://en.wikipedia.org/wiki/Multitier_architecture



یک فرم دیگه به نام frmMain داخل پوشه Forms ایجاد نمایید ، تا اگه یوزر و پسورد وارد شد و مورد تایید قرار گرفت ، این فرم را نشان دهد .
کد های ذیل را در رویداد دکمه btnOk بنویسید :


#region ---------- Authentication User ----------------
private void btnOK_Click(object sender, EventArgs e)
{
//------->Step :1
if ((txtUserName.Text.Trim().Length == 0) || (txtPWD.Text.Trim().Length == 0))
{
MessageBox.Show(Empty_MESSAGE, CAPTION_TITLE);
txtPWD.Text = "";
txtUserName.Text = "";
return;
}
//------>Step :2
string strFilter;
strFilter = "SELECT id,uid,pwd FROM username WHERE" +
" pwd='" + txtPWD.Text + "' AND" +
" uid='" + txtUserName.Text + "'";
// "AND id_user="+get_id;
userAdapter = new SqlDataAdapter(strFilter, Connectionstring);
SqlCommandBuilder UserCmd = new SqlCommandBuilder(userAdapter);
DataTable UserTable = new DataTable();
userAdapter.Fill(UserTable);
UserView =
new DataView(UserTable, "", "", DataViewRowState.OriginalRows);

//---->Step :3

if (UserView.Count == 0)
{

MessageBox.Show(NO_RECORDS_FOUND_MESSAGE, CAPTION_TITLE);
txtPWD.Text = "";
txtUserName.Text = "";

}
else
{

this.Hide();
Forms.frmMain MainPage = new Forms.frmMain();
MainPage.ShowDialog();

}
}
#endregion
داخل جدول username نام یوزر را مثلا aa و فیلد pwd را هم 11 بگیرید .
برای راحتی کاربر ، می توانید در رویداد KeyDown هر تکست باکس کد خای ذیل را بنویسید :


private void txtUserName_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyValue)
{
case 13://for enter
btnOK_Click(sender, e);
break;
case 40://for arrow down key
txtPWD.Focus();
break;
}
}
//---------------------------------
private void txtPWD_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyValue)
{
case 13://for enter
btnOK_Click(sender, e);
break;
case 38://for arrow up key
txtUserName.Focus();
break;
}
}
فعلا Bye

sinpin
چهارشنبه 14 آذر 1386, 08:16 صبح
برای مثال : تصور کنید که لازم بشه دیتابیس رو از sql server به oracle یا ... تغییر بدید.

s_mostafa_h
چهارشنبه 14 آذر 1386, 08:51 صبح
کدی که شما توی فرمهاتون مینویسید به شدت به دیتابیس و قوانین برنامه تون وابسته است که مشکلات زیادی (مثل : عدم توانایی استفاده مجدد از کد، وابستگیهای بیمورد، از دست دادن انعطاف در نگهداری و بسط پذیری و ....) ایجاد میکنه.
پیشنهاد میکنم این لینک رو ببینید :

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

s_mostafa_h
پنج شنبه 15 آذر 1386, 09:59 صبح
چون نظر خواسته بودید؛ پس بدون مقدمه باید بگم که روشی که واسه کد نویسی بکار بردید صحیح نیست.

بالاخره متوجه نشدیم ، منظور شما از این حرف چی بود ؟ می خواستی کمک کنی یا خیلی ببخشید پارازیت می خواستی بندازی . من این تاپیک را زدم تا کمکی بشه برای اونایی که هیچ آشنایی کار با دیتا بیس را نمی دونند .
یکی تاپیک می زنه که یک پروژه ای را می خواهیم انجام بدیم ، 500 نفر جمع میشن و نظر می دن و بعد از 10 تا 20 صفحه پر کردن و نظر دادن ، تاپیک رها می شه و هیچ کاری صورت نمیشه و یکی مثل من میاد تاپیک می زنه و یه کاری شروع می کنه ، همون اول یکی پیدا میشه و میگه روش شما درست نیست و همین و دیگه کمکی هم نمی کنه که چه کاری را باید انجام بدیم تا تاپیک به نتیجه برسه . ظاهرا همون بهتر که این تاپیک هم کلا رها بشه !

hassan razavi
پنج شنبه 15 آذر 1386, 12:24 عصر
آموزشهای شما خوبه و واقعا دستتون هم درد نکنه. ولی مسئله اینجاست که جز به جزش خوبه.
مثلا روش Insert کردن و Update و Delete و Search رو تک به تک خوبه ولی وقتی می خواهید همه رو بزارید کنار هم و بکنیدش یک برنامه ، کار خراب میشه. چرا؟
چون از یک الگوی مشخص (Pattern) استفاده نمیکنید. مثلا سه لایه یا MVC یا ...
برای هر کدوم از این Pattern ها هم کلی مطلب و مقاله در همین سایت و سایتهای دیگه هست.

sinpin
پنج شنبه 15 آذر 1386, 14:09 عصر
بالاخره متوجه نشدیم ، منظور شما از این حرف چی بود ؟ می خواستی کمک کنی یا خیلی ببخشید پارازیت می خواستی بندازی .
نه دوست عزیز، من اصلا همچین منظوری نداشتم.
شما نظر خواستید و من قبول دارم یه مقدار بیش از حد صریح و بی مقدمه نظرم رو گفتم.
من فقط خواستم دید بیشتری داشته باشید. تو برنامه نویسی - و هر علمی - هرچی بیشتر پیش میرید بیشتر میبینید که چقدر نمیدونید! (چون ابتدا در ریشه درخت (Root) هستید و فکر میکنید به همه چیز واقفید، به مرور دیدتون وسیع تر میشه و یهو به خودتون میاین و میبینید که فقط روی دو یا سه شاخه از یک درخت بزرگ پیش رفتید و به اطراف (Leaf) که نگاه میکنید تازه فاصله ها رو درک میکنید...)


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

sinpin
پنج شنبه 15 آذر 1386, 14:20 عصر
همون اول یکی پیدا میشه و میگه روش شما درست نیست و همین و دیگه کمکی هم نمی کنه که چه کاری را باید انجام بدیم تا تاپیک به نتیجه برسه

برای اینکه شاید بتونم کمکی کرده باشم : فعلا شروع کنید به اینکه یکسری از کارهای تکراری رو از درون فرمهاتون بیرون بکشید و به یکسری کلاسهای مستقل انتقال بدید. مثلا میتونید یک کلاس داشته باشید که تمام ارتباطات با دیتابیس رو manage کنه. یا اینکه دستورات SQL رو توش داشته باشه. یک کلاس میتونید داشته باشید برای کار با رشته ها. یک کلاس میتونید داشته باشید فرضا به نام ComboBoxHelper که یکسری از فعالیتهایی که همواره روی کامبوباکس انجام میدید رو توش داشته باشید
اینجوری میتونید فعلا یه نظم نسبی به برنامه تون بدید و از اون مهمتر اگه جایی باز نیازی پیدا کردید اون کلاس رو به پروژه add میکنید. این چیزی که گفتم تقریبا میشه Code Reuse که کار خوبیه (میتونید مجددا از یکسری از کدنویسیهاتون استفاده کنید) بعد از این وضعیت بهتری هست بنام Binary Reuse که شما بعنوان مثال از یکسری از Dll هایی که قبلا ساختید استفاده میکنید.
بعد از این دو مرحله شما ناخواسته با مفاهیمی مثل برنامه نویسی لایه ای و روشهای طراحی، design pattern ها و ... آشنا میشید و به اونها مراجعه میکیند و این قضیه همینطور ادامه داره.
یک ساختمون رو در هر صورت میشه ساخت (حتی بدون مهندسی) اما مهم اینه که چقدر بهینه ساخته بشه (از نظر هزینه) و چقدر عمر کنه (قابلیت نگهداری) و ...

موفق باشید

ARA
پنج شنبه 15 آذر 1386, 14:31 عصر
یکی تاپیک می زنه که یک پروژه ای را می خواهیم انجام بدیم ، 500 نفر جمع میشن و نظر می دن و بعد از 10 تا 20 صفحه پر کردن و نظر دادن ، تاپیک رها می شه و هیچ کاری صورت نمیشه و یکی مثل من میاد تاپیک می زنه و یه کاری شروع می کنه ، همون اول یکی پیدا میشه و میگه روش شما درست نیست و همین و دیگه کمکی هم نمی کنه که چه کاری را باید انجام بدیم تا تاپیک به نتیجه برسه . ظاهرا همون بهتر که این تاپیک هم کلا رها بشه !

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

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

s_mostafa_h
پنج شنبه 15 آذر 1386, 16:24 عصر
برای اینکه شاید بتونم کمکی کرده باشم : فعلا شروع کنید به اینکه یکسری از کارهای تکراری رو از درون فرمهاتون بیرون بکشید و به یکسری کلاسهای مستقل انتقال بدید. مثلا میتونید یک کلاس داشته باشید که تمام ارتباطات با دیتابیس رو manage کنه. یا اینکه دستورات SQL رو توش داشته باشه. یک کلاس میتونید داشته باشید برای کار با رشته ها. یک کلاس میتونید داشته باشید فرضا به نام ComboBoxHelper که یکسری از فعالیتهایی که همواره روی کامبوباکس انجام میدید رو توش داشته باشید
اینجوری میتونید فعلا یه نظم نسبی به برنامه تون بدید و از اون مهمتر اگه جایی باز نیازی پیدا کردید اون کلاس رو به پروژه add میکنید. این چیزی که گفتم تقریبا میشه Code Reuse که کار خوبیه (میتونید مجددا از یکسری از کدنویسیهاتون استفاده کنید) بعد از این وضعیت بهتری هست بنام Binary Reuse که شما بعنوان مثال از یکسری از Dll هایی که قبلا ساختید استفاده میکنید.
بعد از این دو مرحله شما ناخواسته با مفاهیمی مثل برنامه نویسی لایه ای و روشهای طراحی، design pattern ها و ... آشنا میشید و به اونها مراجعه میکیند و این قضیه همینطور ادامه داره.
یک ساختمون رو در هر صورت میشه ساخت (حتی بدون مهندسی) اما مهم اینه که چقدر بهینه ساخته بشه (از نظر هزینه) و چقدر عمر کنه (قابلیت نگهداری) و ...

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


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

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

s_mostafa_h
پنج شنبه 15 آذر 1386, 22:39 عصر
همانطوریکه دوست مان گفتند برای یک ارتباط مشترک با دیتا بیس با توجه به اینکه توی اس کیو ال یک دیتابیس داریم به نام Telephone ، بنابراین کلیه ارتباطات مان را که فرم های مختلفی را که قرا است نشون بدیم از این کلاس برای ارتباط استفاده می کنیم . بنابراین در ابتدا داخل پروژه پوشه ای درست می کنیم و کلاس های مورد نیاز این برنامه را داخل این پوشه قرار می دهیم . اولین کلاسی را که قرار است داخل این پوشه قرار دهیم ، نام آنرا DataAccess می گذاریم و کد های لازم را داخل این کلاس قرار می دهیم :

using System;
using System.Data;
using System.Data.SqlClient;

public class DataAccess
{

protected const string CONNECTION_ERROR_MSG = "ارتباط با اس کیو ال امکان پذیر نمی باشد ";

protected const string SQL_CONNECTION_STRING = "Server=localhost;DataBase=Telephone;Integrated Security=SSPI;Connect Timeout=5";

static bool DidPreviouslyConnect = false;

// Create some data adapters--one for each table.

private SqlDataAdapter sdausername;
protected string strConn = SQL_CONNECTION_STRING;
اگه تا اینجا سئوالی هست بفرمایید ؟