Delphi + FastReport - Dynamiczne wyświetlanie kolumn

Delphi + FastReport - Dynamiczne wyświetlanie kolumn
J0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 82
0

Cześć
Mam 2 tabele w relacji Master-Detail i tworzę z nich raport faktury w FastReport'ach.

Tabela Master: Dok
Tabela Detail: Poz

Tabela Dok ma PK: NrDok
Tabela Poz ma FK: NrDok (połączony z tabelą Dok)

W raporcie mam ustawione Master-Detail w taki sposób:

MasterBand (Dok)

Numer faktury: [Dok."NrDok"]

DetailBand (Poz)

LP, NazwaPoz, Ilosc, Cena j. netto, Wartość netto, Vat, Cena j. brutto, Wartość brutto
[#Line][Poz."Nazwa"][Poz."Ilosc"]... etc.

1.PNG

Wszystko ładnie działa, ale niektóre faktury mogą zawierać tylko ceny netto, inne tylko ceny brutto, a jeszcze inne mogą zawierać wszystkie pola.

Potrzebuję wyświetlać na raporcie tylko te kolumny, które są określone w pozycjach faktury.

Na przykład:
Faktura #1: LP, NazwaPoz, Ilosc, Cena j. netto, Wartość netto, Vat,

Faktura #2: LP, NazwaPoz, Ilosc, Vat, Cena j. brutto, Wartość brutto

Faktura #3: LP, NazwaPoz, Ilosc, Cena j. netto, Wartość netto, Vat, Cena j. brutto, Wartość brutto

Jak to poprawnie ustawić, aby uzyskać taki rezultat? Dane do moich tabel pobieram z XML'i i wstawiam do tabel MemTable.

Próbowałem dodać trzecią tabelę zawierającą nazwy kolumn i ich wartości (NrDok, Nazwa, Wart) (połączone oczywiście kluczem FK NrDok) i w raporcie użyć pionowego band'a, ale wszystkie kolumny mi się duplikują na każdej fakturze.

2.PNG

PD
  • Rejestracja: dni
  • Ostatnio: dni
1

Jako, że masz osobne konfiguracje kolumn (kolejność i ilość) w zależności od typu dokumentu, to musisz sekcje Header i DetailData dodać tyle razy ile konfiguracji wyglądu pozycji masz, a następnie w kodzie raportu włączyć pokazywanie odpowiedniej pary sekcji w zależności od typu dokumentu.
Poniżej przykład z mojej testowej aplikacji - w zależności czy id dokumentu jest parzyste czy nie to drukuje się inna kolejność kolumn:
screenshot-20250523154747.png
screenshot-20250523154757.png

ZK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

Może da się zrobić tak, że dodajesz wszystkie pola na kolumny i w kodzie je ukryjesz zależnie od typu faktury. Jeśli można te pola dać align left to sie same dosuną do siebie. Nie próbowałem tego. Musiałbym sprawdzić jak ja to robię a mam możliwość ukrycia różnych kolumn na opcje.
Drugi sposób to zostawić jednakową liczbę kolumn - dodać niezbedne i w kodzie zależnie od typu faktury w pole wpisać co ma być wyświetlane np. Zamiast netto to brutto.
Lub sterować strukturą tej tabeli pamięciowej w zależności od typu faktury. Może to być łatwiejsze.

J0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 82
0

Udało mi się ogarnąć wyświetlanie tych kolumn przy pomocy band'a poziomego. Ustawilem filtrowanie na tej trzeciej tabeli z kolumnami na OnScroll i teraz pobiera odpowiednie dane. Muszę jednak pobawić się z szerokością i ustawieniem do lewej każdego pola. Mógłbym co prawda zostawić jednakową szerokość każdego pola, ale wówczas nie mieszczą się wszystkie na A4.

@Paweł Dmitruk Ciekawy pomysł z tym dodaniem n-razy tych konfiguracji i ukrywaniem tych niepotrzebnych. Przetestuje i sprawdzę, który sposób będzie lepszy. Twój na pewno zniweluje problem z dostosowaniem rozmieszczenia pół na całą szerokość A4.

@ZenonKlamka Też myślałem nad wstawieniem wszystkich pół i ukrywaniem ich jednak nie jest łatwo później te pola dosunąć do siebie i ustawić aby obejmowały calą szerokość strony.

ZK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

To jeśli zawsze jest ta sama ilość pól tylko rozne dane zawierają to dodaj je na stałe i w kodzie wstaw w polu memo.text:='["tabela.brutto"]'; zaleznie od tego co ma być.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.