Skocz do zawartości

[Raport SQL] Lista wyboru, na podstawie zdeklarowanej zmiennej tablicowej

Polecane posty

Chciałem zrobić selekcję typu dokumentu, na podstawie zadeklarowanej zmiennej tablicowej i otrzymuję błąd:

Cytat

Must declare the table variable

W samy SQL przechodzi, a w NEXO nie pasuje ;)

Jak coś, kluczowe elementy kodu:

DECLARE @typyDokumentu TABLE (Id INT,Nazwa NVARCHAR(256),Opis NVARCHAR(256),Symbol NVARCHAR(256));
INSERT INTO @typyDokumentu VALUES(1,'ZamowienieOdKlienta','Zamówienie od klienta','ZK');
WHERE td.Id IN ({CHL:Typ:SELECT Id, Nazwa FROM @typyDokumentu ORDER BY Nazwa}) OR 'NULL'='{CHL:Typ:SELECT Id, Nazwa FROM  @typyDokumentu ORDER BY Nazwa}'

 

Link to postu

Problem tkwi w tym, że zapytanie z definicji parametru CHL (fragment definicji {CHL:Typ:<zapytanie sql>})

jest wykonywane niezależnie od 'głównego zapytania'. W praktyce oznacza to, że nie ma w nim <zapytanie sql> dostępu do zmiennych, tabel tymczasowych zdefiniowanych z 'głównym zapytaniu'

Działające obejście, jakie mogę zaproponować, to użycie zwykłej tabeli SQL(CREATE TABLE _typyDoumentow ... )

dla listy typów dokumentów.

 

 

 

Link to postu

Hmm, staram się dla pierdół nie tworzyć tabel w bazach klientów, ale jak trzeba będzie, to tak zrobię. A jest ewentualnie inna metoda obejścia tego problemu - normalnie parametr CHL, nie pozwala na inne niż INT identyfikatory wybieranych z listy elementów. A może jest jakaś ukryta systemowa możliwość wybierania typów dokumentów?

Link to postu

Teoretycznie można użyć wariantu parametru {CHL..} z jawnym wskazaniem dostępnych typów ({CHL:Typ dok:ZK#1#FS#2}).

Jeżeli lista typów jest długa lub często występuje w definicji, definicja raportu robi się zagmatwana.

Lista wartości dla 'Typ elementu' nie jest dostępna z poziomu bazy danych.

 

Link to postu

Tylko, aby odczytać z tablicy Dokumenty, wybrane typy, musiałbym mieć wartość tekstową dla kolumny Symbol albo mdmDescription, a CHL nie przepuszcza klucza tekstowego. Przez wartość z typu wyliczeniowego InsERT.Moria.Dokumenty.Logistyka.TypDokumentu, nie da się chyba odfiltrować w tablicy dokumenty?

Link to postu
8 godzin temu, Jacek Izydorczyk napisał:

WHERE (Symbol LIKE 'ZK' AND 1 IN {CHL:Typ dok:ZK#1#FS#2#PA#3})

OR (Symbol LIKE 'FS' AND 2 IN {CHL:Typ dok:ZK#1#FS#2#PA#3})

OR (Symbol LIKE 'PA' AND 3 IN {CHL:Typ dok:ZK#1#FS#2#PA#3})

No właśnie takiego dziubania chciałem uniknąć, ale widać nie ma szans, znowu za dużo SQL'a oczekiwałem od raportów SQL ;)

Link to postu

Symbole typów dokumentów można wyciągnąć bezpośrednio z tabeli Dokumenty:

SELECT DISTINCT Symbol FROM ModelDanychContainer.Dokumenty;

Co będzie miało zaletę taką, że pokaże tylko te typy dokumentów, które w bazie istnieją.

Można również oprzeć się na tabeli Konfiguracje:

SELECT Symbol, Nazwa FROM ModelDanychContainer.Konfiguracje WHERE Domyslna = 1 AND TypDokumentu = 64;

Tutaj wyciągniemy z bazy wszystkie dostępne typy dokumentów. Istotne jest, aby odfiltrować tylko konfiguracje domyślne (Domyslna = 1) oraz odpowiednio przefiltrować je wg kolumny TypDokumentu (w powyższym przykładzie odfiltrowane są tylko dokumenty sprzedaży). Kolumna TypDokumentu przyjmuje wartości z enuma InsERT.Moria.Dokumenty.Logistyka.TypDokumentu.

  • Dziękuję 1
Link to postu

Ok, metoda z użyciem Konfiguracji działa - pozostaje tylko dopasować teraz typy dokumentów :) Teraz już widzę, że podstawą mojego problemu było to, że sprawdziłem definicję CHL tekstowo, w zapytaniu, a tam nie można używać tekstu jako klucze - wyrzuca błędem definicji. Jak się użyje zapytania, to klucze tekstowe przechodzą. Aczkolwiek fajnie by było coś zrobić z kluczami tekstowymi w CHL, bo niekiedy trzeba coś tam wrzucić wynikającego z jakiś tam danych, a nie zawsze jest możliwość wrzucania tabeli do bazy klienta, ba, czasem nawet nie chce się tego robić.

Jak coś, wersja na próbę, dla potomnych:

SELECT
Id [Id]
,NumerWewnetrzny_PelnaSygnatura [Numer]
FROM ModelDanychContainer.Dokumenty
WHERE Symbol
IN ({CHL:Typ:SELECT Symbol, Nazwa FROM ModelDanychContainer.Konfiguracje WHERE Domyslna = 1 AND TypDokumentu = 64})
OR 'NULL'='{CHL:Typ:SELECT Symbol, Nazwa FROM ModelDanychContainer.Konfiguracje WHERE Domyslna = 1 AND TypDokumentu = 64}'

P.S. Tak Swoją drogą, to czemu w definicji tekstowej CHL, jest nazwa#klucz#nazwa#klucz, a jak się ją robi przez zapytanie SQL, to jest klucz#nazwa? ;)

  • Lubię to 1
Link to postu

Powyższe zapytanie, które Panu wysłałem nie uwzględnia jeszcze korekt dokumentów. Pełne zapytanie z uwzględnieniem korekt powinno wyglądać mniej więcej tak:

(SELECT Symbol, Nazwa 
FROM ModelDanychContainer.Konfiguracje
WHERE Domyslna = 1 AND TypDokumentu = 64)
UNION ALL
(SELECT KorektaSymbol AS Symbol, KorektaTytul AS Nazwa
FROM ModelDanychContainer.Konfiguracje
WHERE Domyslna = 1 AND TypDokumentu = 64);

 

  • Dziękuję 1
Link to postu
2 minuty temu, Jerzy Dudra napisał:

Jeżeli chodzi o kolejność klucz,nazwa to tego na pewno nie dotkniemy

Nawet tego nie oczekiwałem, i nikt tego nie oczekuje, bo za dużo raportów w świecie. Zaciekawił mnie tylko brak konsekwencji, bo się notorycznie na to łapie, ale to pewnie robota Microsoftu, a u nich to norma :D

Link to postu
×
×
  • Dodaj nową pozycję...