Jak wyeksportować z FastReport4 do pdf

0

Dzień dobry

Mam raport który podbiera dane z mySQL-a i normalnie go drukuję poprzez okno drukowania do pdf.

Jak zrobić aby eksportować go bez tego okna na dysk do określonej lokalizacji?
np. D\DANE_FAKTURA

W razie potrzeby mogę wkleić kod- to żadna tajemnica

0

Pokaż jak to robisz

0
var
partia:string;
datanaglowek:string;
d1r,d2r,d3r:string;
order1:string;
textinput:string;
SprawdzenieRaportu:integer;
ILEznakow:integer;                        

  
  procedure Button1OnClick(Sender: TfrxComponent);   
  begin                      
 
   begin               
   ILEznakow:=length(Edit1.Text);
   end;
              
   begin             
   if ILEznakow <> 5 then
   showmessage ('Za mało lub za dużo cyfr w numerze zlecenia !');     
          
   if ILEznakow = 5 then
   Button1.ModalResult:=mrOK;      
   // Numer zamówienia
   textinput:=ComboBox1.Text+Edit1.Text;      
   replaceparam('pyt1:order1', 'ftstring', (textinput));
   replaceparam('pyt2:order2', 'ftstring', (textinput));
   replaceparam('pyt3:order3', 'ftstring', (textinput));
   replaceparam('pyt4:order4', 'ftstring', (textinput));
   replaceparam('pyt5:order5', 'ftstring', (textinput));
   replaceparam('pyt6:order6', 'ftstring', (textinput));
   replaceparam('pyt7:order7', 'ftstring', (textinput));
   replaceparam('pyt8:order8', 'ftstring', (textinput));
   replaceparam('pyt9:order9', 'ftstring', (textinput));
   replaceparam('pyt10:order10', 'ftstring', (textinput));
   replaceparam('pyt11:order11', 'ftstring', (textinput));       
    
   // Zmiana formatu daty                                                   
   datanaglowek:=DateToStr(<pyt1."DATA_ZLEC">);    
   d1r:=Copy(datanaglowek,1,4);
   d2r:=Copy(datanaglowek,6,2);
   d3r:=Copy(datanaglowek,9,2);      
               
   // Wypełnienie pola z nr zlecenia                                                                      
   Memo10.Text:='PCV/' + d2r + '/' + d1r + '/' + Edit1.Text + '/' + <pyt1."KLIENT">;                         
 
   Report.ReportOptions.Name :='DANE_FAKTURA_' + ComboBox1.Text + Edit1.Text  
  
   end;
  end;                  
      
begin
  
  // Button1.ModalResult:=mrNone;    
  
end.
0

frPDF: TfrxPDFExport; - takie coś rzucac na formatkę lub tworzysz dynamicznie w aplikacji konsolowej

frPDF.FileName - tu podajesz nazwę pliku ze ścieżką

frRap.Export(frPDF); -- to zapisuje ci jako pdf

0

Nawet nie wiem gdzie to dokładnie wrzucić.
Jestem samoukiem internetowo-forumowym, wiec wybaczcie moje braki w podstawach.

I pytanie czy ten eksport to przerobienie na zdjęcie czy też będzie można tam kopiować bloki tekstowe?

wymyśliłem sobie ze przycisk generuj nie będzie aktywny dopóki ilość wpisanych znaków nie będzie równa 5 - tylko to jest //

2

Odpowiem tak. Nie znam lepszego i bardziej rozbudowanego mechanizmu do raportowania dla delphi niż FastReport. Pracuję na nim od lat i jeszcze nigdy, w żadnej firmie nie zdarzyło mi się, że czegoś się w tym narzędziu nie udało zrobić. Cokolwiek byś sobie nie wymyślił to w FR się da to zrobić jednak faktycznie używanie go wymaga pewnego doświadczenia i wprawy. Jeśli nie masz żadnych podstaw to faktycznie może to być nieco problematyczne. Spróbuję Ci pomóc ale gotowca za Ciebie nie zrobię
screenshot-20210202131214.png

0

Nie oczekuję od nikogo gotowca, podpowiedzi , nakierowania
screenshot-20210202133004.png
mój IDE jest dużo biedniejszy, poza tym nie widzę tam takich opcji.
screenshot-20210202133108.png

Można za to z podglądu eksportować do PDF i prawidłowo robi PDF z blokami tekstowymi.

2

Otwierasz okno z tzw designera i jest to narzędzie wizualne do edycji raportu również wyprodukowane przez FR

screenshot-20210202134307.png

Natomiast w delphi powinieneś utworzyć aplikację z formą jak na załączonym obrazku.
Zamknij to okno raportu dorzuć na formę (w delphi nie w designerze fastreport) komponent, który ci podałem i wtedy w designerze raportu pojawi Ci się dodatkowa ikonka:
screenshot-20210202134539.png

0

Mi raport wychodzi od razu programu produkcyjnego, on jest jakby dodany jako podprogram.
i ja to już mam w preview

screenshot-20210202140107.png
ale export z ikonki nie działa z zielonej strzałki już tak

3

No widzisz i trzeba było tak od razu. Niestety programiści twojej aplikacji uznali, że nie można definiować nazwy / lokalizacji na sztywno dla tego raportu. Natomiast oczywiście dla konkretnego raportu takie parametry można zdefiniować ale nie z designera:

screenshot-20210203092647.png
screenshot-20210203092757.png

0

No dobra wiemy gdzie jest ograniczenie.

natomiast co do zapisz jako, tam jest eksport do pdf, da rade to wykorzystać z kodu raportu?

1

Z kodu aplikacji: TAK
Z kodu raportu: Raczej nie choć pewności nie mam

Musisz zrozumieć mniej więcej jak to działa.
Na formatce w delphi definiujesz dwa obiekty.

  1. Obiekt raportu: TFrxReport
  2. Obiekt eksportu do PDF: TFrxPDFExport
    ponadto programiści dodali jeszcze TFrxDesigner abyś mógł sobie otworzyć okno, na którym pracujesz - ale to jest tylko opcjonalne

Teraz designer, którego używasz ma dostęp tylko do obiektu TFrxReport. Oznacza to ni mniej ni więcej tyle, że każdy obiekt, który zamieścisz w raporcie (Memo, Picture ...) to są obiekty wewnątrz raportu i do nich dostęp masz natomiast do komponentu TfrxPDFExport już nie

screenshot-20210203130352.png

Można co prawda pisać skrypty np w pascalu
screenshot-20210203130435.png
jednak do obiektów z poza raportu dostępu mieć nie będziesz.

Dodam jeszcze, że do raportu można przekazać z aplikacji całego dataseta z danymi lub zdefiniować mu poszczególne zmienne (variables), które przekazywane są do raportu natomiast w drugą stronę czyli z poziomu raportu do aplikacji w zasadzie takiej komunikacji nie ma. A nie ma z tego względu, że to jest raport czyli ma Ci on wygenerować coś z aplikacji, a nie ma służyć do sterowania nią :)

0

Ale masz ze mną urwanie głowy...

dlatego się pytam bo ta opcja jest podczas preview Print - to jest szansa ze wystarczy użyć kodu raportu?

screenshot-20210203132505.png

2

żeby się dało eksportować od razu do pdfa bez dodatkowego klikania (otwarcie podglądu, kliknięcia eksportuj do PDFa, wybrania gdzie się ma zapisać itd) to zmiany musi wprowadzić AUTOR APLIKACJI. Z poziomu raportu tego nie zrobisz

1

Raport sam z siebie w designerze możesz zmienić i zapisać jako plik z rozszerzeniem np fr3 (lub frx jeśli to VS) i to jest taki fastreportowy xml. Na jego podstawie przy "wydruku" otwiera się okno tzw Preview czyli podglądu z już wypełnionymi danymi np z dataseta. Różnica jest taka, że w designerze na pliku fr3 operujesz na szablonie jak ma wyglądać raport natomiast preview pokazuje Ci jak faktycznie raport będzie wyglądał z danymi. Teraz opcja eksportu jak pokazałeś ma różne formy eksportu, które przewidzieli developerzy. Mało tego plik podglądu również możesz zapisać ale już jako fp3. Nie zmienia to jednak zasadniczo faktu, że dalej operujesz w ramach TFrxReport i do TFrxPDFExport dostępu nie masz. To tak w gestii wyjaśnienia byś zrozumiał natomiast @abrakadaber napisał najjaśniej jak się tylko da co można z tym zrobić :)

0

Kolejny pomysł to drukarka pdf ustawiona na sztywno do zapisu pliku pdf na dysku w określonej lokalizacji (można zrobić w trybie cichym)
Show dialog odchacze
screenshot-20210203135548.png

0

Drukarka PDF ... no to jest jakiś pomysł :) aczkolwiek przynajmniej z mojego doświadczenia wynika, że te drukarki czasami nieco zmieniają PDF względem tego co widzisz na faktycznym podglądzie. Jednak warto spróbować ;)

0

W tej chwili korzystam z takiej drukarki - dokładnie DORO PDF.
Działa bezbłędnie - dogram drugą taką do systemu- zmienię nazwę ustalę ścieżkę na właściwy katalog i zmienię jej zachowanie aby nie pokazywało się okno pdf po wydruku (bo można)

0

Ogólnie jako, że napisałeś w dziale delphi to podpowiem Ci jak możnaby spróbować to ugryźć inaczej :) Nie będzie to proste (dla kogoś kto nie zna delphi) ale jeśli Ci bardzo zależy i pomysł z drukarką się nie powiedzie to jest to do wykonania.

Komponent TfrxPDFExport odpowiedzialny za eksport do PDF do którego nie masz dostępu, a który odpowiada za fiename i defaultpath przy eksporcie do PDF finalnie po wielu poziomach dziedziczy z TComponent, który dziedziczy z TObject oznacza to, że komponent ten ma swój uchwyt (THandle). Istnieją gotowe narzędzia, które umożliwiając znalezienie tego uchwytu w aplikacji, która generuje twój raport. Znając już uchwyt możesz napisać kawałek aplikacji, który podmieni na tym obiekcie właśnie filename i defaultpath. Co prawda z FR tego nie robiłem ale np wyłączanie enabla na buttonie czy jakieś modyfikacje formy robiłem jakiś czas temu. Myślę, że przy odrobinie "wytrwałości" udałoby się to zrobić. Jedyny minus, przed uruchomieniem raportu konieczne byłoby uruchamianie tej dodatkowej aplikacji (ewentualnie wydziergać z tego jakąś usługę) :)

Zrobić się da, pytanie czy faktycznie jest Ci to na tyle potrzebne aby się tak bawić :)

0

Dobrzy ludzie podpowiedzcie jeszcze jak wyciągnąć wartość klucza rejestru i zapisać jako zmienną.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName]
ComputerName

0
m4s napisał(a):

Dobrzy ludzie podpowiedzcie jeszcze jak wyciągnąć wartość klucza rejestru i zapisać jako zmienną.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName]
ComputerName

https://www.google.com/search?client=firefox-b-d&q=read+registry+wstawjęzykjakichcesz

0

No to może inaczej.
Potrzebuję użyć nazwy komputera w skrypcie - konkretnie użyć odpowiedniego folderu w zależności na którym komputerze skrypt został uruchomiony.
Jak wspomniałem wyżej mam Fast report okrojony o pewne klasy

0

A czy dobrzy ludzie podpowiedzą czy można i jak kodem zmienić wartości ComboBox?
Mam 24 pola combo od 1 do 24 i chce użyć ich w pętli do generowania raportu.
w jednym bloku odpytywać po kolei ComboBox1 itd do ComboBox24

for k := 1 to 24 do                       
begin
 ComboBoxSKRYPT:='ComboBox' + IntToStr(k);    
 EditSKRYPT:='Edit'+ IntToStr(k);                                   
 Showmessage(ComboBoxSKRYPT.Name); // tu jest błąd ze ciągi nie posiadają właściwości lub metod
 Showmessage(EditSKRYPT);
end;
4

Pomogę ale nie w tym temacie. Zasada jest taka, że 1 temat = 1 wątek na forum

0

To dotyczy tego samego raportu, dlatego nie chciałem rozbijać go na milion tematów.

Raport ewoluuje z dnia na dzień, w tej chwili mam główny blok zapytań powtórzony 24 razy - nieładne to i nie eleganckie. Poza tym sam edycja w w zapytaniu oznacza poprawianie 24 razy w skopiowanych blokach.

Czy mam napisać osobny temat w tym przypadku? @cerrato ???

2

Dotyczy tego samego raportu, ale zupełnie innej sprawy. Moim zdaniem lepiej to by było dać do osobnego wątku.

2

Zasada jest taka, że jak ktoś inny będzie miał podobny problem to po temacie odnajdzie twój wpis i może skorzysta z informacji w nim zawartych bez potrzeby pytania na forum drugi raz o to samo. W przypadku gdy do jednego tematu wrzucamy inne wątki to robi się z tego śmietnik, który nikomu już do niczego się nie przyda. Dlatego trzymamy się zasady 1 problem = 1 temat

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