نمایش نتایج 1 تا 8 از 8

نام تاپیک: گزارشگیری پویا

  1. #1

    Unhappy گزارشگیری پویا

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

  2. #2
    کاربر دائمی آواتار اَرژنگ
    تاریخ عضویت
    آبان 1384
    محل زندگی
    arjang8000@gmail.com
    پست
    2,736
    نقل قول نوشته شده توسط abdolahi64 مشاهده تاپیک
    مشکل من فرستادن دیتاست به گزارشی است که از قبل اسم هیچ فیلدی برای آن مشخص نشده است.
    چیزی که هیچ چیش مشخص نیست بهش یک نال بفرستید. یا اینکه مشکلتان چیزه دیگریست؟

  3. #3

    Cool

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

  4. #4
    دوست عزیز سلام !
    به نظر من اگر شما از گزارش گیری دستی که خودتون ایجاد میکنید استفاده کنید کنترل گزارش مورد نظرتون راحت تر میشه .
    برای اینکار مراحل زیر را انجام بدین :
    ابتدا یک 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();
    }

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

    موفق باشی !

  5. #5
    برای تولید گزارش کاملا پویا کریستال نسخه 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");
    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();
    }
    آن لحظه که تنها اعتبار کسی که مساله ای را مطرح کرده است، شما را در اشتباه بودن ایده هایتان قانع کرد،
    آن لحظه،
    لحظه وداع شما با دنیای خلاقیت و پیشرفت خواهد بود. . .

    برنولی

  6. #6
    نقل قول نوشته شده توسط Ghasem Dehghani مشاهده تاپیک
    دوست عزیز سلام !
    به نظر من اگر شما از گزارش گیری دستی که خودتون ایجاد میکنید استفاده کنید کنترل گزارش مورد نظرتون راحت تر میشه .
    برای اینکار مراحل زیر را انجام بدین :
    ابتدا یک printDocument به فرم اضافه و بعد یک printPreviewControl رو اضافه کنید .
    بعد داخل خواص printPreviewControl1 ، خاصیت Document اون رو به document1 که اول اضافه کرده بودین وصل کنید .

    بعد داخل PrintPage مربوط به printDocument با استفاده از نمونه کد زیر یکی یکی فیلد ها تون رو بر دارین و اون ها رو از هر خاصیتی که هستند مثل عددی ، پولی و غیره با استفاده از توابع آماده و یا توابع سفارشی که خودتون میسازید اون ها رو تبدیل به رشته کنید و با استفاده از یک حلقه For فیلدها تون رو در محل مناسب قرار بدین .
    میشه روشتون با یک مثال توضیح بدین و ضمیمه کنین
    فکر نکنم این روش چندان خوبی باشه تا زمانی که برنامه گزارش سازی مثل Crystal Report وجود داره فکر کنین چندتا صفحه گزارش ادامه داشته باشه اونوقت حلقه و draw و ...
    آن لحظه که تنها اعتبار کسی که مساله ای را مطرح کرده است، شما را در اشتباه بودن ایده هایتان قانع کرد،
    آن لحظه،
    لحظه وداع شما با دنیای خلاقیت و پیشرفت خواهد بود. . .

    برنولی

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

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

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

  8. #8
    اگر بخواهم اطلاعات رو توی gridview نمایش بدم . چطور پرینت بگیرم؟ آیا حتما باید توی printdocument باشه؟
    این کنترل کریستال نسخه developer از کجا گیر میاد.
    البته به نظر میاد stimulreport مثل گریدویو کار کنه؛ اون کنترل از کجا گیر میاد.
    در ضمن من در گزارش گیری توی سی شارپ مبتدی هستم و فقط یک گزارش گیری استاتیک در کریستال را انجام دادم.

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •