poniedziałek, 13 grudnia 2010

Filtr dla dokumentów

Na prośbę kolegi z forum XL, zamieszczam filtr dla dokumentów handlowych z możliwością zawężenia również do operatora.

@PAR ?@O(FS:2033|FSK:2041|FSL:1824|KSL:1832|RA:2035)|Typ_dokumentu|&Typ_dokumentu:REG=1 @? @MSG(Typ Dokumentu) @TIP(Wybierz typ dokumentu) PAR@
@PAR ?@X|Spinacz|&Czy Spinacz ?:REG=0 @? @H({??Typ_dokumentu <> 2033}) PAR@
@PAR ?@X|CzyOperator|&Filtrowanie wg Operatora:REG=0 @? PAR@
@PAR ?@R(SELECT Ope_GIDNumer, Ope_Ident from CDN.OpeKarty WHERE Ope_Zablokowane = 0 ORDER BY Ope_Ident)|Operator|&Operator:REG=ADMIN @? @H({??CzyOperator=0}) PAR@

Trn_GIDNumer IN
(
SELECT Trn_GIDNumer FROM CDN.Tranag
WHERE Trn_GIDTyp = ??Typ_dokumentu
AND
Trn_SpiTyp = CASE ??Spinacz WHEN 1 THEN 0 ELSE 2033 END
AND
Trn_OpeNumerW = CASE ??CzyOperator WHEN 1 THEN ??Operator ELSE Trn_OpeNumerW END
)

czwartek, 9 grudnia 2010

Filtr dla płatności

W nawiązaniu do tematu z forum, które nieraz tutaj wspominam, napisałem filtr (mnie też się przyda :) ), dla dokumentów sprzedażowych ze względu na płatności i ich termin.

@PAR ?@O(Gotówka:10|Przelew:20|Kredyt:30|Czek:40|Karta:50)|Forma|&Forma:REG=1 @? PAR@
@PAR ?@X|Opcja|&Uwzględniać termin:REG=0 @? PAR@
@PAR ?@O(Równy:1|Większy niż:2|Mniejszy niż:3)|Porownanie|&Termin:REG=1 @? @H({??Opcja = 0}) PAR@
@PAR ?@N3|Dni|&Dni:REG=0 @? @H({??Opcja = 0}) @RH(999) PAR@

TrN_GIDNumer IN
(

SELECT    DISTINCT Trn_GIDNumer
FROM         CDN.TraNag INNER JOIN
                      CDN.TraPlat ON CDN.TraNag.TrN_GIDNumer = CDN.TraPlat.TrP_GIDNumer AND CDN.TraNag.TrN_GIDTyp = CDN.TraPlat.TrP_GIDTyp
WHERE
Trp_FormaNr = ??Forma
AND
Trp_Termin - Trn_Data2 = CASE ??Opcja WHEN 0 THEN Trp_Termin - Trn_Data2 ELSE CASE ??Porownanie WHEN 1 THEN ??Dni ELSE Trp_Termin - Trn_Data2 END END
AND
Trp_Termin - Trn_Data2 > CASE ??Opcja WHEN 0 THEN -100 ELSE
CASE ??Porownanie WHEN 1 THEN Trp_Termin - Trn_Data2 - 1 WHEN 2 THEN ??Dni WHEN 3 THEN
CASE WHEN ??Dni - (Trp_Termin - Trn_Data2) > 0 THEN -100 ELSE ??Dni END END END

)


Co my tu mamy ? Jak widać filtrujemy po formie płatności, a następnie możemy określić zadaną przez nas liczbę dni i porównać do terminu na dokumencie. ( = > < ). Zapewne rzuca się w oczy, iż zakroiłem formę płatności do 5 pre-definiowanych form - jeżeli chcecie mieć ich więcej, to wystarczy zmienić typ parametru forma na listę rozwijaną i napisać odpowiednie zapytanie (np. dla tabeli CDN.Konfig o Kon_Numer = 736).

środa, 8 grudnia 2010

Zestawienie modułów XL

W przeciwieństwie do Optimy, XL nie przechowuje wartości Bool w osobnych kolumnach dla każdego modułu zaznaczonego na operatorze, a jedynie określa dane moduły za pomocą jednej wartości liczbowej. Zapewne jest gdzieś procedura, która to zwraca, niemniej jednak jako Pan "zrób to sam" napisałem kawałek kodu, który zwróci nam zestawienie analogiczne jak Optimowa tabela.

DECLARE @Wynik TABLE
(Ope_GID INT,
Ope_Ident VARCHAR(50),
Ope_Nazwisko VARCHAR(50),
Place INT,
Produkcja INT,
Adm_Oddzialow INT,
Serwis INT,
Zamowienia INT,
Administrator INT,
CRM INT,
BI INT,
Srodki INT,
Kompletacja INT,
Ksiegowosc INT,
Sprzedaz INT
)
DECLARE @OpeGID INT
DECLARE @OpeIdent VARCHAR(10)
DECLARE @OpeNazwisko VARCHAR(100)
DECLARE @OpeModuly INT

DECLARE @Place INT
DECLARE @Produkcja INT
DECLARE @Adm_Oddzialow INT
DECLARE @Serwis INT
DECLARE @Zamowienia INT
DECLARE @Administrator INT
DECLARE @CRM INT
DECLARE @BI INT
DECLARE @Srodki INT
DECLARE @Kompletacja INT
DECLARE @Ksiegowosc INT
DECLARE @Sprzedaz INT




DECLARE k CURSOR
FOR
SELECT Ope_GIDNumer, Ope_IDENT, Ope_Nazwisko, Ope_Moduly
FROM CDN.OpeKarty
WHERE Ope_Zablokowane = 0


OPEN k

FETCH NEXT FROM k
INTO @OpeGID, @OpeIdent, @OpeNazwisko, @OpeModuly

WHILE @@FETCH_STATUS = 0
BEGIN

IF @OpeModuly >= 67108864
BEGIN
SET @Place = 1
SET @OpeModuly = @OpeModuly - 67108864
END
ELSE
BEGIN
SET @Place = 0
END
----------------------------------------------------------------------------------------------------------------
IF @OpeModuly >= 262144
BEGIN
SET @Produkcja = 1
SET @OpeModuly = @OpeModuly - 262144
END
ELSE
BEGIN
SET @Produkcja = 0
END
----------------------------------------------------------------------------------------------------------------
IF @OpeModuly >= 4096
BEGIN
SET @Adm_Oddzialow = 1
SET @OpeModuly = @OpeModuly - 4096
END
ELSE
BEGIN
SET @Adm_Oddzialow = 0
END
----------------------------------------------------------------------------------------------------------------
IF @OpeModuly >= 1024
BEGIN
SET @Serwis = 1
SET @OpeModuly = @OpeModuly - 1024
END
ELSE
BEGIN
SET @Serwis = 0
END
----------------------------------------------------------------------------------------------------------------
IF @OpeModuly >= 512
BEGIN
SET @Zamowienia = 1
SET @OpeModuly = @OpeModuly - 512
END
ELSE
BEGIN
SET @Zamowienia = 0
END
----------------------------------------------------------------------------------------------------------------
IF @OpeModuly >= 128
BEGIN
SET @Administrator = 1
SET @OpeModuly = @OpeModuly - 128
END
ELSE
BEGIN
SET @Administrator = 0
END
----------------------------------------------------------------------------------------------------------------
IF @OpeModuly >= 64
BEGIN
SET @CRM = 1
SET @OpeModuly = @OpeModuly - 64
END
ELSE
BEGIN
SET @CRM = 0
END
----------------------------------------------------------------------------------------------------------------
IF @OpeModuly >= 16
BEGIN
SET @BI = 1
SET @OpeModuly = @OpeModuly - 16
END
ELSE
BEGIN
SET @BI = 0
END
----------------------------------------------------------------------------------------------------------------
IF @OpeModuly >= 8
BEGIN
SET @Srodki = 1
SET @OpeModuly = @OpeModuly - 8
END
ELSE
BEGIN
SET @Srodki = 0
END
----------------------------------------------------------------------------------------------------------------
IF @OpeModuly >= 4
BEGIN
SET @Kompletacja = 1
SET @OpeModuly = @OpeModuly - 4
END
ELSE
BEGIN
SET @Kompletacja = 0
END
----------------------------------------------------------------------------------------------------------------
IF @OpeModuly >= 2
BEGIN
SET @Ksiegowosc = 1
SET @OpeModuly = @OpeModuly - 2
END
ELSE
BEGIN
SET @Ksiegowosc = 0
END
----------------------------------------------------------------------------------------------------------------
IF @OpeModuly >= 1
BEGIN
SET @Sprzedaz = 1
SET @OpeModuly = @OpeModuly - 1
END
ELSE
BEGIN
SET @Sprzedaz = 0
END
----------------------------------------------------------------------------------------------------------------
INSERT INTO @Wynik
SELECT
@OpeGID,
@OpeIdent,
@OpeNazwisko ,
@Place,
@Produkcja,
@Adm_Oddzialow,
@Serwis,
@Zamowienia,
@Administrator,
@CRM,
@BI,
@Srodki,
@Kompletacja,
@Ksiegowosc,
@Sprzedaz

FETCH NEXT FROM k INTO @OpeGID, @OpeIdent, @OpeNazwisko, @OpeModuly
END

CLOSE k
DEALLOCATE k

SELECT Ope_Ident, Ope_Nazwisko, Place, Produkcja, Adm_Oddzialow, Serwis, Zamowienia, Administrator, CRM, BI, Srodki,
Kompletacja,Ksiegowosc,Sprzedaz
FROM @Wynik
ORDER BY Ope_Ident
Komu się to przyda ? Myślę, że niejedna osoba mając mirsz-marsz z loginami (niekiedy jeden użytkownik ma 2-3 loginy w zależności od potrzeb)  będzie kiedyś chciała uporządkować swoje dotychczasowe osiągnięcia w zaznaczaniu fistaszków na kartach operatorów, a wtedy takie zestawienie będzie jak znalazł.

Oczywiście, ostatnie zapytanie w kodzie wymaga modyfikacji, tak aby osiągnąć efekt, który będzie nas interesować w danej chwili, aczkolwiek samo generowanie tabeli modułów uważam za wykonane :P