PDA

View Full Version : مشکل در نمایش پیغامهای ارسال شده



forodo
یک شنبه 16 تیر 1392, 15:57 عصر
سلام
در اتوماسیون اداری می خوام مثلاً وقتی 5تا پیغام به کسی می فرستم وقتی که کاربر وارد کارتابل خودش شد اون پیغامها یکی یکی به اون نشون داده شود.
الان وقتی که کاربر وارد کارتابل خودش می شه فقط اولین پیغام رو می بینه ولی بقیه بهش نشون داده نمی شه.
دوتا جدول دارم که یکیش توضیحات و دیگری پیغامها هستش که با همدیگر JOIN هستن.
ارتباطم هم با ADO.NET هست.
چیکار کنم؟؟؟
با تشکر

try

{



OleDbConnection objconnection =



new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\\radman.mdb;Persist" +



" Security Info=True;Jet OLEDB:Database Password=123456");



OleDbCommand objcommand1 = new OleDbCommand();

objcommand1.Connection = objconnection;

objcommand1.CommandText =

@"UPDATE tblMessageDatails

SET SeeOrNotSee = @SeeOrNotSee

WHERE Recievers='"


+ Program.Username + "'AND tblMessageDatails.MessageID = " + GetIDFromtblMessages;

objcommand1.Parameters.AddWithValue(

"@SeeOrNotSee", true);



objconnection.Open();

objcommand1.ExecuteNonQuery();

objconnection.Close();

}



catch (Exception)

{

}


GetIDFromtblMessages همان IDای هستش که برای ارتباط استفاده می شود.
اگر جاییش رو متوجه نشدید بگید بیشتر توضیح بگم
با تشکر

forodo
یک شنبه 16 تیر 1392, 16:34 عصر
یکی جواب بده

ya30ien2
یک شنبه 16 تیر 1392, 17:14 عصر
یعنی بصورت ارور بهش نشون میدی ؟
بهتر نیست یک پیغام بهش بدی که شما دارای مثلا 5 پیام خوانده نشده می باشید برای رویت پیام ها به صفحه ... برید
زیباتر نیست؟
حالا مثلا به صفحه پیام ها میره یه پیام داره میخواد دوباره که نرم افزار رو اجرا کرد این پیام دوباره نمایش داده بشه و اون رو بررسی نمیکنه تا دفعات بعد
البته اینا نظریه هستش

erfan_urchin
یک شنبه 16 تیر 1392, 17:15 عصر
خب الان شما با کدوم خط از کدت میخوای 5 تا پیغام رو نشون بدی؟؟؟؟

ya30ien2
یک شنبه 16 تیر 1392, 17:16 عصر
اگه بخوای که به روش خودت هر پیغام رو پشت هم اجرا کنی باید از حلقه استفاده کنی

forodo
دوشنبه 17 تیر 1392, 08:32 صبح
چطور باید از حلقه استفاده کرد؟؟؟
من مثلاً چند تا پیغام واسه یک نفر ارسال می کنم که این کار در برنامه اتوماسیون اداری هستش و اگر کاربر داخل کارتابل خودش باشه که هیچ پیغام به اون نمایش داده می شه ولی اگر در کارتابلش نباشه وقتی که وارد کارتابلش می شه اگه مثلاً 4نفر براش پیغام فرستادن با فاصله زمانی معین یا اگر مهم نیست 4تا پیغام براش باز بشه.
من نوشتم ولی فقط اولین پیغام رو میاره و بقیه اجرا نمی شه و تا اولین پیغام رو از پایگاه داده پاک نکنم اصلاً دومی رو نمی بینه.
من در اصل می خوام اگر کاربر که مثلاً یوزرش 1 هست رو هرچندتا که پیغام داره ببینه.

hamid_hr
دوشنبه 17 تیر 1392, 09:56 صبح
فقط ميخواد يه سلكت بزني از تمام پيغام هاي كاربر بعد اونا رو تو ليست بريزي

پيغامها رو بريز داخل يه ليست
ليستو ارجاع بده به فرم نمايشت
تو فرم نمايش يه تابع بساز كه بياد از تو اين ليست پيغام ها رو بخونه و نمايش بده بعد از خوندن هر پيغام با thread.sleep فاصله ايجاد كن تا كاربر وقت كنه بخونش
تابعو با thread اجرا كن

forodo
دوشنبه 17 تیر 1392, 10:10 صبح
نمی تونم فقط پیغامهارو بردارم چون به جز پیغامها به تاریخ و روز و ساعت ارسال پیغام که در بانک اطلاعاتی ذخیره شده نیز نیاز دارم.
سلکت می کنم ولی فقط اونایی رو می گم بیار که یوزرشون با یوزری که در بانک اطلاعاتی هستش یکی باشه بعد تعدادشون رو پیدا می کنم بعد یک for گذاشتم که به تعداد اونا یکی یکی شماره IDای که مربوط به اون سطر هستش رو بریزه تو آرایه. تا اینجا این یک تابع هستش.

private








void GetForMessage()

{





try

{





OleDbConnection objconnection =





newOleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\\radman.mdb;Persist" +





" Security Info=True;Jet OLEDB:Database Password=123456");





OleDbDataAdapter objDataAdapter = newOleDbDataAdapter();





DataSet objDataSet = newDataSet();

objDataAdapter.SelectCommand =



newOleDbCommand();

objDataAdapter.SelectCommand.Connection = objconnection;

objDataAdapter.SelectCommand.CommandText =





@"SELECT tblMessageDatails.Recievers, tblMessageDatails.ID

FROM tblMessageDatails, tblMessage

WHERE tblMessageDatails.Recievers = '"








+ Program.Username + "'AND tblMessageDatails.MessageID = tblMessage.ID ";

objDataAdapter.SelectCommand.CommandType =



CommandType.Text;

 

objconnection.Open();

objDataAdapter.Fill(objDataSet,



"tblPersonal_tblAddedHours");

objconnection.Close();

ffoorr =



newint[objDataSet.Tables["tblPersonal_tblAddedHours"].Rows.Count];





for (int i = 0; i <= ffoorr.Length; i++)

{

ffoorr[i] =



Convert.ToInt32(objDataSet.Tables["tblPersonal_tblAddedHours"].Rows[i]["ID"]);





// MessageBox.Show(ffoorr[i].ToString());

}



}





catch (Exception)

{

}

}



در تابعی دیگر گفتم که به تعداد اون سطرهایی که پیدا کردی بیا کارای منو انجام بده که کارام اینه که بیاد بر اساس IDهایی که در آرایه ذخیره شده اون سطر رو از بانک اطلاعاتی و با شرطهایی که گذاشتم بیاره و بعدش اون رو نمایش بده.

private








void GetDescImmediate()

{





try

{





for (int i = 0; i <= ffoorr.Length - 1; i++)

{

 





MessageBox.Show(ffoorr[i].ToString());





OleDbConnection objconnection =





newOleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\\radman.mdb;Persist" +





" Security Info=True;Jet OLEDB:Database Password=123456");





OleDbDataAdapter objDataAdapter = newOleDbDataAdapter();





DataSet objDataSet = newDataSet();

objDataAdapter.SelectCommand =



newOleDbCommand();

objDataAdapter.SelectCommand.Connection = objconnection;

objDataAdapter.SelectCommand.CommandText =





@"SELECT tblMessageDatails.SeeOrNotSee

FROM tblMessageDatails, tblMessage

WHERE tblMessageDatails.Recievers = '"








+ Program.Username + "'AND tblMessageDatails.MessageID = tblMessage.ID AND tblMessageDatails.ID = " + ffoorr[i];

objDataAdapter.SelectCommand.CommandType =



CommandType.Text;

 

objconnection.Open();

objDataAdapter.Fill(objDataSet,



"tblPersonal_tblAddedHours");

objconnection.Close();





if (Convert.ToBoolean(objDataSet.Tables["tblPersonal_tblAddedHours"].Rows[i]["SeeOrNotSee"]) == false)

{





frmGetDesc GetDesc = newfrmGetDesc();

GetDesc.ShowDialog();

}

}



}





catch (Exception)

{

}

}



حالا اینی که می خوام درست شه بعد یه فکری هم برای فاصله بین پیام ها می کنم چون با thread بلد نیستم کار کنم.
راستی وقتی اجرا می کنم اروره There is no row at position 1. رو میده که روی
ffoorr[i]
که می رم می گه 0 هستش وقتی اینو برمی دارم دیگه اون ارور رو نمی ده.با تشکر

hamid_hr
دوشنبه 17 تیر 1392, 10:40 صبح
اول پيشنهاد ميكنم بري Thread ياد بگيري خيلي بهت كمك ميكنه بنظر من پروژه بدون Thread اصلا نميشه

دوم بيا همون مراحلي كه گفتم رو برو ولي به جاي ليست از پيغام هات ليستي از كليد اصلي جدولت بده به فرم
تو فرم هم يه سلكت بزن و اطلاعات اون كليد اصلي رو در بيار و نمايش بده

forodo
دوشنبه 17 تیر 1392, 11:14 صبح
همینکار رو می کنم ولی فقط پیغام اولی رو بهم نشون می ده و به تابع هم نوشتم که هنگامی که پیغام ظاهر شد یک تیک در بانک اطلاعاتی در همان سطر بزند .
وقتی وارد بانک اطلاعاتی می شوم فقط همان پیغام اولی تیک خورده است و اونای دیگه انگار نه انگار.


private








void GetAssign()

{





try

{





OleDbConnection objconnection =





newOleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\\radman.mdb;Persist" +





" Security Info=True;Jet OLEDB:Database Password=123456");





OleDbCommand objcommand1 = newOleDbCommand();

objcommand1.Connection = objconnection;

objcommand1.CommandText =



@"UPDATE tblMessageDatails

SET SeeOrNotSee = @SeeOrNotSee

WHERE Recievers='"








+ Program.Username + "'AND tblMessageDatails.MessageID = " + GetIDFromtblMessages;

objcommand1.Parameters.AddWithValue(



"@SeeOrNotSee", true);



objconnection.Open();

objcommand1.ExecuteNonQuery();

objconnection.Close();

}





catch (Exception)

{

}

}






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

private








void GetControlValues()

{





try

{





OleDbConnection objconnection =





newOleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\\radman.mdb;Persist" +





" Security Info=True;Jet OLEDB:Database Password=123456");





OleDbDataAdapter objDataAdapter = newOleDbDataAdapter();





DataSet objDataSet = newDataSet();

objDataAdapter.SelectCommand =



newOleDbCommand();

objDataAdapter.SelectCommand.Connection = objconnection;

objDataAdapter.SelectCommand.CommandText =





@"SELECT tblMessage.DescD, tblMessage.DateDate, tblMessage.TimeTime,

tblMessage.DayDay

FROM tblMessage, tblPersonal, tblMessageDatails

WHERE tblMessage.ID = tblMessageDatails.MessageID "








;

objDataAdapter.SelectCommand.CommandType =



CommandType.Text;

objconnection.Open();

objDataAdapter.Fill(objDataSet,



"tblPersonal_tblAddedHours");

objconnection.Close();

 

txtDesc.Text = objDataSet.Tables[



"tblPersonal_tblAddedHours"].Rows[0]["DescD"].ToString();

lblDay.Text = objDataSet.Tables[



"tblPersonal_tblAddedHours"].Rows[0]["DayDay"].ToString();

lblDate.Text = objDataSet.Tables[



"tblPersonal_tblAddedHours"].Rows[0]["DateDate"].ToString();

lblTime.Text = objDataSet.Tables[



"tblPersonal_tblAddedHours"].Rows[0]["TimeTime"].ToString();

}





catch (Exception)

{





}






مشکل من این نیست که پیام نشان داده نمی شه مشکل من اینه که وقتی اولین پیام رو نشون میده دیگه پیامهای دیگه رو نشون نمی ده نمی دونم کجای کارم مشکل داره.
تا اون پیام رو از بانک اطلاعاتی پاک نکنم بعدی رو نشون نمی ده.
کلاً اگه 100 تا پیام هم باشه فقط اولی رو نشون می ده و انگار اصلاً فقط یه دونه پیغام بوده.
اگر هم تیک نشان ندادنش بخوره باز پیامهای دیگه رو نشون نمی ده.

خواهشاً کمک کنید که دیگه بدجور گیر کردم.
با تشکر

ya30ien2
دوشنبه 17 تیر 1392, 15:18 عصر
فکر کنم بخاطر این هستش که داخل رویداد لود گذاشتی فکر کنم باید داخل تایمر اجرا کنی مشکلت حل شه

forodo
دوشنبه 17 تیر 1392, 18:24 عصر
تابع زیر که برای باز کردن یک فرم دیگر است که پیغام در اون نمایش داده می شه در داخل تایمر گذاشتم ولی بازم همان اتفاقاتی که در بالا گفتم می افته.

private void GetDescImmediate()
{
try
{
for (int i = 0; i <= ffoorr.Length - 1; i++)
{
OleDbConnection objconnection = new OleDbConnection
("Provider=Microsoft.Jet.OLEDB.4 .0;Data Source=|DataDirectory|\\radman.mdb;Persist" + " Security Info=True;Jet OLEDB:Database Password=123456");
OleDbDataAdapter objDataAdapter = new OleDbDataAdapter();
DataSet objDataSet = new DataSet();
objDataAdapter.SelectCommand = new OleDbCommand();
objDataAdapter.SelectCommand.Connection = objconnection;
objDataAdapter.SelectCommand.CommandText = @"SELECT tblMessageDatails.SeeOrNotSee
FROM tblMessageDatails, tblMessage
WHERE tblMessageDatails.Recievers = '" + Program.Username + "'AND tblMessageDatails.MessageID = tblMessage.ID AND tblMessageDatails.ID = " + ffoorr[i];
objDataAdapter.SelectCommand.CommandType = CommandType.Text;
objconnection.Open();
objDataAdapter.Fill(objDataSet, "tblPersonal_tblAdd edHours");
objconnection.Close();
if (Convert.ToBoolean(objDataSet.Tables["tblPersonal_tblAddedHours"].Rows[i]["SeeOrNotSee"]) == false)
{
frmGetDesc GetDesc = newfrmGetDesc();
GetDesc.ShowDialog();
}
}
}
catch (Exception)
{

}

}

دیگه نمی دونم چیکار کنم!!
یک کمکی بکن نوکرتم.

hamid_hr
دوشنبه 17 تیر 1392, 18:28 عصر
ffoorr چي هست؟
ببين من حدس ميزنم اولي رو كه نشون ميده خطا ايجاد ميشه ميره از حلقه بيرون

forodo
دوشنبه 17 تیر 1392, 18:52 عصر
ffoorr آرایه ای هست که گفتم IDهای اون سطرهایی رو که می خوام برام بریزه توش که در کد بالای پیام شما نوشتمش برای این است که به تعداد سطرهایی که پیدا می کنه سلکت رو انجام بده و بر اساس شماره IDای که توی آرایه هستش کار رو انجام بده.
در مورد اررور که شما گفتی تو پست 8 نوشتم که:
وقتی اجرا می کنم اروره There is no row at position 1. رو میده که روی ffoorr[i] که می رم می گه 0 هستش وقتی اینو برمی دارم دیگه اون ارور رو نمی ده.
فقط وقتی اونو می نویسم این اررور رو می ده وگرنه اگر اون نباشه یک برک پوینت هم روی قسمت کش می ذارم ولی برنامه هیچ ایرادی نمی گیره.
ممنون که برای ما وقت گذاشتی.
اگه چیز دیگه ای به ذهنتون می رسه بگین.
با تشکر

hamid_hr
دوشنبه 17 تیر 1392, 19:04 عصر
چرا تو سلكت يك دونه رو ميخوني
بيا همشونو بخون يك دفعه بريز داخل objDataSet بعد يه حلقه بزار دونه دونه نمايش بده
اينطوري برا هر سطر نميخواد سلكت اجرا بشه

forodo
دوشنبه 17 تیر 1392, 20:16 عصر
یعنی شما می گی حلقه رو قبل از if بذارم؟
یعنی چی یک دونه رو می خونه؟؟؟
مگه اینی که نوشتم کل سطرهایی رو که براش شرط گذاشتم نمیاره؟؟؟

forodo
سه شنبه 18 تیر 1392, 08:43 صبح
یک HELPای برسونید.

hamid_hr
سه شنبه 18 تیر 1392, 08:48 صبح
WHERE tblMessageDatails.Recievers = '" + Program.Username + "'AND tblMessageDatails.MessageID = tblMessage.ID AND tblMessageDatails.ID = " + ffoorr[i]
ببين اين شرطا رو طوري بنويس كه همه ركوردا مخصوص يك نفر رو بياره برات بريزه داخل ديتاست
بعد اون حلقه رو بزار دونه دونه بخونه و بفرسته به فرم نمايشت

forodo
سه شنبه 18 تیر 1392, 09:58 صبح
ممنون ولی اون ffoorrای که گذاشتم برای همین هستش.

tblMessageDatails.Recievers = '" + Program.Username + "'

شرط بالا بررسی می کنه که اون یوزری که الان داخل برنامه هست با یوزری که در جدول tblMessageDatails هست یکی باشه که Recievers برای کسی است که پیغام براش ارسال شده.

tblMessageDatails.MessageID = tblMessage.ID

شرط بالا بررسی می کنه که شماره سطر جدول tblMessage با شماره سطری که در جدول tblMessageDatails این هست یکی باشه. MessageID یک فیلد است که ارتباط داره با جدول tblMessage . که این برای این است که یک فرد ممکن است یک پیغام رو برای چند نفر ارسال کند.

tblMessageDatails.ID = " + ffoorr[i]

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

hamid_hr
سه شنبه 18 تیر 1392, 10:31 صبح
خب ببين اون سلكت و اينا رو قبل از حلقه بدون شرط اخر بنويس تا همه سطر هاي مربوطه رو بريزه داخل ديتاست
بعد اينطوري پيمايش كن و نمايش بده
for (int i = 0; i < objDataSet.Tables[0].Rows.Count; i++)
{
if (Convert.ToBoolean(objDataSet.Tables["tblPersonal_tblAddedHours"].Rows[i]["SeeOrNotSee"]) == false)
{
frmGetDesc GetDesc = newfrmGetDesc();
GetDesc.ShowDialog();
}
}

forodo
سه شنبه 18 تیر 1392, 14:50 عصر
نشد!!!
همون کار شمارو انجام دادم ولی نشد.
این سری کد رو عوض کردم ببینم اصلاً مشکل از کجاست. گفتم شاید اینکه می خواید یه فرم دیگه باز کند مشکل داره ولی ......

for


(int i = 0; i <= objDataSet.Tables["tblPersonal_tblAddedHours"].Rows.Count - 1; i++)

{



if (Convert.ToInt32(objDataSet.Tables["tblPersonal_tblAddedHours"].Rows[i]["SeeOrNotSee"]) == 0)

{



MessageBox.Show("yes");

}



else

{



MessageBox.Show("no");

}

}

چون تابع رو داخل یک تایمر گذاشتم هر یک ثانیه مسیج باکس میاد که می گه yes که فقط واسه اولی هستش.
نمی دونم گیر کار کجاست؟؟؟!!!!!!!!!!!!!

hamid_hr
سه شنبه 18 تیر 1392, 14:59 عصر
ميتوني كل كدا رو برام تو پ خ بفرستي

forodo
سه شنبه 18 تیر 1392, 15:40 عصر
پ خ کجاست؟
بلد نیستم.
شرمنده.
بگی کجاست می فرستم.

matrix-program
سه شنبه 18 تیر 1392, 15:48 عصر
پ خ مخفف پیام خصوصی هستش
برو تو پروفایل کاربری که میخوای بهش پیام بدی و ارسال پیام خصوصی رو بزن