procedure TForm3.frxReport1BeforePrint(Sender: TfrxReportComponent);
begin
   DataModule1.ADOQueryDd.close;
   DataModule1.ADOQueryDd.sql.clear;
 DataModule1.ADOQueryDd.sql.add('Select *  from   test   ');
end;procedure TForm3.Button9Click(Sender: TObject);
begin
  frxReport1.LoadFromFile('dd.fr3');
  frxReport1.ShowReport;
end;如果直接在ADOQuery的SQL属性里面写语句 就正常,为什么?

解决方案 »

  1.   


    procedure TForm3.frxReport1BeforePrint(Sender: TfrxReportComponent); 
    begin 
      DataModule1.ADOQueryDd.close; 
      DataModule1.ADOQueryDd.sql.clear; 
      DataModule1.ADOQueryDd.sql.add('Select *  from  test  '); 
      DataModule1.ADOQueryDd.sql.open;  //加入这句试试。
    end; procedure TForm3.Button9Click(Sender: TObject); 
    begin 
      frxReport1.LoadFromFile('dd.fr3'); 
      frxReport1.ShowReport; 
    end; 
      

  2.   

    procedure TForm3.frxReport1BeforePrint(Sender: TfrxReportComponent);
    begin
      DataModule1.ADOQueryDd.close;
      DataModule1.ADOQueryDd.sql.clear;
    DataModule1.ADOQueryDd.sql.add('Select *  from  test  ');
    end; 似乎每个报表上的控件遍历到的时候,都会触发这个事件也就是报表上有多少个控件,就可能触发多少次beforeprint建议写个全局变量,判断是否有add成功过,有就不add第二次procedure TForm3.frxReport1BeforePrint(Sender: TfrxReportComponent);
    begin
      if SQLAdded then exit;
      DataModule1.ADOQueryDd.close;
      DataModule1.ADOQueryDd.sql.clear;
      DataModule1.ADOQueryDd.sql.add('Select *  from  test  ');
      SQLAdded := true;
    end;