Migracja z QuickReport do sgcReports

sgcReports to pasmowy silnik raportów sgcUI: TsgcReport przechowuje układ, TsgcReportEngine wiąże dane, TsgcReportPreviewVCL wyświetla strony, a eksport PDF zapisuje oznakowany PDF/UA. Ten zestaw przyporządkowuje pasma i kontrolki QuickReport, których używasz, ich odpowiednikom w sgcReports, pokazuje kod ze skompilowanego dema i uczciwie wskazuje, co do siebie nie pasuje.

Raporty Delphi VCL zbudowane w QuickReport

TQuickRep na formularzu, pasma, kontrolki QR na pasmach oraz przycisk podglądu, drukowania lub PDF w aplikacji.

QuickReport jest znów rozwijany. W artykule „QuickReport is back” (blog Embarcadero, Ian Barker, 14 listopada 2024) Embarcadero wyjaśnia, że produkt przeszedł kryzys po śmierci jego głównego twórcy, został wznowiony z partnerem Embarcadero, firmą Barnsten, i obsługuje teraz wszystkie wersje RAD Studio z Delphi i C++Builder od Delphi 7. Strona QuickReport firmy Barnsten (z dnia 2026-10-20) wymienia filtr PDF z osadzonymi czcionkami TrueType, obsługę PDF/A oraz filtry eksportu HTML, XML/XSLT, XLS i XLSX, a QuickReport Pro 5 Developers podaje w cenie 2155,00 EUR bez VAT. Ta strona nie dotyczy więc martwego produktu ani brakującego przycisku PDF. Jest dla zespołów, które chcą tego, o czym ta lista funkcji nie wspomina.

Co daje sgcReports

Każde poniższe twierdzenie o sgcReports znajduje się w dostarczanym kodzie źródłowym. Po stronie QuickReport „Nie wymieniono” oznacza, że strona dostawcy nic o tym nie mówi, a nie „Nieobsługiwane”.

Dostępny PDF/UA

TsgcReportPDFExport domyślnie zapisuje oznakowany PDF/UA (PDFUA ma wartość True, PDFUAPart wybiera część 1 lub 2), z kolejnością czytania, rolami nagłówków z TagRole elementu, tekstami alternatywnymi z AltText oraz Language i Title dokumentu. PDFA dodaje PDF/A-3b, PDF/A-3a lub PDF/A-4 do archiwizacji. Jest dostępny we wszystkich edycjach, także w Community. PDF/UA i oznakowanego PDF nie ma na stronie funkcji Barnsten. Dostępne dokumenty mają większe znaczenie od czasu wejścia w życie Europejskiego aktu o dostępności, dyrektywy (UE) 2019/882, która obejmuje produkty i usługi takie jak e-booki, handel elektroniczny i usługi bankowe.

Projektant dla użytkownika końcowego, VCL i FireMonkey

Twoi użytkownicy mogą zmienić raport bez ponownej kompilacji: sgcShowReportDesigner(Engine) otwiera projektant VCL, albo osadź panel TsgcVCLReportDesigner; sgcShowReportDesignerFMX(Engine) robi to samo w FireMonkey (Delphi XE6 i nowsze, desktop). Projektant VCL podąża za zmianami DPI formularza (jego inspektor, ikony i powierzchnia projektowa zmieniają rozmiar w ChangeScale). Tylko edycje Registered. Strona funkcji Barnsten nie wymienia projektanta dla użytkownika końcowego; historycznie był to osobny produkt firm trzecich, QRDesign. Co do High DPI, odpowiedź na Delphi-PRAXiS z 4 kwietnia 2022 mówiła, że QuickReport 6 kompiluje się w Delphi 11.1, ale nie obsługuje High-DPI; sprawdź aktualną wersję u dostawcy.

Jeden silnik dla całego zestawu

Tabele krzyżowe, kody kreskowe, podraporty i tekst sformatowany to typy elementów tego samego pasmowego silnika. Dzięki jednostkom mostowym raport drukuje też wykres sgcCharts i tabelę przestawną sgcPivotGrid jako elementy, rysowane w PDF jako treść wektorowa (edycje Registered). Eksporty: PDF, XLSX, CSV, HTML i PNG we wszystkich edycjach, DOCX w edycjach Registered.

Definicje JSON i odpowiednik w .NET

Raport zapisuje się i wczytuje w formacie JSON (TsgcReport.SaveToFile, LoadFromFile), więc układy mogą żyć w bazie danych lub pod kontrolą wersji. Ta sama definicja wczytuje się w sgcReports dla .NET (NuGet esegece.sgcReports, .NET Standard 2.0, .NET Framework 4.7.2 i .NET 6 oraz nowsze), więc raport z Delphi może zostać użyty ponownie przez usługę .NET.

Raporty są budowane od nowa, nie importowane. sgcReports nie otworzy pliku .dfm z QuickReport: nie ma importera QuickReport. Każdy raport jest odtwarzany, w kodzie, tak jak robi to poniższe demo, albo w projektancie sgcReports (edycje Registered). Mapowanie i kroki na tej stronie czynią z tego mechaniczną pracę, pasmo po paśmie. sgcReports jest licencjonowany na programistę od €199 z pełnym kodem źródłowym i rokiem aktualizacji, a także wchodzi w skład sgcUI.

Klasy QuickReport i ich odpowiedniki w sgcReports

Każda poniższa nazwa sgcReports występuje w dostarczanym kodzie źródłowym, a te, których używa demo, się w nim kompilują. Nazwy QuickReport podano orientacyjnie; QuickReport nie był zainstalowany podczas sprawdzania tej strony.

QuickReport sgcReports Edycja
TQuickRepTsgcReport (Pages, Styles, Units, Title) i TsgcReportEngine (Report, AddDataSource, Prepare, Variables, OnGetVariable)Wszystkie
TQuickRep.DataSetTsgcReportDataSetSource (SourceName, DataSet) zarejestrowany przez AddDataSource; DataSourceName pasma go wskazujeWszystkie
TQuickRep.Page (papier, marginesy)TsgcReportPage.PaperSize (rpsA3, rpsA4, rpsA5, rpsLetter, rpsLegal, rpsCustom), Margins.Left, Top, Right, BottomWszystkie
TQuickRep.ReportTitleTsgcReport.Title oraz TsgcReportPDFExport.Title dla metadanych PDFWszystkie
TQRBand z BandType rbTitle, rbPageHeader, rbColumnHeaderTsgcReportBand z BandType rbtReportTitle, rbtPageHeader, rbtColumnHeaderWszystkie
rbDetailrbtMasterData z DataSourceName ustawionym na źródło nadrzędneWszystkie
rbGroupHeader, rbGroupFooterrbtGroupHeader, rbtGroupFooterWszystkie
rbSummary, rbPageFooterrbtReportSummary, rbtPageFooterWszystkie
TQRChildBandrbtChild z TsgcReportBand.ChildBandNameWszystkie
TQRSubDetailPasmo rbtDetailData (DataSourceName = źródło szczegółów) oraz MasterSource, MasterFields, DetailFields w źródle szczegółów TsgcReportDataSetSourceWszystkie
TQRGroup.ExpressionrbtGroupHeader z GroupExpressionWszystkie
TQRGroup.ReprintOnNewPageTsgcReportBand.RepeatOnEveryPageWszystkie
TQRGroup.FooterBandNastępne pasmo rbtGroupFooter; pierwsza stopka zamyka najbardziej wewnętrzną grupęWszystkie
TQRBand.ForceNewPageTsgcReportBand.StartNewPageWszystkie
TQRLabel (Caption)Element z Kind = rikText i literalnym Text.TextWszystkie
TQRDBText (DataField, Mask)rikText z Text.Text = '[Source.Field]'; Mask zamienia się w Text.DisplayFormatWszystkie
TQRExpr (Expression)rikText z '[expression]', na przykład '[Lines.Qty * Lines.Price]'; funkcje takie jak IIF, FormatFloat, FormatDateTime, Round, UpperWszystkie
TQRExpr z SUM, COUNT, AVERAGE, MIN, MAX[Sum(x)], [Count()], [Avg(x)], [Min(x)], [Max(x)]; zerowanie według grupy w stopkach grup, zakres strony w stopkach stronWszystkie
TQRSysData qrsPageNumber[Page] oraz [TotalPages] dla Strona X z YWszystkie
TQRSysData qrsDate, qrsTime, qrsDetailNo[Date], [Time] z Text.DisplayFormat; [Line] lub [RecNo]Wszystkie
TQRShape (qrsRectangle, qrsCircle, qrsRoundRect)rikShape z Shape.ShapeKind rskRectangle, rskEllipse, rskRoundRect; Shape.PenColor, FillColor, PenWidthWszystkie
TQRShape qrsHorLinerikLine z Height = 0Wszystkie
TQRImage, TQRDBImagerikImage z Image.FileName lub Image.Picture, albo Image.DataField; Stretch, KeepAspectRatioWszystkie
TQRRichText, TQRDBRichTextrikRichText z RichText.Markup: znaczniki w stylu HTML, nie RTF, mogą zawierać [expressions]Wszystkie
Enabled ustawiane w czasie działania, zdarzenia BeforePrintVisibleExpression na pasmach i elementach; TsgcReportEngine.OnBeforePrintBandWszystkie
Prepare, PreviewTsgcReportEngine.Prepare zwraca TsgcReportPreparedPages; TsgcReportPreviewVCL.Prepare wyświetla je w kontrolce na formularzuWszystkie
Print, PrinterSetupTsgcReportPreviewVCL.Print(aTitle), po standardowym TPrintDialogWszystkie
ExportToFilter z filtrem PDFTsgcReportPDFExport.SaveToFile(aPages, aFileName) lub SaveToStreamWszystkie
PDF/ATsgcReportPDFExport.PDFA = rpaA3b, rpaA3a lub rpaA4Wszystkie
Nie wymienionoPDF/UA: TsgcReportPDFExport.PDFUA (domyślnie True), PDFUAPart, Language, Title; TagRole i AltText elementuWszystkie
Nie wymieniono (QRDesign był dodatkowym modułem firm trzecich)Projektant dla użytkownika końcowego: sgcShowReportDesigner, TsgcVCLReportDesigner; sgcShowReportDesignerFMX w FireMonkeyRegistered

Kod ze skompilowanego dema

Każdy fragment jest skopiowany z dema MigrateFromQuickReport, które kompiluje się w Delphi 7 i Delphi 13 (Win32 i Win64) oraz w edycji Community. Komentarze wskazują kod QuickReport, który zastępuje.

TQuickRep zamienia się w raport i silnik

Przed: TQuickRep na formularzu, z raportem i jego danymi w jednym komponencie. Po: układ, silnik i podgląd to osobne komponenty.

frmMain.dfm
object sgcPreview: TsgcReportPreviewVCL
  Left = 0
  Top = 44
  Width = 900
  Height = 676
  Align = alClient
  TabOrder = 1
  Engine = sgcEngine
end
object sgcReport: TsgcReport
  Left = 40
  Top = 80
end
object sgcEngine: TsgcReportEngine
  Report = sgcReport
  Left = 120
  Top = 80
end

TQuickRep.DataSet i TQRSubDetail zamieniają się w źródła danych

Przed: TQuickRep.DataSet dla faktur i TQRSubDetail z własnym DataSet dla pozycji. Po: jedno źródło na zestaw danych, szczegóły powiązane z nadrzędnym przez pola. FormCreate rejestruje oba przez sgcEngine.AddDataSource.

frmMain.dfm
object srcInvoices: TsgcReportDataSetSource
  SourceName = 'Invoices'
  DataSet = cdsInvoices
  Left = 40
  Top = 208
end
object srcLines: TsgcReportDataSetSource
  SourceName = 'Lines'
  MasterSource = srcInvoices
  MasterFields = 'Number'
  DetailFields = 'Invoice'
  DataSet = cdsLines
  Left = 120
  Top = 208
end

Metoda pomocnicza zastępująca TQRLabel, TQRDBText i TQRExpr

Demo dodaje każdy tekst tą małą metodą swojego formularza, aby poniższe fragmenty pozostały krótkie.

frmMain.pas
function TformMain.AddText(aBand: TsgcReportBand; const aText: string;
  aLeft, aTop, aWidth: Double; const aStyle: string): TsgcReportItem;
var
  oStyle: TsgcReportStyle;
begin
  // one item replaces TQRLabel (literal text), TQRDBText ([Source.Field])
  // and TQRExpr ([expression]); literal text and [expressions] can be mixed
  Result := aBand.Items.Add;
  Result.Kind := rikText;
  Result.Name := aBand.Name + IntToStr(aBand.Items.Count);
  Result.Text.Text := aText;
  Result.Left := aLeft;
  Result.Top := aTop;
  Result.Width := aWidth;
  Result.Height := 14;
  Result.StyleName := aStyle;
  oStyle := sgcReport.Styles.FindStyle(aStyle);
  if Assigned(oStyle) and (oStyle.Font.Size * 1.25 > Result.Height) then
    Result.Height := oStyle.Font.Size * 1.25;
end;

Układ, pasmo tytułu i TQRSysData

Przed: TQuickRep.Page, pasmo tytułu i TQRSysData z datą. Po: TagRole oznacza tytuł jako nagłówek w drzewie znaczników PDF/UA.

frmMain.pas
// QuickReport: TQuickRep.Page (PaperSize, LeftMargin, TopMargin, ...)
oPage := sgcReport.Pages.Add;
oPage.Name := 'Invoices';
oPage.PaperSize := rpsA4;
oPage.Margins.Left := 40;
oPage.Margins.Top := 40;
oPage.Margins.Right := 40;
oPage.Margins.Bottom := 40;

// TQRBand BandType = rbTitle: printed once, on the first page
oBand := AddBand(oPage, rbtReportTitle, 'Title', 40);
AddText(oBand, 'Invoices by customer', 0, 0, 350, 'Title').TagRole :=
  rtrHeading1;
AddText(oBand, 'Printed on', 315, 6, 120, 'Right');
// TQRSysData Data = qrsDate
oItem := AddText(oBand, '[Date]', 440, 6, 75, 'Right');
oItem.Text.DisplayFormat := 'yyyy-mm-dd';

TQRGroup, pasmo szczegółów i TQRSubDetail

Przed: TQRGroup na kliencie, pasmo szczegółów z kontrolkami TQRDBText oraz TQRSubDetail z TQRExpr dla kwoty pozycji. Po:

frmMain.pas
// TQRGroup Expression = 'Invoices.Customer', ReprintOnNewPage = True.
// The column titles are TQRLabel components in QuickReport
oBand := AddBand(oPage, rbtGroupHeader, 'CustomerHeader', 42);
oBand.GroupExpression := 'Invoices.Customer';
oBand.RepeatOnEveryPage := True;
AddText(oBand, '[Invoices.Customer]', 0, 4, 515, 'Group').TagRole :=
  rtrHeading2;
AddText(oBand, 'Invoice / product', 0, 24, 200, 'Bold');
AddText(oBand, 'Date / qty', 210, 24, 120, 'Bold');
AddText(oBand, 'Price', 345, 24, 70, 'BoldRight');
AddText(oBand, 'Amount', 425, 24, 90, 'BoldRight');
AddLine(oBand, 40);

// TQRBand BandType = rbDetail: one band per record of TQuickRep.DataSet.
// Each [Source.Field] text item replaces a TQRDBText with DataField set
oBand := AddBand(oPage, rbtMasterData, 'Invoice', 18);
oBand.DataSourceName := 'Invoices';
AddText(oBand, '[Invoices.Number]', 0, 3, 200, 'Bold');
oItem := AddText(oBand, '[Invoices.InvoiceDate]', 210, 3, 120, 'Bold');
oItem.Text.DisplayFormat := 'yyyy-mm-dd';
oItem := AddText(oBand, '[Invoices.Amount]', 425, 3, 90, 'BoldRight');
// TQRDBText.Mask
oItem.Text.DisplayFormat := '#,##0.00';

// TQRSubDetail DataSet = Lines, linked to the invoice: the link is
// MasterSource / MasterFields / DetailFields of srcLines (see the form)
oBand := AddBand(oPage, rbtDetailData, 'Line', 14);
oBand.DataSourceName := 'Lines';
AddText(oBand, '[Lines.Product]', 15, 1, 195);
AddText(oBand, '[Lines.Qty]', 210, 1, 40, 'Right');
oItem := AddText(oBand, '[Lines.Price]', 345, 1, 70, 'Right');
oItem.Text.DisplayFormat := '#,##0.00';
// TQRExpr Expression = 'Lines.Qty * Lines.Price'
oItem := AddText(oBand, '[Lines.Qty * Lines.Price]', 425, 1, 90, 'Right');
oItem.Text.DisplayFormat := '#,##0.00';

Agregaty w stopce grupy

Przed: komponenty TQRExpr z COUNT i SUM w paśmie stopki grupy. Po:

frmMain.pas
// TQRBand BandType = rbGroupFooter (TQRGroup.FooterBand). Aggregates are
// reset for every group, like TQRExpr with ResetAfterPrint = True
oBand := AddBand(oPage, rbtGroupFooter, 'CustomerFooter', 30);
AddLine(oBand, 2);
// TQRExpr Expression = 'COUNT' and 'SUM(Lines.Qty)'
AddText(oBand, '[Count()] invoices, [Sum(Lines.Qty)] items', 0, 8,
  250, 'Bold');
AddText(oBand, 'Customer total', 260, 8, 155, 'BoldRight');
// TQRExpr Expression = 'SUM(Invoices.Amount)'
oItem := AddText(oBand, '[Sum(Invoices.Amount)]', 425, 8, 90, 'BoldRight');
oItem.Text.DisplayFormat := '#,##0.00';

Pasmo podsumowania, TQRShape i TQRRichText

Przed: pasmo podsumowania z TQRShape, sumami ogólnymi i TQRRichText. Po: tekst sformatowany to znaczniki w stylu HTML.

frmMain.pas
// TQRBand BandType = rbSummary: printed once, after the last record
oBand := AddBand(oPage, rbtReportSummary, 'Summary', 90);
oBand.KeepTogether := True;
// TQRShape Shape = qrsRectangle, Brush.Color and Pen.Color
oItem := oBand.Items.Add;
oItem.Kind := rikShape;
oItem.Name := 'SummaryBox';
oItem.Top := 10;
oItem.Width := 515;
oItem.Height := 30;
oItem.Shape.ShapeKind := rskRectangle;
oItem.Shape.PenColor := $00A0A0A0;
oItem.Shape.FillColor := $00EEF3FA;
// TQRExpr Expression = 'COUNT' and 'SUM(Invoices.Amount)' in the summary
AddText(oBand, 'Grand total, [Count()] invoices', 10, 17, 300, 'Group');
oItem := AddText(oBand, '[Sum(Invoices.Amount)]', 315, 17, 190,
  'GroupRight');
oItem.Text.DisplayFormat := '#,##0.00';
// TQRRichText: the text is HTML-like markup instead of RTF
oItem := oBand.Items.Add;
oItem.Kind := rikRichText;
oItem.Name := 'SummaryNote';
oItem.Top := 50;
oItem.Width := 515;
oItem.Height := 36;
oItem.StyleName := 'Base';
oItem.RichText.Markup := '<b>Migrated from QuickReport.</b> Each band of ' +
  'this report replaces a <i>TQRBand</i>, each text item a <i>TQRLabel</i>, '
  + '<i>TQRDBText</i> or <i>TQRExpr</i>.';

Stopka strony z Strona X z Y

frmMain.pas
// TQRBand BandType = rbPageFooter
oBand := AddBand(oPage, rbtPageFooter, 'PageFooter', 20);
AddLine(oBand, 2);
// TQRLabel with a literal caption
AddText(oBand, 'Invoices by customer', 0, 6, 300);
// TQRSysData Data = qrsPageNumber; [TotalPages] is resolved after the
// last page is laid out
AddText(oBand, 'Page [Page] of [TotalPages]', 315, 6, 200, 'Right');

Podgląd i drukowanie

Przed: QuickRep1.Preview, PrinterSetup i Print. Po:

frmMain.pas
procedure TformMain.btnPreviewClick(Sender: TObject);
begin
  // QuickReport: QuickRep1.Preview (or Prepare + a TQRPreview). sgcReports:
  // the preview control on the form runs the engine and shows the pages
  sgcPreview.Prepare;
  lblStatus.Caption := Format('%d pages prepared', [sgcPreview.PageCount]);
end;

procedure TformMain.btnPrintClick(Sender: TObject);
begin
  // QuickReport: QuickRep1.PrinterSetup + QuickRep1.Print. The print dialog
  // selects the printer, Print sends the prepared pages to it
  if dlgPrint.Execute then
    sgcPreview.Print(sgcReport.Title);
end;

ExportToFilter zamienia się w TsgcReportPDFExport

Przed: ExportToFilter z filtrem PDF. Po: jeden przełącznik zapisuje zwykły PDF albo oznakowany plik PDF/UA.

frmMain.pas
procedure TformMain.SavePDF(aPDFUA: Boolean; const aFileName: string);
var
  oPages: TsgcReportPreparedPages;
  vFileName: string;
begin
  // QuickReport: QuickRep1.ExportToFilter(TQRPDFDocumentFilter.Create(...))
  vFileName := ExtractFilePath(ParamStr(0)) + aFileName;
  // PDF/UA: a tagged PDF (headings, reading order, alternate texts); Title
  // and Language are set on pdfExport in the form
  pdfExport.PDFUA := aPDFUA;
  oPages := sgcEngine.Prepare;
  try
    pdfExport.SaveToFile(oPages, vFileName);
  finally
    oPages.Free;
  end;
  lblStatus.Caption := Format('Saved %s (%d warnings)',
    [vFileName, pdfExport.Warnings.Count]);
end;

Osiem kroków na raport

Zestawy danych pozostają bez zmian. Raport jest odtwarzany pasmo po paśmie.

1

Wymień TQuickRep

Umieść TsgcReport, TsgcReportEngine (Report = raport) i TsgcReportPreviewVCL (Engine = silnik) na zwykłym formularzu.

2

Zarejestruj dane

Dodaj jeden TsgcReportDataSetSource na zestaw danych (SourceName, DataSet) i wywołaj AddDataSource. Dla każdego TQRSubDetail ustaw MasterSource, MasterFields i DetailFields.

3

Ustaw stronę

Dodaj TsgcReportPage z formatem papieru i marginesami z TQuickRep.Page i ustaw TsgcReport.Units (ruPoints w demo), aby współrzędne były przewidywalne.

4

Odtwórz pasma

Jedno TsgcReportBand na każde TQRBand, w kolejności raportu, z odpowiednim typem pasma rbt; DataSourceName w pasmach nadrzędnych i szczegółów, GroupExpression w nagłówkach grup.

5

Odtwórz kontrolki

TQRLabel, TQRDBText i TQRExpr zamieniają się w elementy rikText, które łączą tekst literalny i [expressions]. Mask zamienia się w Text.DisplayFormat, a czcionki w nazwane style.

6

Przetłumacz wyrażenia

Agregaty zamieniają się w [Sum(x)], [Count()], [Avg(x)], [Min(x)] i [Max(x)]; TQRSysData zamienia się w [Page], [TotalPages], [Date] i [Time].

7

Podgląd, drukowanie, eksport

Preview zamienia się w TsgcReportPreviewVCL.Prepare, Print w Print, a filtr PDF w TsgcReportPDFExport.SaveToFile. Ustaw PDFUA, Title i Language, aby uzyskać dostępny PDF.

8

Oddaj go użytkownikom

Opcjonalnie, edycje Registered: zapisz odtworzony raport w JSON przez TsgcReport.SaveToFile i pozwól użytkownikom edytować go przez sgcShowReportDesigner.

Co nie odpowiada sobie jeden do jednego

Przeczytaj to przed zaplanowaniem migracji.

MigrateFromQuickReport

Typowa lista faktur master-detail z QuickReport, zgrupowana według klienta: 18 faktur 4 klientów i ich pozycje, z dwóch TClientDataSet wypełnianych w kodzie.

Gdzie je znaleźć

Instalator sgcUI umieszcza je w Demos\Reports\Delphi\MigrateFromQuickReport: sgcReports_Demo_MigrateFromQuickReport.dpr, frmMain.pas, frmMain.dfm oraz readme.html. Jest też w edycji Community.

Jak je uruchomić

Otwórz .dpr w dowolnym Delphi od 7 do 13 z zainstalowanymi sgcReports i sgcPDF, skompiluj dla Win32 lub Win64 i uruchom. Raport jest przygotowywany przy starcie, trzy strony ze Strona X z Y.

Co wypróbować

Print... wyświetla okno drukowania i drukuje. Save PDF zapisuje invoices.pdf, a Save PDF/UA zapisuje oznakowany plik invoices_pdfua.pdf obok exe, gotowy do sprawdzenia walidatorem PDF/UA.

Uczciwie wobec obu silników: QuickReport jest znów rozwijany, obsługuje Delphi 7 i nowsze, a jego raporty projektuje się w projektancie formularzy Delphi. Jego strona funkcji wymienia filtry eksportu, takie jak XML/XSLT, których sgcReports nie ma, a pozostanie przy nim oznacza brak odtwarzania jakiegokolwiek raportu. sgcReports to dobra droga, gdy potrzebujesz dostępnego wyjścia PDF/UA, projektanta dla swoich użytkowników, raportów współdzielonych z sgcCharts, sgcPivotGrid lub usługą .NET i akceptujesz jednorazowe odtworzenie każdego raportu. Pełną listę funkcji znajdziesz na stronie produktu sgcReports.

Najkorzystniejsza oferta: All-AccessWszystkie produkty eSeGeCe, ze wsparciem Premium w cenie, już od €1,059 rocznie.
Zobacz cennik All-Access

Odtwórz swój pierwszy raport już dziś

Pobierz wersję próbną sgcUI z sgcReports i demem MigrateFromQuickReport, a następnie przenieś swój pierwszy raport.