2009-08-10 5 views
0

Wir verfügen über einen Crystal Report, mit dem der Benutzer auswählen kann, auf welche der verschiedenen Felder gefiltert werden soll. In der Datensatzauswahlformel haben wir Code wie folgt aus:Wie filtert man ein Zahlenfeld gegen einen mehrfachen String-Parameter oder String-Array?

if {?First Selection Type} = "CUSTOMER CODE" then {foo.CustCode} in {?First Selection Value} 
else if {?First Selection Type} = "ORDER" then {bar.OrderNum} in {?First Selection Value} 
... 

Der {?First Selection Value} Parameter als mehrere String-Parameter definiert ist, da einige der Möglichkeiten Strings verwenden müssen.

Leider ist das Feld bar.OrderNum numerisch.

Wenn ich versuche, den Code wie oben einzugeben, gibt Crystal Reports den Fehler "Ein Nummernbereich ist hier erforderlich".

Wenn ich CStr({bar.OrderNum}) setze speichert es ohne Fehler, aber enthält diese Kriterien nicht beim Generieren der SQL-Anweisung, was zu schrecklichen Leistung führt, wie es jeden Auftrag aus der Datenbank abzieht und sucht sie Client-Seite.

Wenn ich ToNumber({?First Selection Value}) oder CDbl({?First Selection Value}) setzen, gibt es die Fehlermeldung "Dieses Array indexiert werden müssen. Zum Beispiel: Array [i]."

Ich brauche eine Möglichkeit, um dieses Kriterium an den Datenbankserver zu übergeben, ohne die Parameter für die Benutzer verwirrender zu machen.

Wenn es darauf ankommt, verwenden wir Crystal Reports 11.0.0.895 für eine Progress OpenEdge 10.1B03-Datenbank.

Antwort

0

Die Lösung, die ich, dass scheint zu funktionieren gefunden ist ein SQL-Ausdruck mit dem folgenden Ausdruck namens OrderNumStr zu erstellen:

CAST("bar1"."SOrderNum" AS VARCHAR(10)) 

und dann die Datensatzauswahl ändern:

if {?First Selection Type} = "CUSTOMER CODE" then {foo.CustCode} in {?First Selection Value} 
else if {?First Selection Type} = "ORDER" then {%OrderNumStr} in {?First Selection Value} 
... 

Das zumindest hat die Kriterien an die Server-Seite gesendet, obwohl es verhindert, dass der Datenbankserver Indizes verwendet, also ist es nicht ideal. Es ist immer noch eine massive Leistungsverbesserung gegenüber dem, was es vorher getan hat.

P.S. (Ich musste die Tabelle im Datenbankexperten von bar in bar1 umbenennen, damit der SQL-Ausdruck funktioniert. Dies kann jedoch progressspezifisch sein.)

Verwandte Themen