各位高手:
    本人现在做如下结构的报表,用的是qreport,苦于无法实现不同区域对应不同的table.请各位执教。
 ———————————————————————
                  Table1
 ———————————————————————  
   Table2            |     Table1
                     | 
 ———————————————————————
                   Table3
 ———————————————————————
项目急于完工,请各位大虾不吝赐教!!如果您指出使用其他的报表工具能够实现也可以。谢谢!

解决方案 »

  1.   

    将所有显示部分改为QRLABEL,在QR的ON NEED DATA事件中赋值
      

  2.   

    动态生成QLabel,以下是一个装箱单的示例。  with (FDmdTranMaster as TDmdProductPacket) do
      begin
        QryMaxID.Active := False;
        QryMaxID.ParamByName('orderid').AsString := QryMaster.Fieldbyname('Orderid').AsString;
        QryMaxID.Active := True;
      end;  Num := 0;
      Block := 6;
      BlockOld := 6;
      S := 1;
      FrmProductPacketPreview := TFrmProductPacketPreview.Create(self);
      FrmProductPacketPreview.QuickRep1.Units := MM;
      FrmProductPacketPreview.QuickRep1.Height := 252;
      FrmProductPacketPreview.QuickRep1.Width := 220;// FrmProductPacketPreview.QuickRep1.Page.PaperSize := [Custom];
      FrmProductPacketPreview.QuickRep1.Page.Length := 252;
      FrmProductPacketPreview.QuickRep1.Page.Width := 220;
      FrmProductPacketPreview.QuickRep1.Page.Units := MM;  I := 60;
      H := 65;
      TI := 20;
      TH := 70;
      CI := 45;
      CH := 60;
      BI := 240;
      BH := 190;
      with (FDmdTranMaster as TDmdProductPacket) do
      begin
        QrySecond.First;
        Number := QrySecond.FieldByName('PacketID').AsInteger;
        while not QrySecond.Eof do
        begin
          if (Number <> QrySecond.FieldByName('PacketID').AsInteger) or (Num = 10)
            or ((Number = QryMaxID.FieldByName('Packetid').AsInteger) and (QrySecond.RecordCount = S))
            then
          begin
            aLabel.Caption := '';
            Number := QrySecond.FieldByName('PacketID').AsInteger;        if (QrySecond.RecordCount <> S) then
              Block := Block + 1;        Num := 0;
            aLabel := TQRLabel.Create(FrmProductPacketPreview);
            aLabel.Parent := FrmProductPacketPreview.QRBand1;
            aLabel.Top := TI;
            aLabel.Left := TH;
            aLabel.Font.Size := 12;
            aLabel.Font.Style := [fsbold];
            aLabel.Caption := QryMaster.FieldByName('custordnb').AsString + '     电  缆  装  箱  单';        aLabel := TQRLabel.Create(FrmProductPacketPreview);
            aLabel.Parent := FrmProductPacketPreview.QRBand1;
            aLabel.Top := CI;
            aLabel.Left := CH;
            aLabel.Font.Size := 8;
            aLabel.Font.Style := [fsbold];
            aLabel.Caption := '序号';        aLabel := TQRLabel.Create(FrmProductPacketPreview);
            aLabel.Parent := FrmProductPacketPreview.QRBand1;
            aLabel.Top := CI;
            aLabel.Left := CH + 120;
            aLabel.Font.Size := 8;
            aLabel.Font.Style := [fsbold];
            aLabel.Caption := '电缆型号';        aLabel := TQRLabel.Create(FrmProductPacketPreview);
            aLabel.Parent := FrmProductPacketPreview.QRBand1;
            aLabel.Top := CI;
            aLabel.Left := CH + 250;
            aLabel.Font.Size := 8;
            aLabel.Font.Style := [fsbold];
            aLabel.Caption := '数量';        aLabel := TQRLabel.Create(FrmProductPacketPreview);
            aLabel.Parent := FrmProductPacketPreview.QRBand1;
            aLabel.Top := BI;
            aLabel.Left := BH;
            aLabel.Font.Size := 8;
            aLabel.Font.Style := [fsbold];
            aLabel.Caption := '第  ' + IntToStr(BlockOld - 5) + '  箱  共  ' + QryMaster.FieldByName('PacketID').AsString + '  箱';
          end;      if ((Block mod 6) = 0) and (BlockOld <> Block) then
          begin
            FrmProductPacketPreview.QuickRep1.Prepare;
            FrmProductPacketPreview.QuickRep1.Preview;
    //        FrmProductPacketPreview.QuickRep1.Print;
          end;      if BlockOld <> Block then
            case Block mod 6 of
              0: begin I := 60; H := 65; TI := 20; TH := 70; CI := 45; CH := 60; BI := 240; BH := 190; BlockOld := Block; end;
              1: begin I := 360; H := 65; TI := 320; TH := 70; CI := 345; CH := 60; BI := 550; BH := 190; BlockOld := Block; end;
              2: begin I := 660; H := 65; TI := 620; TH := 70; CI := 645; CH := 60; BI := 860; BH := 190; BlockOld := Block; end;
              3: begin I := 60; H := 440; TI := 20; TH := 450; CI := 45; CH := 435; BI := 240; BH := 540; BlockOld := Block; end;
              4: begin I := 360; H := 440; TI := 320; TH := 450; CI := 345; CH := 435; BI := 550; BH := 540; BlockOld := Block; end;
              5: begin I := 660; H := 440; TI := 620; TH := 450; CI := 645; CH := 435; BI := 860; BH := 540; BlockOld := Block; end;
            end;//print begin
          aLabel := TQRLabel.Create(FrmProductPacketPreview);
          aLabel.Parent := FrmProductPacketPreview.QRBand1;
          aLabel.Left := H;
          aLabel.Top := I;
          aLabel.Height := 17;
          aLabel.width := 40;
          aLabel.Caption := InttoStr(S);      aLabel := TQRLabel.Create(FrmProductPacketPreview);
          aLabel.Parent := FrmProductPacketPreview.QRBand1;
          aLabel.Left := H + 100;
          aLabel.Top := I;
          aLabel.Height := 17;
          aLabel.width := 40;
          aLabel.Caption := QrySecond.FieldByName('ItemCode').AsString + QrySecond.FieldByName('Attribute').AsString;      aLabel := TQRLabel.Create(FrmProductPacketPreview);
          aLabel.Parent := FrmProductPacketPreview.QRBand1;
          aLabel.Left := H + 250;
          aLabel.Top := I;
          aLabel.Height := 17;
          aLabel.width := 40;
          aLabel.Caption := QrySecond.FieldByName('Qty').AsString;      I := I + 15;
          Num := Num + 1;
          S := S + 1;
    //print end
          QrySecond.Next;
        end;//    FrmProductPacketPreview.QuickRep1.Prepare;
        FrmProductPacketPreview.QuickRep1.Preview;
        FrmProductPacketPreview.Free;
      

  3.   

    分页在  QRBand1BeforePrint 事件中处理.
    以上打印的格式为,一张纸上打印六块内容,出自于同一个数据集。
      

  4.   

    我用超级报表做过类似的,
    可以先把表的数据全部取出来,
    按一行一行,动态生成一个XML格式的报表文件,
    生成的只需要是数据,这样很简单就可以生成的.
    读入就可以了.表头可以先设计好.可以去www.soft198.com去看一下.
    不过是要收费的.
    便宜还是便宜的.