|  16.12.2008, 14:50 | #1 | 
| Участник |   
			
			Коллеги, возник интересный вопрос: может кто знает, как через FieldRef добраться до _значения_ blob поля (т.е. выгрузить его, либо загрузить). Чет мне кажется, что напрямую никак   . 
				__________________ "И лишь патологоанатом не берет работу на дом" (с) Вишневский | 
|  | 
|  16.12.2008, 15:41 | #2 | 
| Участник | |
|  | 
|  16.12.2008, 16:14 | #3 | 
| Участник | 
			
			Да, конечно. А каким образом это поможет при выгрузке, например? Да, CALCFIELD успешно выполняется и, вероятно, даже значение появляется, но это конец пути. Давайте я поясню задачу. Может придет обходное решение. Есть текстовик, который содержит в себе параметры, через которые мона изменить значение полей в любой таблице текущей Фирмы. Формат текстовика следующий: <Номер таблицы>,<Ключ для поиска>,<Номер изменяемого поля>,<Новое Значение поля>. Реализован код (в рамках системы обновления), который все это успешно глотает и обрабатывает. Но этот код не поддерживает передачу сложных типов данных (типа BLOB), чего до сегодняшнего дня и не требовалось. Для того, чтобы не плодить однотипный функционал в случае передачи BLOB было решено передавать в качестве <Новое Значение поля> имя файла, который надо загрузить. Итого, формат получается такой: Таблица,Ключ,Поле_куда_грузить,Файл_который_грузить. Засунуть в FieldRef напрямую BLOB я не нашел, так как у FieldRef нет "методов" работы с блобами и я пошел в обход - создал буфферное блоб-поле в спец. таблице. Заточил функционал на то, чтобы файлик грузился в это буферное поле. Дальше предполагалось получить значение этого буферного поля через некий CacheFieldRef и провернуть что-то типа Код: 1.FieldRef.VALUE := CacheFieldRef.VALUE 2. FieldRev := CacheFieldRef 
				__________________ "И лишь патологоанатом не берет работу на дом" (с) Вишневский | 
|  | 
|  17.12.2008, 00:27 | #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, в последнюю запись. | 
|  | 
|  17.12.2008, 10:41 | #5 | 
| Участник | 
			
			Идея хорошая   . Не знаю, как в пятерке, но в NAV3.70B не работает. Инструкция Код: FieldRef1.VALUE:=ObjectForBLOB."BLOB Reference"; Надо ли понимать это как платформенную недостаточность 3.70B? P.S. Буду рыть дальше, ибо есть ощущение, что можно это провернуть. 
				__________________ "И лишь патологоанатом не берет работу на дом" (с) Вишневский | 
|  |