2009-07-08 1 views
2

У меня возникла проблема с Crystal Report, который отображает данные из таблицы MySQL. Я в настоящее время собирает данные непосредственно из таблицы, однако, когда пользователи пытаются входных параметров, возникают проблемы, такие как:Crystal Reports XI и MySQL Сохраненная процедура с параметрами

  1. нулевые значения параметров возвращают ошибки
  2. параметры не работают, как указано

Затем я создал хранимую процедуру для возврата данных, если параметр пуст, и заставит сервер MySQL выполнять работу, а не сервер Crystal Reports.

Однако Crystal Reports, похоже, не распознает это, и у меня возникли проблемы с отображением результатов процедуры.

Вот копия процедуры я использую:

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; 

Есть ли более простой способ сделать это, или я делаю что-то не так? Любые предложения будут ценны.

+0

кристалла не распознают хранимую процедуру? Я не использую mysql, но, возможно, использую другой драйвер базы данных. – dotjoe

ответ

2

Если я читаю ваши IF дерево правильно, я думаю, что вы могли бы сделать это вместо того, чтобы (я T-SQL парень, поэтому я не могу подтвердить, что это будет работать в MySQL):

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

Спасибо! Мы обновили процедуру до этого, и она работает. Теперь проблема заключается в Crystal Reports .... SELECT * FROM tblData WHERE (field1 = @ param1 OR @ param1 является нулевым) И (field2 = @ param2 OR @ param2 является нулевым) И (field3 = @ param3 OR @ param3 - null); – Brent

1

Я не могу помочь с частью mySQL, но я делаю что-то очень похожее на SQL Server и Oracle. Вместо того, ряд утверждений IF, охватывающих все возможные комбинации нуля/не нулевые параметры, я что-то вроде этого:

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

Это охватывает любое сочетание нулевых и ненулевых параметров без экспоненциально растет число IF заявлений по мере увеличения количества параметров.

Это полная догадка с моей стороны, но в Oracle вам нужно объявить курсор как параметр IN OUT для SP для работы с Crystal. Может ли mySQL иметь такое же требование? Вот пример из 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

Спасибо! Процедура была обновление и в настоящее время: SELECT * FROM tblData WHERE (field1 = @ param1 OR @ param1 является нулевым) И (field2 = @ param2 OR @ param2 является нулевым) И (field3 = @ param3 OR @ param3 - null); Мы изучаем предложение курсора, поскольку проблема с Crystal Report еще не решена. – Brent

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