Хранение изображения в таблице

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
fairei
Сообщения: 6
Зарегистрирован: 16 июн 2010, 20:40

Хранение изображения в таблице

Сообщение fairei »

Я пишу свой интерфейс для учета временных пропусков в Галактике. Данные храню в своей таблице, в випе ее не видно, достаю через хранимые процедуры. Таким же образом должны храниться фотки. Вопрос такой: как из своей таблицы записать фотку в мемо-поле в випе? Может есть какой-нибудь тип переменной, которая будет хранить изображение? Вот сами локальные таблицы и инициализация через хранимую процедуру:

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

var PictureFoto:[тип данных?];
table struct local tmpPass   //таблица с данными о пропусках
(
      Nrec:Comp,
      PView:string,
      Number:Double,
     ..............
      Foto:comp
)
with index (Nrec,PView); 
table struct local tmpFoto  //таблица с фотографиями
(
      Nrec:Comp,
      Foto:[тип данных?]  
)
with index (Nrec); 
Interface PassForm 'Пропуск' (,,sci1378EnEsc) EscClose;  
..........
Text  tmpFoto.Foto;  //мемо-поле
panel panFoto; 
table  tmpFoto;
end;
........
handleEvent
   cmInit:
   {
      stmt := sqlAllocStmt;
        sqlPrepare(stmt, 'LoadTempPass');
        sqlBindCol(stmt, 1, cNrec);
        sqlBindCol(stmt, 2, sView);
        sqlBindCol(stmt, 3, dNumber);
        .............
        sqlBindCol(stmt, 27, cFoto);
        SqlExecute(stmt);

        while(sqlFetch(stmt) = tsOk)
        {
            insert tmpPass set
                tmpPass.Nrec := cNrec,
                tmpPass.PView := sView,
                tmpPass.Number := dNumber,
                ............
                tmpPass.foto:= cfoto    //ссылка на tmpFoto.nrec 
         }
         sqlFreeStmt(stmt);
//tmpFoto
         stmt := sqlAllocStmt;
        sqlPrepare(stmt, 'LoadTmpFoto');
        sqlBindCol(stmt, 1, cNrec);
        sqlBindCol(stmt, 2, PictureFoto);
        SqlExecute(stmt);
        while(sqlFetch(stmt) = tsOk)
        {
            insert tmpFoto set
                tmpFoto.Nrec := cNrec,
                tmpFoto.foto:= PictureFoto
         }
         sqlFreeStmt(stmt);
   } 
........
end;
end.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Хранение изображения в таблице

Сообщение edward_K »

Тип - lvar. Посмотрите например тот же allmemo или текстовый атрибут создайте(attrval). Писать нужно с префиксом - типа jpg, doc и так далее. Можно еще variant использовать, но тогда отобразить не сможете. Смысл хранить фото сотрудников в своей табле не вижу - для этого есть место на 1 странице картотеки(общие сведения), и даже отчеты с ними.
fairei
Сообщения: 6
Зарегистрирован: 16 июн 2010, 20:40

Re: Хранение изображения в таблице

Сообщение fairei »

Фото надо хранить в отдельной таблице,потому что сотрудники не нашей компании, а сторонних организаций. По той же причине не могу использовать allmemo. Для таблицы в памяти тип lvar не подходит(Предупреждение: Таблицы в памяти не поддерживают мемополя. Описание поля игнорируется.)
Vitaliy
Постоянный обитатель
Сообщения: 101
Зарегистрирован: 27 апр 2005, 09:52
Откуда: Сибирь

Re: Хранение изображения в таблице

Сообщение Vitaliy »

fairei писал(а):Фото надо хранить в отдельной таблице,потому что сотрудники не нашей компании, а сторонних организаций. По той же причине не могу использовать allmemo. Для таблицы в памяти тип lvar не подходит(Предупреждение: Таблицы в памяти не поддерживают мемополя. Описание поля игнорируется.)
а что мешает хранить ссылку на файл в стринговом поле, и по необходимости (к примеру при инициализации, смены позиции или прочих события), импортировать это самое фото в AllMemo, описав свой wTable, заполнив cRec нужным значением?

Заполнять эту одну запись в AllMemo можно используя функцию ImportFileToMemo

Таким образом и база не раздувается, и сани изобретать не надо будет.
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Re: Хранение изображения в таблице

Сообщение Masygreen »

Vitaliy писал(а):Таким образом и база не раздувается, и сани изобретать не надо будет.
не согласен .. ссылки это ссылки, а в базе это правильно ...

1)докомпилируйте словарь .. фотка харнится в типе LVar, пусть будет

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

mrtdoc.memo

create table l_xx.mrtdoc "MEMO - поля для таблицы xxx"
Using "mrtdoc.dat"
with table_code = 31502
With replace With TableOptions NoProtect
(
    Nrec      : comp          // "номер записи"  
   ,memo:LVar "Документ"
)
with index
(
   ind00 = nrec(surrogate, unique, journal)
)
;  
2)загружаете туда фотку типа так _PathFile - путь на файл jpg

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

ClearBuffer(#mrtdoc) 
       mrtdoc.Nrec := comp(0); 
       insert current mrtdoc;
if isValid(#mrtdoc)  
      if ImportFileToMemo(mrtdoc.memo, _PathFile,false) = false 
       delete current mrtdoc;
       else
       update current mrtdoc;   
3)смотреть можно

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

  window winPhoto1 'Фотография 1';
  show at (51,1,76,15);
  Text mrtdoc.memo;
    HandleEvent
      cmInit:
      {
        //strTmp := 'Фотография. ' + Persons.FIO;
        //SetWindowTitle(winPhoto, strTmp);
        //bPhotoOn := True;
      }
    end;  // HandleEvent
  end; // winPhoto  
или

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

panel panFoto2; //фотография
  show at (77,1,103,15);
  table mrtdoc01;
  Text mrtdoc01.memo;
HandleEvent
 end; // HandleEvent
end; // panPhoto   
ну вот и все :)
Время ведет!
LaaLaa

Re: Хранение изображения в таблице

Сообщение LaaLaa »

Проще будет через таблицу с полем LVar из словаря Галактики. Можете использовать AllMemо это своеобразная мусора для всяких BLOB полей. Или докомпилируйте словарь добавьте свою таблицу с полем LVar.

На минском форуме я публиковал небольшой пример того, как с помоoщью FastReport можно вывести на печать фотографии сотрудников из базы Галактики. Подробности здесь: http://forum.galaktika.ru/viewtopic.php?p=3714#p3714

А если вы не хотите, свою таблицу публиковать в словаре Галактики и храните фотки в невидимых для Галактики таблицах. Можете попробовать из FastReport через ADO сделать дополнительное подключение к вашей БД и распечатать фотки через объект TfrxAdoQuery.
Ответить