这个问题以前解决过,只是现在又忘记了,就是按条件查询到了数据然后显示在表中,数据表中有20条数据,但符合条件的只有8条,结果报表就将这8条数据显示出或打印出20行(重复显示了),而不8行的;这是在那里控制,让他只显示或打印符合条件的8条成8行,而不重复显示成20行;
相关的代码如下:
procedure Treportfrm.DayReportBeginDoc(Sender: TObject);
begin
with datamodule1.ADOWork do
begin
close;
sql.Clear;
sql.Add('select * from worklist');
open;
if datetostr(strtodatetime(fieldbyname('replydate').AsString))=datetostr(now) then
begin
TfrxMemoView(DayReport.FindObject('memo14')).Memo.Text:=fieldbyname('dostate').AsString;
TfrxMemoView(DayReport.FindObject('Memo15')).Memo.Text:=fieldbyname('workID').AsString;
TfrxMemoView(DayReport.FindObject('Memo16')).Memo.Text:=fieldbyname('Guestname').AsString;
TfrxMemoView(DayReport.FindObject('Memo17')).Memo.Text:=fieldbyname('Replydate').AsString;
TfrxMemoView(DayReport.FindObject('Memo18')).Memo.Text:=fieldbyname('Dotime').AsString;
TfrxMemoView(DayReport.FindObject('Memo19')).Memo.Text:=fieldbyname('OverTime').AsString;
TfrxMemoView(DayReport.FindObject('Memo20')).Memo.Text:=FormatDateTime('hh:mm:ss',strtodatetime(fieldbyname('Dotime').AsString)-strtodatetime(fieldbyname('Replydate').AsString));
TfrxMemoView(DayReport.FindObject('Memo21')).Memo.Text:=fieldbyname('Sstyle').AsString;
TfrxMemoView(DayReport.FindObject('Memo22')).Memo.Text:=fieldbyname('Sproject').AsString;
TfrxMemoView(DayReport.FindObject('Memo23')).Memo.Text:=fieldbyname('Sendman').AsString;
TfrxMemoView(DayReport.FindObject('Memo24')).Memo.Text:=fieldbyname('Note').AsString;
TfrxMemoView(DayReport.FindObject('Memo37')).Memo.Text:=fieldbyname('Room').AsString;
end;
end;
end;
相关的代码如下:
procedure Treportfrm.DayReportBeginDoc(Sender: TObject);
begin
with datamodule1.ADOWork do
begin
close;
sql.Clear;
sql.Add('select * from worklist');
open;
if datetostr(strtodatetime(fieldbyname('replydate').AsString))=datetostr(now) then
begin
TfrxMemoView(DayReport.FindObject('memo14')).Memo.Text:=fieldbyname('dostate').AsString;
TfrxMemoView(DayReport.FindObject('Memo15')).Memo.Text:=fieldbyname('workID').AsString;
TfrxMemoView(DayReport.FindObject('Memo16')).Memo.Text:=fieldbyname('Guestname').AsString;
TfrxMemoView(DayReport.FindObject('Memo17')).Memo.Text:=fieldbyname('Replydate').AsString;
TfrxMemoView(DayReport.FindObject('Memo18')).Memo.Text:=fieldbyname('Dotime').AsString;
TfrxMemoView(DayReport.FindObject('Memo19')).Memo.Text:=fieldbyname('OverTime').AsString;
TfrxMemoView(DayReport.FindObject('Memo20')).Memo.Text:=FormatDateTime('hh:mm:ss',strtodatetime(fieldbyname('Dotime').AsString)-strtodatetime(fieldbyname('Replydate').AsString));
TfrxMemoView(DayReport.FindObject('Memo21')).Memo.Text:=fieldbyname('Sstyle').AsString;
TfrxMemoView(DayReport.FindObject('Memo22')).Memo.Text:=fieldbyname('Sproject').AsString;
TfrxMemoView(DayReport.FindObject('Memo23')).Memo.Text:=fieldbyname('Sendman').AsString;
TfrxMemoView(DayReport.FindObject('Memo24')).Memo.Text:=fieldbyname('Note').AsString;
TfrxMemoView(DayReport.FindObject('Memo37')).Memo.Text:=fieldbyname('Room').AsString;
end;
end;
end;
为什么要建一个和这个查询的数据表相同的数据表,fastreport可以直接连接你的数据集呀
adoquery1就是你去库里按条件筛选,就是select..where,这个应该不用说了吧
打开fastreport设计器,放置master data,可以为它指定数据,即指定TfrxDBDataset,如果adoquery1已经open,那adoquery1的字段就会列出来,然后放置text去关联字段,也可把字段直接拖动master data上程序中adoquery1筛选后,open,然后frxReport1.ShowReport();
现在单一个查询条件可以了,代码如下
procedure TForm1.ADOQuery1FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin
//这里只能容纳一个查询条件了,如果多个表多个查询条件,要同时用这个ADOquery可能就行不通了,多少个查询条件要对应多个ADOquery,但都连接一个表。这是我现在能作到的,希望有办法一个ADOquery能容纳多个查询条件的算法;
if datetostr(strtodatetime(dataset.FieldByName('replydate').AsString))=datetostr(now) then
begin
Accept:=true
end else
begin
Accept:=false;
end;
end;procedure TForm1.frxReport1BeginDoc(Sender: TObject);
begin
with ADOquery1 do
begin
close;
sql.Clear;
sql.Add('select * from worklist');
open;
Filtered:=true;
end;end;
procedure TForm1.ADOQuery1FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin
if dataset.FieldByName('Dostate').AsString='A' then
begin
Accept:=true
end else
begin
Accept:=false;
end; if dataset.FieldByName('Dostate').AsString='U' then
begin
Accept:=true
end else
begin
Accept:=false;
end; end;
显示全部数据给用户增,删,改,但打印时只打印符合要求的记录。2.如果没理解错误那么,解决方法以下:
用两个ADOQuery控件,其中ADOQuery1给用户显示所有记录并实现增,删,改等功能,而打印就用ADOQuery2,当然报表控件的数据源就连着ADOQuery2。
代码如下:
{ADOQuery2的onFilterRecord事件}
procedure TForm1.ADOQuery2FilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
Accept:=(DataSet['replydate']=datetostr(now));
end;{打印功能按钮代码}
procedure TForm1.btn1Click(Sender: TObject);
begin
if not ADOQuery1.IsEmpty then begin
with ADOQuery2 do begin
Close;
Filtered:=False;
SQL.Text:=ADOQuery1.SQL.Text;
Open;
Filtered:=True;
if not IsEmpty then
frxReport1.ShowPreparedReport;
end;
end;end;
var Accept: Boolean);
begin if Bitbtn1.Click=返回值 then //先进行条件按健按下去的过程判断,再引出查询条件,这样就可以一个
ADOQUERY 容纳下多个查询条件了
begin
if dataset.FieldByName('Dostate').AsString='A' then
begin
Accept:=true
end else
begin
Accept:=false;
end;
end;if Bitbtn2.Click=返回值 thenif dataset.FieldByName('Dostate').AsString='U' then
begin
Accept:=true
end else
begin
Accept:=false;
end;
end;........end;