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 dynamic columns no momento da geração de relatórios. Ou seja, não estamos selecionando qualquer coluna da tabela do banco no momento do Crystal Report Design. Em vez de que estamos passando uma consulta SQL string e obter o Crystal Report dinamicamente em tempo de execução em C #. A partir da imagem abaixo você pode entender como ele funciona.
Strongly Typed Dataset. 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 Strongly Typed dataset. Você tem que adicionar um Crystal Report em seu projeto e como data source selecione Strongly Typed dataset.
Selecione todas as 5 colunas de Strongly Typed dataset :
Clique no botão Concluir,Então você pode ver os campos selecionados no Crystal 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 C #. Por que temos que analisar a instrução SQL antes de passá-lo para o Crystal Reports. Então nós criamos uma função para analisar instruções SQL no programa C #.
ProcesSQL Função Pública () As String
Você tem que incluir CrystalDecisions.CrystalReports.Engine 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 <= fields.Length - 1; i++)
{
if (i > 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 : connectionString = "data source=SERVER NAME;initial catalog=crystaldb;user id=USER NAME;password=PASSWORD;";
Você precisa preencher as informações necessárias para conectar o database através da Connection String.
Nenhum comentário:
Postar um comentário