2009-07-08 7 views
2

Ich habe ein Problem mit einem Crystal Report, der Daten aus einer MySQL-Tabelle anzeigt. Ich bin derzeit die Daten direkt aus der Tabelle zu sammeln, aber wenn die Benutzer zur Eingabe von Parametern versuchen, entstehen Probleme, wie zum Beispiel:Gespeicherte Prozedur von Crystal Reports XI und MySQL mit Parametern

  1. Nullwerte für Parameter Fehler
  2. Parameter funktionieren nicht wie angegeben
Rückkehr

Ich habe dann eine gespeicherte Prozedur erstellt, um Daten zurückzugeben, wenn ein Parameter leer ist und der MySQL-Server die Arbeit übernimmt und nicht der Crystal Reports-Server.

Crystal Reports scheint dies jedoch nicht zu erkennen und ich habe Probleme, die Ergebnisse des Verfahrens anzuzeigen.

Hier ist eine Kopie des Verfahrens ich verwende:

Create Procedure sp_report 
(IN @param1 varchar(64), 
IN @param2 varchar(64), 
IN @param3 int) 

Begin 

IF @param1 is null AND @param2 is null AND @param3 is null Then 
    Select * from tblData 
ELSE IF @param1 is null AND @param2 is not null AND @param3 is not null then 
    Select * from tblData where field3 = @param3 and field2 = @param2 
ELSE IF @param1 is not null AND @param2 is not null AND @param3 is null then 
    Select * from tblData where field2 = @param2 and field1 = @param1 
ELSE IF @param1 is not null AND @param2 is null AND @param3 is not null then 
    Select * from tblData where field3 = @param3 and field1 = @param1 
ELSE IF @param1 is not null AND @param2 is null AND @param3 is null then 
    Select * from tblData where field1 = @param1 
ELSE IF @param1 is null AND @param2 is not null AND @param3 is null then 
    Select * from tblData where field2 = @param2 
ELSE IF @param1 is null AND @param2 is null AND @param3 is not null then 
    Select * from tblData where field3 = @param3 
ELSE IF @param1 is not null AND @param2 is not null AND @param3 is not null then 
    Select * from tblData where field3 = @param3 and field2 = @param2 and field1 = @param1 
END; 

Gibt es einen einfacheren Weg, dies zu tun, oder bin ich etwas falsch? Irgendwelche Vorschläge würden sehr geschätzt werden.

+0

Crystal Reports nicht die gespeicherte Prozedur erkennen? Ich benutze nicht mysql, aber vielleicht einen anderen Datenbanktreiber. – dotjoe

Antwort

2

Wenn ich lese Ihre IF Baum richtig, ich glaube, Sie dies tun könnten stattdessen (Ich bin ein T-SQL-Typ, also kann ich nicht bestätigen, ob dies in MySQL läuft):

SELECT * 
    FROM tblData 
WHERE (([email protected]) OR (@param1 is null)) 
    AND (([email protected]) OR (@param2 is null)) 
    AND (([email protected]) OR (@param3 is null)) 
+0

Danke! Wir haben das Verfahren aktualisiert und es funktioniert. Jetzt liegt das Problem mit Crystal Reports .... SELECT * FROM tblData WHERE (field1 = @ param1 OR @ param1 ist null) AND (field2 = @ param2 OR @ param2 ist null) AND (field3 = @ param3 ODER @ param3 ist null); – Brent

1

Ich kann nicht mit dem MySQL-Teil helfen, aber ich mache etwas sehr ähnlich mit SQL Server und Oracle. Anstelle einer Reihe von Anweisungen IF jede mögliche Kombination von null/nicht null Parameter abdecken, das tue ich etwas wie folgt aus:

select * from tblData where (field1 = @param1 or @param1 is null) and 
(field2 = @param2 or @param2 is null) and 
(field3 = @param3 or @param3 is null) 

, dass jede Mischung aus null und Nicht-Null-Parameter schützt, ohne exponentiell die Anzahl der IF-Anweisungen zu erhöhen wenn die Anzahl der Parameter zunimmt.

Dies ist eine komplette Vermutung meinerseits, aber in Oracle müssen Sie einen Cursor als IN OUT-Parameter für SPs mit Crystal zu deklarieren. Könnte mySQL die gleiche Anforderung haben? Hier ist ein Beispiel eines Oracle-SP:

create or replace PROCEDURE  SomeProcedure 
(
    param1    IN   VARCHAR2 DEFAULT null, 
    param2    IN   VARCHAR2 DEFAULT null, 
    REPORT_CURSOR  IN OUT  CrystalPkg.CrystalCursor 
) 
AS 
BEGIN 

    OPEN REPORT_CURSOR FOR 
    SELECT blahblah from blah... 
+0

Danke! Das Verfahren hat Update war und ist zur Zeit: SELECT * VON tblData WHERE (field1 = @ param1 OR @ param1 ist null) AND (field2 = @ param2 OR @ param2 ist null) AND (field3 = @ param3 OR @ param3 ist null); Wir prüfen den Mauszeigervorschlag, da wir immer noch ein Problem mit dem Crystal Report haben. – Brent

0
select * 
from tblData 
where field1 like isnull(@param1,'%%' 
and field2 like isnull(@param2,'%%') 
and field3 like isnull(@param3,'%%')