Хранимая процедура Crystal Reports XI и MySQL с параметрами - PullRequest
2 голосов
/ 09 июля 2009

У меня проблема с отчетом Crystal, который отображает данные из таблицы 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;

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

Ответы [ 3 ]

2 голосов
/ 09 июля 2009

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

SELECT *
  FROM tblData
 WHERE ((field1=@param1) OR (@param1 is null))
   AND ((field2=@param2) OR (@param2 is null))
   AND ((field3=@param3) OR (@param3 is null))
1 голос
/ 09 июля 2009

Я не могу помочь с частью 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 голосов
/ 04 августа 2009
select * 
from tblData 
where field1 like isnull(@param1,'%%' 
and field2 like isnull(@param2,'%%')
and field3 like isnull(@param3,'%%')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...