PDA

View Full Version : گزارشگیری پویا



abdolahi64
دوشنبه 12 فروردین 1387, 09:24 صبح
با سلام به همگی
من می خوام توی پروژه ام که با سی شارپ می نویسمش امکان تنظیم گزارش رو به کاربر بدم. و برام مهم نیست این گزارشگیری با کریستال ریپورت باشه یا با ریپورت ویوار یا حتی دیتا گرید ویو .
و گزارش بر اساس تنظیمی باشه که کاربر انتخاب می کنه از جمله انتخاب جدول و فیلد وغیره. با اسکیوال هم مشکلی ندارم و می تونم تنظیمات کاربر رو به یک دیتاست تبدیل کنم.
مشکل من فرستادن دیتاست به گزارشی است که از قبل اسم هیچ فیلدی برای آن مشخص نشده است.
لطفا راهنمایی کنید.http://www.developercenter.ir/Forum/images/smilies2/cry.gif http://www.developercenter.ir/Forum/images/smilies2/confused.gif http://www.developercenter.ir/Forum/images/smilies2/redface.gif

اَرژنگ
دوشنبه 12 فروردین 1387, 10:54 صبح
مشکل من فرستادن دیتاست به گزارشی است که از قبل اسم هیچ فیلدی برای آن مشخص نشده است. چیزی که هیچ چیش مشخص نیست بهش یک نال بفرستید. یا اینکه مشکلتان چیزه دیگریست؟

abdolahi64
دوشنبه 12 فروردین 1387, 12:09 عصر
اولا ممنونم که بعد از چند روز که این سوال رو در سایتها و انجمن های مختلف مطرح کردم عاقبت شما به اون توجه کردید.
سوالم رو بهتر می گم:
من می خوام یه گزارش تهیه کنم از چند تا جدول که فیلدهاش توسط کاربر انتخاب می شه. با دستور sql اون مشکلی ندارم و می تونم اونو طراحی کنم و به عنوان یه dataset به گریدویو پاس بدم حالا این پاس دهی رو می خوام به یه گزارش ساز باشه البته این کار تودلفی خیلی راحت انجام می شد ولی اینجا چون نیاز مثلا برای datagridview به صورت جداگانه یه report طراحی کنیم و تعداد و نوع فیلدها رو مشخص کنیم کار منو سخت و ناممکن کرده
حالا اگه راه حلی دارید از ارائه اون ممنون می شم:متفکر:

Ghasem Dehghani
دوشنبه 12 فروردین 1387, 14:22 عصر
دوست عزیز سلام !
به نظر من اگر شما از گزارش گیری دستی که خودتون ایجاد میکنید استفاده کنید کنترل گزارش مورد نظرتون راحت تر میشه .
برای اینکار مراحل زیر را انجام بدین :
ابتدا یک printDocument به فرم اضافه و بعد یک printPreviewControl رو اضافه کنید .
بعد داخل خواص printPreviewControl1 ، خاصیت Document اون رو به document1 که اول اضافه کرده بودین وصل کنید .

بعد داخل PrintPage مربوط به printDocument با استفاده از نمونه کد زیر یکی یکی فیلد ها تون رو بر دارین و اون ها رو از هر خاصیتی که هستند مثل عددی ، پولی و غیره با استفاده از توابع آماده و یا توابع سفارشی که خودتون میسازید اون ها رو تبدیل به رشته کنید و با استفاده از یک حلقه For فیلدها تون رو در محل مناسب قرار بدین .


private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
Graphics p = e.Graphics;
for (int i=0;i<=5;++i)
p.DrawString("Hello Free Print", new Font("Tahoma", 20, FontStyle.Bold, GraphicsUnit.Pixel), Brushes.Black, 10, i * 50)
}

بعد از اتمام کار داخل دکمه چاپ گزارش کد زیر رو بنویسید :


private void button1_Click(object sender, EventArgs e)
{
printDocument1.Print();
}

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

موفق باشی !

razavi_university
سه شنبه 13 فروردین 1387, 03:18 صبح
برای تولید گزارش کاملا پویا کریستال نسخه Developer نیاز است. آموزشهاش هم تاحدی توی سایت هست
با crystal report داخل Visual studio اینکار رو میشه تا حدی محدود انجام داد به صورتی که کاربر تا حدی محدود باشه نه اینکه هرچی دلش خواست. مثلا بتونه با تاریخ خاص و یا بر اساس فیلدهای خاصی که پر کنه بهش گزارش بدین
من به روش زیر کار می کنم شاید روش دیگه‌ای هم داشته باشه، دوستان اگر روش دیگه‌ای رو به کار میبرند لطفا بگید تا من هم یاد بگیرم:چشمک:
ابتدا در یک فرم dataTable و یا DataSet ی که کابر می خواد این اطلاعات درگزارشش باشه رو از دیتابیس می‌گیرم و بعد اون رو به یک فرم که CrystalreportViewer داره می‌فرستم و گزارشی که متناسب با اون دیتاست آماده کردم رو داخلش لود می کنم. با این روش یک فرم برای دریافت نیازهای مشتری داریم و یک فرم برای نمایش گزارش. تنها فایلهای گزارش باید فیلدهایشان متناسب با هر گزارش باشد.به مثال زیر نگاه کنین
کد قسمت تولید dataTable (هر کدی که یک dataTable و یا ... خروجی بدهد میتوان نوشت) مثلا:


db.connect();
string strCmd = "EXECUTE [dbName].[dbo].[spu_Order_SelectFact] '" + txtBxNo.Text + "'";
dt = db.select(strCmd);
db.disconnect();

برای نمایش گزارش، زمانی که کاربر دکمه مربوطه رو زد


if (dt!=null)
{
this.Hide();
Report_Form.FrmReport report = new FrmReport(dt, Application.StartupPath + "\\Report\\RptOrder.rpt (file://\\Report\\RptOrder.rpt)");
report.ShowDialog();
this.Show();
}

و کدهایی که در فرم نمایش گزارش داریم:


public FrmReport(DataTable dt,string Path)
{
InitializeComponent();
RepDoc = new ReportDocument();
dataTable = new DataTable();
dataTable = dt;
reportPath = Path;
}
private void FrmReport_Load(object sender, EventArgs e)
{
dataGridView1.DataSource = dataTable;
RepDoc.Load(reportPath);
RepDoc.SetDataSource(dataTable);
crystalReportViewer1.ReportSource = RepDoc;
crystalReportViewer1.Show();
}

razavi_university
سه شنبه 13 فروردین 1387, 03:32 صبح
دوست عزیز سلام !
به نظر من اگر شما از گزارش گیری دستی که خودتون ایجاد میکنید استفاده کنید کنترل گزارش مورد نظرتون راحت تر میشه .
برای اینکار مراحل زیر را انجام بدین :
ابتدا یک printDocument به فرم اضافه و بعد یک printPreviewControl رو اضافه کنید .
بعد داخل خواص printPreviewControl1 ، خاصیت Document اون رو به document1 که اول اضافه کرده بودین وصل کنید .

بعد داخل PrintPage مربوط به printDocument با استفاده از نمونه کد زیر یکی یکی فیلد ها تون رو بر دارین و اون ها رو از هر خاصیتی که هستند مثل عددی ، پولی و غیره با استفاده از توابع آماده و یا توابع سفارشی که خودتون میسازید اون ها رو تبدیل به رشته کنید و با استفاده از یک حلقه For فیلدها تون رو در محل مناسب قرار بدین .

میشه روشتون با یک مثال توضیح بدین و ضمیمه کنین
فکر نکنم این روش چندان خوبی باشه تا زمانی که برنامه گزارش سازی مثل Crystal Report وجود داره فکر کنین چندتا صفحه گزارش ادامه داشته باشه اونوقت حلقه و draw و ...:اشتباه:

gdevnb
سه شنبه 13 فروردین 1387, 10:26 صبح
اولا ممنونم که بعد از چند روز که این سوال رو در سایتها و انجمن های مختلف مطرح کردم عاقبت شما به اون توجه کردید.
سوالم رو بهتر می گم:
من می خوام یه گزارش تهیه کنم از چند تا جدول که فیلدهاش توسط کاربر انتخاب می شه. با دستور sql اون مشکلی ندارم و می تونم اونو طراحی کنم و به عنوان یه dataset به گریدویو پاس بدم حالا این پاس دهی رو می خوام به یه گزارش ساز باشه البته این کار تودلفی خیلی راحت انجام می شد ولی اینجا چون نیاز مثلا برای datagridview به صورت جداگانه یه report طراحی کنیم و تعداد و نوع فیلدها رو مشخص کنیم کار منو سخت و ناممکن کرده
حالا اگه راه حلی دارید از ارائه اون ممنون می شم:متفکر:


میتونید از StimulReport استفاده کنید و دیتاست ها و کانکشن های مورد نظرتون رو به گزارش پاس داده و به حالت دیزاین برید


stiReport1.RegData("connection",con);
stiReport1.RegData("dataset",ds);
stiReport1.Design();

abdolahi64
چهارشنبه 14 فروردین 1387, 09:40 صبح
اگر بخواهم اطلاعات رو توی gridview نمایش بدم . چطور پرینت بگیرم؟ آیا حتما باید توی printdocument باشه؟
این کنترل کریستال نسخه developer از کجا گیر میاد.
البته به نظر میاد stimulreport مثل گریدویو کار کنه؛ اون کنترل از کجا گیر میاد.
در ضمن من در گزارش گیری توی سی شارپ مبتدی هستم و فقط یک گزارش گیری استاتیک در کریستال را انجام دادم.