PDA

View Full Version : برنامه را نصب كردم روي سيستم مقصد موقع گزارش گرفتن پسوورد ميخواد در صورتي كه پسوورد نگذاشتم



csharpprogramer88
یک شنبه 02 خرداد 1389, 15:51 عصر
سلام
دوستان من چند برنامه مجزا را به يك روش نوشتم چندتاي قبلي را نصب كردم و مشكلي نداره ولي يكي را كه بردم روي سيستم مقصد و نصب كردم موقع وارد كردن اطلاعات مشكلي ندارد و درست درج و حذف و ويرايش را انجام ميده اما زماني كه ميخوام گزارش تهيه كنم پيغامي مانند پيغام زير مياد كه از من username و password ميخواد در صورتي كه من هيچگونه password روي گزارش نگذاشتم .
دوستان موضوع خيلي حياتي وو حيثيتي شده خواهشا بررسي كنيد چون زياد وقت ندارم

M.YasPro
یک شنبه 02 خرداد 1389, 16:20 عصر
سلام
عکس کامل نمیاد .
ولی احتمالا شما از ویزارد برای کانکت شدن به دیتابیس استفاده کردید و اطلاعات رو کامل اونجا وارد نکردید که تو runtime از شما میپرسه .

csharpprogramer88
یک شنبه 02 خرداد 1389, 16:35 عصر
دوست عزيز من از ويزارد استفاده نكردم از طريق كد نويسي انجام دادم همه چيز درست پيش ميره درست در زماني كه ميخواد اطلاعات را بياره اينطوري ميشه شما مي گي چيكار كنم منم كه با express كار مي كنم

csharpprogramer88
یک شنبه 02 خرداد 1389, 18:15 عصر
اينم اضافه كنم كه من 4 جدول را با هم در يك گزارش دارم طراحي ميكنم و روي سيستم من مشكلي نداره ولي روي سيستم مقصد مشكل داره

s.khoshfekran
یک شنبه 02 خرداد 1389, 21:49 عصر
دوست عزیز از tableLogOnInfo استفاده کن یه search بزنی حل میشه!!
اینم شاید بدردت بخوره

reportDocument1.SetDatabaseLogon("","")

بازم اگه سوالی بود در خدمتم!

sara.f
یک شنبه 02 خرداد 1389, 23:24 عصر
سلام
شما می تونید تابعی جداگانه تعریف کنید(در فرم گزارش) و با نوشتن چند خط کد عمل set کردن دیتابیس را انجام بدید.مثلا تابعی به صورت زیر

private void setConnection(CrystalDecisions.CrystalReports.Engi ne.ReportClass reportClass)
{
CrystalDecisions.Shared.TableLogOnInfo myLogin;
foreach (CrystalDecisions.CrystalReports.Engine.Table myTable in reportClass.Database.Tables)
{
myLogin = myTable.LogOnInfo;
myLogin.ConnectionInfo.IntegratedSecurity = true;
myLogin.ConnectionInfo.ServerName = @".\SQLEXPRESS";
myTable.ApplyLogOnInfo(myLogin);
}
}

حالا هر جایی که بخواید گزارش را load کنید میتونید از این تابع استفاده کنید، به طور مثال:

CrystalReport1 reportDocument = new CrystalReport1();
setConnection(reportDocument);
crystalReportViewer1.ReportSource = reportDocument;

csharpprogramer88
دوشنبه 03 خرداد 1389, 07:38 صبح
سلام از شما متشكرم كه به مشكل من رسيدگي كردي د خودم تستش كردم بازم user , pass ميخواد
hamsaranCrystalReport نام كريستال طراحي شده است كه من فيلد ها را در آن گذاشتم


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using System.Data.SqlClient;

namespace khanevade.hamsaran
{
public partial class moshakhasathamsaran_report : DevComponents.DotNetBar.Office2007Form
{
SqlDataReader dr;
SqlDataAdapter da;
SqlConnection con;
SqlCommand cmd;
DataSet ds;
BindingSource bs;

public moshakhasathamsaran_report()
{
InitializeComponent();
da = new SqlDataAdapter();
con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\khanevade.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
cmd = new SqlCommand();
ds = new DataSet();
bs = new BindingSource();

}
private void setConnection(CrystalDecisions.CrystalReports.Engi ne.ReportClass reportClass)
{
CrystalDecisions.Shared.TableLogOnInfo myLogin;
foreach (CrystalDecisions.CrystalReports.Engine.Table myTable in reportClass.Database.Tables)
{
myLogin = myTable.LogOnInfo;
myLogin.ConnectionInfo.IntegratedSecurity = true;
myLogin.ConnectionInfo.ServerName = @".\SQLEXPRESS";
myTable.ApplyLogOnInfo(myLogin);
}
}

private void moshakhasathamsaran_report_Load(object sender, EventArgs e)
{
hamsaranCrystalReport reportDocument = new hamsaranCrystalReport();
setConnection(reportDocument);
crystalReportViewer1.ReportSource = reportDocument;


da = new SqlDataAdapter(hamsaran.sabt_o_edit_hamsaran.sqlse lect, con);
da.Fill(ds, "moshakhasathamsaran");
bs.DataSource = ds.Tables["moshakhasathamsaran"];

hamsaran.hamsaranCrystalReport h = new hamsaranCrystalReport();
h.SetDataSource(ds);
this.crystalReportViewer1.ReportSource =h;


}
}
}


دوست من هنوز همون مشكل وجود داره و همون خطاي تصوير اول را ميده

s.khoshfekran
دوشنبه 03 خرداد 1389, 08:16 صبح
دوست عزیز تو کد sara.f این رو هم اصافه کن ببین درست میشه ؟؟

reportDocument1.SetDatabaseLogon("","")

csharpprogramer88
دوشنبه 03 خرداد 1389, 10:25 صبح
سلام به همه دوستان تشكر از اينكه جواب داديد من منبع مشكل را پيدا كردم .
قضيه از اين قراره كه من ابتدا اطلاعات فردي افراد مانند نام و ش .ش و ... را درج ميكنم و سپس در گريد ويو نشان ميدم كه تا اينجا در جدول مشخصات است پس از آن اطلاعات تحصيلات را در جدول تحصيلات و اطلاعات شغل را در جدول شغل درج مي كنم و تمام اين جداول داراي يك كليد اصلي يكسان هستند يعني وقتي روي سطر اول گرديد كليك مي كنم اطلاعات تحصيلات از جدول تحصيلات و اطلاعات شغل از جدول شغل در تكست باكس هايي تعريف كردم نشان داده ميشود كه به اين نوع فرم ها master /details گفته مي شود .
من امتحان كردم همان گزارشي را كه يوزر و پسوورد ميخواست را با يك جدول طراحي كردم بدون هيچ مشكلي اجرا شد ولي زماني كه با دو يا سه جدول اجرا مي كنم يوزر و پسوورد ميخواد .
كدها را بصورت زير نوشتم :


sqlselect = "select * from moshakhasathamsaran";
hamsaran.moshakhasathamsaran_report frm = new moshakhasathamsaran_report();
frm.Show();



اين كد را براي يك دكمه نوشتم و به صفحه ديگري كه crystalReportViewer1 در اونجا قرار داره پاس ميدم .البته اينم بگم اين فقط براي جدول اولي هست و براي جداول ديگر نميدونم چيكار بايد بكنم
اينم براي فرمي كه در اون crystalReportViewer1 قرار دارد


private void moshakhasathamsaran_report_Load(object sender, EventArgs e)
{

da = new SqlDataAdapter(hamsaran.sabt_o_edit_hamsaran.sqlse lect, con);
da.Fill(ds, "moshakhasathamsaran");
bs.DataSource = ds.Tables["moshakhasathamsaran"];

hamsaran.hamsaranCrystalReport h = new hamsaranCrystalReport();
h.SetDataSource(ds);
this.crystalReportViewer1.ReportSource = h;

}



دوستان اين مشكل در سيستم خودم وجود نداره فقط روي سيستم مقصد اشكال مي گيره

csharpprogramer88
دوشنبه 03 خرداد 1389, 12:49 عصر
يعني چطوري من كه نرم افزار پكيج تحويل ميدم

sara.f
دوشنبه 03 خرداد 1389, 12:52 عصر
يعني چطوري من كه نرم افزار پكيج تحويل ميدم

چیزی که گفتم را فراموش کنید، الان که داشتم کدهاتون را نگاه می کردم چند تا مورد را متوجه نشدم!

sara.f
دوشنبه 03 خرداد 1389, 12:57 عصر
سلام از شما متشكرم كه به مشكل من رسيدگي كردي د خودم تستش كردم بازم user , pass ميخواد
hamsaranCrystalReport نام كريستال طراحي شده است كه من فيلد ها را در آن گذاشتم



private void setConnection(CrystalDecisions.CrystalReports.Engi ne.ReportClass reportClass)
{
CrystalDecisions.Shared.TableLogOnInfo myLogin;
foreach (CrystalDecisions.CrystalReports.Engine.Table myTable in reportClass.Database.Tables)
{
myLogin = myTable.LogOnInfo;
myLogin.ConnectionInfo.IntegratedSecurity = true;
myLogin.ConnectionInfo.ServerName = @".\SQLEXPRESS";
myTable.ApplyLogOnInfo(myLogin);
}
}

private void moshakhasathamsaran_report_Load(object sender, EventArgs e)
{
hamsaranCrystalReport reportDocument = new hamsaranCrystalReport();
setConnection(reportDocument);
crystalReportViewer1.ReportSource = reportDocument;


da = new SqlDataAdapter(hamsaran.sabt_o_edit_hamsaran.sqlse lect, con);
da.Fill(ds, "moshakhasathamsaran");
bs.DataSource = ds.Tables["moshakhasathamsaran"];

hamsaran.hamsaranCrystalReport h = new hamsaranCrystalReport();
h.SetDataSource(ds);
this.crystalReportViewer1.ReportSource =h;


}
}
}


دوست من هنوز همون مشكل وجود داره و همون خطاي تصوير اول را ميده

من این کارتون را متوجه نمیشم که چرا دوبار گزارش را به عنوان Source این CrystalReportViewer1 قرار دادید؟

csharpprogramer88
دوشنبه 03 خرداد 1389, 13:01 عصر
فراموش كنم كه نميشه توروخدا يكي يه راه حل بده نميدونم تاپيك بالا منظورم را رسانده يا نه

sara.f
دوشنبه 03 خرداد 1389, 13:11 عصر
فراموش كنم كه نميشه توروخدا يكي يه راه حل بده نميدونم تاپيك بالا منظورم را رسانده يا نه

دوست عزیز خب کمک چطوری دیگه؟ شما هم اصل قضیه را بیخیال میشید و انگار فقط همون جمله "فراموش کن " بنده براتون جالبه!
اگه از من کمک خواستید باید بگم که متاسفانه یا خوشبختانه بنده علم غیب ندارم که حدس بزنم مشکل از کجاست، پس اگر میخواید به جواب برسید به سوالاتی که ازتون میشه پاسخ بدید اونم با دقت. :لبخندساده:
حالا برگردید به دوتا پست قبل از این و به سوال پاسخ بدید.
پیروز باشی.

csharpprogramer88
دوشنبه 03 خرداد 1389, 13:16 عصر
hamsaran.hamsaranCrystalReport h = new hamsaranCrystalReport();
h.SetDataSource(ds);
this.crystalReportViewer1.ReportSource =h;


hamsaranCrystalReport نام خود كريستالي هست كه من فيلدهاي جدول را در اونجا گذاشتم و گزارش طراحي كردم ds هم مربوط به DataSet هست


this.crystalReportViewer1.ReportSource =h;
اينم كه به معني مشخص كردن ReportSource كريستال است .
در مورد اين كد :


hamsaranCrystalReport reportDocument = new hamsaranCrystalReport();
setConnection(reportDocument);
crystalReportViewer1.ReportSource = reportDocument;

خودتون گفتيد ه اينطوري استفاده كنم

sara.f
دوشنبه 03 خرداد 1389, 13:29 عصر
hamsaran.hamsaranCrystalReport h = new hamsaranCrystalReport();
h.SetDataSource(ds);
this.crystalReportViewer1.ReportSource =h;


hamsaranCrystalReport نام خود كريستالي هست كه من فيلدهاي جدول را در اونجا گذاشتم و گزارش طراحي كردم ds هم مربوط به DataSet هست


this.crystalReportViewer1.ReportSource =h;
اينم كه به معني مشخص كردن ReportSource كريستال است .
در مورد اين كد :


hamsaranCrystalReport reportDocument = new hamsaranCrystalReport();
setConnection(reportDocument);
crystalReportViewer1.ReportSource = reportDocument;

خودتون گفتيد ه اينطوري استفاده كنم

:لبخندساده:
من که نگفتم بیاید یه بار یه نمونه به نام ReportDocument تعریف کنید و یه بارم یکی به نام h، اصلا این کار لازم نیست و اشتباه میشه.
شما وقتی میخواید یک گزارش را load کنید ، باید فقط یک فرم گزارش را به عنوان source به CrystalReportViewer بدید( منظورم در یک زمانه)
پس این قسمت را کلا حذف کنید.

hamsaranCrystalReport reportDocument = new hamsaranCrystalReport();
setConnection(reportDocument);
crystalReportViewer1.ReportSource = reportDocument;

و کدتون را اینطوری اصلاح کنید.

hamsaran.hamsaranCrystalReport h = new hamsaranCrystalReport();
setConnection(h);
h.SetDataSource(ds);
this.crystalReportViewer1.ReportSource = h;

حالا اجراش کنید و بیبینید دیگه مشکلی نیست؟

csharpprogramer88
دوشنبه 03 خرداد 1389, 14:13 عصر
:لبخندساده:
من که نگفتم بیاید یه بار یه نمونه به نام ReportDocument تعریف کنید و یه بارم یکی به نام h، اصلا این کار لازم نیست و اشتباه میشه.
شما وقتی میخواید یک گزارش را load کنید ، باید فقط یک فرم گزارش را به عنوان source به CrystalReportViewer بدید( منظورم در یک زمانه)
پس این قسمت را کلا حذف کنید.

hamsaranCrystalReport reportDocument = new hamsaranCrystalReport();
setConnection(reportDocument);
crystalReportViewer1.ReportSource = reportDocument;

و کدتون را اینطوری اصلاح کنید.

hamsaran.hamsaranCrystalReport h = new hamsaranCrystalReport();
setConnection(h);
h.SetDataSource(ds);
this.crystalReportViewer1.ReportSource = h;

حالا اجراش کنید و بیبینید دیگه مشکلی نیست؟


دوست من درست نشد هنوز هم يوززر و پس ميخواد
آخرين كدي كه با راهنمايي شما نوشتم :



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using System.Data.SqlClient;

namespace khanevade.hamsaran
{
public partial class moshakhasathamsaran_report : DevComponents.DotNetBar.Office2007Form
{
SqlDataReader dr;
SqlDataAdapter da;
SqlConnection con;
SqlCommand cmd;
DataSet ds;
BindingSource bs;

public moshakhasathamsaran_report()
{
InitializeComponent();
da = new SqlDataAdapter();
con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\khanevade.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
cmd = new SqlCommand();
ds = new DataSet();
bs = new BindingSource();

}
private void setConnection(CrystalDecisions.CrystalReports.Engi ne.ReportClass reportClass)
{
CrystalDecisions.Shared.TableLogOnInfo myLogin;
foreach (CrystalDecisions.CrystalReports.Engine.Table myTable in reportClass.Database.Tables)
{
myLogin = myTable.LogOnInfo;
myLogin.ConnectionInfo.IntegratedSecurity = true;
myLogin.ConnectionInfo.ServerName = @".\SQLEXPRESS";
myTable.ApplyLogOnInfo(myLogin);
}
}

private void moshakhasathamsaran_report_Load(object sender, EventArgs e)
{
hamsaran.hamsaranCrystalReport h = new hamsaranCrystalReport();
setConnection(h);
h.SetDataSource(ds);
this.crystalReportViewer1.ReportSource = h;
}
}
}


دوست عزيز به صفحه قبل پست 9 سري بزنيد شايد بهتر بتونيد كمك كنيد

MahmoudiNik
دوشنبه 03 خرداد 1389, 18:35 عصر
سلام
دوست عزیز نمیدونم این حدسی که میزنم درسته یا نه:متفکر:
1-اگه به عنوان پنجره نگاه کنید میبینید که به وصل شدن دیتا بیس مربوطه پس به کد زیاد ربطی نداره
ضمن اینکه در سیستم خودتون درسته
2-اگر روی سیستم طرف sql را بصورت engine از طریق ستاپ ساز مربوطه نصب میکنید (یا کل اس کیو ال رو سیستمشون نصبه) اونوخت در زمان نصب اس کیو ال نحوع لاگین بصورت
مخلوط یا با یوزر پسود هستش

در کل فکر کنم مشکل از دسترسی به جداوله! که با بعضی یوزر ها نمیشه به جداولی دسترسی داشت مثل محیط های شبکه!
------------------------------------------------
راه حل:
بستری که کامپیوتر شما برنامه را اجرا می کند چک کنید
سیستم مقابل را مثل سیستم خود بکنید از نظر بستر اجرایی
--------------------------------------
موفق باشد

mn_zandy63
دوشنبه 03 خرداد 1389, 22:55 عصر
سلام دوست من،
کدی که نوشتی ایراد داره، اما اول یه کار کن، فایل گزارشت رو اینجا بذار یه نیگاه بهش بندازیم.

دو حالت داره، یا شما داری dataset رو fill میکنی و از اون استفاده میکنی و اطلاعات قراره از اونجا خونده شه، که دیگه کل تابع setConnection بیخوده، یا قراره گزارشت مستقیم به دیتابیس وصل شه و اطلاعات رو از اونجا بخونه، که در اونصورت ConnectionString و Dataset و DataAdapter و Fill کردن DataSet و این قسمتا اضافیه.

اگه اونطور که خودت گفتی از سه تا جدول ساختی گزارشت رو یعنی دقیقا سه تا جدول رو آوردی داخل گزارش و با هم join کردی، اگه قرار بود از حالت دوم استفاده کنی، یعنی dataset رو fill کنی، باید سه تا DataAdapter میداشتی، اما حالا که فقط یکی داری، یعنی احتمالا از حالت اول داری استفاده میکنی، یعنی ارتباط مستقیم گزارشت با دیتابیس.

من عموما از روش دوم استفاده میکنم، بنابراین اگه از روش اول رفته باشی ممکنه نتونم کمکت کنم. پنجره ای که باز شده یعنی اطلاعات مربوط به Connect به دیتابیست مشکل داره.
شما وقتی که SQL Server رو روی سیستم های کلاینتت نصب میکنی دقیقا چه شکلی نصبش میکنی و چه کاربرایی براش تعریف میکنی، آیا وقتی که نصب میشه روی حالت Mixed Mode نصبش میکنی یا نه؟

موفق باشی

mn_zandy63
دوشنبه 03 خرداد 1389, 22:59 عصر
یه امتحان هم کن،
داخل این تابع که نوشتی:

public moshakhasathamsaran_report()
{
InitializeComponent();
da = new SqlDataAdapter();
con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\khanevade.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
cmd = new SqlCommand();
ds = new DataSet();
bs = new BindingSource();

}


خط آخرش بنویس Con.Open() همین، بعد ببین اصلا برنامه ات روی سیستم کلاینتهات خطا نمیده؟
اگه خطا داد، معنیش اینه که کاربری که برنامه ات داره روش اجرا میشه به SQL دسترسی نداره و مشکل گزارشت هم به همین دلیله.

mn_zandy63
دوشنبه 03 خرداد 1389, 23:01 عصر
و یه سوال دیگه،
اون پنجره که باز میشه، وقتی روی Finish کلیک میکنی، گزارشت باز میشه؟

csharpprogramer88
دوشنبه 03 خرداد 1389, 23:04 عصر
آقا من موقع ساخت ستاپ تيك مربوط به اس كيو ال را مي زنم همانطوري كه در پست هاي قبلي گفتم زماني كه گزارش را تغيير دادم و فقط يك جدول قرار دادم مشكلي نداره

csharpprogramer88
دوشنبه 03 خرداد 1389, 23:05 عصر
نه عزيزم همچنان كه finish ميزنم بازم ازم يوزر پسوورد مي خواد

csharpprogramer88
دوشنبه 03 خرداد 1389, 23:11 عصر
یه امتحان هم کن،
داخل این تابع که نوشتی:

public moshakhasathamsaran_report()
{
InitializeComponent();
da = new SqlDataAdapter();
con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\khanevade.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
cmd = new SqlCommand();
ds = new DataSet();
bs = new BindingSource();

}


خط آخرش بنویس Con.Open() همین، بعد ببین اصلا برنامه ات روی سیستم کلاینتهات خطا نمیده؟
اگه خطا داد، معنیش اینه که کاربری که برنامه ات داره روش اجرا میشه به SQL دسترسی نداره و مشکل گزارشت هم به همین دلیله.

دوست من برنامه كه تحت شبكه نيست .يه برنامه ساده هست كه روي يه سيستم نصب ميشه

mn_zandy63
دوشنبه 03 خرداد 1389, 23:24 عصر
سلام دوست من،
خدا خیرت بده، حداقل به احترام تعداد خطوطی که تایپ کردم با توجه میخوندی :چشمک:
خب اگه وارد نمیشه فرضم رو بیشتر تایید میکنه.

یه زحمت بکش و کدی که گفتم رو به برنامه ات اضافه کن و تست کن.
فایل گزارشت رو هم بذار اینجا.
ممنون.

موفق باشی

mn_zandy63
دوشنبه 03 خرداد 1389, 23:27 عصر
راستی یه سوال،
ببینم بقیه برنامه ات روی سیستم های کاربرت کار میکنه؟
توی بقیه برنامه ات جای دیگه ای اتصال به دیتابیس داری؟ یعنی هیچ جای دیگهء برنامه هیچ Connection ای open میکنی؟ اگه آره از چه Connection String ای استفاده می کنی؟

موفق باشی

csharpprogramer88
دوشنبه 03 خرداد 1389, 23:33 عصر
con.Open();
را اونجايي كه گفتيد قرار دادم ولي بازم همونه هيچ فرقي نكرده

csharpprogramer88
دوشنبه 03 خرداد 1389, 23:38 عصر
راستی یه سوال،
ببینم بقیه برنامه ات روی سیستم های کاربرت کار میکنه؟
توی بقیه برنامه ات جای دیگه ای اتصال به دیتابیس داری؟ یعنی هیچ جای دیگهء برنامه هیچ Connection ای open میکنی؟ اگه آره از چه Connection String ای استفاده می کنی؟

موفق باشی

آره استفاده ميكنم از همين كانكشن ، و مشكل نداره و اجرا ميشه

mn_zandy63
سه شنبه 04 خرداد 1389, 00:02 صبح
خب، آیا قبل از اینکه این گزارشت باز بشه هیچ کدوم از اون Connection ها باز میشه؟
ببین شما Connection رو که باز میکنی تازه دیتابیست وصل میشه به SQL Server،
بنابراین اگه مستقیم رفته باشی سر گزارش اصلا دیتابیست وصل نشده هنوز
اگه مطمئنی که جاهای دیگه Connection هات دارن به حالت Integrated Security وصل میشن، و قبل از باز شدن این گزارش حداقل یکیشون باز میشه، معنیش اینه که اون خط کدی که بهت گفتم اضافه کنی هم نباید خطا بده، و در نتیجه احتمالا کدی که نوشتی مشکلی نداره، (به جز اون خطوطی که بهت گفتم کلا اضافیه، اما تاثیری تو کل قضیه نمیذارن) و اطلاعات من هم بیشتر از این جواب نمیده.

در غیر اینصورت احتمالا یا دیتابیست هنوز Attach نشده یا اگه شده کاربر جاری ویندوزت به دیتابیس دسترسی نداره.

اگه در نهایت جواب نگرفتی گزارشت رو بذار اینجا تا بهت بگم چه شکلی میتونی بدون ارتباط مستقیم گزارش به دیتابیس، گزارشت رو نمایش بدی.

موفق باشی

csharpprogramer88
سه شنبه 04 خرداد 1389, 00:13 صبح
من با همين كانشن استرينگ سلكت و اينسرت ميكنم و تازه يك از يك بخش ديگه گزارش هم ميگيريم . اما باز هم ميگم زماني كه اين دو جدول را با هم استفاده ميكنم به اين مشكل برميخوره

sara.f
سه شنبه 04 خرداد 1389, 00:14 صبح
سلام دوست من،
کدی که نوشتی ایراد داره، اما اول یه کار کن، فایل گزارشت رو اینجا بذار یه نیگاه بهش بندازیم.

دو حالت داره، یا شما داری dataset رو fill میکنی و از اون استفاده میکنی و اطلاعات قراره از اونجا خونده شه، که دیگه کل تابع setConnection بیخوده، یا قراره گزارشت مستقیم به دیتابیس وصل شه و اطلاعات رو از اونجا بخونه، که در اونصورت ConnectionString و Dataset و DataAdapter و Fill کردن DataSet و این قسمتا اضافیه.

اگه اونطور که خودت گفتی از سه تا جدول ساختی گزارشت رو یعنی دقیقا سه تا جدول رو آوردی داخل گزارش و با هم join کردی، اگه قرار بود از حالت دوم استفاده کنی، یعنی dataset رو fill کنی، باید سه تا DataAdapter میداشتی، اما حالا که فقط یکی داری، یعنی احتمالا از حالت اول داری استفاده میکنی، یعنی ارتباط مستقیم گزارشت با دیتابیس.

من عموما از روش دوم استفاده میکنم، بنابراین اگه از روش اول رفته باشی ممکنه نتونم کمکت کنم. پنجره ای که باز شده یعنی اطلاعات مربوط به Connect به دیتابیست مشکل داره.
شما وقتی که SQL Server رو روی سیستم های کلاینتت نصب میکنی دقیقا چه شکلی نصبش میکنی و چه کاربرایی براش تعریف میکنی، آیا وقتی که نصب میشه روی حالت Mixed Mode نصبش میکنی یا نه؟

موفق باشی

سلام
میخواستم بدونم، مگه واسه همون dataset هم نباید از setconnection استفاده کرد؟
منظورم اینه که ما چه از dataset استفاده کنیم و چه گزارش را مستقیما به دیتابیس متصل کنیم، به هر حال باید اول کار برای آوردن فیلدها بر روی فرم از جداول موجود در دیتا بیس استفاده کنیم، پس در هر دو صورت باید از setconnection استفاده کنیم. درسته؟

mn_zandy63
سه شنبه 04 خرداد 1389, 00:18 صبح
فایلت رو گرفتم، نیگاش میکنم،
امکانش هست، کد بقیه ارتباط ها و نمایش گزارشها رو که ندیدیم.
شاید جاهای دیگه از روش دوم که چند پست پیش توضیح دادم استفاده کرده باشید.
موفق باشید

csharpprogramer88
سه شنبه 04 خرداد 1389, 00:26 صبح
دوست عزيز لطف كرديد جواب ميديد فقط با عرض شرمندگي خيلي عجله دارم سريعتر.
هر كجا كه از گزارش استفاده كردم به همين روشه

mn_zandy63
سه شنبه 04 خرداد 1389, 00:36 صبح
سلام دوست من،
متاسفانه احتمالا این آخرین جوابیه که امشب بهت میدم،
شما گزارشت داره به دیتابیسی به نام khanevade new (دقیقا با همین فاصله) وصل میشه،
مطمئن نیستم وقتی که از ConnectionString زیر در کدت استفاده می کنی

con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\khanevade.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
دقیقا تحت چه نامی Attach میشه و بعدا با چه نامی بهش دسترسی خواهی داشت، و آیا این نام درسته یا نه.

اما به هر حال میتونی یه تست کنی، روی سیستم طرفت، SQL Server یا فقط Management Studio رو نصب کن، و ببین دیتابیست با چه نامی Attach شده.
من فکر میکنم مشکلت به این مربوط میشه.

موفق باشی

mn_zandy63
سه شنبه 04 خرداد 1389, 00:45 صبح
راستی، این خط

h.SetDataSource(ds);رو حذف کن از کدت. بازم امتحان کن

csharpprogramer88
سه شنبه 04 خرداد 1389, 01:03 صبح
ببخشيد كانكشن استرينگي كه در همه جاي برنامه استفاده مي كنم اينه :


con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\khanevade new.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");

اون يك اشكال لپي بود تازه خود بانك را هم همراه برنامه bin\Debug قرار دادم البته جداول فعلا خالي هستن .
به نظر شما حل شدنيه يا نه

mn_zandy63
سه شنبه 04 خرداد 1389, 01:05 صبح
خب، کدی که فرستاده بودی رو تغییر دادم،
برات میذارم، این رو هم تست کن،
کد خودت رو تغییر دادم، به صورتی که کاملا از کد میخونه و گزارشت مستقیم به دیتابیس وصل نمیشه.
فقط این خطوط رو چک کن، که اسم جداولت رو درست نوشته باشم، چون با عجله نوشتم ممکنه خطای تایپی داشته باشه:

var cmd1 = new SqlCommand("Select * from moshakhasathamsaran", con);

var cmd2 = new SqlCommand("Select * from tahsilathamsaran", con);

da1.Fill(ds, "moshakhasthamsaran");
da2.Fill(ds, "tahsilathamsaran");


من دیگه میرم، فردا چک میکنم، اگه فراموش کردم با ID من در یاهو تماس بگیر.

موفق باشی

mn_zandy63
سه شنبه 04 خرداد 1389, 01:08 صبح
ببخشيد كانكشن استرينگي كه در همه جاي برنامه استفاده مي كنم اينه :


con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\khanevade new.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
اون يك اشكال لپي بود تازه خود بانك را هم همراه برنامه bin\Debug قرار دادم البته جداول فعلا خالي هستن .
به نظر شما حل شدنيه يا نه

کدی که برام گذاشتی کانکشنش همین بود دیگه؟
من run نکردم کدت رو، اما تغییراتی که دادم باید کار کنه.
تست کن
موفق باشی

mn_zandy63
سه شنبه 04 خرداد 1389, 01:16 صبح
سلام
میخواستم بدونم، مگه واسه همون dataset هم نباید از setconnection استفاده کرد؟
منظورم اینه که ما چه از dataset استفاده کنیم و چه گزارش را مستقیما به دیتابیس متصل کنیم، به هر حال باید اول کار برای آوردن فیلدها بر روی فرم از جداول موجود در دیتا بیس استفاده کنیم، پس در هر دو صورت باید از setconnection استفاده کنیم. درسته؟

سلام دوست عزیز من،
شما برای دسترسی به اطلاعات دیتابیس از هر روشی که استفاده کنی اتصال به دیتابیس رو نیاز داری، اما دو حالت داره. یا دیتاست رو Fill میکنی، که در اونصورت از connection و command و dataadapter استفاده می کنی، و به این شکل به دیتابیس وصل میشی (با open شدن connection). یا گزارشت رو مستقیما وصل میکنی به دیتابیس که باید اطلاعات مربوط به connection رو روی گزارش set کنی که در کد ایشون کد مربوط به این کار در تابعی به اسم setconnection قرار داره. بنابراین در حالت اول به این تابع نیازی نیست.

کد ایشون رو که تغییر دادم به این شکل در اومد:
namespace tempreport
{
public partial class moshakhasathamsaran_report : Form
{
public moshakhasathamsaran_report()
{
InitializeComponent();
}

private void moshakhasathamsaran_report_Load(object sender, EventArgs e)
{
var con = new SqlConnection(@"Data Source=.;AttachDbFilename=|DataDirectory|\khanevad e new.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
var cmd1 = new SqlCommand("Select * from moshakhasathamsaran", con);
var da1 = new SqlDataAdapter(cmd1);

var cmd2 = new SqlCommand("Select * from tahsilathamsaran", con);
var da2 = new SqlDataAdapter(cmd2);

var ds = new DataSet();
da1.Fill(ds, "moshakhasthamsaran");
da2.Fill(ds, "tahsilathamsaran");

var h = new hamsaranCrystalReport();
h.SetDataSource(ds);
crystalReportViewer1.ReportSource = h;
}
}
}

همون طور که میبینید به اون تابع setconnection نیاز نیست، البته این کد تغییر یافته کد خودشون هست میتونه زیباتر از این هم باشه.

موفق باشی

csharpprogramer88
سه شنبه 04 خرداد 1389, 17:21 عصر
سلام و واقعا ممنونم كه وقت گذاشتي برام مشكل قبلي به خير و خوشي تمام شده حالا يك سوال دارم :
اگر بخوام به كاربر اين امكان را بدم كه خودش مثلا بر اساس اينكه تحصيلات و رشته جستجو كنه چيكار بايد بكنم كوئري كه نوشتم بصورت زير است


var cmd1 = new SqlCommand("select * from moshakhasat where id in (select id from tahsilat where maghta='+ليسانس+' and reshte'+كامپيوتر+' and madrak ='+ليسانس+')", con);

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

mn_zandy63
چهارشنبه 05 خرداد 1389, 12:56 عصر
سلام دوست من،
با روش جدیدی که برای نمایش گزارش استفاده کردی، (استفاده از دیتاست برای ارسال اطلاعات به گزارش و نه ارتباط مستقیم گزارش به دیتابیس)
تنها کاری که برای فیلتر کردن رکورد ها باید انجام بدی اینه که کوئری هات رو فیلتر کنی. همین.
و اگه روی سیستم خودت جواب بده حتما روی سیستم کاربرت هم جواب میده نگران نباش.
و اما کوئری که اینجا نوشتی به نظر میاد دستی همینجا نوشتیش، چون به نظر ایراد داره ولی احتمالا در کدت درست نوشتیش. وگرنه بهت جواب نمیداد.

موفق باشی

csharpprogramer88
چهارشنبه 05 خرداد 1389, 21:45 عصر
دوست من بازم تشكر از اينكه جواب دادي ولي راستيتش اين مشكل اينقدر خسته ام كرد كه ديگه مغزم جواب نميده . ايني كه شما گفتيد (تنها کاری که برای فیلتر کردن رکورد ها باید انجام بدی اینه که کوئری هات رو فیلتر کنی. همین.) رو اصلا متوجه نميشم يعني چي خواهشا واضح تر توضيح بديد چون ديگه خيلي گيج شدم ديشب و امروز چندباري on شدم ولي شما نبوديد خواهشا اگر در يك ساعت خاصي در سايت حضور داريد به من بگيد چون ظاهرا اين مشكل قراره بدست شما و دوستمون sara.f حل بشه .
با تشكر از هردوي شما لطفا كمك كنيد

mn_zandy63
پنج شنبه 06 خرداد 1389, 00:43 صبح
سلام دوست من،
یعنی همون کاری که خودت انجام دادی،
یه دونه where بذاری داخل Query ت.
خیلی سخت حرف نزدم ;)

نه من اصولا ساعت خاصی اینجا نیستم، اگه کار مهمی داشتی، احتمالا Yahoo بتونی پیدام کنی.
موفق باشی

csharpprogramer88
پنج شنبه 06 خرداد 1389, 11:43 صبح
دوست من (ه دونه where بذاری داخل Query ت.) یعنی چطوری من که where دارم این هم بگم که دو تا سه تا جدول را با هم باید انتخاب کنم یعنی همه کسانی که از جدول تحصیلات برابر پارامترهای ورودی باشد که کاربر وارد کرده که به تبع اون جدول های دیگه هم بیاد خواهشا اگر مقدوره لطف کنید و زمانی را مشخص کنید تا مشکل من حل بشه چون دیگه خیلی دیر شده و منم واقعا روحا خسته شدم یه لطفی بکنید

sara.f
جمعه 07 خرداد 1389, 00:14 صبح
دوست من (ه دونه where بذاری داخل Query ت.) یعنی چطوری من که where دارم این هم بگم که دو تا سه تا جدول را با هم باید انتخاب کنم یعنی همه کسانی که از جدول تحصیلات برابر پارامترهای ورودی باشد که کاربر وارد کرده که به تبع اون جدول های دیگه هم بیاد خواهشا اگر مقدوره لطف کنید و زمانی را مشخص کنید تا مشکل من حل بشه چون دیگه خیلی دیر شده و منم واقعا روحا خسته شدم یه لطفی بکنید

سلام دوست عزیز.
من متوجه نمیشم الآن مشکل شما چیه؟!
شما که کوئری مورد نظرتون را نوشتید ، پس مشکل دیگه چیه؟

csharpprogramer88
جمعه 07 خرداد 1389, 11:12 صبح
سلام
دوست عزيزمون mn_zandy63 لطف كردنو كدي را برام فرستاد اجرا كردم و جواب داد . ولي دوستان كوئري كه ايشان زحمت كشيدن مربوط ميشه به دو دستور select ساده كه فقط از دو جدول تمام ركورد هاي اونو برمي گردونه با دستور زير :


var cmd1 = new SqlCommand("Select * from moshakhasathamsaran", con);

دستور جدول دومي


var cmd2 = new SqlCommand("Select * from tahsilathamsaran", con);

اين مربوط به يك بخش از گزارش گيري منه . يك بخش گزارش گيري ديگه مربوط ميشه به گزارش گيري بر اساس پارامترهايي كه كاربر واردميكنه مثلا :
پيدا كردن تمام كساني كه مقطع تحصيلي ليسانس دارند رشته اوناهم كامپيوتر كه اينو ميتونيم با يك دستور سلكت و شرط حلش كنيم .
ولي من ميخوام پس از اجراي اين كوئري بر اساس اون شرط فقط فيلد id را كه كليد اصلي منه برگردونه و توي جدول مشخصات بگرده ، و هر كجا فيلد id جدول مشخصات كه كليد اصلي است با فيلد id جدول تحصيلات كه با كوئري اول اجرا كردم برابر هست به كريستال ريپورت بفرستم .
دوستان به اين نكته مهم توجه كنيد كه من با توجه به شرطي كه روي جدول تحصيلات گذاشتم ميخوام هم اطلاعات جدول تحصيلات و هم اطلاعات جدول مشخصات چاپ بشه يعني از هر دو جدول بايد به كريستال بفرستم .
كوئري كه بر اساس پارامترهاي كاربر جستجو ميكنه بازم يوزر نيم و پسوورد ميخواد .
دوستان عزيز من كد را مي فرستم خواهشا سريعتر فردا شنبه هست و من هنوز كاري از پيش نبردم . اميدوارم منظورم را رسانده باشم

spring69
جمعه 07 خرداد 1389, 13:08 عصر
سلام.
بفرمائيد

mn_zandy63
جمعه 07 خرداد 1389, 20:19 عصر
سلام
دوست عزيزمون mn_zandy63 لطف كردنو كدي را برام فرستاد اجرا كردم و جواب داد . ولي دوستان كوئري كه ايشان زحمت كشيدن مربوط ميشه به دو دستور select ساده كه فقط از دو جدول تمام ركورد هاي اونو برمي گردونه با دستور زير :


var cmd1 = new SqlCommand("Select * from moshakhasathamsaran", con);
دستور جدول دومي


var cmd2 = new SqlCommand("Select * from tahsilathamsaran", con);
اين مربوط به يك بخش از گزارش گيري منه . يك بخش گزارش گيري ديگه مربوط ميشه به گزارش گيري بر اساس پارامترهايي كه كاربر واردميكنه مثلا :
پيدا كردن تمام كساني كه مقطع تحصيلي ليسانس دارند رشته اوناهم كامپيوتر كه اينو ميتونيم با يك دستور سلكت و شرط حلش كنيم .
ولي من ميخوام پس از اجراي اين كوئري بر اساس اون شرط فقط فيلد id را كه كليد اصلي منه برگردونه و توي جدول مشخصات بگرده ، و هر كجا فيلد id جدول مشخصات كه كليد اصلي است با فيلد id جدول تحصيلات كه با كوئري اول اجرا كردم برابر هست به كريستال ريپورت بفرستم .
دوستان به اين نكته مهم توجه كنيد كه من با توجه به شرطي كه روي جدول تحصيلات گذاشتم ميخوام هم اطلاعات جدول تحصيلات و هم اطلاعات جدول مشخصات چاپ بشه يعني از هر دو جدول بايد به كريستال بفرستم .
كوئري كه بر اساس پارامترهاي كاربر جستجو ميكنه بازم يوزر نيم و پسوورد ميخواد .
دوستان عزيز من كد را مي فرستم خواهشا سريعتر فردا شنبه هست و من هنوز كاري از پيش نبردم . اميدوارم منظورم را رسانده باشم

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

ببین دوست من، شما دو تا جدول رو Fill کردی و برای گزارش فرستادی، خب، این دو تا داخل گزارش به هم متصل شدند درست مثل وقتی که در یک کوئری SQL دو تا جدول Inner join میشن. بنابراین شما کافیه مثلا اون کوئری که داره از جدول tahsilathamsaran میخونه رو فیلتر کنی. یعنی یه دونه where بذاری و تحصیلات رو فیلتر کنی، حالا از اونجایی که دو تا جدول inner join شدند داخل گزارش فقط همون رکورد هایی رو نمایش خواهد داد که مورد نظرت هست.
بنابراین شما به جای این کد که نوشتی:
private void button1_Click(object sender, EventArgs e)
{
temp = "complate";//براي اينكه در صفحه بعدي ريپورت كامل با ريپورت بر اساس پارامتر را قاطي نكنم
con.Open();
sqlselect1 = "select * from moshakhasathamsaran";
sqlselect2 = "select * from tahsilathamsaran";
moshakhasathamsaran_report frm = new moshakhasathamsaran_report();
frm.Show();
}

private void button2_Click(object sender, EventArgs e)
{
temp = "custom";//براي اينكه در صفحه بعدي ريپورت كامل با ريپورت بر اساس پارامتر را قاطي نكنم
con.Open();

//sqlselect = "select * from moshakhasat where id in (select id from tahsilat where maghta like(N'%" + this.txtmaghta.Text.Trim() + "%') and reshte like(N'%" + this.txtreshte.Text.Trim() + "%')and madrak like(N'%" + this.txtmadrak.Text.Trim() + "%'))";

sqlselect1 = "select * from moshakhasathamsaran";
sqlselect2 = "select * from tahsilathamsaran where maghta like(N'%" + this.textBox1.Text.Trim() + "%') and reshte like(N'%" + this.textBox2.Text.Trim() + "%')and madrak like(N'%" + this.textBox3.Text.Trim() + "%'))";
moshakhasathamsaran_report frm = new moshakhasathamsaran_report();
frm.Show();
}


این کد رو بنویس:
private void button1_Click(object sender, EventArgs e)
{
con.Open();
sqlselect1 = "select * from moshakhasathamsaran";
sqlselect2 = "select * from tahsilathamsaran";
moshakhasathamsaran_report frm = new moshakhasathamsaran_report();
frm.Show();
}

private void button2_Click(object sender, EventArgs e)
{
con.Open();
sqlselect1 = "select * from moshakhasathamsaran";
sqlselect2 = "select * from tahsilathamsaran where maghta like(N'%" + this.textBox1.Text.Trim() + "%') and reshte like(N'%" + this.textBox2.Text.Trim() + "%')and madrak like(N'%" + this.textBox3.Text.Trim() + "%'))";
moshakhasathamsaran_report frm = new moshakhasathamsaran_report();
frm.Show();
}


و داخل فرم گزارشت، به جای این کد
if (Form1.temp == "complate")
{
var con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\khanevade new.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
con.Open();
var cmd1 = new SqlCommand(Form1.sqlselect1, con);
var da1 = new SqlDataAdapter(cmd1);

var cmd2 = new SqlCommand(Form1.sqlselect2, con);
var da2 = new SqlDataAdapter(cmd2);

var ds = new DataSet();
da1.Fill(ds, "moshakhasathamsaran");
da2.Fill(ds, "tahsilathamsaran");

var h = new hamsaranCrystalReport();
h.SetDataSource(ds);
crystalReportViewer1.ReportSource = h;
}

else if (Form1.temp == "custom")
{
var con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\khanevade new.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
con.Open();
var cmd1 = new SqlCommand(Form1.sqlselect3, con);
var da1 = new SqlDataAdapter(cmd1);

var ds = new DataSet();
da1.Fill(ds, "moshakhasathamsaran");
//da2.Fill(ds, "tahsilathamsaran");

var h = new hamsaranCrystalReport();
h.SetDataSource(ds);
crystalReportViewer1.ReportSource = h;
}


فقط بنویس:
var con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\khanevade new.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
con.Open();
var cmd1 = new SqlCommand(Form1.sqlselect1, con);
var da1 = new SqlDataAdapter(cmd1);

var cmd2 = new SqlCommand(Form1.sqlselect2, con);
var da2 = new SqlDataAdapter(cmd2);

var ds = new DataSet();
da1.Fill(ds, "moshakhasathamsaran");
da2.Fill(ds, "tahsilathamsaran");

var h = new hamsaranCrystalReport();
h.SetDataSource(ds);
crystalReportViewer1.ReportSource = h;


سعی کردم تا اونجا که میشه روش خودت رو تغییر ندم که ایراد اصلیت رو متوجه شی.

اگه جاییش گنگ بود بگو تا بیشتر توضیح بدم.
موفق باشی