2016-08-08 17 views
0

Ich muss in einem Cognos-Bericht eine Option für die Schlüsselwortsuche bereitstellen. Ich habe 4 Texteingabeaufforderungen für Schlüsselwörter. Ich brauche eine Lösung, bei der ich das Detailfeld anhand von bis zu 4 eingegebenen Keywords filtere. Der Filterausdruck habe ich versucht, ist:Cognos-Berichtsschlüsselwort-Suche

IF (?p_Details1? IS NOT NULL) THEN (IF (?p_Details2? IS NOT NULL) THEN (IF (?p_Details3? IS NOT NULL) THEN (IF (?p_Details4? IS NOT NULL) THEN (UPPER([DETAILS]) CONTAINS (UPPER(?p_Details1?)) OR UPPER([DETAILS]) CONTAINS (UPPER(?p_Details2?)) OR UPPER([DETAILS]) CONTAINS (UPPER(?p_Details3?)) OR UPPER([DETAILS]) CONTAINS (UPPER(?p_Details4?))) ELSE (UPPER([DETAILS]) CONTAINS (UPPER(?p_Details1?)) OR UPPER([DETAILS]) CONTAINS (UPPER(?p_Details2?)) OR UPPER([DETAILS]) CONTAINS (UPPER(?p_Details3?)))) ELSE (UPPER([DETAILS]) CONTAINS (UPPER(?p_Details1?)) OR UPPER([DETAILS]) CONTAINS (UPPER(?p_Details2?)))) ELSE (UPPER([DETAILS]) CONTAINS (UPPER(?p_Details1?)))) ELSE (1=1)

Wenn einer der Textfeld aufgefordert ist null der Bericht alle Datensätze zurückgibt. So scheint es zu sein, ignoriert meine if-Aussagen. Funktioniert, wenn alle Eingabeaufforderungen für Textfelder Daten enthalten.

Prost.

Antwort

0

Dieser Filter sollte für Sie arbeiten:

(?p_Details1? IS NOT NULL AND UPPER([DETAILS]) CONTAINS (UPPER(?p_Details1?))) 
OR 
(?p_Details2? IS NOT NULL AND UPPER([DETAILS]) CONTAINS (UPPER(?p_Details2?))) 
OR 
(?p_Details3? IS NOT NULL AND UPPER([DETAILS]) CONTAINS (UPPER(?p_Details3?))) 
OR 
(?p_Details4? IS NOT NULL AND UPPER([DETAILS]) CONTAINS (UPPER(?p_Details4?))) 
OR 
(?p_Details1? IS NULL AND ?p_Details2? IS NULL AND ?p_Details3? IS NULL AND ?p_Details4? IS NULL) 

Es könnte hilfreich sein, eines Filters als Test zu denken, dass Cognos auf jede Zeile angewendet wird. Es wird entweder die Zeile behalten (wahr) oder verwerfen (falsch). Bei relationalen Datenbankquellen funktioniert das intern nicht so, aber es funktioniert tatsächlich.

Der Filter prüft zunächst, ob die erste Eingabeaufforderung einen Wert enthält und das Datenelement [Details] den Eingabeaufforderungswert enthält. Wenn dies der Fall ist, enthält es die Zeile und fährt mit der nächsten Zeile fort. Ist dies nicht der Fall, wird zum nächsten Teil der OR-Anweisung übergegangen, der die zweite Aufforderung prüft. Wenn die zweite Eingabeaufforderung einen Wert enthält und das Datenelement [Details] den Eingabeaufforderungswert enthält, wird die Zeile beibehalten und in die nächste Zeile verschoben. Dies wird für alle vier Parameter wiederholt.

Wenn keiner dieser Ausdrücke true zurückgibt und erst dann wird der letzte Teil ausgewertet. Dieser Ausdruck überprüft, ob alle Eingabeaufforderungen NULL sind. Wenn dies der Fall ist, werden alle Zeilen zurückgegeben.