Funkcja - parametr

Zapytania SQL, widoki, Crystal, definicje filtrów, szybkich raportów, wydruków, API, Hydra, .NET

Moderator: mikey

AndrzejK
Posty: 47
Rejestracja: 26 wrz 2023, 14:00
Rola: Użytkownik CDN XL
Wersja: 2023

Funkcja - parametr

Post autor: AndrzejK »

Cześć,

mam napisaną funkcję, która wyświetla tabelę pod szybkim wykresem, w której mam wyszczególnione dokumenty z konkretnego zakresu. Jak najlepiej ogarnąć wynik tej funkcji na filtr? Przykładowo: jestem na FS i funkcja zwraca mi 5 dokumentów FS, zamykam wykres oraz wybieram filtr, który filtruje mi tylko te dokumenty, które były na wykresie. Otwierając wykres dokumenty zawsze będą inne (uwarunkowane od tego czy na dokumencie jest atrybut czy go nie ma). Jak to najszybciej i najkorzystniej ogarnąć?

Awatar użytkownika
praiser
Posty: 1087
Rejestracja: 02 lip 2014, 12:22
Rola: Handlowiec CDN XL
Wersja: 2023

Re: Funkcja - parametr

Post autor: praiser »

najprościej chyba to zrobić na odwrót. wywołać funkcję w filtrze zawężając do Trn_GidNumer a potem wywołać wykres warunkując przez {filtrsql}
--------------------------------
Pozdrawiam
WW

StabiL
Posty: 69
Rejestracja: 28 cze 2017, 15:41
Rola: Konsultant CDN XL

Re: Funkcja - parametr

Post autor: StabiL »

Najkorzystniej to zrobić filtr z parametrem, gdzie wskazujesz nr dokumentu faktury do której wchodzisz. Skoro to funkcja tabelaryczna możesz użyć cross apply i w ten sposób zawężać wyniki. W sumie to nie widzę innej rozsądnej drogi i szybszej. Można zapisywać wyniki wykresu do jakiejś technicznej tabeli, kasować je przy każdym wywołaniu wykresu, a w filtrze się do tej tabeli odwoływać. Ale to musisz pamiętać o zapisywaniu operatora i potem w filtrze się do niego odwoływać. Choć myślę, że cross apply jest zdecydowanie lepszym rozwiązaniem :)

AndrzejK
Posty: 47
Rejestracja: 26 wrz 2023, 14:00
Rola: Użytkownik CDN XL
Wersja: 2023

Re: Funkcja - parametr

Post autor: AndrzejK »

praiser pisze:
19 lut 2025, 08:34
najprościej chyba to zrobić na odwrót. wywołać funkcję w filtrze zawężając do Trn_GidNumer a potem wywołać wykres warunkując przez {filtrsql}
faktycznie brzmi to wszystko logicznie (również co StabiL napisał) natomiast pytanie, jak to przekazać przez {filtrsql}, w wykresie dać where {filtrsql} czy w funkcji dać zmienną? od strony sqla sobie szybciej radzę niż łączenie tego w tym systemie :)

edit:

no i jeszcze jest kwestia zawężenia dokumentów, w XLu jest przecież na dole do wyboru miesiąc/rok za który mają się wyświetlić dokumenty, ja tego na wykresie nie warunkuję, bo nie opieram się o datę - zadziała ten filtr?

Dzięki z góry Panowie za przybliżenie tematu!

Awatar użytkownika
praiser
Posty: 1087
Rejestracja: 02 lip 2014, 12:22
Rola: Handlowiec CDN XL
Wersja: 2023

Re: Funkcja - parametr

Post autor: praiser »

Można to skonstruować tak: (parametry dat w XL muszą zostać wyłączone na czas używania filtru w takim rozwiązaniu chyba, że daty zawierają się w obrębie tego samego okresu)

Przykładowa funkcja zwracająca Gid faktur wystawionych między dwoma datami:

Kod: Zaznacz cały

CREATE FUNCTION [CDN].[jakasfunkcja]
(
	@dataod int,
	@datado int
)
RETURNS 
@kolumn table (
		[TrnGid] int
)
AS
BEGIN
	insert into @kolumn 
    SELECT DISTINCT Trn_GidNumer
    FROM CDN.TraNag
    WHERE Trn_Data2 between @dataod and @datado
RETURN
END
W ERP XL konstruujesz filtr odwołujący się do funkcji, który pokaże faktury z pomiędzy dwóch dat

Kod: Zaznacz cały

@PAR ?@D17|DataOd|&Data od:REG=77752 @? PAR@
@PAR ?@D17|DataDo|&Data do:REG=77752 @? PAR@

Trn_GidNumer IN (
select W.TrnGid
from cdn.TraNag
outer apply [CDN].[jakasfunkcja] (??DataOd,??DataDo) as W
)
W Efekcie w {filtrsql} masz co co jest ustawione na oknach plus twój filtr np:

Kod: Zaznacz cały

(TrN_TrNTyp=3) AND ((   Trn_GidNumer IN ( select W.TrnGid from cdn.TraNag outer apply [CDN].[jakasfunkcja] (81866,81866) as W ))) AND TrN_RokMiesiac=202502
Zatem w wykresie nie wywołujesz funkcji z parametrami bo przeniesione są do filtra a jedynie warunkujesz dla {filtrsql}.
Czyli np. wyświetl numery tych faktur

Kod: Zaznacz cały

select 1 as ID,
cdn.nazwaobiektu(Trn_GidTyp,Trn_GidNumer,0,2) as GID
from CDN.TraNag
left join CDN.KntAdresy ON TrN_KnATyp = KntAdresy.KnA_GIDTyp 
    AND TrN_KnANumer = KntAdresy.KnA_GIDNumer
left join CDN.KsefDokumenty ON TrN_GIDTyp = KSF_DokTyp 
    AND TrN_GIDNumer = KSF_DokNumer
where {filtrsql}
Powinno zadziałać.
--------------------------------
Pozdrawiam
WW

ODPOWIEDZ