|
|
#1 |
|
Участник
|
Коллеги, возник интересный вопрос: может кто знает, как через FieldRef добраться до _значения_ blob поля (т.е. выгрузить его, либо загрузить). Чет мне кажется, что напрямую никак
.
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский |
|
|
|
|
#2 |
|
Участник
|
|
|
|
|
|
#3 |
|
Участник
|
Да, конечно. А каким образом это поможет при выгрузке, например? Да, CALCFIELD успешно выполняется и, вероятно, даже значение появляется, но это конец пути.
Давайте я поясню задачу. Может придет обходное решение. Есть текстовик, который содержит в себе параметры, через которые мона изменить значение полей в любой таблице текущей Фирмы. Формат текстовика следующий: <Номер таблицы>,<Ключ для поиска>,<Номер изменяемого поля>,<Новое Значение поля>. Реализован код (в рамках системы обновления), который все это успешно глотает и обрабатывает. Но этот код не поддерживает передачу сложных типов данных (типа BLOB), чего до сегодняшнего дня и не требовалось. Для того, чтобы не плодить однотипный функционал в случае передачи BLOB было решено передавать в качестве <Новое Значение поля> имя файла, который надо загрузить. Итого, формат получается такой: Таблица,Ключ,Поле_куда_грузить,Файл_который_грузить. Засунуть в FieldRef напрямую BLOB я не нашел, так как у FieldRef нет "методов" работы с блобами и я пошел в обход - создал буфферное блоб-поле в спец. таблице. Заточил функционал на то, чтобы файлик грузился в это буферное поле. Дальше предполагалось получить значение этого буферного поля через некий CacheFieldRef и провернуть что-то типа Код: 1.FieldRef.VALUE := CacheFieldRef.VALUE 2. FieldRev := CacheFieldRef
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский |
|
|
|
|
#4 |
|
Участник
|
Да.. интересная задачка. Не плохо пришлось повозиться.
Код: //Создаем поток связанный с загружаемым файлом
FileToLoad.OPEN('C:\2.txt');
FileToLoad.CREATEINSTREAM(Instream1);
//Будем грузить в 50000 таблицу.
CLEAR(RecordRef1);
RecordRef1.OPEN(50000);
//в моем случае в данной таблице две записи, они уже существуют, и я хочу загружать файл в последнюю запись.
IF RecordRef1.FINDLAST THEN;
//В моем случае BLOB поле имеет ID = 2;
FieldRef1:=RecordRef1.FIELD(2);
//В данный момент У меня английская версия 5.0 SP1, поэтому ObjectForBLOB - это переменная типа record - Object (Объект);
//Нам важно лишь то, чтобы была объявлена переменная типа BLOB, а явно этого сделать нельзя,
//можно только используя уже существующую таблицу, например Object и её поле "BLOB Reference" ("BLOB Ссылка")
//Обманываем Navision:
ObjectForBLOB."BLOB Reference":=FieldRef1.VALUE;
//Создаем поток, куда будем грузить
ObjectForBLOB."BLOB Reference".CREATEOUTSTREAM(OutStream1);
//Копируем содержимое файла в блоб поле
COPYSTREAM(OutStream1, Instream1);
//Переобманываемся обратно
FieldRef1.VALUE:=ObjectForBLOB."BLOB Reference";
//Сохраняемся
RecordRef1.MODIFY;
FileToLoad.CLOSE;
//Все - файл загружен в запись 50000, в поле с ID = 2, в последнюю запись. |
|
|
|
|
#5 |
|
Участник
|
Идея хорошая
. Не знаю, как в пятерке, но в NAV3.70B не работает. ИнструкцияКод: FieldRef1.VALUE:=ObjectForBLOB."BLOB Reference"; Надо ли понимать это как платформенную недостаточность 3.70B? P.S. Буду рыть дальше, ибо есть ощущение, что можно это провернуть.
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский |
|
|