BLOB

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

А.Н.
постоялец
Сообщения: 230
Зарегистрирован: 13.03.2010 11:23:58

BLOB

Сообщение А.Н. »

Не загружаются данные в поток. Вообще, не понимаю как с ними работать.

В одной строке, для примера, у меня записан XML. Но сообщение не выдаётся никогда:

Код: Выделить всё

    with TBlobField(FieldByName('TICKET_BODY')) do
      if (BlobSize > 0) then
        begin
          SaveToStream(FTicketBody);
          FTicketBody.Position := 0;
ShowMessage(FInsCompanyName);
        end;


Т.е., ни один BLOB не загружается. Почему? В них хранятся формы отчётов lazreport'а.
Как загрузить бланк из произвольного поля? Как сохранить?
И будет ли редактор отчётов сохранять форму в тот же поток, откуда она была загружена, при нажатии кнопки "Сохранить"?
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Тоже храню формы отчетов в блоб полях, загружаю так:

Код: Выделить всё

//загрузка формы отчета
procedure TAnalogProtocol.LoadReportBy(FieldName: string; ts: TStream);
begin
  with frmMain do
    begin
      zqtmp2.Close;
      zqtmp2.SQL.Clear;
      zqtmp2.SQL.Add('SELECT * FROM TIP where ID_OF_VID='+inttostr(pnlHead.tag));
      ZQtmp2.Active:=true;
      (ZQtmp2.FieldByName(FieldName) as TBlobField).SaveToStream(ts);
      ts.Position:=0;
    end;
end;

//вызов
procedure TfrmMain.btnView1Click(Sender: TObject);
var ms:TMemoryStream;
begin
  ms:=TMemoryStream.Create;
  AnalogProtocol.LoadReportBy('TPROTOCOL1',ms);
  frReport1.LoadFromStream(ms);
  ms.free;
  frReport1.ShowReport;
end;
А.Н.
постоялец
Сообщения: 230
Зарегистрирован: 13.03.2010 11:23:58

Сообщение А.Н. »

Аналогичный код:

Код: Выделить всё

    with FieldByName('TICKET_BODY') as TBlobField do
      if (BlobSize > 0) then
        begin
          SaveToStream(FTicketBody);
          FTicketBody.Position := 0;
        end;

не работает. :(
Хотя, проблем с BLOB в MyDAC быть не должно.

Добавлено спустя 3 минуты 27 секунд:
Работает без "if (BlobSize > 0) then".
Но отчёт говорит "неподдерживаемый формат FRF". Я засунул туда бланк, сохранённый в файле.
Ведь ему без разницы откуда грузить? Формат всегда один и тот же? У меня такое впечатление, что BLOB просто не грузится.
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

хм, а как "засунул"? Надо также как и выдергиваешь отчет, так и заливать его в блоб поле, потоком.
А.Н.
постоялец
Сообщения: 230
Зарегистрирован: 13.03.2010 11:23:58

Сообщение А.Н. »

Просто загрузил в студии. Зачем именно так, с помощью потока? Ведь не должно быть разницы.
Чёрт, пробовал сохранить таким способом:

Код: Выделить всё

    Edit();
    with TBlobField(FieldByName('TICKET_BODY')) do
      begin
        FTicketBody.Position := 0;
        LoadFromStream(FTicketBody);
      end;

    Post();


Не сохраняет. Говорит incorrect string value. :(
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Код: Выделить всё

procedure TfrmMain.imgProt1Click(Sender: TObject);
  var ts:tStream;
begin
  //загрузка репорта из файла и сохранение в блоб
  if opd1.Execute then
    begin
      frReport1.LoadFromFile(opd1.FileName);
      ts:=TMemoryStream.Create;
      frReport1.SaveToStream(ts);
      ts.Position:=0;

      ZQtmp.Edit;
      (ZQtmp.FieldByName('TPROTOCOL1')as TBlobField).LoadFromStream(ts);
      ZQtmp.Post;
    end;

end;
А.Н.
постоялец
Сообщения: 230
Зарегистрирован: 13.03.2010 11:23:58

Сообщение А.Н. »

Не работает. Та же ошибка. :-( Какая-то проблема с сохранением.

Добавлено спустя 27 секунд:
Почему "некорректное значение строки"? :-|
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Без понятия, проект из которого дергаются эти куски кода собирался еще на 0.9.24, да так и работает. А в новых проектах возни с отчетами, к счастью, нету.

Добавлено спустя 2 минуты 27 секунд:
Задам глупый вопрос, а поле точно обьявлено как Blob? =)
А.Н.
постоялец
Сообщения: 230
Зарегистрирован: 13.03.2010 11:23:58

Сообщение А.Н. »

Задам глупый вопрос, а поле точно обьявлено как Blob? =)

Как TEXT в таблице и внесено в список полей запроса, используя редактор полей.
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Как TEXT в таблице и внесено в список полей запроса, используя редактор полей.

Хе, вопрос оказался не глупым)) Поменяй тип поля на Blob и должно заработать.
А.Н.
постоялец
Сообщения: 230
Зарегистрирован: 13.03.2010 11:23:58

Сообщение А.Н. »

:D Гы-гы-гы. :( Что б я сдох. Работает. Но ведь в доках ясно написано, что TEXT - это BLOB, в котором, при сравнении не учитывается регистр.
Что ж это такое?
Спасибо огромное.

Добавлено спустя 4 минуты:
Теперь ещё вопрос.
Как обработать нажатие кнопки "Сохранить" в редакторе бланка?

Добавлено спустя 31 минуту 42 секунды:
Кажется, разобрался:

Код: Выделить всё

ProcedureInitDesigner();
  if (frDesigner = nil) then exit;
  ShowMessage((frDesigner as TfrDesignerForm).FileBtn3.Name);
exit;


FileBtn3 - кнопка сохранения на панельке редактора отчёта.

Ещё раз спасибо.

Кстати, в модуле LR_Desgn:
{.$Define ExtOI} // External Custom Object inspector (Christian)
{.$Define StdOI} // External Standard Object inspector (Jesus)
Возможно подключить другой инспектор объектов в дизайнере (хотя, похоже, что он там, вообще, не работает).
Также, есть опция, отключающая модальный показ редактора из DesignReport отчётов.
Естественно, всё требует перекомпиляции lazreport'а.

Возник другой вопрос.
Что такое шаблоны Fast Report (FastReportTemplate), для чего они нужны и как их использовать?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

А.Н. писал(а):Возможно подключить другой инспектор объектов в дизайнере (хотя, похоже, что он там, вообще, не работает).

Прекрасно работает Сервис>Инструментальные панели>Инспектор объектов.

p.s. Я пока ещё в lazreport особо не разбирался, но это предстоит в будущем....
А.Н.
постоялец
Сообщения: 230
Зарегистрирован: 13.03.2010 11:23:58

Сообщение А.Н. »

Оно там есть, но что делает непонятно...

Добавлено спустя 24 минуты 16 секунд:
>> load handel
>> sound(y, Fs)
Аллиллуйя! Аллилуйя! Аллиллуйя! :mrgreen:
После серии грязных хаков, типа создания класса TfrDumbReport с пустыми методами сохранения, с последующим переопределением переменной CurrentReport, в сменённом на мой, обработчике нажатия кнопки сохранения формы дизайнера отчёта, квитанции стали сохраняться в потоке, затем в БД. Ну наконец-то.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

В принципе он там вообще не нужен т.к. все свойства дублируется различными тулбарами и редакторами...
А.Н.
постоялец
Сообщения: 230
Зарегистрирован: 13.03.2010 11:23:58

Сообщение А.Н. »

В принципе он там вообще не нужен

Да и непонятно работает ли он...

Вопрос про то что такое шаблоны - остаётся. Кто знает?

Добавлено спустя 7 минут 52 секунды:
О, блин, я рано порадовался. Сволочи, неужели не могли сделать public свойства у этого чёртового дизайнера? :-(
И процедуры TfrReport:
procedure SaveToFile(FName: String);
procedure SaveToXMLFile(const FName: String);
не виртуальные. :-(
Косячит бланк, если его пытаться загрузить, а, затем сохранить. Или создаст новый бланк, если такого ещё не существует. Стоило сделать создателям lazreport одно свойство public и проблем бы не было. Так нет же...
Ответить