Страница 1 из 1

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

Добавлено: 26 окт 2011, 14:58
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.

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

Добавлено: 26 окт 2011, 18:26
edward_K
Тип - lvar. Посмотрите например тот же allmemo или текстовый атрибут создайте(attrval). Писать нужно с префиксом - типа jpg, doc и так далее. Можно еще variant использовать, но тогда отобразить не сможете. Смысл хранить фото сотрудников в своей табле не вижу - для этого есть место на 1 странице картотеки(общие сведения), и даже отчеты с ними.

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

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

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

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

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

Таким образом и база не раздувается, и сани изобретать не надо будет.

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

Добавлено: 27 окт 2011, 12:22
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   
ну вот и все :)

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

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

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

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