我正在使用VS2008中的crsytal报告。我希望能够根据用户通过日期时间选择器的输入过滤我的水晶报表查看器中的日期。我的问题是日期字段本身在我的数据库中是STRING格式。 -_-每当我通过代码比较值时,我会将其解析为datetime。
我该如何解决这个问题?有什么方法可以解析报告字段吗?我不希望/不能将我的数据库字段更改为datetime,因为这将需要更改我的整个系统。
~EDIT~
点击过滤按钮后,我有一个名为FromCreated_DTime的日期时间选择器。我将其值解析为短日期字符串(例如1/01/2011),然后将其分配给我的字符串参数字段。使用Select Expert公式,我应用了您的代码。我的参数字段名为actualStart:
Date (ToNumber (Right ({Projects.Actual_StartDate}, 4)),
ToNumber (Left ({Projects.Actual_StartDate}, InStr ({Projects.Actual_StartDate}, "/")-1)),
ToNumber (Mid ({Projects.Actual_StartDate},
InStr ({Projects.Actual_StartDate}, "/")+1,
InStrRev({Projects.Actual_StartDate},"/")-InStr({Projects.Actual_StartDate}, "/")-1))
)
>=
Date (ToNumber (Right ({?actualStart}, 4)),
ToNumber (Left ({?actualStart}, InStr ({?actualStart}, "/")-1)),
ToNumber (Mid ({?actualStart},
InStr ({?actualStart}, "/")+1,
InStrRev({?actualStart},"/")-InStr({?actualStart}, "/")-1))
)
private void Filter_Btn_Click(object sender, EventArgs e)
{
ReportDocument cryRpt = new ReportDocument();
TableLogOnInfos crtableLogoninfos = new TableLogOnInfos();
TableLogOnInfo crtableLogoninfo = new TableLogOnInfo();
ConnectionInfo crConnectionInfo = new ConnectionInfo();
cryRpt.Load("D:\\MY_THESIS\\WORKING FILES\\WindowsFormsApplication2\\WindowsFormsApplication2\\Reports\\Crystal Reports\\UsersReport.rpt");
crConnectionInfo.ServerName = "RITZEL-PC\\SQLEXPRESS";
crConnectionInfo.UserID = "NNIT-Admin";
crConnectionInfo.Password = "password";
crConnectionInfo.DatabaseName = "NNIT DB";
Tables CrTables = cryRpt.Database.Tables;
foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in CrTables)
{
crtableLogoninfo = CrTable.LogOnInfo;
crtableLogoninfo.ConnectionInfo = crConnectionInfo;
CrTable.ApplyLogOnInfo(crtableLogoninfo);
}
// Create parameter objects
ParameterFields myParams = new ParameterFields();
//PARAMETER NAME
ParameterField myParam = new ParameterField();
ParameterDiscreteValue myDiscreteValue = new ParameterDiscreteValue();
myParam.ParameterFieldName = "actualStart";
myDiscreteValue = new ParameterDiscreteValue();
myDiscreteValue.Value = FromCreated_DTime.Value.ToShortDateString();
myParam.CurrentValues.Add(myDiscreteValue);
myParams.Add(myParam);
crystalReportViewer1.ParameterFieldInfo = myParams;
crystalReportViewer1.ReportSource = cryRpt;
}
答案 0 :(得分:1)
取决于数据库中日期字段的格式。这是一个例子:
stringvar yyear;
stringvar mmonth;
stringvar dday;
dday := {ORDERS.ORDER_DATE}[5 to 6];
mmonth := {ORDERS.ORDER_DATE}[3 to 4];
yyear := {ORDERS.ORDER_DATE}[1 to 2];
if yyear < "50" then
date(tonumber(yyear)+2000,tonumber(mmonth),tonumber(dday))
else
date(tonumber(yyear)+1900,tonumber(mmonth),tonumber(dday))
答案 1 :(得分:0)
有一点......如果你打算将日期用作选择参数(你所描述的),如果你使用所概述的方法,你将非常不友好地打败你的数据库。在小型数据库中没有太大问题(记录更少,更小,等等),但在更大的数据库中,您将遇到问题。描述的方法基本上是PULLS BACK EVERY(合格)记录,转换,然后决定它是否应该被破坏或丢弃。那些前4(5)个单词应该在你的灵魂中发出恐怖。如果需要,它仍然是显示日期的好方法,但不是使用字符串日期进行记录选择。
你可以( )做的是创建日期参数,然后将它们转换为合适的字符串表达式,并使用它来搜索数据库。您可以为每个报告运行设置一次参数。你会带回每一条记录,转换,比较,丢弃等等。它让我的大脑捶打只是输入它。 :-D
希望有所帮助,请不要读任何讽刺,除了善意之外别无其他。
答案 2 :(得分:0)
更新:给定名为Projects.Actual_StartDate的字符串,格式为/
- 以月 - 日 - 年顺序分隔的字段,具有四位数年份和一位或两位数的日期和月份值,下面的公式应该将字符串转换为日期,并将其与名为{?actualStart}的Crystal日期参数进行比较:
Date (ToNumber (Right (TrimRight ({Projects.Actual_StartDate}), 4)),
ToNumber (Left ({Projects.Actual_StartDate}, InStr ({Projects.Actual_StartDate}, "/")-1)),
ToNumber (Mid ({Projects.Actual_StartDate},
InStr ({Projects.Actual_StartDate}, "/")+1,
InStrRev({Projects.Actual_StartDate},"/")-InStr({Projects.Actual_StartDate}, "/")-1))
)
>= {?actualStart}
答案 3 :(得分:0)
在Crystal中使用SQL表达式的示例 - 取决于启用SQL Exp的数据源。
我要去ASSuME,字段日期是10个字符串, 即“mm / dd / yyyy” 我要去ASSuME你的参数是一个字符串。使用日期选择器更方便。您可以将DP日期转换为字符串。使用{?actualStart},{Projects.Actual_StartDate}
@SQLMonth
Left( {?actualStart}, 2 ) >
Left( {Projects.Actual_StartDate}, 2 )
@SQLDay
-- You can use SUBSTRING, but I'm being lazy.
-- Time results for both and then decide
Right( Left( {?actualStart}, 5 ) , 2 ) >
Right( Left( {Projects.Actual_StartDate}, 5 ) , 2 )
@SQLYear
Right( {?actualStart}, 4 ) >
Right( {Projects.Actual_StartDate}, 4 )
然后,在“选择专家”中,您可以包括:
(The REST of your selection code)
AND
( {@SQLYear} AND {@SQLMonth} AND {@SQLDay} )
这会被推送到服务器并减少处理时间,并且只返回您想要的记录。 **
**理论上......我没有测试过这个,我是从记忆中做到的。 :-)
奇怪的是,如果您使用SQL命令(=“以程序方式制作SQL”,那么这也是您将使用的代码。 * )
* 好的,我尝试了几种不同的(错误)拼写编程,而FF拼写检查并不喜欢一个人。