这个问题以前解决过,只是现在又忘记了,就是按条件查询到了数据然后显示在表中,数据表中有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;

解决方案 »

  1.   

    而且你的数据集为什么要在BeginDoc中打开呢,为什么提前打开呢
      

  2.   

    你为什么不直接连接数据库呢,fastreport中放置text,连接到数据集的具体字段,数据集筛选出记录,fastreport也就自动显示数据集的记录,这样不能满足你的要求吗
      

  3.   

    如果你的数据集提前就把4条数据筛选出来,也就是你的数据集中就只有你要的4条数据,那样是不是就不用去处理fastreport了呢,不知我是不是理解有问题
      

  4.   

    是的,但是如果按你的想法筛选出来放那里,如果作到不要处理Fastreport的话,那只能建一个和这个查询的数据表相同的数据表来临时的放这些筛选出来的数据,再导向Fastreport,这样是行的通,但这样实不可以取,一定还的通过控制Fastreport的办法来作到,但现在就不知怎样来控制
      

  5.   


    为什么要建一个和这个查询的数据表相同的数据表,fastreport可以直接连接你的数据集呀
      

  6.   

    fastreport组件中有个TfrxDBDataset组件,窗体放置TfrxDBDataset,其dataset属性指向你的数据集控件,比如adoquery1
    adoquery1就是你去库里按条件筛选,就是select..where,这个应该不用说了吧
    打开fastreport设计器,放置master data,可以为它指定数据,即指定TfrxDBDataset,如果adoquery1已经open,那adoquery1的字段就会列出来,然后放置text去关联字段,也可把字段直接拖动master data上程序中adoquery1筛选后,open,然后frxReport1.ShowReport();
      

  7.   

    我现在试了几次,终于明白了frxReport的显示原理原来和DBgrid是一样的,是实时的数据表中显示,在这里没有办法控制的,只能在adoquery中筛选后先出来后把符合条件的数据再给frxReport才行,frxReport本身是控制不了的
      

  8.   

    问题是找到了,也解决了,虽则好多了,可是又产生了一个新的小问题,就是在这个表下我要建多个查询条件,但是一个adoquery只能容纳一个查询条件,否则是什么产生冲突,不知有什么办法能在一个ADOquery下建立多个查询条件而又不冲突,
    现在单一个查询条件可以了,代码如下
    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;
      

  9.   

    就用ADOquery,你每次筛选不同的数据,然后打开report,就会编程最新的数据,不用创建多个数据集,除非你要同时显示多个report
      

  10.   

    就用ADOquery,你每次筛选不同的数据,然后打开report,就会编程最新的数据,不用创建多个数据集,除非你要同时显示多个report
      

  11.   

    哦,那这样条件同时出现在这个事件中不会冲突吗,这是两个表要用的查询条件,但是在打开任何一个表时,应当执行的是两个条件都符合的数据全部出来(即是符合‘A’的出来,符合‘U“的也出来了),实际上我要只符合是'A'的或是符合'U'的;不是同时要,
    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; 
      

  12.   

    1.对楼主问题的理解:
      显示全部数据给用户增,删,改,但打印时只打印符合要求的记录。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;
      

  13.   

    谢谢GOTOPONE,你的方法可行,但是麻烦了一点,现在我可以直接解决了,现在的问题就是我想在一个ADOquery下完成多条件的判断,如果在条件前没有给条件的话,那查询的条件一 定会冲突,所以我想通按键按下的事件来的返回值来作为条件产生的条件,可是Bitbtn1.Click中Click是一个过程,不知这个过程的返回值是怎样的获取,能不能获取。查了网上也查不到(大部份的人认为过程不可能获取的到),不知有谁知不知怎样的获取,其本的算法是这样,本来想另起个题目再问这个问题的,但是考虑到两个题目有关联,脱开了就很难讲清楚,所在此有劳大家费神了,procedure TForm1.ADOQuery1FilterRecord(DataSet: TDataSet; 
      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;