gpt4 book ai didi

delphi - 快速报告显示来自 ADOQuery 的不正确数据

转载 作者:行者123 更新时间:2023-12-03 15:56:31 30 4
gpt4 key购买 nike

我在快速报告中遇到问题,显示 ADO 查询中的数据不正确。我使用以下 sql.text

SELECT * FROM JOB_DATA 
INNER JOIN CUSTOMER ON JOB_DATA.CUST_CODE = CUSTOMER.CUST_CODE
WHERE JOB_DATA.SHIP_DATE Between [Date1] And [Date2]
ORDER by SHIP_DATE

快速报告仅显示 SHIP_DATE = null 的数据。

如果我抛出一个 TDBgrid 并将其附加到附加到同一 ADOquery 的数据源,那么 dbgrid 将显示完全正确的信息。

我没有主意,有什么建议吗?

要回答有关日期来源的问题:

var
date1:string;
date2:string;
sql_str:string;
begin
date1:=inputbox('Date Range','Enter Beginning Date','');
Try
StrToDate(date1);
Except
On EConvertError Do
Begin
MessageDlg('Please enter a valid date. Format xx/xx/xx',
mtError, [mbOK], 0);
//ShowMessage('Please enter a valid date. Format `enter code here`xx/xx/xx');
Exit;
End;
End;

date2:=inputbox('Date Range','Enter Ending Date','');
Try
StrToDate(date2);
Except
On EConvertError Do
Begin
MessageDlg('Please enter a valid date. Format xx/xx/xx',
mtError, [mbOK], 0);
//ShowMessage('Please enter a valid date. Format `enter code here`xx/xx/xx');
Exit;
End;
End;

sql_str:= 'SELECT * FROM JOB_DATA INNER JOIN CUSTOMER ON ' +
'JOB_DATA.CUST_CODE = CUSTOMER.CUST_CODE ' +
'WHERE JOB_DATA.SHIP_DATE Between ';
sql_str:= sql_str+ ''' ';
sql_st:=sql_str + date1;
sql_str:= sql_str+ '''';
sql_str:= sql_str+ ' AND ';
sql_str:= sql_str+ ''' ';
sql_str:= sql_str+ date2;
sql_str:= sql_str+ ' ''';

with ADOQuery5 do
begin
Close;
SQL.Clear;
SQL.text:= sql_str;
Open;
end;
frxreport2.ShowReport();
end;

ADOquery 附加到 frxDBDataset2,而 frxDBDataset2 又附加到 frxReport2。我没有做任何事情来改变查询中的结果。

不,我的报告中没有代码,它都是由向导生成的。

最佳答案

FastReport 无法仅显示 SHIP_DATE 的记录是 NULL ,因为您的查询不应根据您的 WHERE 返回它们子句 if Date1Date2被正确分配。这意味着您的数据集和 FastReport 未正确连接,或者代码中的某些内容为 BETWEEN 分配了日期值。子句错误,并且未正确向查询提供日期。

首先要确保所有报告列都正确分配了正确的 TfrxDataSet以及正确的数据库列。 (单击报表项(文本对象或任何可能的对象),然后检查其 DataSetDataField 属性以确保它们正确。)

如果这不是问题,则可能是您构建查询的方式存在问题,该方式可能未正确格式化 ADO 的日期。 (您只需使用任何格式来传递 StrToDate 调用而不会引发异常。)

您设置 SQL 的方式确实不可取。当您尝试在代码中管理自己的引用时,它是不可读且不可维护的。

您应该使用参数,它首先可以保护您免受 SQL 注入(inject),而且还允许数据库驱动程序为您正确格式化引用的值和日期并保持内容可读。 (您还可以为参数使用可读的名称,这样当您六个月后看到它们时,您就会知道它们的含义。)

var
// Your other variable declarations here
StartDate, EndDate: TDateTime;
begin
Date1 := InputBox(Whatever);
try
StartDate := StrToDate(Date1);
except
// Handle EConvertError
end;
Date2 := InputBox(Whatever);
try
EndDate := StrToDate(Date2);
except
// Handle EConvertError
end;

sql_str := 'SELECT * FROM JOB_DATA J'#13 +
'INNER JOIN CUSTOMER C'#13 +
'ON J.CUST_CODE = C.CUST_CODE'#13 +
'WHERE J.SHIP_DATE BETWEEN :StartDate AND :EndDate';

with ADOQuery5 do
begin
Close;
// No need to clear. If you're using the same query more than once,
// move the SQL assignment and the Parameter.DataType somewhere
// else, and don't set them here.
// The query can be reused just by closing, changing parameter values,
// and reopening.
SQL.Text := sql_str;
with Parameters.ParamByName('StartDate') do
begin
DataType := ftDate;
Value := StartDate;
end;
with Parameters.ParamByName('EndDate') do
begin
DataType := ftDate;
Value := EndDate;
end;
Open;
end;
frxReport2.ShowReport;
end;

关于delphi - 快速报告显示来自 ADOQuery 的不正确数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18114360/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com