konto usunięte

Temat: MyNeoReport - ktoś używał i może podzielić się opinią?

Witajcie,
jak w temacie - ktoś używał kiedyś MyNeoReport?
http://www.codeproject.com/KB/dotnet/myneoreportintro....
Każda opinia wskazana;)

Do czego tego potrzebuję: proste raporciki dla danych z MS SQL Serv

Temat: MyNeoReport - ktoś używał i może podzielić się opinią?

A czy kontrolka kliencka Reporting Services nie rozwiąże Twoich problemów? Masz narzędzie do edycji (darmowy WebDeveloper Express + plugin + redist, od biedy ujdzie także fyiReporting RDL, Visual Studio), sama kontrolka jest mała, lekka, oferuje eksport do XLS, DOC, PDF, uferuje podgląd wydruku z podziałem na strony i wiele innych: http://www.goldenline.pl/forum/1644560/kontrolka-wysiw...

Nie ma problemu z transportem kontrolki z aplikacją - kilka DLLek. Chyba, że próbowałeś z nią pracować i nie jesteś zadowolony z rezultatów?

MyNeoReport niestety nie znam :(

konto usunięte

Temat: MyNeoReport - ktoś używał i może podzielić się opinią?

Hm.. kontrolka to troche nawet przerost moich oczekiwań.
Docelowo mialo byc tylko "preview" + "print" - ale mysle jednak, ze skorzystam z proponowej przez Ciebie kontroleczki:) W sumie kto wie, co mi za jakis czas odbije - nie bede musial przerabiac calego raportowania przynajmniej:)

Temat: MyNeoReport - ktoś używał i może podzielić się opinią?

Przykładowa rzecz, do jakiej można wykorzystać kontrolkę RDLC. Wraz z demonstracją wywołania funkcji rysującej barkod z zewnętrznej DLLki oraz modyfikacją marginesów i rozmiarów pól raportu. Niestety, rozmiary elementów raportu są "hardcoded" w XMLu, ale właśnie dzięki temu, że to XML, masz relatywnie łatwy wpływ na każdy element raportu (byle znać jego nazwę).

Cuda, Panie, można robić (choć czasem trzeba się narobić) :)
Obrazek

Obrazek


A poniżej standardowe zastosowanie RDLC :)

Obrazek

Obrazek

Obrazek

konto usunięte

Temat: MyNeoReport - ktoś używał i może podzielić się opinią?

Dodatkowo - wynalazlem za posrednictwem Twoich postow biblioteczke do Barcodow, ktora tez az nadto mi wystarcza;)
BarcodeLib.Barcode.DoEncode(BarcodeLib.TYPE.UPC_SUPPLEMENTAL_5DIGIT, row.Cells[10].Value.ToString(), true, 50, 25);


Co ja bym bez Ciebie zrobil i ile mi grzebania po sieci zaoszczedziles:)

Temat: MyNeoReport - ktoś używał i może podzielić się opinią?

:)

To do kompletu, by nie szukać po necie - poniższy kod pokaże Ci, jak obsłużyć subraport i wykonać eksport do pliku. Wydruk (z kodu, bez żadnych okienek z ustawieniami) robi się bardzo podobnie, tylko trzeba się nieco namęczyć z obsługą metapliku.

Jak widzisz, jeśli chcesz zrobić wydruk bez podglądu, w ogóle nie musisz umieszczać kontrolki na formie (zresztą kontrolka 2010 nawet nie da się umieścić w designerze, trzeba dodać kontrolkę 2008 i podmienić referencję), wykorzystujesz jedynie silnik renderujący.
public int GenerateCatalog(bool generatePDF, bool skipTOC)
{
OracleConnection conn = new OracleConnection( "Data Source=" + this.dbConfig.DBName +
";User Id=" + this.dbConfig.user +
";Password=" + this.dbConfig.pwd +
";Integrated Security=no;");

OracleDataAdapter odaMain = new OracleDataAdapter(Resource1.SQL_MAIN, conn);
....
....

try
{
odaMain.Fill(dsMain);
....
}
catch (OracleException oraex)
{
switch (oraex.Code)
{
....
}
}

string DBVersion = GetDBVersion(conn);
conn.Close();
conn.Dispose();

// ważne! nazwy zrodla danych w definicji raportu i w kodzie musza byc takie same.
dsMain.Tables[0].TableName = "DataSet1_TablesDescription";
....

// w trybie "cichym" nic wiecej nie trzeba
LocalReport report = new LocalReport();

// wczytujemy raport z pliku (ale boze byc rownie dobrze z zasobow, ze strumienia)

Stream s = new FileStream(@"Report.rdlc", FileMode.Open);
report.LoadReportDefinition(s);
s.Close();

// najlepiej niech nazwa subraportu i jego pliku beda takie same.
s = new FileStream(@"TableRelationship.rdlc", FileMode.Open);
report.LoadSubreportDefinition(@"TableRelationship", s);
s.Close();

report.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource(dsMain.Tables[0].TableName, dsMain.Tables[0]));
....

// to zdarzenie mozna podpiac tylko z kodu
report.SubreportProcessing += new SubreportProcessingEventHandler(LocalReport_SubreportProcessing);

report.SetParameters(new ReportParameter("DBVersion", DBVersion));

// eksport do pliku
Warning[] warnings;
string[] streamids;
string mimeType;
string encoding;
string extension;

string format = "";

if (generatePDF)
{
....
fileName = "KatalogTabel_" + DBVersion + ".pdf";
format = "PDF";
}
else
{
....
fileName = "KatalogTabel_" + DBVersion + ".doc";
format = "Word";
}
....

// pdf, xls, doc, jpg, bmp, png, emf...
byte[] bytes = report.Render( format, null, out mimeType, out encoding,
out extension, out streamids, out warnings);

FileStream fs = new FileStream(this.fileName, FileMode.Create);
fs.Write(bytes, 0, bytes.Length);
fs.Close();

....
}
....

void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e)
{
e.DataSources.Clear();

// jak o tym zapomnisz, sypnie bledem, ze brak zrodla danych.
// musisz tu podac WSZYSTKIE zrodla danych, dla raportu glownego i wszystkich subraportow!
e.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource(dsMain.Tables[0].TableName, dsMain.Tables[0]));
....
}
Adrian Olszewski edytował(a) ten post dnia 29.11.10 o godzinie 12:03

Temat: MyNeoReport - ktoś używał i może podzielić się opinią?

I jeszcze kod do "cichego" drukowania(zaadaptowany z rozwiązania, do którego link podałem w jednym z postów):

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing.Imaging;
using System.IO;
using System.Drawing.Printing;
using Microsoft.Reporting.WinForms;

namespace .........
{
class PrintingProvider
{
private int currentPageIndex;
private IList<Stream> streams;
private LocalReport report;

decimal marginLeft;
decimal MarginTop;

string printerName;

public PrintingProvider(LocalReport report, decimal marginLeft, decimal MarginTop, string printerName)
{
this.report= report;
this.marginLeft = marginLeft;
this.marginTop = marginTop;
this.printerName = printerName;
}

private Stream CreateStream(string name, string fileNameExtension, Encoding encoding,
string mimeType, bool willSeek)
{
MemoryStream memStream = new MemoryStream();
streams.Add(memStream);
return memStream;
}

private void Export()
{
string deviceInfo =
"<DeviceInfo>" +
" <OutputFormat>EMF</OutputFormat>" +
" <PageWidth>21cm</PageWidth>" +
" <PageHeight>29.7cm</PageHeight>" +
" <MarginTop>" + this.marginTop.ToString("n2").Replace(",", ".") + "mm</MarginTop>" +
" <MarginLeft>" + this.marginLeft.ToString("n2").Replace(",", ".") + "mm</MarginLeft>" +
" <MarginRight>0.0in</MarginRight>" +
" <MarginBottom>0.0in</MarginBottom>" +
"</DeviceInfo>";
Warning[] warnings;
streams = new List<Stream>();

this.report.Render("Image", deviceInfo, CreateStream, out warnings);

foreach (Stream stream in streams)
stream.Position = 0;
}

private void Print()
{
if (streams == null || streams.Count == 0)
return;

PrintDocument printDoc = new PrintDocument();
printDoc.PrinterSettings.PrinterName = this.PrinterName;
if (!printDoc.PrinterSettings.IsValid)
{
...... // brak drukarki
return;
}
printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
printDoc.DocumentName = "..........";
printDoc.PrintController = new StandardPrintController();
printDoc.Print();
}

public void PrintIt()
{
this.Export();
this.currentPageIndex = 0;
this.Print();
}

private void PrintPage(object sender, PrintPageEventArgs ev)
{
Metafile pageImage = new Metafile(streams[currentPageIndex]);
ev.Graphics.DrawImage(pageImage, ev.PageBounds);

currentPageIndex++;
ev.HasMorePages = (currentPageIndex < streams.Count);
}
}
}


Jeśli chcesz wykorzystać zewnętrzne klasy, np. tę do obsługi barkodów, musisz dodać w kodzie:
report.AddTrustedCodeModuleInCurrentAppDomain("System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");

report.AddTrustedCodeModuleInCurrentAppDomain("I25, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");


Możesz też wygenerować tzw. mapę raportu, czyli panel z "klikalnymi" linkami po lewej stronie raportu, odnoszącymi się do elementów, którym na etapie projektowania nadałeś nazwy. Co przydatne, mapa eksportuje się do PDFa w formie "bookmarków" i do DOCa, gdzie na tej podstawie jednym kliknięciem (albo w kodzie przez COM) można wygenerować spis treści.
Obrazek


I to chyba najważniejsze przydatne sprawy. Powodzenia, w razie problemów pisz :)Adrian Olszewski edytował(a) ten post dnia 29.11.10 o godzinie 12:51

konto usunięte

Temat: MyNeoReport - ktoś używał i może podzielić się opinią?

Dziekuje ogromnie! Podziele sie pozniej wynikiem tworczosci;)
Maciej Hehl

Maciej Hehl w teorii Automatyk i
Robotyk (po wydziale
mechanicznym), ...

Temat: MyNeoReport - ktoś używał i może podzielić się opinią?

Czy mogę tak nieśmiało zapytać do czego służą argumenty w tej funkcji?


private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek)
{
MemoryStream memStream = new MemoryStream();
streams.Add(memStream);
return memStream;
}
Maciej Hehl edytował(a) ten post dnia 30.11.10 o godzinie 19:05

konto usunięte

Temat: MyNeoReport - ktoś używał i może podzielić się opinią?

a tak zapytam przy okazji raportów
w jaki sposób szybko w ASP.NET przenieść zawartość datagrid-a do pliku excel najlepiej generowanego dynamicznie

Temat: MyNeoReport - ktoś używał i może podzielić się opinią?

Maciej Hehl:
Czy mogę tak nieśmiało zapytać do czego służą argumenty w tej funkcji?


private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek)
{
MemoryStream memStream = new MemoryStream();
streams.Add(memStream);
return memStream;
}
Maciej Hehl edytował(a) ten post dnia 30.11.10 o godzinie 19:05

Taka jest sygnatura delegaty CreateStreamCallback. W podanym przypadku wystarczyło utworzenie strumienia bez żadnych "dodatków" i nie trzeba było korzystać z dostarczanych w parametrach wartości.

namespace Microsoft.Reporting.WinForms
{
// Summary:
// Provides a stream to the ReportViewer control for rendering.
//
// Parameters:
// name:
// The name of the stream.
//
// extension:
// The file name extension to use if a file stream is being created.
//
// encoding:
// An Encoding enumerator value specifying the character encoding of the stream.
// This may be null if the stream does not contain characters.
//
// mimeType:
// A string containing the MIME type of the stream.
//
// willSeek:
// A Boolean value indicated whether the stream needs to support seeking. If
// the value is false, the stream will be forward-only and will be sent to the
// client in chunks as it is created. If the value is true, the stream may be
// written in any order.
//
// Returns:
// A Stream object to which the ReportViewer control can write data.
public delegate Stream CreateStreamCallback(string name, string extension, Encoding encoding, string mimeType, bool willSeek);
}

konto usunięte

Temat: MyNeoReport - ktoś używał i może podzielić się opinią?

@Adrian && @Maciek
sadze ze odnosnie Maćkowego pytania o parametry przydaloby sie tez jednoczesnie wspomniec o Missing.Value, czyli tzw. wartosci opcjonalnej nader czesto w c# wykorzystywanej (a juz szczegolnie przy wspolpracy z Excel itp) - kiedy to spora czesc parametrow wywolania nie jest obligatoryjna i nasze Missing.Value stanowi najlepszy sposób na powyższe, np:
dla stworzenia workbooka excel, o składni:
Workbook Add(
[In, Optional] object Template
);

używamy jak poniżej:
Workbook workbook = excelApplication.Workbooks.Add(Missing.Value);


Co prawda uwaga nie do końca z samym zapytaniem powiązana, ale sądzę, że przydatnaPiotr Jędrkowiak edytował(a) ten post dnia 30.11.10 o godzinie 21:05
Maciej Hehl

Maciej Hehl w teorii Automatyk i
Robotyk (po wydziale
mechanicznym), ...

Temat: MyNeoReport - ktoś używał i może podzielić się opinią?

Adrian Olszewski:
Taka jest sygnatura delegaty CreateStreamCallback. ...

Dziękuję. To sprawę wyjaśnia :)



Wyślij zaproszenie do