RDL без Sql Report в asp.net

RDL - xml-приложение для создания отчетов.

Для "привязки" rdl к проекту требуется произвести следующие действия, как на локальном компьютере так и на сервере, где будет располагаться приложение:

  • установить report viewer 
  • установить связанные ресурсы SQLSysClrTypes
  • переименовываем нашу rdl в rdlc
  • добавляем rdlc в проект

рисунок 1

рисунок 2

Далее двойным "щелчком" открываем файл. Нам требуется выполнить следующие действия:

  • добавить свой DataSource
  • привязать к объектам свои DataSet'ы
  • написать небольшой кусочик кода на C#

Добавление DataSource

Нажимаем на Add Dataset... В поле Data source нажимаем на кнопку New. Далее с помощью мастера создаем файл xsd. С помощью этого файла можно создавать dataset

   

Если Вы все сделаете правильно, то вот что примерно вы должны видеть

Привязать в объектам свои Dataset'ы

Далее остается привязать наш dataset в rdlc. Для этого дважды щелкам по нужному нам dataset и привязываем его к нужной "функции" 

Код написанный на C#

public override byte[] GetBytes()
{
var rv = new ReportViewer();
rv.ProcessingMode = ProcessingMode.Local;
rv.LocalReport.ReportPath = this.RDLCFilePath;  // путь к rdlc файлу. Указывать польностью
rv.LocalReport.Refresh();

byte[] streamBytes = null;
string encoding = "";
string mimeType = "";
string filenameExtension = "";
string[] streamids = null;
Warning[] warnings;


var charge = GetChargeInfo(x => new { x.F_Manage_Org, x.N_Year, x.N_Month, x.F_Subscr });
rv.LocalReport.DataSources.Clear(); // очищать обязательно

// добавляем данные в dataset'ы
var conn_point = GetAccessor<KvitAccessor>().GetRPTAdviceConnPoint(charge.F_Manage_Org.Value, charge.N_Year.Value, charge.N_Month.Value, charge.F_Subscr.Value);
rv.LocalReport.DataSources.Add(new ReportDataSource("Conn_Point", conn_point));
var months = this.Provider.CS_Month.Select(x => new { x.LINK, x.C_Name, N_Code = x.LINK }).ToList();
rv.LocalReport.DataSources.Add(new ReportDataSource("CS_Month", months));

rv.LocalReport.DataSources.Add(new ReportDataSource("PC_RPT_377_Advice_Mass", Advices));

// -- добавляем данные в dataset'ы
rv.LocalReport.SetBasePermissionsForSandboxAppDomain(new System.Security.PermissionSet(System.Security.Permissions.PermissionState.Unrestricted)); // кусочик для безопасности

// установка параметров в rdlc

var adviceParams = GetAdviceParams(charge.N_Year.Value, charge.N_Month.Value, charge.F_Manage_Org.Value, charge.F_Subscr.Value);

Type type = adviceParams.GetType();
foreach (var par in rv.LocalReport.GetParameters())
{
var pi = type.GetProperty(par.Name);
if (pi != null)
{
var value = pi.GetValue(adviceParams);
if (value != null)
{
if (par.MultiValue)
rv.LocalReport.SetParameters(new ReportParameter(par.Name, value.ToString().Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries)));
else
rv.LocalReport.SetParameters(new ReportParameter(par.Name, value.ToString()));
}
}
}

var nullPars =
rv.LocalReport.GetParameters()
.Where(x => x.Values == null || x.Values.Count == 0);

foreach (var par in nullPars)
{
if (par.AllowBlank)
{
rv.LocalReport.SetParameters(new ReportParameter(par.Name, ""));
continue;
}

if (par.Nullable)
rv.LocalReport.SetParameters(new ReportParameter(par.Name, (string) null));
}

// --установка параметров в rdlc

rv.LocalReport.Refresh();
const string deviceInfo = "<DeviceInfo>" +
" <OutputFormat>PDF</OutputFormat>" +
" <PageWidth>11.80in</PageWidth>" +
" <PageHeight>8.27in</PageHeight>" +
"</DeviceInfo>";
streamBytes = rv.LocalReport.Render("PDF", deviceInfo, out mimeType, out encoding, out filenameExtension, out streamids, out warnings);
return streamBytes;
}

// реализация в контроллере

[AllowAnonymous]
public FileResult Kvit(int? charge, Decimal? amount = null)
{

byte[] streamBytes = null;
string mimeType = "";

var accessor = GetAccessor<KvitAccessor>();

var receiptHeader = accessor.LPReceiptHeader(charge ?? 0);

streamBytes = GetKvitStream(Server.MapPath(Url.Content(CustomSettings.KvitReport)), out mimeType, charge, amount); // здесь возвращается набор байтов

Response.ContentType = mimeType;
Response.BinaryWrite(streamBytes);


if (receiptHeader != null)
return File(streamBytes, mimeType, "Квитанция {0} за {1} .pdf".F(receiptHeader.C_Subscr_Number,
receiptHeader.C_Period.ToLower()));
return File(streamBytes, mimeType, "Квитанция.pdf");
}

Нет комментариев

Добавить комментарий