PDA

View Full Version : سوال: نحوه تعویض Datasource در گزارش Stimul



zarrinnegar
چهارشنبه 13 دی 1391, 00:15 صبح
من قبلا با FastReport کار میکردم و خیلی هم ازش راضی بودم و هستم ولی میخواستم با استیمول کار کنم
توی استیمول به sql متصل میشم و view مورد نظر رو انتخاب میکنم و گزارش رو میسازم و تست میگیرم کار میکنه

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

DataTable dt1 = new DataTable();
dt1 = ........

StiReport report = new StiReport();
report.Load("c:\\Report1.mrt");

report.Dictionary.Databases.Clear();
report.RegData("Vw_Person ", dt1);
report.Dictionary.Synchronize();
report.Compile();
report.Show();


ولی گزارش خالی نشونم میده
1 - نام view در گزارش هم نام با نام انتخاب شده است
2 - اگر Database.clear() رو ننویسم پیغام خطا میده که به sql نمیتونه وصل بشه

اگر توی گزارش بیام و یک Datasource از نوع Dataset, DataTable بسازم و بعدش یکی یکی فیلد ها رو دستی اضافه کنم و بعد گزارش رو بسازم بعد نمیتونم Preview بگیرم و گزارش رو تست کنم

آیا این تنها راهه یا راهی هست که همون اولی رو یه جوری بهش دیتا پاس کنم بدون کانکشن sql ؟

سعید کشاورز
چهارشنبه 13 دی 1391, 11:04 صبح
سلام

لینک تاپیک (http://barnamenevis.org/showthread.php?374699-%D9%BE%D8%A7%D8%B3-%D8%AF%D8%A7%D8%AF%D9%86-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%D8%AF%DB%8C%D8%AA%D8%A7-%DA%AF%D8%B1%DB%8C%D8%AF-%D8%A8%D9%87-%D8%A7%D8%B3%D8%AA%DB%8C%D9%85%D9%88%D9%84-%D8%B1%DB%8C%D9%BE%D9%88%D8%B1%D8%AA%D8%B1&highlight=%D9%BE%D8%A7%D8%B3+%D8%AF%D8%A7%D8%AF%D9 %86+%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA+%D8 %A8%D9%87+%D8%A7%D8%B3%D8%AA%DB%8C%D9%85%D9%88%D9% 84)
فکر کنم این تاپیک به کارتون بیاد..
پستهای 12 و 13 رو نگاه کنید..

zarrinnegar
جمعه 15 دی 1391, 11:06 صبح
کسی نظر دیگه ای نداره

zarrinnegar
جمعه 15 دی 1391, 21:47 عصر
:متفکر: دست دوستان درد نکنه

veniz2008
جمعه 15 دی 1391, 22:02 عصر
سلام. یه خورده بیشتر توضیح بدید. چطوری به sql وصل میشید؟. از داخل خود استیمول کانکشن رو میسازید یا از سی شارپ اتصال رو برقرار میکنید؟. گزارش شما استاتیک هست؟. مگه ip سرور رو ندارید که کلاینت بتونه به سرور وصل بشه؟

zarrinnegar
جمعه 15 دی 1391, 22:06 عصر
سلام. یه خورده بیشتر توضیح بدید. چطوری به sql وصل میشید؟. از داخل خود استیمول کانکشن رو میسازید یا از سی شارپ اتصال رو برقرار میکنید؟. گزارش شما استاتیک هست؟. مگه ip سرور رو ندارید که کلاینت بتونه به سرور وصل بشه؟

من 3 لایه کار میکنم و کلاینت به sql وصل نمیشه درخواست رو به لایه دوم میده اون هم به sql کانکت میشه بعد اطلاعات رو واکشی میکنه بصورت Datatable برمیگردونه
حالا توی کلاینت باید Dt رو بهش پاس داد بدون کانکشن sql

زمانی که گزارش رو میسازم مجبورم به sql کانکشن بزنم و چند تا view رو صدا بزنم بعد بینشون Join بزنم و بعد گزارشم رو بچینم
تا بعد بتونم پیش نمایش بگیرم ببینم درست نشون میده یا نه
ولی بعد از اون دیگه به sql کانکشن نمیزنم

میتونم بیان داخل ریپورت و بعدش چند تا Datasource از نوع Datatable بسازم و بعد همه فیلدها رو یکی یکی توش بسازم و بعد ارتباط ها رو بر قرار کنم و بعد اون کانکشن sql رو به همراه View هاش پاک کنم و بعد از توی برنامه یکی یکی Dt ها رو بهش پاس بدم و در این صورت کار میکنه ولی من حدود 20 تا گزارش دارم که هر کدوم 5 - 6 تا view استفاده میشه با حدود 50 - 60 تا فیلد که مجبورم دوباره بعد از طراحی گزارشم همه رو از نو توی stimul تعریف کنم که یخورده وقت گیره
ولی کار میکنه

میخوام ببینم راهی هست که اینکار رو نکنم و همون view ها رو بهش دیتا بدم نشون بده یا نه

veniz2008
جمعه 15 دی 1391, 22:20 عصر
مشکلی نباید باشه. این گزارش رو قبلا 3 لایه نوشتم،در یک لایه کار اتصال به دیتابیس رو انجام دادم، توی یک کلاس به نام Report ، متد مورد نظر برای گزارشگیری رو نوشتم، در فرم اصلی هم متد رو صدا زدم و گزارشم رو گرفتم :
لایه اتصال :

using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace Pos
{
class DbRun
{
SqlConnection con;
public DataTable DtRun;
public DbRun()
{
con = new SqlConnection("Data Source = .\\md2008;Initial Catalog = DBPos;Integrated Security = True");
}
//

public void ExecSelectCommand(SqlCommand mycmd)
{
mycmd.Connection = con;
if (con.State == ConnectionState.Closed)
{
con.Open();
}
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = mycmd;
DtRun = new DataTable();
da.Fill(DtRun);
con.Close();
con.Dispose();
}
}
}
متد :

public void MonthlyList(int cityid)
{
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "MonthlyList";
cmd.Parameters.AddWithValue("@cityid", cityid);
DbRun MyDbRun = new DbRun();
MyDbRun.ExecSelectCommand(cmd);
DtReport = new DataTable();
DtReport= MyDbRun.DtRun;
}
پشت دکمه هم متد رو صدا زدم، به اینصورت :

Report myreport = new Report();
myreport.MonthlyList(Convert.ToInt32(CmbCity.Selec tedValue));
if (myreport.DtReport.Rows.Count == 0)
MessageBox.Show("موردی یافت نشد");
else
{
stiReport1.Load("StiReportMonthlyListByCity.mrt");
stiReport1.RegData(myreport.DtReport);
stiReport1.Show();
}

zarrinnegar
جمعه 15 دی 1391, 22:25 عصر
تا اینجا همه چی درسته ولی داخل
StiReportMonthlyListByCity.mrt

چی ؟
داخلش هم به sql کانکشن زدی؟
اگه کانکشن زدی این کد رو قبل از show کردن report بزار بعد اجرا کن ببین کار میکنه


stiReport1.Dictionary.Databases.Clears();


اگه کار نکرد بدون که درسته دیتا رو با Dt بهش پاس میدی ولی قبلش یک کانکشن به sql میزنه بعد دیتای شما رو لود میکنه

ولی اگه کار کرد :خجالت:

veniz2008
جمعه 15 دی 1391, 22:31 عصر
تا اینجا همه چی درسته ولی داخل
StiReportMonthlyListByCity.mrt

چی ؟
داخلش هم به sql کانکشن زدی؟
اگه کانکشن زدی این کد رو قبل از show کردن report بزار بعد اجرا کن ببین کار میکنه


stiReport1.Dictionary.Databases.Clears();


اگه کار نکرد بدون که درسته دیتا رو با Dt بهش پاس میدی ولی قبلش یک کانکشن به sql میزنه بعد دیتای شما رو لود میکنه

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

zarrinnegar
جمعه 15 دی 1391, 22:35 عصر
نه منظورم اینه که زمانی که گزارش رو توی designer میسازی چیکار میکنی ؟
اونجا مگه کانکشن نمیزنی بعد table و یا view رو میاری داخل گزارش میچینی ؟
یا همین طوری Text میزاری توی باند Data ؟

veniz2008
جمعه 15 دی 1391, 22:43 عصر
توی فایل گزارش، یک دیتاسورس از نوع dataset, datatable انتخاب و ستون ها رو مطابق با ستون های دیتاتیبل میسازم. من از Text استفاده میکنم و خاصیت دیتاسورس از کنترل DataBand رو بر روی دیتاسورسی که در مرحله قبلی درون گزارش ساختم قرار میدم.( روی مربع آبی رنگ کلیک و دیتاسورس رو بهش معرفی میکنم). من یک HeaderBand هم اضافه میکنم و درونش Text میزارم که واسه عنوان ستون ها مورد استفاده قرار میگیره.

zarrinnegar
جمعه 15 دی 1391, 22:47 عصر
توی فایل گزارش، یک دیتاسورس از نوع dataset, datatable انتخاب و ستون ها رو مطابق با ستون های دیتاتیبل میسازماحسنت به شما من هم همینو گفتم

زمانی که گزارش رو میسازم مجبورم به sql کانکشن بزنم و چند تا view رو صدا بزنم بعد بینشون Join بزنم و بعد گزارشم رو بچینم
تا بعد بتونم پیش نمایش بگیرم ببینم درست نشون میده یا نه
ولی بعد از اون دیگه به sql کانکشن نمیزنم

میتونم بیام داخل ریپورت و بعدش چند تا Datasource از نوع Datatable بسازم و بعد همه فیلدها رو یکی یکی توش بسازم و بعد ارتباط ها رو بر قرار کنم و بعد اون کانکشن sql رو به همراه View هاش پاک کنم و بعد از توی برنامه یکی یکی Dt ها رو بهش پاس بدم و در این صورت کار میکنه ولی من حدود 20 تا گزارش دارم که هر کدوم 5 - 6 تا view استفاده میشه با حدود 50 - 60 تا فیلد که مجبورم دوباره بعد از طراحی گزارشم همه رو از نو توی stimul تعریف کنم که یخورده وقت گیره
ولی کار میکنه

veniz2008
شنبه 16 دی 1391, 04:09 صبح
زمانی که گزارش رو میسازم مجبورم به sql کانکشن بزنم و چند تا view رو صدا بزنم بعد بینشون Join بزنم و بعد گزارشم رو بچینم
تا بعد بتونم پیش نمایش بگیرم ببینم درست نشون میده یا نه

یه چندتا سوال همچنان در این باره وجود داره : آیا شما همه view های ساخته شده رو جداگانه به استیمول میفرستید و در اونجا view ها رو ادغام میکنید؟ اگر چنین کاری میکنید دلیل کارتون چیه؟. من زمانیکه قراره از چند جدول داده بخونم، اگر داده ها با هم در ارتباط هستن، کوئری خودم درون یک stored procedure بصورت join شده در قالب یک دیتاتیبل برای استیمول میفرستم و در فایل گزارشم همه فیلدها (یا بعضی از فیلدهای مورد نظرم) رو درون گزارش ایجاد میکنم (یا از Text استفاده میکنم یا از دیتاسورسی که ساختم مستقیما فیلدها رو drag میکنم به صفحه گزارش). این حالت رو که چندین جدول رو در قالب یک دیتاتیبل میفرستم معمولا زمانی استفاده میکنم که اطلاعات همه جداول با هم در ارتباط هستن/ ولی فرض بگیرید به هر دلیلی قصد دارم که اطلاعات رو در قالب view های جداگانه بفرستم (یعنی دیتاتیبل های جداگانه بفرستم نه یک دیتاتیبل) مثلا زمانیکه میخوام نمودار مربوط به نمرات درسی 2 آزمون رو برای دانش اموزان نشون بدم، هر ازمون رو داخل یک دیتاتیبل می ریزم و هر دوتا دیتاتیبل رو در قالب یک دیتاست برای استیمول میفرستم. در اینجا اگه بخوام دیتاتیبل ها رو همزمان و بصورت پشت سر هم برای استیمول بفرستم، استیمول فقط دیتاتیبل دوم رو شناسایی میکنه ولی زمانیکه هر دو دیتاتیبل رو در قالب یک دیتاست میفرستم درون فایل گزارشم به هر دو دیتاتیبل دسترسی دارم و فایل گزارشم رو می چینم. برای اینکار کافیه که درون فایل گزارش دو دیتاسورس از نوع dataset در نظر بگیرید (چون 2 آزمون دارم) و هر دیتاسورس رو مطابق با فیلدهای دیتاتیبل طراحی کنیم.
برای حالت اول که یک دیتاتیبل که شامل یک کوئری join شده از چند جدول هست که قاعدتا نباید مشکلی داشته باشید. برای حالت دوم هم که شامل دیتاست هست یک کد میزارم تا مطلب کاملا روشن بشه :

// ساخت دیتاتیبل اول که شامل نمرات آزمون1 می باشد
SqlDataAdapter da1 = new SqlDataAdapter("select * from Tbl_Nomre where AzmoonID = 1", con);
DataTable dt1 = new DataTable();
da1.Fill(dt1);

// ساخت دیتاتیبل دوم که شامل نمرات آزمون2 می باشد
SqlDataAdapter da2 = new SqlDataAdapter("select * from Tbl_Nomre where AzmoonID = 2", con);
DataTable dt2 = new DataTable();
da1.Fill(dt2);

// ساخت دیتاست از روی دیتاتیبل ها و پاس دادن دیتاست به استیمول
DataSet ds = new DataSet();
ds.Merge(dt1);
ds.Tables[0].TableName = "DS_Azmoon1";

ds.Merge(dt2);
ds.Tables[1].TableName = "DS_Azmoon2";

stiReort1.Load("stiReportAzmoon.mrt");
stiReport1.RegData(ds);
stiReport1.Show();


میتونم بیام داخل ریپورت و بعدش چند تا Datasource از نوع Datatable بسازم و بعد همه فیلدها رو یکی یکی توش بسازم و بعد ارتباط ها رو بر قرار کنم و بعد اون کانکشن sql رو به همراه View هاش پاک کنم و بعد از توی برنامه یکی یکی Dt ها رو بهش پاس بدمبا توجه به توضیحات بالا نیازی به ارسال چندین دیتاتیبل بصورت مجزا نیست و میتونید در قالب یک دیتاست همه دیتاتیبل ها رو بفرستید.
نمیدونم مطالب بالا نیاز شما رو پوشش میده یا نه،(شاید من از توضیحات شما بد برداشت کردم)، اگر منظور دیگه ای دارید درباره نوع گزارشتون یک کم توضیح بدید اینکه جداولتون چی هستن و میخواید که چطور گزارشی رو برای کاربر تولید کنید تا بشه راهنمایی بهتری کرد.

zarrinnegar
شنبه 16 دی 1391, 10:13 صبح
ممنونم از اینکه جواب دادید
این قسمت Datasource رو که گفتید خیلی خوبه و از این قسمت استفاده میکنم
ولی مشکل من این چیز ها نیست

مشکل من اینه که زمان طراحی گزارش چون دائم به preview مراجعه میکنم تا فونت و اندازه نمایش فیلدها و نحوه چیدمان توی گزارش رو ببینم تا گزارش دلخواهم رو بسازم در اول کار Datasource ام رو از نوع DataTable,Dataset انتخاب نمیکنم چون در این حالت نمیتونم دیتایی رو ببینم بخاطر پیچیدگی در گزارش
یک نمونه از گزارش رو ببینید
97877

تعداد Data band رو میبینید
من به علت تعدد باند دیتا و Join کردن اطلاعات در استمول لازمه که پیش نمایش بگیرم و موقع طراحی گزارش , خروجی رو ببینم
بخاطر همین در اول کار Datasource ام از نوع Dataset,DataTable نیست بخاطر همین هم از ورودی report وقتی میخوام Datasource یا DataTable بهش پاس میدم نشون نمیده

veniz2008
شنبه 16 دی 1391, 12:27 عصر
یه کاری کنید. کانکشن و جداول (یا stored procedure ) رو از درون استیمول به گزارش تعریف کنید و درون دکمه گزارش گیری فقط گزارش رو show کنید. بذارید بیشتر توضیح بدم. شما کوئری join خودتون رو در قالب یک sp بسازید، حالا ابتدا یک new connection از نوع sql connection ایجاد کنید و دیتابیسی رو که باهاش کار میکنید به استیمول معرفی کنید تا کانکشن استرینگ شما ساخته بشه. بعد از این کار یک new datasource از نوع Data from sql connection ایجاد کنید، در قسمت Query Text اون sp که ساختید رو اجرا کنید ( اگر نام استورد پروسیجر شما sp1 باشه میشه execute sp1 و بعد با اجرای ! ، sp رو اجرا کنید تا ستون های گزارش رو برای شما بسازه. در صورت اجرای موفقیت آمیز برنامه به شما پیغام مناسب رو میده). با زدن دکمه Retrieve column میتونید ستون های گزارش رو مشاهده کنید. خوب حالا درون فایل گزارش میتونید درون data band ستون ها رو drag کنید و با تغییر فونت یا سایزشون و از قسمت preview درون گزارشتون، تغییرات و نحوه چیدمان ستون ها رو ملاحظه کنید. درون محیط سی شارپ هم کافیه که فقط گزارش رو show کنید.(چون شما عملا تمام کارها رو سمت استیمول انجام میدید و در سی شارپ فقط این گزارش رو برای نمایش صدا میزنید).

veniz2008
پنج شنبه 16 خرداد 1392, 16:13 عصر
سلام
به نظر شما بهتره که من فایل های گزارشم رو داخل دیتابیس ذخیره کنم و یا کنار فایل اجرایی تک تک کاربران؟؟
سلام.
ما درون دیتابیس و جداولمون، فیلدهای مربوط به یک موجودیت یا رابطه رو ذخیره می کنیم نه فایل های گزارش یا ...
اجباری به ذخیره کردن فایل های گزارش کنار فایل اجرایی نیست ولی کار رو راحت تر میکنه. بنابراین توصیه میشه که فایل های گزارش رو در کنار فایل اجرایی برنامه ذخیره کنید.
موفق باشید.

صباح فتحی
پنج شنبه 16 خرداد 1392, 17:26 عصر
سلام دیتاتیبل پرمیشه درست؟
خب ستون های گزارشم متناظرن دیگه؟
بهتره توپروژه یک دیتاست بساز ی وداخل دیتاست اون دیتاتیبل رو درست کنی.بعد روی فایل گزارش راست کلیک choose dt source.دیتاستو انتخاب کن.

صباح فتحی
پنج شنبه 16 خرداد 1392, 22:02 عصر
کدنویسیشم اینطور جواب میده

DataTable dt = new DataTable();
dt = query.Show1Roze(Class.varibles.UserID, dataGridView1.CurrentRow.Cells[0].Value.ToString());

stiReport1.RegData(dt);

stiReport1.Compile();
stiReport1.Render();
stiReport1.Show();