Создание отчета Crystal Report SQL для MS SQL - PullRequest
0 голосов
/ 12 ноября 2009

Если вы создаете Crystal Report с помощью встроенного мастера, таблицы связываются и т. Д. Что определяет, превращает ли параметр его в реальный оператор SQL? Кроме того, почему он заключает все в двойные кавычки?

Например:

Вот мой базовый SQL-оператор, сгенерированный CR:

SELECT "poitem"."fpono"
,      "pomast"."fcompany"
,      "pomast"."fvendno"
,      "poitem"."fpartno"
,      "poitem"."fitemno"
,      "poitem"."frelsno"
,      "poitem"."fordqty"
,      "poitem"."frcpqty"
,      "poitem"."fucostonly"
,      "poitem"."flstpdate"
FROM "M2MDATA01"."dbo"."pomast" "pomast"
     INNER JOIN "M2MDATA01"."dbo"."poitem" "poitem"
     ON "pomast"."fpono" = "poitem"."fpono"

Теперь посмотрим, что произойдет, когда я добавлю следующее в редактор редактора:

{poitem.fcategory} = "INV" and
not ({poitem.fmultirls} = "Y" and
{poitem.frelsno} = "  0") and
{poitem.fordqty} > {poitem.frcpqty} and
cdate({poitem.flstpdate}) = {?LastPromDate} and
{poitem.forgpdate} = DateTime (2010, 10, 05, 00, 00, 00) and 
{pomast.fstatus} = "OPEN" 

Я добавил forgpdate для сравнения, так как я запрашиваю даты двумя разными способами.

Вот SQL, который я получаю:

 SELECT "poitem"."fpono"
,      "pomast"."fcompany"
,      "pomast"."fvendno"
,      "poitem"."fpartno"
,      "poitem"."fitemno"
,      "poitem"."frelsno"
,      "poitem"."fordqty"
,      "poitem"."frcpqty"
,      "poitem"."fucostonly"
,      "poitem"."flstpdate"
,      "poitem"."fcategory"
,      "poitem"."fmultirls"
,      "pomast"."fstatus"
,      "poitem"."forgpdate"
FROM "M2MDATA01"."dbo"."pomast" "pomast"
     INNER JOIN "M2MDATA01"."dbo"."poitem" "poitem"
     ON "pomast"."fpono" = "poitem"."fpono"
WHERE     "poitem"."fcategory" = 'INV'
      AND("poitem"."fmultirls" <> 'Y'
          OR "poitem"."frelsno" <> '  0')
      AND "poitem"."fordqty" > "poitem"."frcpqty"
      AND("poitem"."forgpdate" >= {TS '2010-10-05 00:00:00'}
          AND "poitem"."forgpdate" < {TS '2010-10-05 00:00:01'})
      AND "pomast"."fstatus" = 'OPEN'

Большая часть этого передана напрямую, однако это преобразовало мое утверждение "Не".

Также обратите внимание, что моя строка cdate вообще не была отправлена, а разрешена в самом Crystal.

Кто-нибудь знает точно, как Кристалл решает, что делать? Я работаю с некоторыми большими базами данных и мне нужны мои критерии в выражении SQL, иначе Crystal возвращает огромные наборы данных, которые тратят время, память и обработку.

ТИА.

Ответы [ 3 ]

1 голос
/ 12 ноября 2009

Формат SQL, который он генерирует, частично зависит от версии Crystal и поставщика данных. Если вы используете ODBC, он всегда будет заключать в кавычки все, так как этот синтаксис является стандартом ANSI. То же самое обычно применяется при составлении отчетов по SQL Server и другим источникам данных. Однако если, например, вы создадите отчет в Crystal 8.5 и используете провайдер источника данных SQL Server, он будет генерировать SQL без кавычек (т. Е. Просто обычный SELECT MyTable.MyField FROM MyTable). Я считаю, что это поведение было изменено в версии 9 для любого источника данных SQL Server, но это не является общим изменением. В Crystal 11 использование собственного поставщика вместо ODBC для источника данных Informix не будет генерировать SQL в кавычках, как указано выше.

Что касается того, как он оценивает, что делать в SQL, это зависит от того, сколько он может переписать в SQL источника данных. Любая формула, использующая функцию Crystal (например, функцию CDate, которую вы использовали), обычно может быть оценена только внутри самого Crystal. Чтобы максимизировать работу, выполняемую сервером, не используйте какие-либо функции Crystal, поля сводки или операторы Switch. Точная сумма, которую он может конвертировать снова, зависит от поставщика. Иногда просто невозможно преобразовать все это. Также есть опция Использовать индексы на сервере для скорости, которая может ускорить процесс, но не очень помогает в том, что и где выполняется.

1 голос
/ 12 ноября 2009

Вы получите больший контроль над оператором SQL, если будете использовать объект Command, а не отдельные таблицы. База данных | Эксперт по базам данных ..., разверните корневую папку нужного сервера баз данных и нажмите «Добавить команду». Введите желаемый оператор SQL. При необходимости добавьте параметры.

Параметры, создаваемые в объекте Command, гораздо менее гибки, чем те, которые вы определяете в самом отчете. Вы можете выбрать параметры, определенные в объекте Command (который будет автоматически добавлен в отчет) и дополнительные параметры, определенные в отчете, которые будут применяться при чтении отчета из базы данных (очевидно, меньше). эффективный).

1 голос
/ 12 ноября 2009

почему все заключено в двойные кавычки?

Двойные кавычки - это стандартный способ заключения имен объектов. Это безопасный кроссплатформенный способ убедиться, что имена таблиц и столбцов вашей компании не будут конфликтовать с зарезервированным ключевым словом где-либо.

Основная часть вопроса, по-видимому, заключается в том, почему это делает вашу сторону сравнения переменных на стороне клиента. Там я боюсь, что не могу вам помочь. Я думаю, что это связано с тем, какие индексы доступны, за исключением того, что для Crystal было бы странно слишком много знать об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...