fastreport中,frxdbdataset有几个选项来控制打印的记录rbfirst,从数据集的第一行开始; 
rbcurrent,从数据集的当前行开始;等 
但如果客户要只打印它所选择的几行,怎么办? 
我也查询一些资料,有的人说根据所选择的行,重新构造数据集,数据集只包含客户所选择的记录,这方法有点烦琐,如果是主从表,一个数据集还不能解决问题, 
各位高手有没有更好的方法,请指教!! 

解决方案 »

  1.   

    1.要有两个数据结构一样的表,以下例子为,aTABLE,btable两个数据表. 
    2.在用户介面要有一个DBGrid控件,数据源是连接aTABLE,给用户选择打印数据之用的. 
    3.fastreport连的数据源是btable表. 
    4.打印按钮的代码如下: var
    i:integer;
    begin
      {------如果用户有选择了数据--------}
     if DBGrid.SelectedRows.Count>0 then begin
      ADOQuery.DisableControls;{数据源是aTABLE表}
     for i := 0 to DBGrid.SelectedRows.Count- 1 do begin
        ADOQuery.GotoBook(pointer(DBGrid.SelectedRows.Items[i]));
        with ADOQuery2 begin
          append;
          FieldByName('x_a').AsString:= adoquery.FieldByName('x_a').AsString;
          FieldByName('x_b').AsString:= adoquery.FieldByName('x_b').AsString;
          post;
        end;
      ...你的打印控制;
      ADOQuery.EnableControls;
     end;
     end else begin {没有选择数据的情况下为全部打印}
       with ADOQuery begin
         DisableControls;
         First;
          while not eof begin
            ADOQuery2.append;
            ADOQuery2.FieldByName('x_a').AsString:= FieldByName('x_a').AsString;
            ADOQuery2.FieldByName('x_b').AsString:= FieldByName('x_b').AsString;
            ADOQuery2.post;
            next;
          end;
         EnableControls;
       end;
      ........你的打印代码
     end;
     
    end;
      

  2.   

    谢谢你们的回复,看了最后一楼的代码,要是主从表的话,该怎么做呢,不更麻烦
    fastreport打印报表,也是逐行扫描的吧,难道不能这样,选择了的就显示报表,没选择的就跳过?
    有谁试过没?
      

  3.   

    fastreport连接的是数据集,选择数据操作是在DBGrid中,在DBGrid中选择了数据,并不是在数据集中选择了数据,特别是多条选择的时候,所以fastreport应该不知道当前用户的选择,觉得还是重新构造数据集