Chciałbym dodać kod w Pascalu do formularza FastReport.
Kod ma oddziaływać na dwie zmienne: kol3 i kol6.
Jeżeli zmienna kol6 zawiera znaki drukowalne, to kol3 ma nie wyświetlać danych. Jeżeli natomiast kol6 jest pusta, to kol3 ma wyświetlać dane. Zmienne są typu string.
Nie mam pewności, czy kol6 niekiedy nie zawiera spacji (być może nie, ale musiałbym sprawdzać w danych programu kilka tysięcy pozycji), jeżeli nic nie wyświetla, dlatego pisałem o znakach drukowalnych.
Pomoże ktoś?
- Rejestracja:ponad 3 lata
- Ostatnio:ponad rok
- Postów:13

- Rejestracja:około 18 lat
- Ostatnio:11 dni
- Lokalizacja:Zielona Góra
skoro kod ma reagować na znaki drukowane to nawet jeden ze znaków spełnia warunek. Dlatego sprawdź czy w danym stringu znajduje się choć jeden znak z tych drukowanych, czyli:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
jeśli spełnia to możesz uznac warunek za spełniony i już
- Rejestracja:ponad 13 lat
- Ostatnio:około miesiąc
- Lokalizacja:Podaj nazwę miejscowości
A nie wystarczy coś takiego? (nie znam typów jakich tam używasz)
kol3.visible := trim(kol6.text) <> '';

- Rejestracja:ponad 3 lata
- Ostatnio:ponad rok
- Postów:13
Dziękuję, ale chyba nie do końca się zrozumieliśmy. Chodzi mi o to, jak wyglądałby cały kod. Dla uproszczenia przyjmijmy, że w niektórych rekordach kol6 jest pusta (NULL).
Próbowałem coś takiego:
var kol3, kol6: string;
begin
if kol6 =null then kol3 else kol6;
end.
Ale nie działa.
- Rejestracja:ponad 13 lat
- Ostatnio:około miesiąc
- Lokalizacja:Podaj nazwę miejscowości
"Rekord kol6", w innym miejscu "kol6: string". A powyższy kod nie ma sensu ale za to też nie przedstawia żadnej idei.
To co piszesz sugeruje że nie masz żadnego z powyższych tylko string zapisany jako Variant. Czyli pewnie pole z bazy danych. I wartość z tego pola wyświetlasz w jakimś obiekcie.
Dlatego w zdarzeniu wywoływanym przed wydrukowaniem danych każdego rekordu (np OnMasterDetail albo OnBeforePaint dla bloku MasterData) bierzesz wartość tegoż pola i sprawdzasz czy to null czy też pusty tekst, jeśli tak to robisz co tam chcesz.
O np to:
procedure OnMasterDetail();
begin
MemoKol6.Visible := Trim(VarAsStr(<Towary."T_Nazwa">)) <> '';
MemoKol3.Visible := not MemoKol6.Visible;
end;
Piszę z pamięci ale OIDP tak to powinno wyglądać. Jak pomyliłem zdarzenie wywoływane przy każdym rekordzie to luknij w dokumentacji do FR.
edit.
A jak nie chodzi o dane z bazy, to powyższy kod robisz normalnie w głównym bloku skryptu (begin...end.).

- Rejestracja:ponad 12 lat
- Ostatnio:7 miesięcy
- Postów:6610
a nie możesz tego załatwić po stronie danych jak normalny człowiek?

- Rejestracja:ponad 3 lata
- Ostatnio:ponad rok
- Postów:13
@abrakadaber: Dzięki za zainteresowanie. Ostatnio nie miałem czasu się tym zajmować, ale temat ciągle aktualny.
A zatem po kolei. To są dane z bazy programu. Ale to nie jest baza SQL-owa, tylko plikowa. Ale to chyba nieistotne.
Zmienne kol3, kol6 i inne zawierają specyficzne wyrażenia (kody, które zna program), które odnoszą się do konkretnych pól w bazie.
Na przykład wyrażenie '@0003' wyciąga ulicę i numery klatek budynku (przykładowo Piłsudskiego 9-17), wyrażenie '@2118' ulicę i numer klatki (Piłsudskiego 11), wyrażenie '@0002' numer mieszkania.
Ale jest pewien problem. Niektóre wpisy w bazie nie zawierają ulicy i numeru klatki, za to wszystkie zawierają ulicę i numery klatek budynku. Te, które nie zawierają ulicy i numeru klatki, to są zazwyczaj budynki z jedną klatką (ale nie wszystkie - niektóre budynki jednoklatkowe są zwracane w wyrażeniu '@0003'). Wtedy od razu wiadomo jaki jest konkretny adres mieszkania, ale jak budynek ma 10 klatek, to adres pobrany z wyrażenia '@0003' nie jest jednoznaczny (Piłsudskiego 9-17 m. 36).
Chodzi mi o takie wyciągnięcie adresów, że kiedy wyrażenie '@2118' odwołuje się do pustego pola, wtedy dopiero wyświetla się pole z wyrażenia '@0003'.
Chcę po prostu mieć jednoznaczny adres w jednej kolumnie w zestawieniu.
W moim konkretnym przypadku zmienna kol3 ma przypisane wyrażenie '@0003', zmienna kol6 - '@2118', kol7 - '@0002'
Nie wiem, czy nie zagmatwałem zbytnio.

- Rejestracja:ponad 12 lat
- Ostatnio:7 miesięcy
- Postów:6610
@Therminus: no ale do wydruku chyba nie przekazujesz @2118
tylko wartość "docelową", np. Piłsudskiego 11
- to co stoi na przeszkodzie podstawić żądaną wartość na etapie jej wyliczania?
- Rejestracja:ponad 3 lata
- Ostatnio:ponad rok
- Postów:13
@robertz68: Powiedzmy, że chcę odfiltrować wszystkich lokatorów z całej bazy, którzy mają adres e-mail. Adres zamieszkania chcę w jednej kolumnie.

- Rejestracja:ponad 12 lat
- Ostatnio:7 miesięcy
- Postów:6610
Therminus napisał(a):
Jestem użytkownikiem programu
a no to to zmienia bardzo dużo. Od tego powinieneś zacząć ponieważ chyba wszyscy (a ja na pewno) założyli, że masz dostęp do kodu aplikacji.
To jeszcze kilka pytań:
- to jest raport dla net, vcl (w edytorze wydruków kliknij pomoc -> O FastReport...)
- jak jest zdefiniowane źródło danych dla raportu - czy jest bezpośrednio w raporcie (zakładka Dane i czy są tam jakieś obiekty, jak na rysunku)
czy może są TYLKO w Raport->Dane...
A teraz próbując rozwiązać Twój problem to może tak
- kliknij na swój
MasterData
- w OI na zakładce zdarzenia wybierz
OnBeforePrint
i kliknij go dwa razy - w kodzie wpisz
mmKol3.Visible := Trim(<FDQuery1."kol6">) = '';
zastępującmmKol3
nazwąMemoView
, które pokazuje u CiebieKol3
i odpowiednioFDQuery1."kol6"
polem które masz
Efekt, bez kodu
z kodem
dane
select '_ aaa' kol1, '' kol3, 'aaa' kol6
union all select '_ bbb', '', 'bbb'
union all select '111 _', '111', ''
union all select '222 ccc', '222', 'cccc'
w załączniku raport spakowany 7Z bo forum nie przepuszcza załączników fr3 Test.7z
- Test.7z (1 KB) - ściągnięć: 82
- screenshot-20220107234800.png (1 KB) - ściągnięć: 13
- screenshot-20220107232625.png (11 KB) - ściągnięć: 13
- screenshot-20220107234740.png (1 KB) - ściągnięć: 15
- screenshot-20220107232332.png (22 KB) - ściągnięć: 10
- Rejestracja:ponad 3 lata
- Ostatnio:ponad rok
- Postów:13
@abrakadaber: Dziękuję za poświęcony czas i chęć pomocy.
Prawie działa, ale nie do końca tak, jak chciałem.
AD Pytanie 1: Nie nie rozumiem o co pytasz, ale to chyba nieistotne.
AD Pytanie 2: W zakładce Data (Dane) jest pusto.
Mój kod mógłby wyglądać tak:
procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
Memo3.Visible := Trim(<kol6>) = '';
end;
begin
end.
I to działa, ale zmienna kol3 wymaga umieszczenia w dodatkowym polu Memo, a to oznacza, że muszę dodać na wydruku jeszcze jedną kolumnę. Na przykład tak:
No i wydruk wtedy wygląda dziwnie, bo jest ramka z numerem budynku tam, gdzie powinien być, a pozostałe miejsca są puste.
Tymczasem ja chcę mieć adresy w jednej kolumnie.
Jak widać pole Memo7 powinno zawierać zmienne kol3, kol6 i kol7, które składają się na adres budynku/klatki i numeru lokalu.
Z tym, że kol3 ma wyświetlać dane tylko w przypadku pustej kol7, żeby numery budynków i klatek nie dublowały się.
- FR1.png (55 KB) - ściągnięć: 13
- FR2.png (52 KB) - ściągnięć: 13
- wydruk1.png (76 KB) - ściągnięć: 14
- Rejestracja:ponad 13 lat
- Ostatnio:około miesiąc
- Lokalizacja:Podaj nazwę miejscowości
Therminus napisał(a):
Jak widać pole Memo7 powinno zawierać zmienne kol3, kol6 i kol7, które składają się na adres budynku/klatki i numeru lokalu.
Z tym, że kol3 ma wyświetlać dane tylko w przypadku pustej kol7, żeby numery budynków i klatek nie dublowały się.
Przyznam że się już zupełnie pogubiłem w tym co piszesz. Czytelność tego wszystkiego jest żadna.
Ale z grubsza - zamiast ukrywać memo to wpłyń a jego zawartość, o np tak:
procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
if Trim(<kol7>) = '' then
Memo3.Text := Format('%s %s', [<kol3>, <kol6>]) else
Memo3.Text := <kol6>;
end;
begin
end.




- Rejestracja:ponad 12 lat
- Ostatnio:7 miesięcy
- Postów:6610
@Therminus: to co napisałeś w ostatnim poście zmienia całkowicie postać rzeczy i od tego powinieneś był zacząć.
Do "problematycznego" memo wstaw takie coś ul. [IIF(Length(Trim(<kol7>)) = 0, <kol3>, '')] [kol6] m. [kol7]
- powinno załatwić sprawę
- Rejestracja:ponad 3 lata
- Ostatnio:ponad rok
- Postów:13
dziobu napisał(a):
Przyznam że się już zupełnie pogubiłem w tym co piszesz.
Istotnie, chyba trochę pogmatwałem. Nie chcę dodatkowego pola Memo (w tym wypadku Memo3), bo mi dojdzie jeszcze jedna kolumna na wydruku, której nie potrzebuję i nie chcę. Kod, który zaproponował @abrakadaber wymagał umieszczenia [kol3] w oddzielnym polu Memo. Ale to ślepa uliczka. Tabelka na wydruku ma zawierać 4 kolumny, a nie pięć.
Powtórzę jeszcze raz najważniejsze:
pole Memo7 powinno zawierać zmienne kol3, kol6 i kol7, które składają się na adres budynku/klatki i numeru lokalu; kol3 ma wyświetlać dane tylko wtedy, kiedy kol7 jest pusta.
Chyba jaśniej nie potrafię. :)
- Rejestracja:ponad 3 lata
- Ostatnio:ponad rok
- Postów:13
@abrakadaber: Niestety, nie zadziałało. [kol3] nie wyświetla żadnych danych. Nawet tam, gdzie są potrzebne. To znaczy kiedy [kol7] jest pusta.
Edit: Sam się pogubiłem. :-) Miało być "kiedy [kol6] jest pusta". Zasugerowałem, się tym co pisał @abrakadaber
- Rejestracja:ponad 3 lata
- Ostatnio:około 3 lata
- Postów:46


- Rejestracja:ponad 3 lata
- Ostatnio:ponad rok
- Postów:13
@abrakadaber:
wstaw takie coś ul. [IIF(Length(Trim(<kol7>)) = 0, <kol3>, '')] [kol6] m. [kol7]
Stop! Pomyłka! Ma być [IIF(Length(Trim(<kol6>)) = 0, <kol3>, '')] [kol6] m. [kol7]
I teraz to działa!
Dziękuję bardzo.
- Rejestracja:ponad 3 lata
- Ostatnio:ponad rok
- Postów:13
@Therminus: Tak było. Zamieszałem konkretnie w tym post 2022-01-09 13:28 i potem błąd powtarzałem. :-)