снова "invalid File Format"

отредактировано 18:20 Раздел: FastReport 4.0
почитал про ошибку, пишут что это из-за того, что поток не перематывают на начало. мне не помогает.
procedure TfrReport.LoadReport(report_name: String);
var
  ms: TMemoryStream;
begin
  try
  Screen.Cursor:=crHourGlass;
  with ZQuery1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add(Format('SELECT report_data FROM report WHERE report_name=''%s''',[report_name]));
      Open;
      if RecordCount=0 then
        begin
          MessageDlg('Îò÷åò íå íàéäåí.',mtInformation,[mbOK],0);
          Exit;
        end
      else
        begin
          ms:=TMemoryStream.Create;
          TBlobField(FieldByName('report_data')).SaveToStream(ms);
          ms.Position:=0;
          frxReport1.LoadFromStream(ms);
          frxReport1.PrepareReport();
          frxReport1.ShowPreparedReport;
        end;
    end;
  finally
    ZQuery1.Close;
    Screen.Cursor:=crDefault;
    ms.Free;
  end;
end;

Комментарии

  • отредактировано 18:20
    1. уничтожать поток нужно там же где и создаёте иначе AV 100% если отчёт не найден
    2. чтение из потока правильное, а как записываете ???
  • отредактировано 18:20
    DimaBr написал: »
    1. уничтожать поток нужно там же где и создаёте иначе AV 100% если отчёт не найден
    2. чтение из потока правильное, а как записываете ???
    1 спасибо
    2
    procedure TfrReport.acLoadREportExecute(Sender: TObject);
    var
      fs: TFileStream;
    begin
      CreateOrShowform(TfmDlgLoadReport, fmDlgLoadReport, False, false);
      with fmDlgLoadReport do
      begin
        ShowModal;
        if ModalResult=mrOK then
        begin
          fs:=TFileStream.Create(fmDlgLoadReport.edFile.Text,fmOpenRead);
          with ZQuery1 do
          begin
            Close;
            SQL.Clear;
            Params.Clear;
            SQL.Add('select  fn_insert_report(:parent_id, :report_name, :report_data) as result;');
     
            Params.ParamValues['report_name']:=  Trim(fmDlgLoadReport.edReportName.Text);
            Params.ParamValues['parent_id']:=  (DBTreeView.Selected as TdxDBTreeNode).keyfieldvalue;
            ParamByName('report_data').DataType:=ftBlob;
            ParamByName('report_data').LoadFromStream(fs,ftBlob);
            Open;
          end;
          fs.free;
        end;
      end;
    end;
    
  • gpigpi
    отредактировано March 2012
    А где в Вашем коде что-то подобное этому:

    frxReport1.SaveToStream(ms);
    ms.Position:=0;
    ParamByName('report_data').LoadFromStream(ms,ftBlob);
  • отредактировано 18:20
    gpi написал: »
    А где в Вашем коде что-то подобное этому:

    frxReport1.SaveToStream(ms);
    ms.Position:=0;
    ParamByName('report_data').LoadFromStream(ms,ftBlob);
    Зачем это? Сначала отчеты сохраняются в бд, потом выгружаются:
    procedure TfrReport.SaveReportToDB;
    begin
      CreateOrShowform(TfmDlgLoadReport, fmDlgLoadReport, False, false);
      with fmDlgLoadReport do
      begin
        ShowModal;
        if ModalResult=mrOK then
        begin
          with ZQuery1 do
          begin
            Close;
            SQL.Clear;
            Params.Clear;
            SQL.Add('select  fn_load_report(:parent_id, :report_name,  :report_data);');
    
            Params.ParamValues['report_name']:=  Trim(fmDlgLoadReport.edReportName.Text);
            Params.ParamValues['parent_id']:=  (DBTreeView.Selected as TdxDBTreeNode).keyfieldvalue;
            ParamByName('report_data').LoadFromFile(fmDlgLoadReport.edFile.Text, ftBlob);
            ExecSQL;
          end;
        end;
      end;
    end;
    
    procedure TfrReport.LoadReportFromDB(ReportName: String);
    var
      ms: TMemoryStream;
    begin
      try
      Screen.Cursor:=crHourGlass;
      with ZQuery1 do
        begin
          Close;
          SQL.Clear;
          SQL.Add(Format('SELECT report_data FROM report WHERE report_name=''%s''',[ReportName]));
          Open;
          if RecordCount=0 then
            begin
              MessageDlg('Отчет не найден.',mtInformation,[mbOK],0);
              Exit;
            end
          else
            begin
              ms:=TMemoryStream.Create;
              try
                TBlobField(FieldByName('report_data')).SaveToStream(ms);
                ms.Position:=0;
                if ms.Size>0 then
                begin
                  frxReport1.Clear;
                  frxReport1.LoadFromStream(ms);
                  frxReport1.PrepareReport();
                  frxReport1.ShowPreparedReport;
                end;
             finally
               ms.Free;
              end;
            end;
        end;
      finally
        ZQuery1.Close;
        Screen.Cursor:=crDefault;
      end;
    end;
    
    В бд отчет лежит в таком виде(тип поля bytea в PostgreSQL) 1512 на самом деле коды символов 015 и 012
    <?xml version="1.0" encoding="utf-8"?>1512
    <TfrxReport Version="4.9.105" DotMatrixReport="False" IniFile="\\Software\\Fast Reports" PreviewOptions.Buttons="4095" PreviewOptions.Zoom="1" PrintOptions.Printer="Default" PrintOptions.PrintOnSheet="0" ReportOptions.CreateDate="40976,7880202894" ReportOptions.Description.Text="" ReportOptions.LastChange="40976,8944702431" ScriptLanguage="PascalScript" ScriptText.Text="begin
    
    end." PropData="044C65667403780103546F7002380844617461736574730100095661726961626C65730100055374796C650100">1512  
        <TfrxDataPage Name="Data" Height="1000" Left="0" Top="0" Width="1000"/>1512  
        <TfrxReportPage Name="Page1" PaperWidth="210" PaperHeight="297" PaperSize="9" LeftMargin="10" RightMargin="10" TopMargin="10" BottomMargin="10" ColumnWidth="0" ColumnPositions.Text="" HGuides.Text="" VGuides.Text="">1512    
            <TfrxMemoView Name="Memo1" Left="60" Top="40" Width="444" Height="88" ShowHint="False" Font.Charset="1" Font.Color="-16777208" Font.Height="-48" Font.Name="Arial" Font.Style="1" ParentFont="False" Text="report"/>1512  
        </TfrxReportPage>1512
    </TfrxReport>1512
    
  • отредактировано 18:20
    Запись
        MS := TMemoryStream.Create;
        Report.SaveToStream(MS);
        MS.Position := 0;
        (DataSet.FieldByName('DataReports')as TBlobField).LoadFromStream(MS);
        MS.Free;
    

    Чтение
        MS := TMemoryStream.Create;
        TBlobField(QueryReport.FieldByName('DataReports')).SaveToStream(MS);
        MS.Position := 0;
        Result.LoadFromStream(MS);
        MS.Free;
    

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.