2016-08-22 8 views
0

У меня есть несколько основных выражений, чтобы выделить определенные поля:SSRS сравнивающие даты в выражении

=IIF(Fields!Failure.Value > 0, "Red", "Transparent") 

Однако, я еще одно поле, которое содержит дату в следующем формате:

22/08/2016 22/08/2016 - each field can contain multiple dates. 

Это хранится в SQL как VARCHAR.

мне нужно запустить аналогичное выражение в моем докладе для достижения следующего:

Если дата 1 день старше, чем дата отчета выполняется, выделите поле. Если дата больше, чем на 1 день старше, выделите поле другого цвета.

Я знаком с основными выражениями, но я не могу представить простой способ получить текущую дату, а затем сравнить между ними.

+0

Используйте дату, тип данных, а не varchar, чтобы хранить даты. – jarlh

+0

Я не могу этого сделать, к сожалению, поскольку сингл содержит несколько записей даты. – PnP

+0

Это еще хуже проблема дизайна ... Никогда, никогда не храните данные в виде разделенных запятыми элементов. Это вызовет у вас массу проблем. – jarlh

ответ

1

Как уже сказал, вы действительно не должны использовать хаки, как это ...

Но это должно работать вы:

=iif(Len(Replace(Replace(Fields!DateField.Value," ",""), Format(Today, "dd/MM/yyyy"),"")) = 0, "Transparent" ,iif(Len(Replace(Replace(Replace(Fields!DateField.Value," ",""), Format(Today, "dd/MM/yyyy"),""), Format(Today().AddDays(-1), "dd/MM/yyyy"),"")) = 0, "Green", "Red")) 

по существу, удалить соединяющий символ (в данном случае, пространстве), а затем заменить все экземпляры текущей даты в заданном формате. Если остались какие-либо символы, у вас есть дата, которая не соответствует сегодняшним. Затем возьмите это значение и повторите для всех случаев вчера.

Очевидно, что это сработает, если ваше форматирование даты изменится.
Но тогда вы уже знали, что сравнение дат как строк было плохой идеей, правильно ...

+0

При попытке запустить отчет я получаю сообщение об ошибке (я заменил DateField.Value на значение моего набора данных). – PnP

+0

Вставьте как сообщение об ошибке, так и ваше выражение. – iamdave

+0

Также вы заменили оба экземпляра DateField? – iamdave

1

Вы можете использовать функцию Split для генерации массива значений. Конечно, вам все равно нужно выбрать один из них для тестирования. Ниже вы можете вернуться.

=Iif(
    CDate(
     Split(
      "21/08/2016, 22/08/2016", 
      "," 
     ).GetValue(0) 
    ) < Today, 
    "True", 
    "False" 
) 

Если, однако, вы имеете дело с датой строки, которая может содержать любое количество дат, и вы, чтобы проверить их все, то простое выражение SSRS не будет справиться с этим. К счастью, мы можем использовать немного настраиваемого кода.

Щелкните правой кнопкой мыши фон отчета и выберите свойства отчета. Выберите пункт «код» и вставьте следующий текст в окне кода

Public Function TestDate(DateString As String) As String 
    Dim DatesArray() As String = Split(DateString) 
    Dim ReturnValue As String = "Transparent" 
    For Each d As String In DatesArray 
     If Date.Parse(d) = DateAdd(DateInterval.Day, -1, Date.Today) Then 
      ReturnValue = "Red" 
     End If 
     If Date.Parse(d) < DateAdd(DateInterval.Day, -1, Date.Today) Then 
      ReturnValue = "DarkRed" 
     End If 
    Next 
    Return ReturnValue 
End Function 

Теперь измените выражение, как показано ниже

=Code.TestDate("21/08/2016 22/08/2016") 

Я использовал Date.Today в VB ограничить сравнение даты до дня. Если вы хотите, чтобы быть более точным, а именно: точное время, используйте Date.Now вместо

+0

Идя по формату в приведенном примере, вам нужно разбить на пробел, а не запятую. – iamdave

+0

Это было бы в пространстве, однако я не могу жестко скопировать даты в Split(). Как я могу заполнить это автоматически всеми значениями данного поля? – PnP

+0

Итак, замените твердую строку дат полем данных, например Split (Fields! MyFieldName.Value) –