Crystal Reports-(15)
Autor: AshSworD | Publicado: 2011-11-03T10:01:00-03:00

Bem vamos nos aprofundar em&nbsp;Dynamic Crystal Reports de C#


Normalmente Crystal Reports é gerado com colunas pré-definidas,Ou seja, os campos mostrados no Crystal Reports estão selecionados através de um assistente na hora do Crystal Report design .
O programa a seguir descreve como gerar um cristal report em C # com&nbsp;dynamic columns&nbsp;no momento da geração de relatórios.&nbsp;Ou seja, não estamos selecionando qualquer coluna da tabela do banco no momento do Crystal Report Design.&nbsp;Em vez de que estamos passando uma&nbsp;consulta SQL&nbsp;string e obter o Crystal Report dinamicamente em tempo de execução em C #.&nbsp;A partir da imagem abaixo você pode entender como ele funciona.
Strongly Typed Dataset.&nbsp;Aqui estamos limitando em cinco colunas, mas você pode adicionar qualquer número de coluna de acordo com suas necessidades de relatórios.Próximo passo é criar um projeto de Cristal Reports da&nbsp;Strongly Typed dataset.&nbsp;Você tem que adicionar um Crystal Report em seu projeto e como data source selecione&nbsp;Strongly Typed dataset.Selecione todas as &nbsp;5 colunas de&nbsp;Strongly Typed dataset :Clique no botão Concluir,Então você pode ver os campos selecionados no&nbsp;Crystal&nbsp;Reports .Organize os campos de acordo com seus critérios.Aqui estamos indo passar as instruções SQL para o Crystal Reports em runtime de &nbsp;C #.&nbsp;Por que temos que analisar a instrução SQL antes de passá-lo para o Crystal Reports.&nbsp;Então nós criamos uma função para analisar instruções SQL no programa C #.
ProcesSQL Função Pública () As StringVocê tem que incluir&nbsp;CrystalDecisions.CrystalReports.Engine&nbsp;em seu código-fonte C #.using CrystalDecisions.CrystalReports.Engine;using CrystalDecisions.Shared;


using System;
using System.Windows.Forms;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using System.Data;
using System.Data.SqlClient ;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        CrystalReport1 objRpt = new CrystalReport1(); 

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SqlConnection cnn ;
            string connectionString = null;
            string sql = null;
            connectionString = "data source=SERVER NAME;initial catalog=crystaldb;user id=USER NAME;password=PASSWORD;";
            cnn = new SqlConnection(connectionString);
            cnn.Open();
            sql = procesSQL();
            SqlDataAdapter dscmd = new SqlDataAdapter(sql, cnn);
            DataSet1 ds = new DataSet1();
            dscmd.Fill(ds, "Product");
            objRpt.SetDataSource(ds.Tables[1]);
            crystalReportViewer1.ReportSource = objRpt;
            crystalReportViewer1.Refresh();
        }

        public string procesSQL()
        {
            string sql = null;
            string inSql = null;
            string firstPart = null;
            string lastPart = null;
            int selectStart = 0;
            int fromStart = 0;
            string[] fields = null;
            string[] sep = { "," };
            int i = 0;
            TextObject MyText ;

            inSql = textBox1.Text;
            inSql = inSql.ToUpper();

            selectStart = inSql.IndexOf("SELECT");
            fromStart = inSql.IndexOf("FROM");
            selectStart = selectStart + 6;
            firstPart = inSql.Substring(selectStart, (fromStart - selectStart));
            lastPart = inSql.Substring(fromStart, inSql.Length - fromStart);

            fields = firstPart.Split(',');
            firstPart = "";
            for (i = 0; i &lt;= fields.Length - 1; i++)
            {
                if (i &gt; 0)
                {
                    firstPart = firstPart + ", " + fields[i].ToString() + " AS COLUMN" + (i + 1);
                    firstPart.Trim();

                    MyText = (TextObject) objRpt.ReportDefinition.ReportObjects[i+1];
                    MyText.Text = fields[i].ToString();
                }
                else
                {
                    firstPart = firstPart + fields[i].ToString() + " AS COLUMN" + (i + 1);
                    firstPart.Trim();

                    MyText = (TextObject)objRpt.ReportDefinition.ReportObjects[i+1];
                    MyText.Text = fields[i].ToString();
                }
            }
            sql = "SELECT " + firstPart + " " + lastPart;
            return sql;
        } 
    }
}

OBS :&nbsp;connectionString = "data source=SERVER NAME;initial catalog=crystaldb;user id=USER NAME;password=PASSWORD;";&nbsp;Você precisa preencher as informações necessárias para conectar o database &nbsp;através da &nbsp;Connection String.