Skip to content

Commit 0b36dc2

Browse files
committed
#35 - CDate parser.
1 parent dccd781 commit 0b36dc2

File tree

6 files changed

+133
-5
lines changed

6 files changed

+133
-5
lines changed

readme.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ https://github.com/Apress/beg-sql-server-reporting-services/blob/master/Beginnin
279279

280280
| Group | Expression | Status | Comments |
281281
| ----- | ------- | ------ | -------- |
282-
| Date & Time | CDate | Not started | |
282+
| Date & Time | CDate | Complete | |
283283
| Date & Time | DateAdd | Complete | |
284284
| Date & Time | DateDiff | Complete | |
285285
| Date & Time | DatePart | Partial | Not yet tested with all time intervals |
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
using Microsoft.VisualBasic;
2+
using ReportViewer.NET.DataObjects;
3+
using ReportViewer.NET.Extensions;
4+
using System;
5+
using System.Collections.Generic;
6+
using System.Text.RegularExpressions;
7+
8+
namespace ReportViewer.NET.Parsers.DateAndTime
9+
{
10+
public class CDateParser : BaseParser
11+
{
12+
public static Regex CDateRegex = RegexCommon.GenerateParserRegex("CDate");
13+
14+
public CDateParser(
15+
string currentString,
16+
ExpressionFieldOperator op,
17+
ReportExpression currentExpression,
18+
IEnumerable<IDictionary<string, object>> dataSetResults,
19+
IDictionary<string, object> values,
20+
int currentRowNumber,
21+
IEnumerable<DataSet> dataSets,
22+
DataSet activeDataset,
23+
ReportRDL report
24+
) : base(currentString, op, currentExpression, dataSetResults, values, currentRowNumber, dataSets, activeDataset, CDateRegex, report)
25+
{
26+
}
27+
28+
public override (Type, object) ExtractExpressionValue(string fieldName, string dataSetName)
29+
{
30+
throw new NotImplementedException();
31+
}
32+
33+
public override void Parse()
34+
{
35+
var match = CDateRegex.Match(CurrentString);
36+
var matchValue = match.Value;
37+
38+
// Remove the surrounding CDate including open & close brace so we can inspect inner members and see if they too contain program flow expressions.
39+
matchValue = matchValue.MatchValueSubString(6);
40+
41+
// DateTime will either come directly from database or will be calculated from other expression.
42+
var date = this.Report.Parser.ParseReportExpressionString(
43+
matchValue,
44+
this.DataSetResults,
45+
this.Values,
46+
this.CurrentRowNumber,
47+
this.DataSets,
48+
this.ActiveDataset,
49+
null
50+
).ExpressionAsDateTime();
51+
52+
this.CurrentExpression.Index = match.Index;
53+
this.CurrentExpression.ResolvedType = typeof(DateTime);
54+
this.CurrentExpression.Value = date;
55+
}
56+
}
57+
}

src/ReportViewer.NET/Parsers/DateAndTime/DateStringParser.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
using ReportViewer.NET.DataObjects;
2-
using ReportViewer.NET.Extensions;
32
using System;
43
using System.Collections.Generic;
5-
using System.Linq;
6-
using System.Text;
74
using System.Text.RegularExpressions;
8-
using System.Threading.Tasks;
95

106
namespace ReportViewer.NET.Parsers.DateAndTime
117
{

src/ReportViewer.NET/Parsers/ExpressionFieldOperator.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public enum ExpressionFieldOperator
5353
OrElse,
5454
Left,
5555
MonthName,
56+
CDate,
5657
DateAdd,
5758
DateDiff,
5859
DatePart,

src/ReportViewer.NET/Parsers/ExpressionParser.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,15 @@ private void SearchDateTimeFunctions(
479479
ref string proposedString
480480
)
481481
{
482+
if (CDateParser.CDateRegex.IsMatch(currentString) &&
483+
(currentExpression.Operator == ExpressionFieldOperator.None || CDateParser.CDateRegex.Match(currentString).Index < currentExpression.Index)
484+
)
485+
{
486+
var cDateParser = new CDateParser(currentString, ExpressionFieldOperator.CDate, currentExpression, dataSetResults, values, currentRowNumber, dataSets, activeDataset, _report);
487+
cDateParser.Parse();
488+
proposedString = cDateParser.GetProposedString();
489+
}
490+
482491
if (MonthNameParser.MonthNameRegex.IsMatch(currentString) &&
483492
(currentExpression.Operator == ExpressionFieldOperator.None || MonthNameParser.MonthNameRegex.Match(currentString).Index < currentExpression.Index)
484493
)
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using Microsoft.VisualStudio.TestTools.UnitTesting;
2+
using ReportViewer.NET.DataObjects;
3+
using ReportViewer.NET.Extensions;
4+
using ReportViewer.NET.Parsers;
5+
6+
namespace ReportViewer.NET.Tests.Parsers.DateAndTime
7+
{
8+
[TestClass]
9+
public class CDateParserTests
10+
{
11+
private ExpressionParser _expressionParser;
12+
private ReportRDL _report;
13+
14+
public CDateParserTests()
15+
{
16+
var report = TestHelper.PrimeReport();
17+
18+
_report = report;
19+
_expressionParser = new ExpressionParser(report);
20+
}
21+
22+
[TestMethod]
23+
public void CDate_From_Date_Returns_Date()
24+
{
25+
// Arrange
26+
var expr = "=CDate(Now())";
27+
28+
// Act
29+
var result = _expressionParser.ParseReportExpressionString(
30+
expr,
31+
null,
32+
null,
33+
1,
34+
_report.DataSets,
35+
null,
36+
null
37+
).ExpressionAsDateTime();
38+
39+
// Assert
40+
Assert.AreEqual(DateTime.Now.Hour, result.Hour);
41+
Assert.AreEqual(DateTime.Now.Minute, result.Minute);
42+
}
43+
44+
[TestMethod]
45+
public void CDate_From_String_Returns_Date()
46+
{
47+
// Arrange
48+
var expr = "=CDate(\"January 15, 2010\")";
49+
50+
// Act
51+
var result = _expressionParser.ParseReportExpressionString(
52+
expr,
53+
null,
54+
null,
55+
1,
56+
_report.DataSets,
57+
null,
58+
null
59+
).ExpressionAsDateTime();
60+
61+
// Assert
62+
Assert.AreEqual(new DateTime(2010, 1, 15), result);
63+
}
64+
}
65+
}

0 commit comments

Comments
 (0)