Tworzenie raportów na podstawie ustalonych szablonów

0

Witam,
Chce zrobić aplikacje która będzie generowała pewien wydruk danych - raport. Moja baza danych jest zrobiona na podstawie rekordów. Chce aby wygląd wydruku mozna zmieniac bez wchdzenia w kod, cos tak jak szablony. Widzialem w pewnej apce ze ktos miał utworzony szablon w pliku doc i mozna bylo dostosowywac wyglad wydruku. Plik doc miał odwołania jakies do pól ktore sa uzupelnianie zaciagajac dane z bazy.

0
damkon napisał(a):

Chce zrobić aplikacje która będzie generowała pewien wydruk danych(raport)

I co cie powstrzymuje? Oprócz tego że chcesz użyć w tym celu Pascala?

0

Chodzi o to w jaki sposob stworzyc szablon w doc badz docx i na podstawie tego szablonu generowac raporty podstawiajac dane z bazy w odpowiednie miejsca w pliku doc.

0

Dawno dawno temu w Delphi 7, coś takiego robiłem, może coś ci pomoże :


type
  TWordReplaceFlags = set of (wrfReplaceAll, wrfMatchCase, wrfMatchWildcards);

.....
.....
procedure TfrmDrukowanieDokumentow.OtworzDokumentDOC(plik:string);
const
  wdFindContinue = 1;
  wdReplaceOne = 1;
  wdReplaceAll = 2;
  wdDoNotSaveChanges = 0;
var
  WordApp: OLEVariant;
  Flags: TWordReplaceFlags;
  x:integer;
  i:integer;
begin


 if assigned(GRID) then
  begin
   for x:=0 to GRID.SelectedRows.Count-1 do
    begin
     Flags:=[wrfReplaceAll];
     try
       WordApp := CreateOLEObject('Word.Application');
     except
       on E: Exception do
       begin
         E.Message := 'MSWord nie jest dostępny.';
         raise;
       end;
     end;

     with GRID.DataSource.DataSet do
       GotoBookmark(Pointer(GRID.SelectedRows.Items[x]));
     for i:=0 to GRID.DataSource.DataSet.FieldCount-1 do
      begin


       try


        try
          { Hide Word }
          WordApp.Visible := True;
          { Open the document }
          WordApp.Documents.Open(sciezka+'\'+plik);
          { Initialize parameters}
          WordApp.Selection.Find.ClearFormatting;
          WordApp.Selection.Find.Text := '['+GRID.DataSource.DataSet.Fields[i].DisplayName+']';
          WordApp.Selection.Find.Replacement.Text := GRID.DataSource.DataSet.Fields[i].AsString;
          WordApp.Selection.Find.Forward := True;
          WordApp.Selection.Find.Wrap := wdFindContinue;
          WordApp.Selection.Find.Format := False;
          WordApp.Selection.Find.MatchCase := wrfMatchCase in Flags;
          WordApp.Selection.Find.MatchWholeWord := False;
          WordApp.Selection.Find.MatchWildcards := wrfMatchWildcards in Flags;
          WordApp.Selection.Find.MatchSoundsLike := False;
          WordApp.Selection.Find.MatchAllWordForms := False;
          { Perform the search}
          if wrfReplaceAll in Flags then
            WordApp.Selection.Find.Execute(Replace := wdReplaceAll)
          else
            WordApp.Selection.Find.Execute(Replace := wdReplaceOne);
        finally
          { Quit Word }
      //    WordApp.Quit;
        end;
       except
       end;
      end;
     WordApp := Unassigned;
    end;
  end;
end;

a z drugiej strony nie lepiej np fastreporta użyć ??

0

A fastreport nie będzie miał problemu pobierać dane z pliku typu rekordowego ?

1

do FR dorzucasz UserDataSet i możesz tam przekazać cokolwiek zechcesz

1

FR niestety jest płatny ale szczerze mówiąc to były najlepiej wydane pieniądze w życiu ... tworzenie raportów w FR jest tak proste i przyjemne, że łatwiej chyba tylko w apex mi się robi :)

0

Jeszcze w wersji 10.3 Community Edition FR był dokładany w specjalnej wersji dla Embarcadero i była to wersja bardzo użyteczna. Od wersji 10.4 już go chyba nie ma a klucze do 10.3 wygasły. Tak więc albo zakup albo ... nie wiem co.

1

w tagach masz Lazarus-a, więc jak chcesz to jest dostępny LazReport (czyli przeniesiony i trochę rozbudowany FreeReport, darmowa wersja FastReports).
Komponenty znajdują się na dysku po standardowej instalacji lazarusa. Należy tylko zainstalować (Menu: Pakiet > instaluj / odinstaluj pakiety)

0

Dodajmy jeszcze, że LazReport ma polską wersję językową i jest możliwy eksport do PDF.

0

Ok. Ale jak załadować dane z pliku typu rekordowego. Bo pobranie danych z bazy SQL jest spoko ale mam problem z plikiem aby z niego zaciągnąć dane.

1

Musisz zdefiniować DataSet. Poczytaj sobie to:
https://wiki.freepascal.org/How_to_write_in-memory_database_applications_in_Lazarus/FPC
Znajdziesz też stosowne poradniki w google. Ogólnie to wbrew pozorom proste. Musisz po prostu napisać import z pliku do stworzonego przez siebie DataSeta (moim zdaniem należy użyć do tego klasy TBufDataSet). W przykładzie powyżej masz import z csv.
Jeśli jednak piszesz bazę od zera to nie ma jednak większego sensu. TBufDataSet ma metody do odczytu i zapisu danych. Stwórz sobie więc odpowiedni DataSet i z nim pracuj.

0

Zrobiłem szablon w HTML i używając stringreplace podmieniam dane pobrane z pliku np: %numer% jest podmieniane na 123. Dodatkowo dodam jeszcze jeden plik przechowujący zmienne przypisane do danych w bazie. Przez co łatwo będzie dodawać nowe zmienne do szablonu. Czyli np: %nowa_zmienna% - urzadzenie.model. potem można wstawić gdzie się chce nową zmienna do szablonu w HTML.

2

ale korzystając z komponentu do raportowania możesz od razu wynika zapisać do pdf, html, obrazka, czy puścić bezpośrednio na drukarkę.
tutaj masz przykład użycia LazReport: Eksport tekstu ze znakami specjalnymi do PDF

1 użytkowników online, w tym zalogowanych: 0, gości: 1