Как преобразовать этот оператор Crystal Report IF для использования в предложении WHERE в службах Reporting Services? - PullRequest
0 голосов
/ 16 апреля 2010

Я пытаюсь перевести этот оператор Crystal Reports IF для использования в предложении WHERE -

{@receipt_datetime_daylight} in {?DateRange} and
(if {?Call Sign} = "All Call Signs" Then
    {cacs_incident_task.resource_or_class_id} = {cacs_incident_task.resource_or_class_id}
Else If {?Call Sign} = "All Sierra Call Signs" Then
    {cacs_incident_task.resource_or_class_id} in ["S10", "S11", "S12"]
Else If {?Call Sign} = "All Whiskey Call Signs" Then
    {cacs_incident_task.resource_or_class_id} in ["W01", "W02", "W03"]
Else
    {cacs_incident_task.resource_or_class_id} = {?Call Sign}) and
(if {?OffenceType} = "All Offences" Then
    {cacs_inc_type.description} = {cacs_inc_type.description}
else
    {cacs_inc_type.description} = {?OffenceType})

Операторы CASE не работают в службах Reporting Services, поэтому мне нужно найти причину перевода этогов предложение WHERE.Кто-нибудь знает способ?

Ответы [ 2 ]

0 голосов
/ 19 апреля 2010

После небольшой работы вот мое решение -

/* Input Parameters */
Declare @StartDate datetime
Declare @EndDate datetime
DECLARE @CallSign varchar(50)
DECLARE @OffenceType varchar(50)

/* Local variables */
declare @CallSignClause nvarchar(1000)
declare @OffenceTypeClause nvarchar(1000)
declare @DateClause nvarchar(1000)
declare @SQLSelect nvarchar(4000)

/* Test Parameters */
Set @CallSign = 'All Whiskey Call Signs'
Set @OffenceType = 'Burglary'
Set @StartDate = { d '2010-01-01' }
Set @EndDate = { d '2010-04-01' }

if @CallSign = 'All Call Signs' OR @CallSign is null
    set @CallSignClause = ' cacs_incident_task.resource_or_class_id = cacs_incident_task.resource_or_class_id'

if @CallSign = 'All Sierra Call Signs' 
    set @CallSignClause = ' (cacs_incident_task.resource_or_class_id IN (''S10'', ''S11'', ''S12'', ''S13'', ''S14'', ''S15'', ''S16'', ''S17'', ''S18'', ''S19'', ''S20'', ''S21'', ''S22'', ''S23'', ''S24'', ''S25'', ''S26'', ''S27'', ''S28'', ''S29'', ''S30'', 
               ''S33'', ''S34'', ''S35'', ''S51'', ''S52'', ''S53'', ''S82'', ''S83''))'

if @CallSign = 'All Whiskey Call Signs' 
    set @CallSignClause = '(cacs_incident_task.resource_or_class_id IN (''W01'', ''W02'', ''W03'', ''W04'', ''W11'', ''W12'', ''W13'', ''W14'', ''W15'', ''W22'', ''W23'', ''W31'', ''W32'', ''W33'', ''W34'', ''W42'', ''W43'', ''W44'', ''W45'', 
               ''W51'', ''W52'', ''W53'', ''W54'', ''W58'', ''W62'', ''W63'', ''W64'', ''W65'', ''W68'', ''W81'', ''W82'', ''W83'', ''W84'', ''W92'', ''W93'', ''W94'', ''W95''))'

if (@CallSign <> 'All Call Signs') AND (@CallSign <> 'All Sierra Call Signs') AND (@CallSign <> 'All Whiskey Call Signs') AND (@CallSign is not null)
    set @CallSignClause = ' cacs_incident_task.resource_or_class_id = ''' + @CallSign + ''''

if @OffenceType = 'All Offences' OR @OffenceType is null
    set @OffenceTypeClause = 'cacs_inc_type.description = cacs_inc_type.description'
else
    set @OffenceTypeClause = 'cacs_inc_type.description LIKE ''%' + @OffenceType + '%'''

if @StartDate is null
    set @DateClause = ''
else
    /* set @DateClause = ' ccors_offence.committed_to_date between cast(''' +left( cast(@StartDate as varchar(20)), 12) + '''  as datetime) and cast(''' +left( cast(@EndDate as varchar(20)), 12) + '''  as datetime)' */
    set @DateClause = ' DateAdd(dd, 0, DateDiff(dd, 0, cacs_incident_header.at_scene_date)) + DateAdd(dd, 0 - DateDiff(dd, 0, cacs_incident_header.at_scene_time), cacs_incident_header.at_scene_time) between cast(''' +left( cast(@StartDate as varchar(20)), 12) + '''  as datetime) and cast(''' +left( cast(@EndDate as varchar(20)), 12) + '''  as datetime) AND ' 

set @SQLSelect = 
'SELECT
    cacs_incident_header."id", cacs_incident_header."receipt_date", cacs_incident_header."receipt_time", cacs_incident_header."receipt_daylight", cacs_incident_header."at_scene_date", cacs_incident_header."at_scene_time", cacs_incident_header."at_scene_daylight",
    cacs_incident_task."resource_or_class_id",
    cacs_resource."description" as cacs_resource,
    cacs_inc_type."description" as cacs_inc_type,
    atscene_datetime = DateAdd(dd, 0, DateDiff(dd, 0, cacs_incident_header.at_scene_date)) + DateAdd(dd, 0 - DateDiff(dd, 0, cacs_incident_header.at_scene_time), cacs_incident_header.at_scene_time) 
FROM
    { oj ((("universe_db"."dbo"."cacs_incident_header" cacs_incident_header INNER JOIN "universe_db"."dbo"."cacs_incident_header_inc_type_id" cacs_incident_header_inc_type_id ON
        cacs_incident_header."id" = cacs_incident_header_inc_type_id."id")
     INNER JOIN "universe_db"."dbo"."cacs_incident_task" cacs_incident_task ON
        cacs_incident_header."id" = cacs_incident_task."incident_header_id")
     INNER JOIN "universe_db"."dbo"."cacs_inc_type" cacs_inc_type ON
        cacs_incident_header_inc_type_id."inc_type_id" = cacs_inc_type."id")
     INNER JOIN "universe_db"."dbo"."cacs_resource" cacs_resource ON
        cacs_incident_task."resource_or_class_id" = cacs_resource."id"}
WHERE ' + @DateClause + @CallSignClause + ' AND ' + @OffenceTypeClause +
' ORDER BY cacs_incident_task."resource_or_class_id" ASC'

/* exec sp_executesql @SQLSelect */
print @SQLSelect
0 голосов
/ 18 апреля 2010

у вас есть три решения:

1 - создайте запрос и поместите эти условия в условие WHERE.

2 - создайте expression для этой работы и выполните эту работу с этим. Вы можете писать на нем BASIC языком.

3 - вы можете использовать assembly для этого. это означает, что вы должны сделать dll на своем любимом языке и использовать его методы в своем отчете.

...