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.
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?
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.
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ć ??
A fastreport nie będzie miał problemu pobierać dane z pliku typu rekordowego ?
do FR dorzucasz UserDataSet i możesz tam przekazać cokolwiek zechcesz
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 :)
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.
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
)
Dodajmy jeszcze, że LazReport ma polską wersję językową i jest możliwy eksport do PDF.
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.
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.
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.
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